멀티턴, MemorySaver,MessagesState 질문 입니다
안녕하세요 강의 보다가 헷갈리는 부분이 있어서 질문드립니다
질문1. 3.3 LangGraph에서 도구(tool) 활용 방법
아래 agent 함수는 여러번 호출되는데 리턴하는 부분에서 새로운 배열을 만드는것 처럼 보이지만 add_messages에 의해 자동으로 누적되어 멀티턴 대화가 된다고 이해하면 맞을까요?
def agent(state: MessagesState) -> MessagesState:
"""
에이전트 함수는 주어진 상태에서 메시지를 가져와
LLM과 도구를 사용하여 응답 메시지를 생성합니다.
Args:
state (MessagesState): 메시지 상태를 포함하는 state.
Returns:
MessagesState: 응답 메시지를 포함하는 새로운 state.
"""
# 상태에서 메시지를 추출합니다.
messages = state['messages']
# LLM과 도구를 사용하여 메시지를 처리하고 응답을 생성합니다.
response = llm_with_tools.invoke(messages)
# 응답 메시지를 새로운 상태로 반환합니다.
return {'messages': [response]}
질문2. 3.5 Agent의 히스토리를 관리하는 방법
MemorySaver()의 목적은 주피터 노트북 각 블록을 사용하는데 있어 그 전에 실행해서 얻은 message를 메모리에 저장후 다음 요청 (update_query)에 반영하기 위해 사용된게 맞을까요?
답변 2
1
안녕하세요! 좋은 질문 감사합니다. 다행히 패키지 이슈는 해결하셨군요, 답변을 드려보자면 모두 이해하신 바가 맞습니다.
언뜻 보면 매 호출 시
{'messages': [response]}로 새로운 리스트를 만드는 것처럼 보입니다. 하지만 LangGraph에서add_messages의 역할이 상태(state)의 누적 관리이기 때문에, 실제로는 이 새로운 메시지가 기존 상태에 자동으로 누적됩니다.MemorySaver()의 주된 목적은 LangGraph에서 생성된 대화 히스토리를 메모리에 저장해두고, 주피터 노트북 환경에서 각 블록을 실행할 때마다 이전에 쌓인 히스토리를 유지하여 활용하기 위함입니다.구체적으로,
주피터 노트북은 코드 블록이 독립적으로 실행될 수 있습니다. 따라서 이전 실행 결과가 다음 코드 실행에서 유지되지 않을 수 있습니다.
이런 상황에서
MemorySaver()는 상태(state)를 저장해두고, 이후 새로운 요청(update_query)을 처리할 때 기존의 대화 내용을 누적하여 context로 반영할 수 있도록 해줍니다.결과적으로, 각 요청마다 대화의 맥락을 유지한 채로 멀티턴 대화를 계속 이어갈 수 있게 해줍니다.
1
안녕하세요, 인프런 AI 인턴입니다. znznwkdrns님. 강의를 시청하시며 질문해 주신 부분에 대해 답변 드리겠습니다.
질문1. 멀티턴 대화 이해
주어진 agent 함수는 MessagesState 객체를 사용하여 멀티턴 대화를 구현합니다. MessagesState 를 통해 이전 대화 기록을 유지하면서 새로운 메시지를 추가할 수 있습니다. 전달된 코드를 보면:
return {'messages': [response]}
이 부분에서는 단순히 새로운 메시지를 배열로 만들어 반환하는 것처럼 보일 수 있습니다. 그러나 add_messages와 같은 메서드가 있다면, 메시지가 자동으로 누적되어 멀티턴 대화가 가능합니다. 기본적으로 MessagesState라고 명명된 객체는 지속적인 상태 관리 기능을 제공하며, 전체 대화 기록을 관리하게 됩니다. 그래서 새 응답을 추가할 때 과거 메시지를 손실하지 않도록 구현되어 있습니다.
질문2. MemorySaver의 목적
MemorySaver는 주로 대화의 지속성을 마련하기 위해 사용됩니다. 주피터 노트북에서 각 셀 블록을 실행할 때 이전 셀에서의 결과나 메시지를 메모리에 저장하고, 이를 후속 처리에서 재사용하도록 돕습니다. 즉, MemorySaver()는 에이전트 상태를 초기화하거나 업그레이드하여 지속성을 주기 위한 하나의 도구로 사용됩니다.
- 상태 유지: 이전의 메시지가 새 메시지와 혼합될 수 있도록 유지합니다.
- 업데이트 기능: 새로운 쿼리 요청 시에 이전의 대화 기록이 반영되며 보다 컨텍스트적으로 풍부한 응답을 생성할 수 있도록 합니다.
이렇게 함으로써, 각 요청과 응답이 독립된 것이 아닌, 전체적인 맥락을 유지하는 대화형 AI 시스템을 구현할 수 있습니다.
유사한 논의 및 참고 자료
기존에 관련 논의가 있었던 게시물을 찾아보십시오. 이들은 비슷한 주제를 다루고 있으며 추가적인 학습에 도움이 될 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
[ReadMe]영상에 나온거랑 깃이랑 다르네요
0
50
2
import Hub Error
0
48
2
코드 최종 결과 질문드립니다.
0
45
2
AgentState의 messages 확인해주세요.
0
51
2
2.3 Agentic RAG 관련 질문이 있습니다.
0
49
2
깃허브 레포지토리 확인 요청
0
67
2
제공해주신 레포가 Windows 환경에 너무 비친화적입니다.
0
96
2
마크다운을 텍스트 파일로 변환하기
0
109
1
max token을 제한하는게 왜 성능을 개선하게 되는걸까요?
0
100
2
pyzerox 유니코드 에러
0
118
2
영상 메타데이터 생성 관련 LLM 활용 질문
0
105
1
종합부동산세 부분 tool 사용 질문 드립니다.
0
99
2
uv sync 파이썬 버전문제 onnxruntime
-1
171
2
MCP를 활용해서 간단한 에이전트를 만들어보세요
0
133
1
PDF 형식
0
97
1
5.3 langchain-mcp-adpater를 활용한 MCP 도구 사용 tool_list 지연 사유
0
129
2
3.6 human_in_the_loop 3rd case
0
105
1
summary 를. 시스템메세지에 추가하는 부분에 관하여
0
115
3
병렬 처리 중 retrieve 관련 궁금한 사항
0
103
1
query 에 대한 answer 결과값이 나오지 않습니다.
0
118
2
사람과 관련된 표현이 없는데 rewrite 로 이동하지 않는경우
0
89
1
retriever 관련 질문
0
78
1
인터룹 관련 질문
0
63
2
2.4 Self-RAG 결과가 달라요!
0
100
2





