[流畅掌握事件流:如何从自定义工具中实时接收事件]

110 阅读2分钟

引言

在构建复杂的AI应用时,你可能需要管理和流式传输事件以更好地控制和监控程序运行。在这篇文章中,我们将探讨如何使用astream_events()方法,从LangChain工具中流式传输事件。我们将为你提供详细的步骤和代码示例,帮助你集成并流式传输这些事件。

主要内容

1. 准备条件

在开始之前,请确保熟悉以下概念:

  • LangChain工具
  • 自定义工具
  • 事件流使用
  • 在自定义工具中访问RunnableConfig

兼容性说明

  • 在Python<=3.10中,LangChain无法自动传播配置,因此需要手动传播RunnableConfig对象。
  • 在Python>=3.11中,该对象会自动传播,但为了兼容旧版本,建议仍然手动传播。

注意:该指南需要langchain-core>=0.2.16

2. 定义自定义工具

我们将创建一个自定义工具,使用聊天模型将文本摘要减少到10个字,然后反转输出。

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

# 使用API代理服务提高访问稳定性
model = ChatOpenAI(model="gpt-4o-mini")

@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

3. 代码示例

通过astream_events()方法,我们可以捕捉工具执行过程中的事件:

LONG_TEXT = """
NARRATOR:
According to all known laws of aviation, there is no way a bee should be able to fly. 
Its wings are too small to get its fat little body off the ground. The bee, of course, flies anyway 
because bees don't care what humans think is impossible.
"""

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)

常见问题和解决方案

  1. 无法接收事件

    • 确保在Python<=3.10中手动传播RunnableConfig对象。
    • 在工具和内部链中正确传递配置。
  2. 事件流不完整

    • 确保API调用的稳定性,必要时使用API代理服务。

总结和进一步学习资源

通过本文,你掌握了如何流式传输自定义工具中的事件。接下来,你可以探索以下资源以深化理解:

参考资料


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

---END---