inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

LangGraph를 활용한 AI Agent 개발 (feat. MCP)

3.5 Agent의 히스토리를 관리하는 방법

멀티턴, MemorySaver,MessagesState 질문 입니다

해결된 질문

183

znznwkdrns

작성한 질문수 9

0

안녕하세요 강의 보다가 헷갈리는 부분이 있어서 질문드립니다

 

질문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)에 반영하기 위해 사용된게 맞을까요?

 

프롬프트엔지니어링 llm ai-agent langgraph mcp

답변 2

1

제이쓴

안녕하세요! 좋은 질문 감사합니다. 다행히 패키지 이슈는 해결하셨군요, 답변을 드려보자면 모두 이해하신 바가 맞습니다.

  1. 언뜻 보면 매 호출 시 {'messages': [response]}로 새로운 리스트를 만드는 것처럼 보입니다. 하지만 LangGraph에서 add_messages의 역할이 상태(state)의 누적 관리이기 때문에, 실제로는 이 새로운 메시지가 기존 상태에 자동으로 누적됩니다.

     

  2. MemorySaver()의 주된 목적은 LangGraph에서 생성된 대화 히스토리를 메모리에 저장해두고, 주피터 노트북 환경에서 각 블록을 실행할 때마다 이전에 쌓인 히스토리를 유지하여 활용하기 위함입니다.

    구체적으로,

    • 주피터 노트북은 코드 블록이 독립적으로 실행될 수 있습니다. 따라서 이전 실행 결과가 다음 코드 실행에서 유지되지 않을 수 있습니다.

    • 이런 상황에서 MemorySaver()는 상태(state)를 저장해두고, 이후 새로운 요청(update_query)을 처리할 때 기존의 대화 내용을 누적하여 context로 반영할 수 있도록 해줍니다.

    • 결과적으로, 각 요청마다 대화의 맥락을 유지한 채로 멀티턴 대화를 계속 이어갈 수 있게 해줍니다.

     

0

znznwkdrns

답변 감사합니다 ~~

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. znznwkdrns님. 강의를 시청하시며 질문해 주신 부분에 대해 답변 드리겠습니다.

질문1. 멀티턴 대화 이해

주어진 agent 함수는 MessagesState 객체를 사용하여 멀티턴 대화를 구현합니다. MessagesState 를 통해 이전 대화 기록을 유지하면서 새로운 메시지를 추가할 수 있습니다. 전달된 코드를 보면:

return {'messages': [response]}

이 부분에서는 단순히 새로운 메시지를 배열로 만들어 반환하는 것처럼 보일 수 있습니다. 그러나 add_messages와 같은 메서드가 있다면, 메시지가 자동으로 누적되어 멀티턴 대화가 가능합니다. 기본적으로 MessagesState라고 명명된 객체는 지속적인 상태 관리 기능을 제공하며, 전체 대화 기록을 관리하게 됩니다. 그래서 새 응답을 추가할 때 과거 메시지를 손실하지 않도록 구현되어 있습니다.

질문2. MemorySaver의 목적

MemorySaver는 주로 대화의 지속성을 마련하기 위해 사용됩니다. 주피터 노트북에서 각 셀 블록을 실행할 때 이전 셀에서의 결과나 메시지를 메모리에 저장하고, 이를 후속 처리에서 재사용하도록 돕습니다. 즉, MemorySaver()는 에이전트 상태를 초기화하거나 업그레이드하여 지속성을 주기 위한 하나의 도구로 사용됩니다.

  1. 상태 유지: 이전의 메시지가 새 메시지와 혼합될 수 있도록 유지합니다.
  2. 업데이트 기능: 새로운 쿼리 요청 시에 이전의 대화 기록이 반영되며 보다 컨텍스트적으로 풍부한 응답을 생성할 수 있도록 합니다.

이렇게 함으로써, 각 요청과 응답이 독립된 것이 아닌, 전체적인 맥락을 유지하는 대화형 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