AI App: Tool Use Design Pattern 工具使用设计模式

1. 什么是工具使用设计模式

工具使用设计模式侧重于赋予大型语言模型与外部工具交互的能力,以实现特定目标。

工具是代理可以执行的代码,用于执行作。工具可以是简单的函数,比如计算器,也可以是调用第三方服务(如股票价格查询或天气预报)的 API。

在人工智能代理的背景下,工具设计为由代理响应模型生成的函数调用来执行。

2. 工具使用设计模式应用场景

人工智能代理可以利用工具完成复杂任务、获取信息或做出决策,包括:

  • 动态信息检索:通过调用外部API获取数据
  • 代码执行与解释: 代理可以执行代码或脚本来解决问题、生成报告等。
  • 工作流程自动化: 集成任务调度器、管道等工具,自动化重复或多步骤的工作流
  • 客户支持: 客服可以与客户关系管理系统、工单平台或知识库交互,解决用户查询。
  • 内容生成与编辑: 代理可以利用语法检查器、文本摘要器或内容安全评估器等工具,协助内容创作任务。

3. Coding

确保你使用的LLM支持函数调用,不确定的可以去豆包查一下,这里用的 qwen3-max。

https://github.com/Selene1225/ai_learning/blob/main/app/tool_bot/tool_chat_bot.py

核心代码:定义tool function

python 复制代码
# 定义 tool function
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_time",
            "description": "获取当前城市的时间",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "提供location的英文去获取时间, e.g. San Francisco"
                    }
                },
                "required": ["location"]
            }
        }
    }
]

# 用户输入
messages = [{
    "role": "user",
    "content": input("你想知道哪个城市的时间? ")
}]

# openai LLM
openai.api_key = api_key
openai.base_url = base_url
openai.api_type = "openai"
response = openai.chat.completions.create(
    model=model_name,
    messages=messages,
    tools=tools,
    tool_choice="auto"
)

response_message = response.choices[0].message
messages.append(response_message)

# LLM处理用户输入得到function参数
if response_message.tool_calls:
    for tool_call in response_message.tool_calls:
        if tool_call.function.name == "get_current_time":
            # 接收 LLM 返回的arg,调用工具
            tool_args = json.loads(tool_call.function.arguments)
            time_response = get_current_time(tool_args["location"])
            messages.append({
                "tool_call_id": tool_call.id,
                "role": "tool",
                "name": "get_current_time",
                "content": time_response
            })
        else:
            print(f"Unknown tool call: {tool_call.function.name}")

# LLM 完成「工具结果的 "二次处理"」,最终返回符合用户需求的自然语言响应
final_response = openai.chat.completions.create(
    model=model_name,
    messages=messages,
)

print(final_response.choices[0].message.content)

function关键属性:

bash 复制代码
Tool Function: 
name # 我们想要调用的函数名称。
description # 这是对该函数工作原理的描述。这里需要具体且清晰。
parameters # 你希望模型在响应中生成的数值和格式列表。参数数组由具有以下属性的项组成:
    type # 属性的数据类型将存储于 。
    properties # 模型响应时将使用的具体值列表
        name # 键是模型在其格式化响应中使用的属性名称,例如产品。
        type # 该属性的数据类型,例如字符串 。
        description # 具体物业的描述。

用户输入先丢给LLM处理,提取 tool 需要的入参,然后调用tool的function拿到response,最后再丢给LLM得到一个自然语言的输出反馈给用户。

对用户来说,提问和结果都是自然语言;对代码而言,入参和输出都是标准的代码结构,不需要额外处理参数格式等。

4. App

完整代码:https://github.com/Selene1225/ai_learning/tree/main/app/tool_bot

python 复制代码
app/tool_bot/
├── index.html          # 前端页面
├── app.py              # Flask 后端服务
├── requirements.txt    # 后端依赖
├── timezone_config.json # 时区配置文件
├── tool_chat_bot.py    # 原始的工具调用脚本
└── README.md           # 项目说明文档
相关推荐
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
略略略咯咯10 小时前
(总结)设计模式
设计模式
Cosolar1 天前
DeepSeek Harness 理解 Harness 的设计哲学 - 可组合的插件运行时
人工智能·设计模式·架构
Nebula_g1 天前
JavaSE基础语法:特殊类(特殊情景下的设计模式)
java·开发语言·设计模式
George_Ye2 天前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
莫得感情 o2 天前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu3 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理
剧中有戏3 天前
单例模式从入门到精通:一个数据库连接池的完整剖析
设计模式
胡萝卜术3 天前
编译期与运行期的双重防线:从 TypeScript 类型之争到 LLM 输出的自动化择优
前端·设计模式·面试