从0到1构建智能提示系统:Anthropic工具调用实战指南
为什么需要工具调用能力?
你是否遇到过这样的场景:当用户询问"我最近的订单状态"时,AI只能礼貌地回答"无法访问您的订单信息"?或者当用户需要计算复杂数值时,AI给出的结果总是与计算器有出入?这些痛点的核心在于——基础提示工程无法突破AI模型的固有局限。
Anthropic的交互式提示工程教程高级篇正是为解决这些问题而生。通过工具调用(Tool Use)技术,我们可以让Claude像人类一样使用"计算器""数据库查询"等外部工具,将AI的推理能力与工具的执行能力完美结合。本指南将基于GitHub_Trending/pr/prompt-eng-interactive-tutorial项目,带你从零构建一个完整的工具调用系统。
工具调用的工作原理
工具调用本质上是一种"协作式问题解决"流程。想象你是一位客服人员,当用户询问订单状态时,你需要:
- 确认是否需要查询系统(判断是否使用工具)
- 向系统查询订单信息(调用工具)
- 根据系统返回结果整理回复(处理工具结果)
AI的工具调用流程与之类似,只是将"系统"替换为具体的函数或API。完整的工具调用流程包含四个关键步骤:
图1:工具调用的四步工作流程(来源:AmazonBedrock/images/tool_use_flow.png)
四步实现工具调用
- 定义工具集:告诉AI有哪些可用工具及其参数要求
- 生成工具调用请求:AI根据用户问题决定是否调用工具
- 执行工具并返回结果:在外部环境中运行工具并获取结果
- 整理结果生成回复:AI基于工具返回结果生成自然语言回复
从零开始构建工具调用系统
让我们通过一个实际案例来理解如何实现工具调用。我们将构建一个订单查询系统,包含用户查询、订单检索和订单取消三个核心功能。
步骤1:定义工具规范
首先需要明确告诉AI有哪些工具可用。每个工具定义应包含名称、描述和输入参数,就像产品说明书一样:
toolConfig = {
'tools': [
{
'toolSpec': {
'name': 'get_order_by_id',
'description': 'Retrieves order details by order ID',
'inputSchema': {
'json': {
'type': 'object',
'properties': {
'order_id': {
'type': 'string',
'description': 'Unique order identifier'
}
},
'required': ['order_id']
}
}
}
},
# 更多工具定义...
]
}
完整的工具定义可参考AmazonBedrock/toolUse_order_bot/final_order_bot_converse_api.py中的toolConfig对象。
步骤2:实现工具函数
工具定义只是"说明书",我们还需要实现实际的功能。以下是一个查询订单的示例函数:
def get_order_by_id(order_id):
"""根据订单ID查询订单详情"""
for order in orders:
if order["id"] == order_id:
return order
return None
这个函数会在本地数据库中查找匹配的订单。完整实现可参考AmazonBedrock/toolUse_order_bot/final_order_bot_converse_api.py中的FakeDatabase类。
步骤3:处理工具调用请求
当AI决定调用工具时,会生成一个结构化的工具调用请求。我们需要解析这个请求并调用相应的函数:
def process_tool_call(tool_name, tool_input):
"""根据工具名称和输入参数调用相应函数"""
if tool_name == "get_order_by_id":
return db.get_order_by_id(tool_input["order_id"])
elif tool_name == "cancel_order":
return db.cancel_order(tool_input["order_id"])
# 其他工具处理...
步骤4:构建对话循环
最后需要构建一个对话循环,让AI能够持续与用户交互并根据需要调用工具:
while True:
# 获取用户输入
user_message = input("User: ")
messages.append({"role": "user", "content": user_message})
# 调用AI API获取响应
response = bedrock_client.converse(**converse_api_params)
if response['stopReason'] == "tool_use":
# 处理工具调用
tool_result = process_tool_call(tool_name, tool_input)
messages.append({"role": "user", "content": tool_result})
else:
# 直接返回AI回复
print("Assistant:", response['output']['message']['content'])
完整的对话循环实现可参考AmazonBedrock/toolUse_order_bot/final_order_bot_converse_api.py中的start_chat()函数。
常见问题与最佳实践
如何避免不必要的工具调用?
AI有时会在不需要工具的情况下尝试调用工具,例如当用户询问"你能做什么"时。解决这个问题的关键是在系统提示中明确说明何时应该使用工具:
只有在需要查询用户信息、订单状态或执行订单操作时才使用工具。
如果用户只是询问帮助或一般性问题,直接回答即可,不需要调用工具。
如何处理工具调用错误?
当工具调用失败(如订单ID不存在)时,需要告诉AI如何处理:
def get_order_by_id(order_id):
for order in orders:
if order["id"] == order_id:
return order
return {"error": f"Order {order_id} not found"}
然后在系统提示中说明:
如果工具返回包含"error"的结果,请将错误信息友好地告知用户,不要再次调用工具。
如何优化工具调用的参数质量?
AI有时会提供不完整或格式错误的参数。通过提供示例可以显著提高参数质量:
当调用get_order_by_id工具时,请使用以下格式:
<function_calls>
<invoke name="get_order_by_id">
<antml:parameter name="order_id">24601</parameter>
</invoke>
</function_calls>
进阶应用:多工具协同与复杂工作流
工具调用的真正强大之处在于能够组合多个工具完成复杂任务。例如,一个"退货流程"可能需要:
- 使用
get_user工具验证用户身份 - 使用
get_customer_orders工具获取用户所有订单 - 使用
get_order_by_id工具获取特定订单详情 - 使用
cancel_order工具取消订单
这种多工具协同可以通过提示工程实现:
当处理退货请求时,请按以下步骤操作:
1. 询问用户邮箱以验证身份(使用get_user工具)
2. 获取用户所有订单(使用get_customer_orders工具)
3. 询问用户要退货的订单ID
4. 取消指定订单(使用cancel_order工具)
5. 告知用户退货流程已完成
总结与下一步
通过本文,你已经了解了工具调用的基本原理和实现方法。工具调用技术极大扩展了AI的能力边界,使其从单纯的文本生成工具转变为能够与外部系统交互的智能助手。
下一步学习建议
- 尝试扩展工具集,添加产品推荐、库存查询等功能
- 实现更复杂的错误处理和重试机制
- 探索工具调用与提示链(Prompt Chaining)的结合应用
工具调用只是高级提示工程的起点,更多高级技术可参考Anthropic 1P/10.2_Appendix_Tool Use.ipynb和AmazonBedrock/10_2_3_Complete_Tool_Use_Workflow.ipynb。
掌握这些技术后,你将能够构建更智能、更实用的AI应用,解决实际业务问题。
相关资源
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



