LangGraph 공식문서를 번역한 내용입니다. 필요한 경우 부연 설명을 추가하였고 이해하기 쉽게 예제를 일부 변경하였습니다. 문제가 되면 삭제하겠습니다.
https://langchain-ai.github.io/langgraph/how-tos/#human-in-the-loop
일부 채팅 모델, 예를 들어 OpenAI의 새로운 O1 모델(이 글을 읽는 시점에 따라 다를 수 있음)은 스트리밍을 지원하지 않는다. 이는 astream_events
API를 사용할 때 문제가 될 수 있는데, 이 API는 스트리밍 모드에서 모델을 호출하며, 스트리밍이 정상적으로 작동할 것을 기대하기 때문이다.
이 가이드에서는 스트리밍을 지원하지 않는 모델에 대해 스트리밍을 비활성화하는 방법을 알아보자. 이를 통해 이러한 모델이 astream_events
API를 통해 호출되더라도 스트리밍 모드로 실행되지 않도록 할 수 있다.
from langchain_openai import ChatOpenAI
from langgraph.graph import MessagesState
from langgraph.graph import StateGraph, START, END
llm = ChatOpenAI(model="o1-preview", temperature=1)
graph_builder = StateGraph(MessagesState)
def chatbot(state: MessagesState):
return {"messages": [llm.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
from IPython.display import Image, display
display(Image(graph.get_graph().draw_mermaid_png()))
스트리밍을 비활성화하지 않는 방법
이제 그래프를 정의했으므로, 스트리밍을 비활성화하지 않고 astream_events
를 호출해 보자. O1 모델이 기본적으로 스트리밍을 지원하지 않기 때문에 이 호출은 오류를 발생시킬 것이다.
input = {"messages": {"role": "user", "content": "strawberry에 r이 몇개 있지?"}}
try:
async for event in graph.astream_events(input, version="v2"):
if event["event"] == "on_chat_model_end":
print(event["data"]["output"].content, end="", flush=True)
except:
print("Streaming not supported!")
Streaming not supported!
예상한 대로 오류가 발생했다. 다행히도 이를 해결할 수 있는 간단한 방법이 있다.
현재기준(24.11.30)으로 o1-preview 모델도 스트리밍을 지원한다. 위의 예제대로 동작하지 않는다.
스트림 비활성화하는 방법
이제 그래프를 수정하지 않고, 모델의 disable_streaming
파라미터를 True
로 설정하여 문제를 해결해 보자.
llm = ChatOpenAI(model="o1-preview", temperature=1, disable_streaming=True)
graph_builder = StateGraph(MessagesState)
def chatbot(state: MessagesState):
return {"messages": [llm.invoke(state["messages"])]}
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
이제 동일한 입력으로 다시 실행하면 오류 없이 실행될 것이다.
input = {"messages": {"role": "user", "content": "strawberry에 r이 몇개 있지?"}}
async def stream_content():
try:
async for event in graph.astream_events(input, version="v2"):
if event["event"] == "on_chat_model_end":
print(event["data"]["output"].content, end="", flush=True)
except:
print("Streaming not supported!")
asyncio.run(stream_content())
'strawberry'라는 단어에는 'r'이 총 세 번 들어있습니다.
LangGraph 참고 자료
- Controllability
- Persistence
- Memory
- Human-in-the-loop
- Streaming
- Tool calling
- Subgraphs
- State Management
- Other
- Prebuilt ReAct Agent