Skip to content

如何禁用不支持流式传输的模型的流式传输功能

前提条件

本指南假设您熟悉以下内容:

一些聊天模型,包括 OpenAI 新推出的 O1 模型(取决于您阅读本文的时间),不支持流式传输。这在使用 astream_events API 时可能会引发问题,因为该 API 以流式模式调用模型,期望流式传输能够正常工作。

在本指南中,我们将向您展示如何禁用不支持流式传输的模型的流式传输功能,确保这些模型即使通过 astream_events API 调用时,也永远不会以流式模式运行。

API Reference: ChatOpenAI | StateGraph | START | END

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": "how many r's are in strawberry?"}}
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!

正如我们所预期的,发生了一个错误,幸运的是有一个简单的解决方法!

禁用流式传输

现在,不对我们图进行任何更改,让我们将模型上的 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": "how many r's are in strawberry?"}}
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)
There are three "r"s in the word "strawberry".