Study/AI
[LangChain] debug모드로 메모리 관리 실습하기
728x90
반응형
debug모드를 켜면 LLM이 어떤식으로 동작되고 있는지 상세히 알아볼 수 있다.
import langchain
langchain.debug = True
- 메시지와 trimmer 정의
messages = [
SystemMessage(content="사용자의 질문에 2문장 이내로 짧게 대답해"),
HumanMessage(content="오늘은 피자를 먹어야지!"),
AIMessage(content="정말 좋은 생각이야. 음료는 무엇으로 할 거야?"),
HumanMessage(content="내일은 수영을 가야지!"),
AIMessage(content="수영이라니, 정말 좋은 운동이야. 수영장은 어디로 다녀?"),
HumanMessage(content="주말에는 영화를 보러 갈 거야!"),
AIMessage(content="주말이 벌써부터 기다려지겠는걸? 보려고 생각해둔 영화가 있어?"),
]
trimmer = trim_messages(
max_tokens=120,
token_counter=llm,
strategy="last",
include_system=True,
start_on=HumanMessage,
)
max_tokens: 토큰 120개만 남기고 자른다.
strategy: 최근 대화를 남기고 과거대화를 지운다.
include_system: 시스템메시지 남긴다. start_on: HumanMessage부터 시작한다.
trimmer.invoke(messages)
=> [SystemMessage(content='사용자의 질문에 2문장 이내로 짧게 대답해', additional_kwargs={}, response_metadata={}),
HumanMessage(content='내일은 수영을 가야지!', additional_kwargs={}, response_metadata={}),
AIMessage(content='수영이라니, 정말 좋은 운동이야. 수영장은 어디로 다녀?', additional_kwargs={}, response_metadata={}),
HumanMessage(content='주말에는 영화를 보러 갈 거야!', additional_kwargs={}, response_metadata={}),
AIMessage(content='주말이 벌써부터 기다려지겠는걸? 보려고 생각해둔 영화가 있어?', additional_kwargs={}, response_metadata={})]
- parser 정의
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
chain = trimmer | llm | parser
- debug모드로 실행
chain.invoke(messages + [
HumanMessage(content="오늘 뭘 먹는다고 했지?")
]
)
=> trimmer에 의해 메시지가 오늘 뭘 먹는지에 대한 내용이 삭제되었으므로 llm은 이를 인지하지 못한다.
[chain/start] [chain:RunnableSequence] Entering Chain run with input:
[inputs]
[chain/start] [chain:RunnableSequence > chain:trim_messages] Entering Chain run with input:
[inputs]
[chain/end] [chain:RunnableSequence > chain:trim_messages] [3ms] Exiting Chain run with output:
[outputs]
[llm/start] [chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{
"prompts": [
"System: 사용자의 질문에 2문장 이내로 짧게 대답해\nHuman: 내일은 수영을 가야지!\nAI: 수영이라니, 정말 좋은 운동이야. 수영장은 어디로 다녀?\nHuman: 주말에는 영화를 보러 갈 거야!\nAI: 주말이 벌써부터 기다려지겠는걸? 보려고 생각해둔 영화가 있어?\nHuman: 오늘 뭘 먹는다고 했지?"
]
}
[llm/end] [chain:RunnableSequence > llm:ChatOpenAI] [1.43s] Exiting LLM run with output:
{
"generations": [
[
{
"text": "아직 정하지 않았어? 맛있는 음식을 선택하길 바랄게!",
"generation_info": {
"finish_reason": "stop",
"logprobs": null
},
"type": "ChatGeneration",
"message": {
"lc": 1,
...
[chain/end] [chain:RunnableSequence] [1.44s] Exiting Chain run with output:
{
"output": "아직 정하지 않았어? 맛있는 음식을 선택하길 바랄게!"
}
chain.invoke(messages + [
HumanMessage(content="주말에는 내가 뭘 한다고 했지?")
]
)
=> 주말에는 내가 영화를 보러간다는 내용이 삭제되지 않았으므로 llm은 답변할 수 있다.
[chain/start] [chain:RunnableSequence] Entering Chain run with input:
[inputs]
[chain/start] [chain:RunnableSequence > chain:trim_messages] Entering Chain run with input:
[inputs]
[chain/end] [chain:RunnableSequence > chain:trim_messages] [5ms] Exiting Chain run with output:
[outputs]
[llm/start] [chain:RunnableSequence > llm:ChatOpenAI] Entering LLM run with input:
{
"prompts": [
"System: 사용자의 질문에 2문장 이내로 짧게 대답해\nHuman: 주말에는 영화를 보러 갈 거야!\nAI: 주말이 벌써부터 기다려지겠는걸? 보려고 생각해둔 영화가 있어?\nHuman: 주말에는 내가 뭘 한다고 했지?"
]
}
[llm/end] [chain:RunnableSequence > llm:ChatOpenAI] [1.18s] Exiting LLM run with output:
{
"generations": [
[
{
"text": "주말에는 영화를 보러 간다고 했어! 어떤 영화 볼 예정이야?",
"generation_info": {
"finish_reason": "stop",
"logprobs": null
},
"type": "ChatGeneration",
"message": {
"lc": 1,
...
[chain/end] [chain:RunnableSequence] [1.19s] Exiting Chain run with output:
{
"output": "주말에는 영화를 보러 간다고 했어! 어떤 영화 볼 예정이야?"
}
728x90
반응형
'Study > AI' 카테고리의 다른 글
[LangChain] RAG의 기본 단계 (1) | 2025.08.18 |
---|---|
[LangChain] RunnableWithMessageHistory, BaseChatMessageHistory를 사용해 메시지 히스토리 관리하기 (6) | 2025.08.11 |
[LangChain] 메모리 관리 (0) | 2025.08.10 |
[LangChain] 메모리 (4) | 2025.08.10 |
[LangChain] Parser (5) | 2025.08.10 |
댓글