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

[langgraph] 지원하지 않는 모델에서 스트리밍을 비활성화하는 방법

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 참고 자료

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유