揭示流事件的奥秘:如何在LangChain工具中实现流式传输

87 阅读2分钟

引言

在现代应用中,流式传输事件可以显著提升用户体验和系统效率。当你在使用LangChain工具与聊天模型、信息检索器或其他可运行组件互动时,了解如何访问内部事件或配置它们是非常重要的。本指南将引导你如何正确传递参数以使用 astream_events() 方法来实现这一目标。

主要内容

1. 了解流事件基础

LangChain提供了一种强大的机制来生成和流式传输事件。然而,如果你在Python ≤ 3.10中运行异步代码,LangChain不能自动将配置(包括astream_events()所需的回调)传播给子运行对象。这通常是无法从自定义可运行组件或工具中看到事件的原因。

2. 配置传播和兼容性

如果你运行的是Python ≥ 3.11,RunnableConfig 会自动传播到子运行对象中。然而,为了确保代码在旧版本Python中运行良好,手动传播 RunnableConfig 依然是个好主意。

3. 手动传播配置

如果你有一个自定义工具,它调用一个链条来通过提示一个聊天模型返回仅10个字,并反转输出,下面将演示如何手动传递 RunnableConfig

示例工具定义:

from langchain_core.runnables import RunnableConfig
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.tools import tool

@tool
async def special_summarization_tool_with_config(
    long_text: str, config: RunnableConfig
) -> str:
    """A tool that summarizes input text using advanced techniques."""
    prompt = ChatPromptTemplate.from_template(
        "You are an expert writer. Summarize the following text in 10 words or less:\n\n{long_text}"
    )

    def reverse(x: str):
        return x[::-1]

    chain = prompt | model | StrOutputParser() | reverse
    # 将配置对象作为参数传递给任何执行的运行对象
    summary = await chain.ainvoke({"long_text": long_text}, config=config)
    return summary

代码示例

一个完整的示例展示如何使用 astream_events() 方法:

stream = special_summarization_tool_with_config.astream_events(
    {"long_text": LONG_TEXT}, version="v2"
)

async for event in stream:
    if event["event"] == "on_chat_model_end":
        print(event)

此代码尝试捕获聊天模型的结束事件,但在Python ≤ 3.10中将不会触发,除非你手动传播配置。

常见问题和解决方案

  • 问题: 在Python ≤ 3.10中没有事件触发。 解决方案: 手动传播 RunnableConfig 到子运行对象。

  • 问题: 如何确保在所有Python版本中都能顺利运行? 解决方案: 即便在Python ≥ 3.11中也手动传递配置,以确保兼容性。

总结和进一步学习资源

通过本指南,你了解了如何在LangChain工具中实现事件流。在此基础上,你可以探索更多使用工具的指南:

参考资料

  1. LangChain 官方文档
  2. Python 官方文档
  3. LangChain-Core API 参考

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---