배경 및 목적
이번 13기 AI 스터디에 앞서, 1DAY 1랭그래프, 즉 하루에 1개의 랭그래프 개념을 설명하는 부분을 기획하게 됐습니다.
-> 랭그래프 스터디에 관심이 있다면 신청해주세요!
주황색 배경의 한국 광고
스터디 신청링크
이 프로젝트의 목표는 랭그래프를 쉽게 입문하실 수 있게 상세한 개념부터 코드까지 함께 공부해보실 수 있게 정리해서 드릴 예정입니다.
저는 랭그래프를 처음들어봐요!, 1일차 글을 보고 싶다면!?
-> 링크로 접속하기!
참고 자료
활용 툴
파이썬, 코랩, 랭그래프, 랭체인
핵심 요약: LangGraph를 활용한 에이전트 메모리 구축
0. 핵심 내용
이번엔 3일차에 이어 agent memory 내용입니다.
채팅 도구와 바운드 도구
여러분들이 chatGPT를 사용하면서 가장 좋게 느껴지는 부분은, 바로 위에서 채팅했던 내역을 기억하여 다음에 나올 답변에 그 맥락이 포함돼있다는 것일텐데요,
저희가 만드는 Agent에 맥락을 추가시키기 위해 agent memory 기능을 추가할 수 있습니다.
프로젝트의 다양한 단계를 보여주는 다이어그램
쓰레드 id를 통해, 체크포인트를 불러와서 맥락을 추가할 수 있습니다.
# 스레드를 지정합니다.
config = {"configurable": {"thread_id": "1"}}
# 입력을 지정합니다.
messages = [HumanMessage(content="Add 3 and 4.")]
# 그래프를 호출하여 메시지를 전달하고, 결과를 messages 변수에 저장합니다.
messages = react_graph_memory.invoke({"messages": messages}, config)
# 각 메시지를 예쁘게 출력합니다.
for m in messages['messages']:
m.pretty_print()
-> 위 코드가 가장 핵심적인 쓰레드를 지정하고, 그 쓰레드에 메세지를 입력하는 부분입니다.
# "Multiply that by 2."라는 메시지를 생성합니다.
messages = [HumanMessage(content="Multiply that by 2.")]
# 동일한 `thread_id`를 사용하여 그래프를 호출하고 메시지를 전달합니다.
messages = react_graph_memory.invoke({"messages": messages}, config)
# 각 메시지를 예쁘게 출력합니다.
for m in messages['messages']:
m.pretty_print()-> 그리고 위해서 계산한 3+4 = 7 의 부분에 *2를 해라라고 했을 때,
위에서 진행됐던 쓰레드 id인 1을 호출하게 되고, 맥락을 알아차려 7 * 2 가 행하게 됩니다.
Python 스크립트의 스크린샷
더 자세한 내용은 밑에를 참고해주세요 🙂
1. 소개 및 검토
- 목표: 이전에 구축한 에이전트가 act, observe, reason 기능을 통해 도구 호출과 자연어 응답을 처리할 수 있었던 것을 바탕으로, 에이전트에 메모리를 도입하여 멀티턴 대화를 가능하게 합니다.
- 기능:
- 도구 호출 반환
- 자연어 응답 반환
2. 환경 설정
- 라이브러리 설치: langchain_openai, langchain_core, langgraph 라이브러리를 설치합니다.
%%capture --no-stderr
%pip install --quiet -U langchain_openai langchain_core langgraph
```
- API 키 설정: OpenAI와 LangChain의 API 키를 설정하여 모델과의 연동을 준비합니다.
```python
import os, getpass
def setenv(var: str):
if not os.environ.get(var):
os.environ[var] = getpass.getpass(f"{var}: ")
setenv("OPENAI_API_KEY")
setenv("LANGCHAIN_API_KEY")
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "langchain-academy"3. 도구 정의 및 바인딩
- 도구 함수 정의: 덧셈, 곱셈, 나눗셈을 수행하는 함수를 정의합니다.
from langchain_openai import ChatOpenAI
def multiply(a: int, b: int) -> int:
return a * b
def add(a: int, b: int) -> int:
return a + b
def divide(a: int, b: int) -> float:
return a / b
tools = [add, multiply, divide]
llm = ChatOpenAI(model="gpt-4o")
llm_with_tools = llm.bind_tools(tools)4. 그래프 구축
- 상태 정의: MessagesState를 통해 메시지 리스트를 상태로 관리합니다.
from langgraph.graph import MessagesState
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
# 시스템 메시지 정의
sys_msg = SystemMessage(content="You are a helpful assistant tasked with performing arithmetic on a set of inputs.")
# 에이전트 노드 정의
def assistant(state: MessagesState):
return {"messages": [llm_with_tools.invoke([sys_msg] + state["messages"])]}- 그래프 빌드: 에이전트 노드와 도구 노드를 추가하고, 조건부 에지를 통해 흐름을 제어합니다.
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import tools_condition, ToolNode
from IPython.display import Image, display
# 그래프 빌더 초기화
builder = StateGraph(MessagesState)
# 노드 추가
builder.add_node("assistant", assistant)
builder.add_node("tools", ToolNode(tools))
# 에지 추가
builder.add_edge(START, "assistant")
builder.add_conditional_edges(
"assistant",
tools_condition,
)
builder.add_edge("tools", "assistant")
# 그래프 컴파일
react_graph = builder.compile()
# 그래프 시각화
display(Image(react_graph.get_graph(xray=True).draw_mermaid_png()))5. 그래프 실행
- 도구 호출 없이 응답 실행:
from langchain_core.messages import HumanMessage
messages = [HumanMessage(content="Add 3 and 4.")]
messages = react_graph.invoke({"messages": messages})
for m in messages['messages']:
m.pretty_print()- 도구 호출 포함 응답 실행:
messages = [HumanMessage(content="Multiply that by 2.")]
messages = react_graph.invoke({"messages": messages})
for m in messages['messages']:
m.pretty_print()6. 메모리 도입
- 지속성 설정: MemorySaver 체크포인터를 사용하여 그래프 상태를 저장하고, 멀티턴 대화를 지원합니다.
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
react_graph_memory = builder.compile(checkpointer=memory)- 스레드 지정 및 그래프 호출: 동일한 thread_id를 사용하여 이전 상태를 유지하며 대화를 이어갑니다.
# 스레드를 지정합니다.
config = {"configurable": {"thread_id": "1"}}
# 초기 메시지 실행
messages = [HumanMessage(content="Add 3 and 4.")]
messages = react_graph_memory.invoke({"messages": messages}, config)
for m in messages['messages']:
m.pretty_print()
# 이어서 메시지 실행
messages = [HumanMessage(content="Multiply that by 2.")]
messages = react_graph_memory.invoke({"messages": messages}, config)
for m in messages['messages']:
m.pretty_print()7. 결론
- 메모리 도입의 효과: 지속성을 통해 에이전트가 이전 대화 상태를 기억하여 더 자연스러운 멀티턴 대화를 가능하게 합니다.
- LangGraph의 장점: 체크 포인터를 통한 상태 관리로 복잡한 대화 흐름을 효과적으로 제어할 수 있습니다.
랭그래프, AI 에이전트 구현에 관심이 생겼나요?
->지금바로 랭그래프 스터디에 관심이 있다면 신청해주세요!
주황색 배경의 한국 광고
지피터스 13기 스터디 신청링크