배경 및 목적
이번 13기 AI 스터디에 앞서, 1DAY 1랭그래프, 즉 하루에 1개의 랭그래프 개념을 설명하는 부분을 기획하게 됐습니다.
-> 랭그래프 스터디에 관심이 있다 면 신청해주세요!
주황색 배경의 한국 광고
스터디 신청링크
이 프로젝트의 목표는 랭그래프를 쉽게 입문하실 수 있게 상세한 개념부터 코드까지 함께 공부해보실 수 있게 정리해서 드릴 예정입니다.
저는 랭그래프를 처음들어봐요!, 1일차 글을 보고 싶다면!?
-> 링크로 접속하기!
참고 자료
활용 툴
파이썬, 코랩, 랭그래프, 랭체인
핵심 요약: 메시지 요약 기능을 갖춘 LangGraph 챗봇 구축
핵심 내용:
대화 요약 통합: LangGraph와 LLM을 사용하여 대화의 실행 요약을 생성함으로써 전체 대화를 압축된 형태로 유지하고 토큰 비용과 지연 시간을 절감합니다.
메모리 및 지속성 도입:
MemorySaver체크포인터를 활용하여 그래프 상태를 자동으로 저장하고, 스레드 ID를 통해 장기적이고 연속적인 멀티턴 대화를 지원합니다. (지속적인 대화 내용을 기반으로 하는 채팅 구현을 위해서 메모리 및 지속성은 꼭 필요한 개념입니다.)조건부 로직 활용: 메시지 수가 특정 기준을 초과할 때 자동으로 대화를 요약하는 조건부 에지를 설정하여 대화 흐름을 효율적으로 관리합니다. (코랩 예제에서는 6번의 대화를 진행했다면, 지금까지 했던 대화를 요약하기 시작합니다.)
대화의 흐름도
-> 6번의 이상 대화를 한 경우에만 summarize_conversation을 호출하여 대화를 요약 합니다.
1. 상태 스키마 정의:
- MessagesState에 summary 키를 추가하여 대화 요약을 저장합니다.
```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기 스터디 신청링크