LangGraph 공식문서를 번역한 내용입니다. 필요한 경우 부연 설명을 추가하였고 이해하기 쉽게 예제를 일부 변경하였습니다. 문제가 되면 삭제하겠습니다.
https://langchain-ai.github.io/langgraph/how-tos/create-react-agent-hitl/
이 가이드는 ReAct 에이전트에 사람이 개입하는 프로세스를 추가하는 방법을 보여준다. ReAct 에이전트를 시작하는 방법에 대한 튜토리얼은 이 링크를 참조하자.
도구가 호출되기 전에 중단점을 추가하려면 create_react_agent
에 interrupt_before=["tools"]
를 전달하면 된다. 이 기능이 작동하려면 체크포인터를 사용해야 한다.
준비
우선, 필요한 패키지를 설치하자.
pip install langgraph langchain-openai
코드
# First we initialize the model we want to use.
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# For this tutorial we will use custom tool that returns pre-defined values for weather in two cities (NYC & SF)
from typing import Literal
from langchain_core.tools import tool
@tool
def get_weather(location: str):
"""Use this to get weather information from a given location."""
if location.lower() in ["nyc", "new york"]:
return "nyc는 흐린거 같아요"
elif location.lower() in ["sf", "san francisco"]:
return "sf는 항상 맑아요"
else:
raise AssertionError("Unknown Location")
tools = [get_weather]
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
from langgraph.prebuilt import create_react_agent
graph = create_react_agent(
model, tools=tools, interrupt_before=["tools"], checkpointer=memory
)
사용
def print_stream(stream):
"""A utility to pretty print the stream."""
for s in stream:
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
from langchain_core.messages import HumanMessage
config = {"configurable": {"thread_id": "42"}}
inputs = {"messages": [("user", "SF, CA 날씨 어때?")]}
print_stream(graph.stream(inputs, config, stream_mode="values"))
================================ Human Message =================================
SF, CA 날씨 어때?
================================== Ai Message ==================================
Tool Calls:
get_weather (call_pQM9dwr0sU0HP5SNRFtsA1VO)
Call ID: call_pQM9dwr0sU0HP5SNRFtsA1VO
Args:
location: San Francisco, CA
그래프가 올바른 곳에서 멈춘것을 확인할 수 있다.
snapshot = graph.get_state(config)
print("Next step: ", snapshot.next)
Next step: ('tools',)
이제 도구 호출을 승인하거나 수정한 후 다음 노드로 진행할 수 있다. 도구 호출을 승인하려면 간단히 None
입력으로 그래프 스트리밍을 계속하면 된다. 도구 호출을 수정하려면 상태를 업데이트하여 올바른 도구 호출을 반영한 후, 업데이트가 적용되면 계속 진행할 수 있다.
다시 실행을 시도하면 오류가 발생하는 것을 볼 수 있다.
print_stream(graph.stream(None, config, stream_mode="values"))
================================== Ai Message ==================================
Tool Calls:
get_weather (call_pQM9dwr0sU0HP5SNRFtsA1VO)
Call ID: call_pQM9dwr0sU0HP5SNRFtsA1VO
Args:
location: San Francisco, CA
================================= Tool Message =================================
Name: get_weather
Error: AssertionError('Unknown Location')
Please fix your mistakes.
================================== Ai Message ==================================
Tool Calls:
get_weather (call_YyXwvyPckskhNoY80WE1FhN1)
Call ID: call_YyXwvyPckskhNoY80WE1FhN1
Args:
location: San Francisco
이 오류는 "San Francisco, CA"라는 도구 인수가 도구에서 인식하지 못하는 위치였기 때문에 발생했다. 이제 "San Francisco, CA" 대신 "San Francisco"를 검색하도록 도구 호출을 수정하는 방법을 보여주겠다. 현재 도구는 "San Francisco, CA"를 알 수 없는 위치로 처리한다. 상태를 업데이트한 후 그래프 스트리밍을 계속하면 오류 없이 진행되는 것을 볼 수 있다.
state = graph.get_state(config)
last_message = state.values["messages"][-1]
last_message.tool_calls[0]["args"] = {"location": "San Francisco"}
graph.update_state(config, {"messages": [last_message]})
{'configurable': {'thread_id': '42', 'checkpoint_ns': '', 'checkpoint_id': '1efb0f8a-4ac7-6eb8-8004-7e34116e51c0'}}
print_stream(graph.stream(None, config, stream_mode="values"))
================================== Ai Message ==================================
Tool Calls:
get_weather (call_YyXwvyPckskhNoY80WE1FhN1)
Call ID: call_YyXwvyPckskhNoY80WE1FhN1
Args:
location: San Francisco
================================= Tool Message =================================
Name: get_weather
sf는 항상 맑아요
================================== Ai Message ==================================
샌프란시스코(San Francisco)는 항상 맑은 날씨를 자랑합니다! 다른 궁금한 점이 있으면 말씀해 주세요.
그래프는 샌프란시스코의 날씨를 조회하도록 제대로 업데이트되었고, 도구에서 "샌프란시스코는 항상 맑아요"라는 올바른 응답을 받았으며, 그에 맞게 사용자에게 응답을 했다.
LangGraph 참고 자료
- Controllability
- Persistence
- Memory
- Human-in-the-loop
- Streaming
- Tool calling
- Subgraphs
- State Management
- Other
- Prebuilt ReAct Agent