스트리밍(Sstreaming)
복습
모듈 2에서는 그래프 상태와 메모리를 사용자 정의하는 몇 가지 방법을 다뤘습니다.
장기간 대화를 지속할 수 있는 외부 메모리를 가진 챗봇을 구축하는 단계까지 진행했습니다.
목표
이 모듈에서는 메모리를 기반으로 구축되어 사용자가 다양한 방식으로 그래프와 직접 상호작용할 수 있게 해주는 human-in-the-loop에 대해 자세히 살펴보겠습니다.
human-in-the-loop의 기반을 마련하기 위해, 먼저 실행 과정에서 그래프 출력(예: 노드 상태 또는 채팅 모델 토큰)을 시각화하는 여러 방법을 제공하는 스트리밍에 대해 자세히 알아보겠습니다.
%%capture --no-stderr
%pip install --quiet -U langgraph langchain_openai langgraph_sdk스트리밍
LangGraph는 스트리밍에 대한 최상위 지원으로 구축되었습니다.
모듈 2의 챗봇을 설정하고, 실행 중에 그래프에서 출력을 스트리밍하는 다양한 방법을 보여드리겠습니다.
from dotenv import load_dotenv
load_dotenv("../.env", override=True)True
import os
import getpass
def _set_env(var: str):
if not os.environ.get(var):
os.environ[var] = getpass.getpass(f"{var}: ")
_set_env("OPENAI_API_KEY")Python 3.11 미만에서 토큰 단위 스트리밍을 활성화하기 위해 call_model과 함께 RunnableConfig를 사용한다는 점에 유의하세요. 이는 Python < 3.11에서만 필요합니다. Python 3.x를 사용하는 CoLab에서 이 노트북을 실행하는 경우를 대비하여 포함했습니다.
from typing import Annotated, Optional
from IPython.display import Image, display
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, RemoveMessage
from langchain_core.runnables import RunnableConfig
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph, START, END
from langgraph.graph import MessagesState
# LLM
model = ChatOpenAI(model="gpt-4o", temperature=0)
# State
class State(MessagesState):
summary: Annotated[Optional[str], "summary"]
# 모델 호출 로직 정의
def call_model(state: State, config: RunnableConfig):
# 요약이 존재하면 가져오기
summary = state.get("summary", "")
# 요약이 있다면 추가합니다
if summary:
# 시스템 메시지에 요약 추가
system_message = f"이전 대화 요약: {summary}"
# 요약문을 최신 메시지에 추가하십시오
messages = [SystemMessage(content=system_message)] + state["messages"]
else:
messages = state["messages"]
response = model.invoke(messages, config)
return {"messages": response}
def summarize_conversation(state: State):
# 먼저, 기존 요약문을 가져옵니다.
summary = state.get("summary", "")
# 요약 프롬프트 생성
if summary:
# 요약본이 이미 존재합니다
summary_message = (
f"지금까지의 대화 요약입니다: {summary}\n\n"
"위의 새로운 메시지를 고려하여 요약을 확장하십시오.:"
)
else:
summary_message = "위의 대화 내용을 요약하세요.:"
# 우리의 기록에 프롬프트를 추가하세요
messages = state["messages"] + [HumanMessage(content=summary_message)]
response = model.invoke(messages)
# 가장 최근의 2개 메시지를 제외한 모든 메시지를 삭제하세요
delete_messages = [RemoveMessage(id=m.id) for m in state["messages"][:-2]]
return {"summary": response.content, "messages": delete_messages}
# 대화를 종료할지 요약할지 결정하십시오
def should_continue(state: State):
"""Return the next node to execute."""
messages = state["messages"]
# 메시지가 여섯 개 이상일 경우 대화를 요약합니다
if len(messages) > 6:
return "summarize_conversation"
# 그렇지 않으면 그냥 끝낼 수 있다
return END
workflow = StateGraph(State)
workflow.add_node("conversation", call_model)
workflow.add_node("summarize_conversation", summarize_conversation)
workflow.set_entry_point("conversation")
workflow.add_conditional_edges(
"conversation",
should_continue,
{
"summarize_conversation": "summarize_conversation",
END: END,
},
)
workflow.set_finish_point("summarize_conversation")
memory = MemorySaver()
graph = workflow.compile(checkpointer=memory)
display(Image(graph.get_graph().draw_mermaid_png()))
전체 상태 스트리밍
이제 그래프 상태를 스트리밍하는 방법에 대해 알아보겠습니다.
.stream과 .astream은 결과를 스트리밍하여 반환하는 동기 및 비동기 메서드입니다.
LangGraph는 그래프 상태에 대해 몇 가지 다른 스트리밍 모드를 지원합니다:
values: 각 노드가 호출된 후 그래프의 전체 상태를 스트리밍합니다.updates: 각 노드가 호출된 후 그래프 상태의 업데이트만을 스트리밍합니다.

