3. μ±λ΄μ κΈ°μ΅λ ₯, Memory
π― μ΄ μ±ν°μμ λ°°μΈ κ²
- μ±λ΄μ΄ λνλ₯Ό κΈ°μ΅νκ² λ§λλ βMemoryβμ μ€μμ± μ΄ν΄νκΈ°
ConversationBufferMemory
: λͺ¨λ λνλ₯Ό κΈ°μ΅νλ κ°μ₯ κΈ°λ³Έμ μΈ λ©λͺ¨λ¦¬ConversationBufferWindowMemory
: μ΅κ·Ό λνλ§ κΈ°μ΅νμ¬ ν ν°μ μ μ½νλ λ©λͺ¨λ¦¬ConversationSummaryMemory
: κΈ΄ λνλ₯Ό μμ½νμ¬ ν΅μ¬λ§ κΈ°μ΅νλ λ©λͺ¨λ¦¬ConversationSummaryBufferMemory
: μ΅κ·Ό λνλ κ·Έλλ‘, μ€λλ λνλ μμ½νλ νμ΄λΈλ¦¬λ λ©λͺ¨λ¦¬ConversationKGMemory
: λνμμ μ§μ κ·Έλν(Knowledge Graph)λ₯Ό ꡬμΆνλ κ³ κΈ λ©λͺ¨λ¦¬LLMChain
λ° LCELκ³Ό ν¨κ» Memoryλ₯Ό ν΅ν©νλ λ°©λ²
ConversationBuffer(Window)Memory
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
ConversationBufferMemory
λ₯Ό μ¬μ©νμ¬ μ 체 λν κΈ°λ‘μ μ μ₯νλ λ°©λ²ConversationBufferWindowMemory
λ₯Ό μ¬μ©νμ¬ μ΅κ·Ό Kκ°μ λνλ§ μ μ₯νλ λ°©λ²
π 1λ¨κ³: λν κΈ°μ΅νκΈ°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.memory import ConversationBufferMemory, ConversationBufferWindowMemory |
π μ½λ μμΈ μ€λͺ
1. Memoryλ?
μ±λ΄μ κΈ°λ³Έμ μΌλ‘ βμνκ° μλ(stateless)β νΉμ±μ κ°μ§λλ€. μ¦, λ°©κΈ λλ λνλ λ°λ‘ μμ΄λ²λ¦½λλ€. Memoryλ μ±λ΄μ΄ μ΄μ λν λ΄μ©μ κΈ°μ΅νκ³ λ€μ λ΅λ³μ νμ©ν μ μλλ‘ λν κΈ°λ‘μ μ μ₯νκ³ κ΄λ¦¬νλ κ΅¬μ± μμμ
λλ€.
2. ConversationBufferMemory
- λͺ¨λ λν λ΄μ©μ μμλλ‘ λ²νΌμ μ μ₯ν©λλ€.
- κ°λ¨νμ§λ§, λνκ° κΈΈμ΄μ§λ©΄ ν둬ννΈμ ν¬ν¨λλ ν ν° μμ΄ λ¬΄νμ λμ΄λ λΉμ©κ³Ό μ±λ₯ λ¬Έμ κ° λ°μν μ μμ΅λλ€.
3. ConversationBufferWindowMemory
k
νλΌλ―Έν°λ‘ μ§μ λ κ°μλ§νΌμ μ΅κ·Ό λνλ§ μ μ₯ν©λλ€.- ν ν° μ¬μ©λμ μ μ΄νλ©΄μλ μ΅κ·Ό λνμ λ§₯λ½μ μ μ§ν μ μλ ν¨μ¨μ μΈ λ°©λ²μ λλ€.
4. MessagesPlaceholder
ChatPromptTemplate
λ΄μμ λ©λͺ¨λ¦¬κ° λμ μΌλ‘ μ½μ
λ μμΉλ₯Ό μ§μ νλ νλ μ΄μ€νλμ
λλ€. variable_name
μ memory
μ memory_key
μ μΌμΉν΄μΌ ν©λλ€.
β 체ν¬λ¦¬μ€νΈ
-
ConversationBufferWindowMemory
λ₯Ό μ΄κΈ°ννκ³k
κ°μ μ€μ νλμ? -
MessagesPlaceholder
λ₯Ό ν둬ννΈμ μΆκ°νλμ? - μ²΄μΈ μ€ν ν
memory.save_context
λ₯Ό νΈμΆνμ¬ λνλ₯Ό μ μ₯νλμ?
ConversationSummary(Buffer)Memory
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
ConversationSummaryMemory
: μ 체 λνλ₯Ό LLMμ μ¬μ©ν΄ μμ½νμ¬ μ μ₯νλ λ°©λ²ConversationSummaryBufferMemory
: μμ½κ³Ό λ²νΌλ§μ κ²°ν©ν νμ΄λΈλ¦¬λ λ©λͺ¨λ¦¬
π 1λ¨κ³: λν μμ½νμ¬ κΈ°μ΅νκΈ°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.memory import ConversationSummaryMemory, ConversationSummaryBufferMemory |
π μ½λ μμΈ μ€λͺ
1. ConversationSummaryMemory
- λνκ° μΆκ°λ λλ§λ€ LLMμ νΈμΆνμ¬ μ 체 λν λ΄μ©μ μμ½ν©λλ€.
- λνκ° μ무리 κΈΈμ΄μ Έλ ν둬ννΈμ ν¬ν¨λλ ν ν° μμ μΌμ νκ² μ μ§ν μ μμ΅λλ€.
- λ¨μ : λνκ° μΆκ°λ λλ§λ€ μμ½μ μν΄ LLMμ νΈμΆνλ―λ‘ λΉμ©μ΄ λ°μνκ³ μ½κ°μ μ§μ°μ΄ μκΈΈ μ μμ΅λλ€.
2. ConversationSummaryBufferMemory
ConversationBufferMemory
μConversationSummaryMemory
μ μ₯μ μ κ²°ν©ν κ²μ λλ€.- νμμλ λνλ₯Ό λ²νΌμ κ·Έλλ‘ μ μ₯νλ€κ°,
max_token_limit
μΌλ‘ μ§μ λ ν ν° μμ μ΄κ³Όνλ©΄ κ°μ₯ μ€λλ λνλΆν° μμ½νμ¬ λ²νΌμ ν¬κΈ°λ₯Ό μ€μ λλ€. - ν¨μ¨μ±κ³Ό μ νμ± μ¬μ΄μ κ· νμ λ§μΆ λ§€μ° μ€μ©μ μΈ λ©λͺ¨λ¦¬μ λλ€.
λμ νλ¦ (SummaryBuffer):
1 | 1. λν 1, 2, 3 μΆκ° -> λ²νΌμ κ·Έλλ‘ μ μ₯ |
β 체ν¬λ¦¬μ€νΈ
-
ConversationSummaryBufferMemory
λ₯Όllm
κ³Όmax_token_limit
κ³Ό ν¨κ» μ΄κΈ°ννλμ? - μ¬λ¬ λ²μ λνλ₯Ό μΆκ°ν ν,
get_history()
λ₯Ό ν΅ν΄ μ€λλ λνκ° μμ½λλ κ²μ νμΈνλμ?
ConversationKGMemory
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
ConversationKGMemory
λ₯Ό μ¬μ©νμ¬ λνμμ μ§μ κ·Έλν(Knowledge Graph)λ₯Ό μΆμΆνκ³ νμ©νλ λ°©λ²
π 1λ¨κ³: μ§μ κ·Έλνλ‘ λν κΈ°μ΅νκΈ°
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.memory import ConversationKGMemory |
π μ½λ μμΈ μ€λͺ
1. ConversationKGMemory
(Knowledge Graph)
- λνμμ μ€μν κ°μ²΄(Entity, μ: μ¬λ, μ₯μ)μ κ·Έλ€ μ¬μ΄μ κ΄κ³λ₯Ό μΆμΆνμ¬ μ§μ κ·Έλν ννλ‘ μ μ₯ν©λλ€.
- λ¨μν λν κΈ°λ‘μ΄ μλ, ꡬ쑰νλ μ 보λ₯Ό κΈ°μ΅νλ―λ‘ νΉμ κ°μ²΄μ λν μ§λ¬Έμ λ μ νν λ§₯λ½μ μ 곡ν μ μμ΅λλ€.
- μ΄λ»κ² μλνλκ°?: λ΄λΆμ μΌλ‘ LLMμ μ¬μ©νμ¬ λνμμ β(μ£Όμ΄, μμ μ΄, λͺ©μ μ΄)β ννμ νΈλ¦¬ν(triple)μ μΆμΆν©λλ€. (μ:
(Nicolas, lives in, South Korea)
,(Nicolas, likes, kimchi)
) load_memory_variables
κ° νΈμΆλ λ, νμ¬ μ§λ¬Έκ³Ό κ΄λ ¨λ μ§μλ€μ μμ½νμ¬SystemMessage
λ‘ μ 곡ν©λλ€.
β 체ν¬λ¦¬μ€νΈ
-
ConversationKGMemory
λ₯Ό μ΄κΈ°ννλμ? - μ¬λ¬ μ 보λ₯Ό λ΄μ λνλ₯Ό μΆκ°νλμ?
- νΉμ κ°μ²΄μ λν μ§λ¬Έμ
load_memory_variables
μ μ λ¬νμ¬, κ΄λ ¨λ μ λ³΄κ° μμ½λμ΄ λ°νλλ κ²μ νμΈνλμ?
Memoryμ Chainμ ν΅ν©
π― μ΄λ² λ¨κ³μμ λ°°μΈ κ²
- λ κ±°μ
LLMChain
μ λ©λͺ¨λ¦¬λ₯Ό μ§μ ν΅ν©νλ λ°©λ² - μ΅μ LCEL(LangChain Expression Language)μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό 체μΈμ ν΅ν©νλ λ°©λ²
π 1λ¨κ³: LCELλ‘ λ©λͺ¨λ¦¬ ν΅ν©νκΈ° (μ΅μ λ°©μ)
μ 체 μ½λ (notebook.ipynb):
1 | from langchain.memory import ConversationSummaryBufferMemory |
π μ½λ μμΈ μ€λͺ
1. LCEL λ°©μμ λ©λͺ¨λ¦¬ ν΅ν©
μ΄κ²μ΄ νμ¬ LangChainμμ κΆμ₯νλ λ°©μμ
λλ€. λ©λͺ¨λ¦¬λ₯Ό 체μΈμ μΌλΆλ‘ λͺ
μμ μΌλ‘ μ°κ²°νμ¬ λ°μ΄ν° νλ¦μ λ λͺ
ννκ² λ§λλλ€.
RunnablePassthrough.assign(history=...)
: 체μΈμ μμ λΆλΆμ μλ‘μ΄history
ν€λ₯Ό μΆκ°νλ λ¨κ³μ λλ€.lambda x: memory.load_memory_variables(x)["history"]
:invoke
κ° νΈμΆλ λmemory
μμ λν κΈ°λ‘μ λ‘λνλ ν¨μμ λλ€. μ΄ ν¨μλ 체μΈμ΄ μ€νλ λλ§λ€ νΈμΆλμ΄ νμ μ΅μ λν κΈ°λ‘μ κ°μ Έμ΅λλ€.memory.save_context(...)
: μ²΄μΈ μ€νμ΄ λλ ν, μ¬μ©μμ μ§λ¬Έκ³Ό λͺ¨λΈμ λ΅λ³μ μλμΌλ‘ λ©λͺ¨λ¦¬μ μ μ₯νμ¬ λ€μ λνλ₯Ό μ€λΉν©λλ€.
2. λ κ±°μ LLMChain
λ°©μ (μ°Έκ³ )
1 | # μμ λ°©μ |
LLMChain
μ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό λ΄λΆμ μΌλ‘ μλ μ²λ¦¬ν΄μ€μ νΈλ¦¬νμ§λ§, 볡μ‘ν 체μΈμ ꡬμ±ν λ λ°μ΄ν° νλ¦μ΄ λΆλΆλͺ ν΄μ§λ λ¨μ μ΄ μμμ΅λλ€. LCEL λ°©μμ μ΄λ₯Ό κ°μ νμ¬ λ λͺ μμ μ΄κ³ μ μ°ν μ²΄μΈ κ΅¬μ±μ κ°λ₯νκ² ν©λλ€.
β 체ν¬λ¦¬μ€νΈ
- LCELμ μ¬μ©νμ¬ λ©λͺ¨λ¦¬ λ‘λ, ν둬ννΈ, λͺ¨λΈμ μμλλ‘ μ°κ²°νλμ?
-
RunnablePassthrough.assign
μ μ¬μ©νμ¬ μ²΄μΈμhistory
λ₯Ό μ£Όμ νλμ? - μ²΄μΈ νΈμΆ ν
save_context
λ₯Ό μ¬μ©νμ¬ λν λ΄μ©μ μλμΌλ‘ μ μ₯νλμ? - μ±λ΄μ΄ μ΄μ λν λ΄μ©μ κΈ°μ΅νκ³ λ΅λ³νλ κ²μ νμΈνλμ?
μΆμ² : https://nomadcoders.co/fullstack-gpt