1. LangChainμ 첫걸μ
π― μ΄ μ±ν°μμ λ°°μΈ κ²
- LangChainμ μ¬μ©νμ¬ μΈμ΄ λͺ¨λΈ(LLM)κ³Ό μ± λͺ¨λΈμ μ΄κΈ°ννλ λ°©λ²
predict
μpredict_messages
μ μ°¨μ΄μ μ΄ν΄νκΈ°PromptTemplate
μ μ¬μ©νμ¬ λμ μΌλ‘ ν둬ννΈλ₯Ό μμ±νλ λ°©λ²OutputParser
λ₯Ό μ¬μ©νμ¬ λͺ¨λΈμ μΆλ ₯μ μνλ νμμΌλ‘ λ³ννλ λ°©λ²- LangChain Expression Language (LCEL)μ μ¬μ©νμ¬ μ¬λ¬ κ΅¬μ± μμλ₯Ό μ°κ²°(chain)νλ λ°©λ²
LLMκ³Ό Chat Model
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
- LangChainμ
ChatOpenAI
λͺ¨λΈμ μ΄κΈ°ννλ λ°©λ² predict
λ©μλλ₯Ό μ¬μ©νμ¬ κ°λ¨ν μ§λ¬Έμ λν λ΅λ³μ μ»λ λ°©λ²
π 1λ¨κ³: ChatOpenAI λͺ¨λΈ μ΄κΈ°ν λ° μ¬μ©
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.chat_models import ChatOpenAI |
π μ½λ μμΈ μ€λͺ
1. ChatOpenAI
λ?ChatOpenAI
λ LangChain λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ κ΅¬μ± μμλ‘, OpenAIμ GPT λͺ¨λΈ(μ: GPT-3.5, GPT-4)κ³Ό μνΈμμ©ν μ μκ² ν΄μ£Όλ λ€λ¦¬ μν μ ν©λλ€. μ΄ ν΄λμ€λ₯Ό μ¬μ©νλ©΄ 볡μ‘ν API νΈμΆ μμ΄ Python μ½λ λ΄μμ μ§μ λνν AI λͺ¨λΈμ μ¬μ©ν μ μμ΅λλ€.
- μ μ¬μ©νλκ°?: OpenAIμ κ°λ ₯ν μΈμ΄ λͺ¨λΈμ μ°λ¦¬ μ ν리μΌμ΄μ μ μ½κ² ν΅ν©ν μ μμ΅λλ€.
- μ΄λ»κ² μλνλκ°?:
ChatOpenAI()
λ₯Ό νΈμΆνλ©΄, λ΄λΆμ μΌλ‘ OpenAI APIμ μ°κ²°ν μ€λΉλ₯Ό ν©λλ€. μ΄ λ, μμ€ν μOPENAI_API_KEY
νκ²½ λ³μκ° μ€μ λμ΄ μμ΄μΌ ν©λλ€.
2. .predict()
λ©μλ.predict()
λ κ°μ₯ κ°λ¨νκ² λͺ¨λΈμκ² μ§λ¬Έμ λμ§κ³ λ΅λ³(λ¬Έμμ΄)μ λ°λ λ°©λ²μ
λλ€.
- μ¬μ©λ²:
chat.predict("μ§λ¬Έ λ΄μ©")
ννλ‘ μ¬μ©νλ©°, λ¬Έμμ΄μ μ λ ₯λ°μ λ¬Έμμ΄μ λ°νν©λλ€.
λΉκ΅ μμ:
1 | # Before (LangChain μ¬μ© μ ) |
β 체ν¬λ¦¬μ€νΈ
-
langchain
λΌμ΄λΈλ¬λ¦¬κ° μ€μΉλμλμ? -
OPENAI_API_KEY
νκ²½ λ³μλ₯Ό μ€μ νλμ? -
ChatOpenAI
λ₯Ό importνκ³ μ΄κΈ°ννλμ? -
predict
λ©μλλ‘ μ§λ¬Έμ 보λ΄κ³ κ²°κ³Όλ₯Ό νμΈνλμ?
Predict Messages
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
SystemMessage
,AIMessage
,HumanMessage
μ μν μ΄ν΄νκΈ°predict_messages
λ₯Ό μ¬μ©νμ¬ λ 볡μ‘ν λν λ§₯λ½μ μ λ¬νλ λ°©λ²
π 1λ¨κ³: λ€μν μν μ λ©μμ§ μ¬μ©νκΈ°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.chat_models import ChatOpenAI |
π μ½λ μμΈ μ€λͺ
1. λ©μμ§ νμ
: System
, AI
, Human
SystemMessage
: λͺ¨λΈμ μν μ΄λ νλ λ°©μμ μ§μνλ λ©μμ§μ λλ€. μλ₯Ό λ€μ΄, βλλ λ²μκ°μΌβ λλ βμΉμ νκ² λλ΅ν΄β μ κ°μ μ§μΉ¨μ λ΄λ¦½λλ€.HumanMessage
: μ¬μ©μκ° μ λ ₯νλ λ©μμ§μ λλ€.AIMessage
: AI λͺ¨λΈμ΄ μ΄μ μ νλ μλ΅μ λνλ λλ€. λνμ νλ¦μ μ μ§ν λ μ¬μ©λ©λλ€.
2. .predict_messages()
λ©μλ.predict()
κ° λ¨μν λ¬Έμμ΄ μ§λ¬Έλ§ λ°λ κ²κ³Ό λ¬λ¦¬, .predict_messages()
λ μμμ μ€λͺ
ν λ©μμ§ κ°μ²΄λ€μ 리μ€νΈλ₯Ό μ
λ ₯μΌλ‘ λ°μ΅λλ€. μ΄λ₯Ό ν΅ν΄ λͺ¨λΈμκ² μν , μ΄μ λν λ΄μ© λ± λ νλΆν λ§₯λ½μ μ λ¬νμ¬ μ κ΅ν λ΅λ³μ μ λν μ μμ΅λλ€.
λΉκ΅ μμ:
1 | # Before (predict) |
β 체ν¬λ¦¬μ€νΈ
-
SystemMessage
,AIMessage
,HumanMessage
λ₯Ό import νλμ? - μΈ κ°μ§ λ©μμ§ νμ μ μν μ μ΄ν΄νλμ?
- λ©μμ§ λ¦¬μ€νΈλ₯Ό λ§λ€μ΄
predict_messages
μ μ λ¬ν΄ 보μλμ?
Prompt Templates
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
PromptTemplate
κ³ΌChatPromptTemplate
μ μ¬μ©λ²- ν νλ¦Ώμ μ¬μ©νμ¬ λμ μΌλ‘ ν둬ννΈλ₯Ό λ§λλ λ°©λ²
π 1λ¨κ³: ν νλ¦ΏμΌλ‘ ν둬ννΈ μμ±νκΈ°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.chat_models import ChatOpenAI |
π μ½λ μμΈ μ€λͺ
1. ChatPromptTemplate
μ΄λ?ChatPromptTemplate
μ λ©μμ§ λͺ©λ‘μ ν
νλ¦Ώμ λ§λλ λꡬμ
λλ€. {variable}
κ³Ό κ°μ νλ μ΄μ€νλλ₯Ό μ¬μ©νμ¬ ν둬ννΈμ μΌλΆλ₯Ό λμ μΌλ‘ λ³κ²½ν μ μμ΅λλ€.
- μ μ¬μ©νλκ°?: λ§€λ²
SystemMessage
,HumanMessage
κ°μ²΄λ₯Ό μλμΌλ‘ λ§λ€ νμ μμ΄, μ ν΄μ§ νμ λ³μλ§ λ°κΏ λΌμλ£μ΄ ν¨μ¨μ μΌλ‘ ν둬ννΈλ₯Ό μμ±ν μ μμ΅λλ€.
2. .from_messages()
μ .format_messages()
.from_messages()
: λ©μμ§ μν κ³Ό ν νλ¦Ώ λ¬Έμμ΄μ νν 리μ€νΈλ₯Ό λ°μ ν νλ¦Ώ κ°μ²΄λ₯Ό μμ±ν©λλ€..format_messages()
: μμ±λ ν νλ¦Ώ κ°μ²΄μ μ€μ λ³μ κ°μ μ λ¬νμ¬ μ΅μ’ λ©μμ§ λ¦¬μ€νΈλ₯Ό λ§λλλ€.
μκ°ν:
1 | ββββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββ |
β 체ν¬λ¦¬μ€νΈ
-
ChatPromptTemplate
μ import νλμ? -
from_messages
λ₯Ό μ¬μ©ν΄ ν νλ¦Ώμ λ§λ€μλμ? -
format_messages
μ λ³μλ₯Ό μ λ¬νμ¬ μ΅μ’ ν둬ννΈλ₯Ό μμ±νλμ?
Output Parserμ LCEL
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
BaseOutputParser
λ₯Ό μμλ°μ 컀μ€ν νμλ₯Ό λ§λλ λ°©λ²- LangChain Expression Language (LCEL)μ νμ΄ν(
|
) μ°μ°μ μ¬μ©λ²
π 1λ¨κ³: μΆλ ₯ νμ μ μ λ° μ²΄μΈ μ°κ²°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.chat_models import ChatOpenAI |
π μ½λ μμΈ μ€λͺ
1. BaseOutputParser
λͺ¨λΈμ μΆλ ₯(μ£Όλ‘ λ¬Έμμ΄)μ μ°λ¦¬κ° μνλ νν(μ: 리μ€νΈ, JSON)λ‘ λ³ννλ μν μ ν©λλ€. BaseOutputParser
λ₯Ό μμνκ³ parse
λ©μλλ₯Ό ꡬννμ¬ μ»€μ€ν
νμλ₯Ό λ§λ€ μ μμ΅λλ€.
CommaOutputParser
: μ΄ μμ μμλ μΌνλ‘ κ΅¬λΆλ λ¬Έμμ΄μ Python 리μ€νΈλ‘ λ³ννλ νμλ₯Ό λ§λ€μμ΅λλ€.
2. LangChain Expression Language (LCEL)
LCELμ LangChainμ μ¬λ¬ κ΅¬μ± μμλ₯Ό |
(νμ΄ν) μ°μ°μλ‘ μ½κ² μ°κ²°ν μ μκ² ν΄μ£Όλ κ°λ ₯ν κΈ°λ₯μ
λλ€. λ°μ΄ν°κ° μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ νλ₯΄λ©° κ° λ¨κ³λ₯Ό κ±°μΉ©λλ€.
λμ νλ¦:
1 | 1. `chain.invoke`μ λμ λ리 μ λ¬ |
β 체ν¬λ¦¬μ€νΈ
-
BaseOutputParser
λ₯Ό μμνμ¬ λλ§μ νμλ₯Ό λ§λ€μλμ? -
|
μ°μ°μλ₯Ό μ¬μ©νμ¬template
,chat
,parser
λ₯Ό μ°κ²°νλμ? -
chain.invoke()
λ₯Ό μ¬μ©νμ¬ μ 체 체μΈμ μ€ννλμ?
Chaining Chains
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
- μ¬λ¬ κ°μ 체μΈμ νλλ‘ μ°κ²°νλ λ°©λ²
- μ€νΈλ¦¬λ° μΆλ ₯μ μ²λ¦¬νλ λ°©λ²
π 1λ¨κ³: λ κ°μ μ²΄μΈ μ°κ²°νκΈ°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.chat_models import ChatOpenAI |
π μ½λ μμΈ μ€λͺ
1. StreamingStdOutCallbackHandler
λͺ¨λΈμ΄ μλ΅μ μμ±ν λ, μ 체 μλ΅μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬λ λμ λ¨μ΄(ν ν°)κ° μμ±λ λλ§λ€ μ€μκ°μΌλ‘ μΆλ ₯ν΄μ£Όλ μ½λ°± νΈλ€λ¬μ
λλ€. μ¬μ©μ κ²½νμ ν₯μμν¬ μ μμ΅λλ€.
2. μ²΄μΈ μ°κ²°νκΈ°
LCELμ μ¬μ©νλ©΄ ν 체μΈμ μΆλ ₯μ λ€λ₯Έ 체μΈμ μ
λ ₯μΌλ‘ μ λ¬ν μ μμ΅λλ€.
λμ νλ¦:
1 | 1. `final_chain.invoke`μ {"cuisine": "indian"} μ λ¬ |
β 체ν¬λ¦¬μ€νΈ
-
StreamingStdOutCallbackHandler
λ₯Ό μ¬μ©νμ¬ μ€μκ° μΆλ ₯μ νμΈνλμ? - λ κ° μ΄μμ ν둬ννΈμ λͺ¨λΈμ κ°κ°μ 체μΈμΌλ‘ λ§λ€μλμ?
- 첫 λ²μ§Έ 체μΈμ μΆλ ₯μ λ λ²μ§Έ 체μΈμ μ
λ ₯μΌλ‘ μ λ¬νλλ‘
final_chain
μ ꡬμ±νλμ?
Recap
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
- μ±ν° 1μμ λ°°μ΄ λͺ¨λ κ°λ μ μ’ ν©νμ¬ νλμ 체μΈμ μμ±νλ λ°©λ²
π 1λ¨κ³: μ΅μ’ μ²΄μΈ μμ± λ° κ°μ
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.chat_models import ChatOpenAI |
π μ½λ μμΈ μ€λͺ
μ΄λ² λ¨κ³μμλ μ΄μ κΉμ§ λ°°μ΄ λͺ¨λ κ²μ μ’ ν©ν©λλ€.
ChatOpenAI
λ₯ΌStreamingStdOutCallbackHandler
μ ν¨κ» μ€μ νμ¬ μ€μκ° μλ΅μ λ°μ΅λλ€.- κ°κΈ° λ€λ₯Έ μν μ κ°μ§ λ κ°μ
ChatPromptTemplate
(chef_prompt
,veg_chef_prompt
)μ μ μν©λλ€. - κ° ν
νλ¦Ώμ
chat
λͺ¨λΈκ³Ό|
μ°μ°μλ‘ μ°κ²°νμ¬ λ κ°μ κΈ°λ³Έ 체μΈ(chef_chain
,veg_chain
)μ λ§λλλ€. chef_chain
μ μΆλ ₯μveg_chain
μrecipe
μ λ ₯μΌλ‘ λ§€ννμ¬final_chain
μ ꡬμ±ν©λλ€.invoke
λ₯Ό μ¬μ©νμ¬ μ 체 νλ‘μΈμ€λ₯Ό μμν©λλ€.
μ΄κ²μ΄ λ°λ‘ LangChainμ ν΅μ¬ μμ΄λμ΄μ λλ€. μκ³ μ¬μ¬μ© κ°λ₯ν κ΅¬μ± μμ(LLM, Prompt, Parser λ±)λ₯Ό λ§λ€μ΄ LCELμ ν΅ν΄ λ κ³ λΈλ‘μ²λΌ 쑰립νμ¬ λ³΅μ‘ν μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€.
π‘ μ°μ΅ κ³Όμ
- λ²μ μ²΄μΈ μΆκ°νκΈ°:
final_chain
μ λ§μ§λ§μ λ²μκ° μν μ νλ μΈ λ²μ§Έ 체μΈμ μΆκ°νμ¬, μ΅μ’ λ μνΌλ₯Ό μ€νμΈμ΄λ‘ λ²μνλλ‘ λ§λ€μ΄λ³΄μΈμ. - μΆλ ₯ νμ μ¬μ©νκΈ°:
chef_chain
λ€μμCommaOutputParser
μ μ μ¬ν νμλ₯Ό μΆκ°νμ¬, λ μνΌμμ μ¬λ£ λͺ©λ‘λ§ μΆμΆνλλ‘ μμ ν΄λ³΄μΈμ.
μΆμ² : https://nomadcoders.co/fullstack-gpt