stream_mode="updates"를 살펴보겠습니다.
updates로 스트리밍하기 때문에, 그래프의 각 노드가 실행된 후의 상태 업데이트만을 볼 수 있습니다.
각 chunk는 node_name을 키로 하고 업데이트된 상태를 값으로 하는 딕셔너리입니다.
from langchain_core.runnables import RunnableConfig
config = RunnableConfig(configurable={"thread_id": "1"})
input = State(
messages=[HumanMessage(content="안녕하세요! 저는 랜스입니다.")],
summary="",
)
for chunk in graph.stream(input, config, stream_mode="updates"):
print(chunk){'conversation': {'messages': AIMessage(content='안녕하세요, 랜스님! 만나서 반갑습니다. 어떻게 도와드릴까요?', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 20, 'prompt_tokens': 15, 'total_tokens': 35, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLgUL4F1KbNCeJGGEgN5nqaACaIYm', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, id='run--cacb66a0-82ec-4a79-8b6f-f5d53a0b310b-0', usage_metadata={'input_tokens': 15, 'output_tokens': 20, 'total_tokens': 35, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})}}
이제 state update를 출력해 보겠습니다.
for chunk in graph.stream(input, config, stream_mode="updates"):
chunk["conversation"]["messages"].pretty_print()==================================[1m Ai Message [0m==================================
안녕하세요, 랜스님! 만나서 반갑습니다. 어떻게 도와드릴까요?
이제 stream_mode="values"를 볼 수 있습니다.
이것은 conversation 노드가 호출된 후의 그래프의 full state입니다.
# 대화를 새로 시작합니다.
config = RunnableConfig(configurable={"thread_id": "2"})
# 대화 시작
input_message = HumanMessage(content="안녕하세요! 저는 랜스입니다.")
for event in graph.stream(
{"messages": [input_message], "summary": ""},
config,
stream_mode="values",
):
for m in event["messages"]:
m.pretty_print()
print("---" * 25)================================[1m Human Message [0m=================================
안녕하세요! 저는 랜스입니다.
---------------------------------------------------------------------------
================================[1m Human Message [0m=================================
안녕하세요! 저는 랜스입니다.
==================================[1m Ai Message [0m==================================
안녕하세요, 랜스님! 만나서 반갑습니다. 어떻게 도와드릴까요?
---------------------------------------------------------------------------
스트리밍 토큰
우리는 종종 그래프 상태보다 더 많은 것을 스트리밍하고 싶어합니다.
특히, 채팅 모델 호출 시 토큰이 생성되는 대로 스트리밍하는 것이 일반적입니다.
우리는 .astream_events 메서드를 사용하여 이를 수행할 수 있습니다. 이 메서드는 노드 내부에서 발생하는 이벤트를 실시간으로 스트리밍합니다!
각 이벤트는 몇 개의 키를 가진 딕셔너리입니다:
event: 방출되는 이벤트의 유형입니다.name: 이벤트의 이름입니다.data: 이벤트와 연관된 데이터입니다.metadata: 이벤트를 방출하는 노드인langgraph_node를 포함합니다.
살펴보겠습니다.
config = RunnableConfig(configurable={"thread_id": "3"})
input_message = HumanMessage(content="49ers NFL 팀에 대해 알려주세요.")
async for event in graph.astream_events(
{"messages": [input_message]}, config, version="v2"
):
print(
f"Node: {event['metadata'].get('langgraph_node', '')}. Type: {event['event']}. Name: {event['name']}"
)Node: . Type: on_chain_start. Name: LangGraph
Node: conversation. Type: on_chain_start. Name: conversation
Node: conversation. Type: on_chat_model_start. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_stream. Name: ChatOpenAI
Node: conversation. Type: on_chat_model_end. Name: ChatOpenAI
Node: conversation. Type: on_chain_start. Name: should_continue
Node: conversation. Type: on_chain_end. Name: should_continue
Node: conversation. Type: on_chain_stream. Name: conversation
Node: conversation. Type: on_chain_end. Name: conversation
Node: . Type: on_chain_stream. Name: LangGraph
Node: . Type: on_chain_end. Name: LangGraph
핵심은 그래프 내 채팅 모델에서 나오는 토큰들이 on_chat_model_stream 타입을 가진다는 것입니다.
event['metadata']['langgraph_node']를 사용하여 스트리밍할 노드를 선택할 수 있습니다.
그리고 event['data']를 사용하여 각 이벤트의 실제 데이터를 가져올 수 있으며, 이 경우에는 AIMessageChunk입니다.
config = RunnableConfig(configurable={"thread_id": "4"})
async for event in graph.astream_events(
{"messages": [HumanMessage(content="49ers NFL 팀에 대해 알려주세요.")]},
config,
version="v2",
):
# 특정 노드(conversation)로부터 토큰 청크을 가져와서 출력합니다.
if (
event["event"] == "on_chat_model_stream"
and event["metadata"].get("langgraph_node", "") == "conversation"
):
print(event["data"]){'chunk': AIMessageChunk(content='', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='샌', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='프', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='란', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='시', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='코', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='49', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='ers', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(S', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='an', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' Francisco', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='49', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='ers', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 미국', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 프로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 풋', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 리', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='그', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(N', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='FL', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 캘', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='리', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='포', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='니', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='아', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='주', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 샌', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='타', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='클', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='래', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='라', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 위치', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='한', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 리', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='바', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 스타', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='디', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='움', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='Le', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='vi', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content="'s", additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' Stadium', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 홈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='구', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='장', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 사용', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='하고', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 있습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='은', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='194', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='6', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='년에', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 창', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='단', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='되', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='었', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으며', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' NFL', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 내', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='셔', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='널', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 풋', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 컨', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='런', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(N', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='FC', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 서', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='부', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 지', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='구', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 속', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='해', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 있습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='###', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 주요', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 성', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='과', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' **', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='슈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 우', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='승', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='**', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=':', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='49', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='ers', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 총', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='5', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='번', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 슈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에서', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 우', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='승', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='했습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' (', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='198', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='1', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='198', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='4', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='198', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='8', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='198', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='9', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='199', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='4', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 시즌', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' **', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='컨', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='런', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 챔', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='피', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='언', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='십', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='**', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=':', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 여러', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 차', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='례', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' NFC', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 챔', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='피', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='언', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='십', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 진', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='출', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='하여', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 우', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='승', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 차', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='지', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='했습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' **', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='디', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='비', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='전', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 타', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='틀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='**', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=':', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' NFC', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 서', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='부', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 지', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='구', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에서', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 여러', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 차', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='례', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 우', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='승', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 차', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='지', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='했습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='###', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 색', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='상', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 빨', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='간', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='색', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 금', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='색', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 흰', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='색', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='###', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 주요', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 라이', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='벌', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 댈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='러스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 카', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='우', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='보', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 그', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='린', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='베', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 패', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='커', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 시', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='애', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='틀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 시', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='호', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='크', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='앤', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='젤', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='레스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 램', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='###', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 역사', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='적', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 인', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='물', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' **', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='조', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 몬', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='타', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='나', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(J', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='oe', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' Montana', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')**', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=':', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 전', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='설', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='적인', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 쿼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='터', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='백', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='49', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='ers', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 여러', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 슈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 우', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='승', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 이', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='끌', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='었습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' **', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='제', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='리', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 라', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(J', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='erry', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' Rice', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')**', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=':', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' NFL', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 역사', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='상', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 최고의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 와', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이드', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 리', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='시', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='버', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 중', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 한', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 명', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 평가', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='받', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='-', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' **', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='티', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='브', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 영', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='(S', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='teve', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' Young', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=')**', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=':', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 몬', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='타', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='나', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 뒤', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='를', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 이어', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 이', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='끈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 쿼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='터', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='백', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 슈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' MVP', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='를', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 수', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='상', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='했습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='###', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 최근', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 동', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='향', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='최근', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 몇', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 년', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='간', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='49', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='ers', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 다시', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 경쟁', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='력', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 있는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 부', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='상', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='하고', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 있으며', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' ', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='201', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='9', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 시즌', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 슈', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='퍼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='볼', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 진', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='출', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='하기', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='도', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 했', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='은', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 강', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='력', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='한', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 수', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='비', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='와', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 효', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='율', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='적인', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 공격', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 바', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='탕', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 꾸', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='준', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='히', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 플레이', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='오', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='프', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 진', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='출', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 노', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='리고', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 있습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.\n\n', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='49', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='ers', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 전', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='통', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='과', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 역', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='사를', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 자', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='랑', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='하는', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팬', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='들에게', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 많은', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 사랑', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 받고', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 있습니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 팀', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 성공', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='은', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 뛰', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='어난', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 선수', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='들과', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 코', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='칭', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 스', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='태', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='프', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='의', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 노력', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 덕', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='분', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='이며', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=',', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 앞으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='도', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' NFL', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='에서', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 중요한', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 역할', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='을', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 할', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 것으로', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content=' 기대', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='됩니다', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='.', additional_kwargs={}, response_metadata={}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
{'chunk': AIMessageChunk(content='', additional_kwargs={}, response_metadata={'finish_reason': 'stop', 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'service_tier': 'default'}, id='run--aa01674d-bcc2-4d92-a1f9-429d6524421b')}
위에서 볼 수 있듯이, AIMessageChunk를 가져오려면 그냥 chunk 키를 사용하면 됩니다.
config = RunnableConfig(configurable={"thread_id": "5"})
input_message = HumanMessage(content="49ers NFL 팀에 대해 알려주세요.")
async for event in graph.astream_events(
{"messages": [input_message]},
config,
version="v2",
):
# 특정 노드로부터 채팅 모델 토큰을 가져옵니다 특정 노드에서 채팅 모델 토큰을 가져옵니다
if (
event["event"] == "on_chat_model_stream"
and event["metadata"].get("langgraph_node", "") == "conversation"
):
data = event["data"]
print(data["chunk"].content, end="", flush=True)샌프란시스코 포티나이너스(San Francisco 49ers)는 미국 프로 풋볼 리그(NFL)의 팀 중 하나로, 캘리포니아주 샌타클래라에 본거지를 두고 있습니다. 팀은 1946년에 창단되었으며, NFL의 내셔널 풋볼 컨퍼런스(NFC) 서부 지구에 속해 있습니다. 포티나이너스는 NFL 역사상 가장 성공적인 팀 중 하나로, 여러 차례 슈퍼볼 우승을 차지한 바 있습니다.
### 주요 정보:
- **슈퍼볼 우승**: 포티나이너스는 총 5번의 슈퍼볼에서 우승했습니다. (1981, 1984, 1988, 1989, 1994 시즌)
- **팀 컬러**: 빨간색, 금색
- **홈구장**: 리바이스 스타디움(Levi's Stadium), 2014년부터 사용
- **주요 라이벌**: 댈러스 카우보이스, 시애틀 시호크스, 그린베이 패커스 등
### 역사:
포티나이너스는 1980년대와 1990년대 초반에 걸쳐 전성기를 누렸으며, 이 시기에 조 몬타나(Joe Montana), 제리 라이스(Jerry Rice), 스티브 영(Steve Young)과 같은 전설적인 선수들이 활약했습니다. 이들은 팀의 성공에 크게 기여하며 NFL 역사에 길이 남을 명성을 쌓았습니다.
### 최근 동향:
최근 몇 년간 포티나이너스는 다시 경쟁력 있는 팀으로 자리매김하기 위해 노력하고 있으며, 젊은 선수들과 유능한 코칭 스태프를 통해 팀의 재건을 도모하고 있습니다. 2019 시즌에는 슈퍼볼 LIV에 진출하기도 했습니다.
포티나이너스는 전통과 혁신을 겸비한 팀으로, 팬들에게 많은 사랑을 받고 있습니다.
LangGraph API를 이용한 스트리밍
이 모듈의 /studio 디렉토리에서 터미널에 다음 명령어를 실행하세요:
langgraph dev다음과 같은 출력이 표시됩니다:
- 🚀 API: http://127.0.0.1:2024
- 🎨 Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
- 📚 API Docs: http://127.0.0.1:2024/docs브라우저를 열고 Studio UI로 이동하세요: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
LangGraph API는 그래프 상태 편집을 지원합니다.
from langgraph_sdk import get_client
client = get_client(url="http://127.0.0.1:2024")
# 호스팅된 모든 그래프 검색
assistants = await client.assistants.search()
assistants[{'assistant_id': '6f6fce9a-b777-529d-9699-dd340ddec86c',
'graph_id': 'dynamic_breakpoints',
'config': {},
'context': {},
'metadata': {'created_by': 'system'},
'name': 'dynamic_breakpoints',
'created_at': '2025-10-01T02:35:53.227003+00:00',
'updated_at': '2025-10-01T02:35:53.227003+00:00',
'version': 1,
'description': None},
{'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca',
'graph_id': 'agent',
'config': {},
'context': {},
'metadata': {'created_by': 'system'},
'name': 'agent',
'created_at': '2025-10-01T02:35:53.225400+00:00',
'updated_at': '2025-10-01T02:35:53.225400+00:00',
'version': 1,
'description': None}]
이전과 마찬가지로 values를 stream해 봅시다.
# 새 스레드 생성
thread = await client.threads.create()
thread{'thread_id': '986a79bf-bf35-4760-af78-1bd7c8b9c40e',
'created_at': '2025-10-01T02:38:22.436546+00:00',
'updated_at': '2025-10-01T02:38:22.436553+00:00',
'metadata': {},
'status': 'idle',
'config': {},
'values': None}
# 입력 메시지
input_message = HumanMessage(content="2와 3을 곱하세요")
async for event in client.runs.stream(
thread["thread_id"],
assistant_id="agent",
input={"messages": [input_message]},
stream_mode="values",
):
print(event)StreamPart(event='metadata', data={'run_id': '01999da1-b945-7206-96ef-fc92e99cee6e', 'attempt': 1})
StreamPart(event='values', data={'messages': [{'content': '2와 3을 곱하세요', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'a83361fa-7675-4b43-b55a-7cf425ead090', 'example': False}]})
StreamPart(event='values', data={'messages': [{'content': '2와 3을 곱하세요', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'a83361fa-7675-4b43-b55a-7cf425ead090', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'function': {'arguments': '{"a":2,"b":3}', 'name': 'multiply'}, 'type': 'function'}], 'refusal': None}, 'response_metadata': {'token_usage': {'completion_tokens': 17, 'prompt_tokens': 136, 'total_tokens': 153, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLh0ZCyt8S5ucbPAw5z2ENxYsmywi', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, 'type': 'ai', 'name': None, 'id': 'run--db776baf-139c-46d1-9b74-2eb05896b106-0', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 136, 'output_tokens': 17, 'total_tokens': 153, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}}]})
StreamPart(event='values', data={'messages': [{'content': '2와 3을 곱하세요', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'a83361fa-7675-4b43-b55a-7cf425ead090', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'function': {'arguments': '{"a":2,"b":3}', 'name': 'multiply'}, 'type': 'function'}], 'refusal': None}, 'response_metadata': {'token_usage': {'completion_tokens': 17, 'prompt_tokens': 136, 'total_tokens': 153, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLh0ZCyt8S5ucbPAw5z2ENxYsmywi', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, 'type': 'ai', 'name': None, 'id': 'run--db776baf-139c-46d1-9b74-2eb05896b106-0', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 136, 'output_tokens': 17, 'total_tokens': 153, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}}, {'content': '6', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'multiply', 'id': '0b8ddb4e-17b1-41c0-a062-fe448b4238ce', 'tool_call_id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'artifact': None, 'status': 'success'}]})
StreamPart(event='values', data={'messages': [{'content': '2와 3을 곱하세요', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'human', 'name': None, 'id': 'a83361fa-7675-4b43-b55a-7cf425ead090', 'example': False}, {'content': '', 'additional_kwargs': {'tool_calls': [{'id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'function': {'arguments': '{"a":2,"b":3}', 'name': 'multiply'}, 'type': 'function'}], 'refusal': None}, 'response_metadata': {'token_usage': {'completion_tokens': 17, 'prompt_tokens': 136, 'total_tokens': 153, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLh0ZCyt8S5ucbPAw5z2ENxYsmywi', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None}, 'type': 'ai', 'name': None, 'id': 'run--db776baf-139c-46d1-9b74-2eb05896b106-0', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 136, 'output_tokens': 17, 'total_tokens': 153, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}}, {'content': '6', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'multiply', 'id': '0b8ddb4e-17b1-41c0-a062-fe448b4238ce', 'tool_call_id': 'call_P4bxodhJaiggSZwH2PRt99FX', 'artifact': None, 'status': 'success'}, {'content': '2와 3을 곱하면 6입니다.', 'additional_kwargs': {'refusal': None}, 'response_metadata': {'token_usage': {'completion_tokens': 13, 'prompt_tokens': 161, 'total_tokens': 174, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLh0aDjmXROVUncDWiYbEilq4tbRN', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None}, 'type': 'ai', 'name': None, 'id': 'run--293f7e2c-a065-45db-9ebb-77ebab7493bb-0', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 161, 'output_tokens': 13, 'total_tokens': 174, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}}]})
스트리밍된 객체는 다음을 가집니다:
event: Typedata: State
from langchain_core.messages import convert_to_messages
thread = await client.threads.create()
input_message = HumanMessage(content="2와 3을 곱하세요")
async for event in client.runs.stream(
thread["thread_id"],
assistant_id="agent",
input={"messages": [input_message]},
stream_mode="values",
):
messages = event.data.get("messages", None)
if messages:
print(convert_to_messages(messages)[-1])
print("=" * 25)=========================
content='2와 3을 곱하세요' additional_kwargs={} response_metadata={} id='3f7ebb4b-6063-4d09-b283-e3a69a0deb61'
=========================
content='' additional_kwargs={'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 136, 'output_tokens': 17, 'total_tokens': 153, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}, 'tool_calls': [{'id': 'call_4RjqGX74fSOsXo0BeNWZ1Bqx', 'function': {'arguments': '{"a":2,"b":3}', 'name': 'multiply'}, 'type': 'function'}], 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 17, 'prompt_tokens': 136, 'total_tokens': 153, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLh1w4zFXHAPLhhHN4mElAdsOPHjv', 'service_tier': 'default', 'finish_reason': 'tool_calls', 'logprobs': None} id='run--fdf4b0e1-ad8d-4400-b71e-872a715b0903-0' tool_calls=[{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_4RjqGX74fSOsXo0BeNWZ1Bqx', 'type': 'tool_call'}]
=========================
content='6' name='multiply' id='a9678610-8327-48db-bf44-d2c3530eb5d7' tool_call_id='call_4RjqGX74fSOsXo0BeNWZ1Bqx'
=========================
content='2와 3을 곱하면 6입니다.' additional_kwargs={'invalid_tool_calls': [], 'usage_metadata': {'input_tokens': 161, 'output_tokens': 13, 'total_tokens': 174, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}, 'refusal': None} response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 161, 'total_tokens': 174, '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-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'id': 'chatcmpl-CLh1xcXA539V9Gukwtu9Zl5xbws6O', 'service_tier': 'default', 'finish_reason': 'stop', 'logprobs': None} id='run--82369b0b-1b7c-4f93-8d37-10d9e94d0f20-0'
=========================
API를 통해서만 지원되는 몇 가지 새로운 스트리밍 모드가 있습니다.
예를 들어, 위의 사례를 더 잘 처리하기 위해 messages 모드를 사용할 수 있습니다!
이 모드는 현재 그래프에 메시지 목록인 messages 키가 있다고 가정합니다.
messages 모드를 사용하여 방출되는 모든 이벤트에는 두 가지 속성이 있습니다:
event: 이벤트의 이름입니다data: 이벤트와 관련된 데이터입니다
thread = await client.threads.create()
input_message = HumanMessage(content="2와 3을 곱하세요")
async for event in client.runs.stream(
thread["thread_id"],
assistant_id="agent",
input={"messages": [input_message]},
stream_mode="messages",
):
print(event)StreamPart(event='metadata', data={'run_id': '01999da4-de67-7347-8d4d-a9f8c46427e6', 'attempt': 1})
StreamPart(event='messages/metadata', data={'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb': {'metadata': {'created_by': 'system', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'run_attempt': 1, 'langgraph_version': '0.6.8', 'langgraph_api_version': '0.4.31', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_auth_user_id': '', 'langgraph_request_id': '737d7e76-ccce-4fce-918c-eefbfbeddc3d', 'run_id': '01999da4-de67-7347-8d4d-a9f8c46427e6', 'thread_id': '1ad38d6e-e314-4a6b-8819-ecefa8c6bd85', 'user_id': '', 'langgraph_step': 1, 'langgraph_node': 'assistant', 'langgraph_triggers': ['branch:to:assistant'], 'langgraph_path': ['__pregel_pull', 'assistant'], 'langgraph_checkpoint_ns': 'assistant:ec5e892a-031b-0263-ebd7-8b5b311042e0', 'checkpoint_ns': 'assistant:ec5e892a-031b-0263-ebd7-8b5b311042e0', 'ls_provider': 'openai', 'ls_model_name': 'gpt-4o', 'ls_model_type': 'chat', 'ls_temperature': None}}})
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2,"', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2,"b', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2,"b":', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2,"b":3', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2,"b":3}', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {'tool_calls': [{'index': 0, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'function': {'arguments': '{"a":2,"b":3}', 'name': 'multiply'}, 'type': 'function'}]}, 'response_metadata': {'finish_reason': 'tool_calls', 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'service_tier': 'default'}, 'type': 'ai', 'name': None, 'id': 'run--a2f07abf-c6b2-4202-83da-ebf8ed1c40bb', 'example': False, 'tool_calls': [{'name': 'multiply', 'args': {'a': 2, 'b': 3}, 'id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'type': 'tool_call'}], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/metadata', data={'58313c3f-5913-408f-9b42-989a90fd2443': {'metadata': {'created_by': 'system', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'run_attempt': 1, 'langgraph_version': '0.6.8', 'langgraph_api_version': '0.4.31', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_auth_user_id': '', 'langgraph_request_id': '737d7e76-ccce-4fce-918c-eefbfbeddc3d', 'run_id': '01999da4-de67-7347-8d4d-a9f8c46427e6', 'thread_id': '1ad38d6e-e314-4a6b-8819-ecefa8c6bd85', 'user_id': '', 'langgraph_step': 2, 'langgraph_node': 'tools', 'langgraph_triggers': ['branch:to:tools'], 'langgraph_path': ['__pregel_pull', 'tools'], 'langgraph_checkpoint_ns': 'tools:b97cf5e0-7c9a-3d11-1586-7911b2aad04c', 'LANGSMITH_LANGGRAPH_API_VARIANT': 'local_dev'}}})
StreamPart(event='messages/complete', data=[{'content': '6', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'tool', 'name': 'multiply', 'id': '58313c3f-5913-408f-9b42-989a90fd2443', 'tool_call_id': 'call_HqNF60FYjQp8kBBJGfVuhPSL', 'artifact': None, 'status': 'success'}])
StreamPart(event='messages/metadata', data={'run--714bf0f4-0228-44d7-afc4-0075241abb4b': {'metadata': {'created_by': 'system', 'graph_id': 'agent', 'assistant_id': 'fe096781-5601-53d2-b2f6-0d3403f7e9ca', 'run_attempt': 1, 'langgraph_version': '0.6.8', 'langgraph_api_version': '0.4.31', 'langgraph_plan': 'developer', 'langgraph_host': 'self-hosted', 'langgraph_api_url': 'http://127.0.0.1:2024', 'langgraph_auth_user_id': '', 'langgraph_request_id': '737d7e76-ccce-4fce-918c-eefbfbeddc3d', 'run_id': '01999da4-de67-7347-8d4d-a9f8c46427e6', 'thread_id': '1ad38d6e-e314-4a6b-8819-ecefa8c6bd85', 'user_id': '', 'langgraph_step': 3, 'langgraph_node': 'assistant', 'langgraph_triggers': ['branch:to:assistant'], 'langgraph_path': ['__pregel_pull', 'assistant'], 'langgraph_checkpoint_ns': 'assistant:6d29ba20-dcc0-1b5a-e43a-b99dd90f5b22', 'checkpoint_ns': 'assistant:6d29ba20-dcc0-1b5a-e43a-b99dd90f5b22', 'ls_provider': 'openai', 'ls_model_name': 'gpt-4o', 'ls_model_type': 'chat', 'ls_temperature': None}}})
StreamPart(event='messages/partial', data=[{'content': '', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 ', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과는', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과는 ', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과는 6', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과는 6입니다', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과는 6입니다.', 'additional_kwargs': {}, 'response_metadata': {}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
StreamPart(event='messages/partial', data=[{'content': '2와 3을 곱한 결과는 6입니다.', 'additional_kwargs': {}, 'response_metadata': {'finish_reason': 'stop', 'model_name': 'gpt-4o-2024-08-06', 'system_fingerprint': 'fp_f33640a400', 'service_tier': 'default'}, 'type': 'ai', 'name': None, 'id': 'run--714bf0f4-0228-44d7-afc4-0075241abb4b', 'example': False, 'tool_calls': [], 'invalid_tool_calls': [], 'usage_metadata': None}])
몇 가지 이벤트를 확인할 수 있습니다:
metadata: 실행에 대한 메타데이터messages/complete: 완전히 형성된 메시지messages/partial: 채팅 모델 토큰
타입에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
이제 이러한 메시지를 스트리밍하는 방법을 보여드리겠습니다.
메시지의 도구 호출을 더 잘 포맷하기 위한 헬퍼 함수를 정의해보겠습니다.
thread = await client.threads.create()
input_message = HumanMessage(content="2와 3을 곱하세요")
def format_tool_calls(tool_calls):
"""
도구 호출 목록을 가독성 있는 문자열로 포맷팅합니다.
Args:
tool_calls (list): 각각 도구 호출을 나타내는 사전 목록입니다.
각 사전에는 'id', 'name', 'args' 키가 포함되어야 합니다.
Returns:
str: 도구 호출의 형식화된 문자열 또는 목록이 비어 있을 경우 "No tool calls".
"""
if tool_calls:
formatted_calls = []
for call in tool_calls:
formatted_calls.append(
f"Tool Call ID: {call['id']}, Function: {call['name']}, Arguments: {call['args']}"
)
return "\n".join(formatted_calls)
return "No tool calls"
async for event in client.runs.stream(
thread["thread_id"],
assistant_id="agent",
input={"messages": [input_message]},
stream_mode="messages",
):
# 메타데이터 이벤트 처리
if event.event == "metadata":
print(f"Metadata: Run ID - {event.data['run_id']}")
print("-" * 50)
# 부분 메시지 이벤트 처리
elif event.event == "messages/partial":
for data_item in event.data:
# 사용자 메시지 처리
if "role" in data_item and data_item["role"] == "user":
print(f"Human: {data_item['content']}")
else:
# 이벤트에서 관련 데이터를 추출하십시오
tool_calls = data_item.get("tool_calls", [])
invalid_tool_calls = data_item.get("invalid_tool_calls", [])
content = data_item.get("content", "")
response_metadata = data_item.get("response_metadata", {})
if content:
print(f"AI: {content}")
if tool_calls:
print("Tool Calls:")
print(format_tool_calls(tool_calls))
if invalid_tool_calls:
print("Invalid Tool Calls:")
print(format_tool_calls(invalid_tool_calls))
if response_metadata:
finish_reason = response_metadata.get("finish_reason", "N/A")
print(f"Response Metadata: Finish Reason - {finish_reason}")
print("-" * 50)Metadata: Run ID - 01999da5-81f2-7293-99a7-d12f26baefdb
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2, 'b': 3}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2, 'b': 3}
--------------------------------------------------
Tool Calls:
Tool Call ID: call_PcB7gHPRL9OtCBURtupv0txj, Function: multiply, Arguments: {'a': 2, 'b': 3}
Response Metadata: Finish Reason - tool_calls
--------------------------------------------------
--------------------------------------------------
AI: 2
--------------------------------------------------
AI: 2와
--------------------------------------------------
AI: 2와
--------------------------------------------------
AI: 2와 3
--------------------------------------------------
AI: 2와 3을
--------------------------------------------------
AI: 2와 3을 곱
--------------------------------------------------
AI: 2와 3을 곱하면
--------------------------------------------------
AI: 2와 3을 곱하면
--------------------------------------------------
AI: 2와 3을 곱하면 6
--------------------------------------------------
AI: 2와 3을 곱하면 6입니다
--------------------------------------------------
AI: 2와 3을 곱하면 6입니다.
--------------------------------------------------
AI: 2와 3을 곱하면 6입니다.
Response Metadata: Finish Reason - stop
--------------------------------------------------