박정기
박정기
🗡️ AI 레전드
🎖️ 마스터 파트너
🚀 SNS 챌린지 달성자

[1DAY 1랭그래프] 챗봇 멀티턴 그리고 메세지 요약기능 에 대하여 #6일차

배경 및 목적

이번 13기 AI 스터디에 앞서, 1DAY 1랭그래프, 즉 하루에 1개의 랭그래프 개념을 설명하는 부분을 기획하게 됐습니다.

-> 랭그래프 스터디에 관심이 있다면 신청해주세요!

주황색 배경의 한국 광고

스터디 신청링크

이 프로젝트의 목표는 랭그래프를 쉽게 입문하실 수 있게 상세한 개념부터 코드까지 함께 공부해보실 수 있게 정리해서 드릴 예정입니다.

저는 랭그래프를 처음들어봐요!, 1일차 글을 보고 싶다면!?

-> 링크로 접속하기!

참고 자료

코랩 실습 링크

공식 랭그래프 강의 링크

활용 툴

파이썬, 코랩, 랭그래프, 랭체인

핵심 요약: 메시지 요약 기능을 갖춘 LangGraph 챗봇 구축

  1. 핵심 내용:

    1. 대화 요약 통합: LangGraph와 LLM을 사용하여 대화의 실행 요약을 생성함으로써 전체 대화를 압축된 형태로 유지하고 토큰 비용과 지연 시간을 절감합니다.

    2. 메모리 및 지속성 도입: MemorySaver 체크포인터를 활용하여 그래프 상태를 자동으로 저장하고, 스레드 ID를 통해 장기적이고 연속적인 멀티턴 대화를 지원합니다. (지속적인 대화 내용을 기반으로 하는 채팅 구현을 위해서 메모리 및 지속성은 꼭 필요한 개념입니다.)

    3. 조건부 로직 활용: 메시지 수가 특정 기준을 초과할 때 자동으로 대화를 요약하는 조건부 에지를 설정하여 대화 흐름을 효율적으로 관리합니다. (코랩 예제에서는 6번의 대화를 진행했다면, 지금까지 했던 대화를 요약하기 시작합니다.)

대화의 흐름도

-> 6번의 이상 대화를 한 경우에만 summarize_conversation을 호출하여 대화를 요약 합니다.


1. 상태 스키마 정의:

- MessagesStatesummary 키를 추가하여 대화 요약을 저장합니다.

```python

from langgraph.graph import MessagesState

class State(MessagesState):

summary: str

```

2. LLM 호출 및 요약 노드 정의:

- LLM을 호출하여 메시지에 요약을 통합하고, 일정 메시지 수 이상일 때 요약을 생성합니다.

```python

from langchain_core.messages import SystemMessage, HumanMessage, RemoveMessage

def call_model(state: State):

summary = state.get("summary", "")

messages = [SystemMessage(content=f"Summary: {summary}")] + state["messages"] if summary else state["messages"]

response = model.invoke(messages)

return {"messages": response}

def summarize_conversation(state: State):

summary_prompt = f"Create a summary of the conversation: {state.get('summary', '')}"

response = model.invoke(state["messages"] + [HumanMessage(content=summary_prompt)])

delete_messages = [RemoveMessage(id=m.id) for m in state["messages"][:-2]]

return {"summary": response.content, "messages": delete_messages}

```

3. 메모리 및 그래프 빌드:

- MemorySaver 체크포인터를 사용하여 대화 상태를 저장하고, 스레드 ID로 대화를 관리합니다.

```python

from langgraph.checkpoint.memory import MemorySaver

from langgraph.graph import StateGraph, START, END

from IPython.display import Image, display

def should_continue(state: State):

return "summarize_conversation" if len(state["messages"]) > 6 else END

builder = StateGraph(State)

builder.add_node("conversation", call_model)

builder.add_node("summarize_conversation", summarize_conversation)

builder.add_edge(START, "conversation")

builder.add_conditional_edges("conversation", should_continue)

builder.add_edge("summarize_conversation", END)

memory = MemorySaver()

graph = builder.compile(checkpointer=memory)

display(Image(graph.get_graph().draw_mermaid_png()))

```

4. 대화 시작 및 스레드 관리:

- 동일한 thread_id를 사용하여 대화를 이어가고 요약을 적용합니다.

```python

config = {"configurable": {"thread_id": "1"}}

# 초기 대화

messages = [HumanMessage(content="Add 3 and 4.")]

messages = graph.invoke({"messages": messages}, config)

for m in messages['messages']:

m.pretty_print()

# 이어지는 대화

messages = [HumanMessage(content="Multiply that by 2.")]

messages = graph.invoke({"messages": messages}, config)

for m in messages['messages']:

m.pretty_print()

```

결론

- 효율적인 대화 관리: LangGraph를 통해 대화를 요약하고 메모리를 도입하여 장기 대화를 효율적으로 관리할 수 있습니다.

- 비용 절감 및 성능 향상: 대화 요약을 통해 토큰 사용량과 응답 시간을 줄여줍니다.

- 유연한 대화 흐름 제어: 조건부 로직과 스레드를 활용하여 다양한 대화 시나리오를 유연하게 처리할 수 있습니다.


랭그래프, AI 에이전트 구현에 관심이 생겼나요?

->지금바로 랭그래프 스터디에 관심이 있다면 신청해주세요!

주황색 배경의 한국 광고

지피터스 13기 스터디 신청링크

2

👉 이 게시글도 읽어보세요