langgraph / / 2024. 12. 1. 18:03

[langgraph] 그래프의 전체 상태를 스트리밍하는 방법

LangGraph 공식문서를 번역한 내용입니다. 필요한 경우 부연 설명을 추가하였고 이해하기 쉽게 예제를 일부 변경하였습니다. 문제가 되면 삭제하겠습니다.

https://langchain-ai.github.io/langgraph/how-tos/stream-values/

LangGraph는 여러 스트리밍 모드를 지원한다. 주요 모드는 다음과 같다.

  • values: 이 스트리밍 모드는 그래프의 값을 스트리밍한다. 이는 각 노드가 호출된 후 그래프의 전체 상태이다.
  • updates: 이 스트리밍 모드는 그래프에 대한 업데이트를 스트리밍한다. 이는 각 노드가 호출된 후 그래프 상태에 대한 업데이트이다.

여기서는 stream_mode="values"에 대해 설명한다.

준비

우선, 필요한 패키지를 설치하자.

pip install langgraph langchain-openai langchain-community

그래프 정의

이 가이드에서는 간단한 ReAct 에이전트를 사용한다.

import asyncio
from typing import Literal

from dotenv import load_dotenv
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

load_dotenv()


@tool
def get_weather(city: Literal["서울", "부산"]):
    """Use this to get weather information."""
    if city == "서울":
        return "서울은 흐릴것 같아요"
    elif city == "부산":
        return "부산은 항상 맑아요"
    else:
        raise AssertionError("Unknown city")


tools = [get_weather]

model = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)
graph = create_react_agent(model, tools)

Stream values

inputs = {"messages": [("human", "서울 날씨 어때?")]}


async def stream_async():
    async for chunk in graph.astream(inputs, stream_mode="values"):
        chunk["messages"][-1].pretty_print()


asyncio.run(stream_async())
================================ Human Message =================================

서울 날씨 어때?
================================== Ai Message ==================================
Tool Calls:
  get_weather (call_uQVwJsxzpMECGD6wRja0qP33)
 Call ID: call_uQVwJsxzpMECGD6wRja0qP33
  Args:
    city: 서울
================================= Tool Message =================================
Name: get_weather

서울은 흐릴것 같아요
================================== Ai Message ==================================

서울은 흐릴 것 같습니다.

최종 결과만 얻고 싶다면, 동일한 방법을 사용하고 마지막으로 받은 값을 추적하면 된다.

inputs = {"messages": [("human", "서울 날씨 어때?")]}


async def stream_async():
    async for chunk in graph.astream(inputs, stream_mode="values"):
        final_result = chunk

    print(final_result)
    final_result["messages"][-1].pretty_print()

asyncio.run(stream_async())
{'messages': [HumanMessage(content='서울 날씨 어때?', additional_kwargs={}, response_metadata={}, id='bc4c7236-c4c5-4107-a920-34a6d58f1b90'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_87XBaGtOjzGKk9NnqBSoBl8I', 'function': {'arguments': '{"city":"서울"}', 'name': 'get_weather'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 14, 'prompt_tokens': 57, 'total_tokens': 71, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_0705bf87c0', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-e4f11c04-2cac-48d4-ade0-8f3f6f9bad26-0', tool_calls=[{'name': 'get_weather', 'args': {'city': '서울'}, 'id': 'call_87XBaGtOjzGKk9NnqBSoBl8I', 'type': 'tool_call'}], usage_metadata={'input_tokens': 57, 'output_tokens': 14, 'total_tokens': 71, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}), ToolMessage(content='서울은 흐릴것 같아요', name='get_weather', id='511cd5df-9cf8-4211-8150-fed977d3f1ae', tool_call_id='call_87XBaGtOjzGKk9NnqBSoBl8I'), AIMessage(content='서울은 흐릴 것 같습니다. 추가적인 날씨 정보가 필요하시면 말씀해 주세요!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 21, 'prompt_tokens': 86, 'total_tokens': 107, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_0705bf87c0', 'finish_reason': 'stop', 'logprobs': None}, id='run-01a2e5d7-0434-4110-b1fd-544d948851e9-0', usage_metadata={'input_tokens': 86, 'output_tokens': 21, 'total_tokens': 107, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}
================================== Ai Message ==================================

서울은 흐릴 것 같습니다. 추가적인 날씨 정보가 필요하시면 말씀해 주세요!
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유