大模型 Agent 与 Function Calling 实践指南
一、基础知识
1.1 什么是 Agent(智能体)?
Agent(智能体)是指能够感知环境并采取行动以实现特定目标的自主系统。这个概念源于人工智能领域,强调系统的自主性、反应性和目标导向性。
在大模型时代,Agent 通常指基于大语言模型(LLM)构建的、能够自主决策并执行任务的智能系统。它不再只是被动回答问题的聊天机器人,而是能够主动规划、调用工具、完成复杂任务的"数字助手"。
Agent 的核心架构
一个典型的 Agent 系统包含以下核心组件:
| 组件 | 功能描述 | 示例 |
|---|---|---|
| 大语言模型(LLM) | 作为"大脑",负责理解意图、推理决策、生成响应 | GPT-4、Claude、Kimi 等 |
| 工具(Tools) | 外部能力接口,扩展模型的边界能力 | 搜索、计算、代码执行、API 调用、数据库查询 |
| 记忆(Memory) | 存储对话历史、上下文信息和长期知识 | 短期记忆(对话历史)、长期记忆(知识库) |
| 规划(Planning) | 将复杂任务分解为可执行的子步骤 | 任务分解、反思修正、链式思考 |
💡 通俗理解:如果把 Agent 比作一个人,LLM 是"大脑",Tools 是"手脚",Memory 是"记忆",Planning 是"思维方式"。
1.2 什么是 Function Calling / Tool Calling?
Function Calling(函数调用,OpenAI 等厂商也称为 Tool Calling)是大模型的一项核心能力,它允许模型在需要时生成结构化的函数调用请求,而不是直接生成最终答案。
为什么需要 Function Calling?
大模型虽然知识丰富,但存在以下局限:
- ❌ 无法获取实时信息(如天气、股价)
- ❌ 无法执行精确计算(如复杂数学运算)
- ❌ 无法与外部系统交互(如发送邮件、控制设备)
- ❌ 知识有截止日期,不了解最新事件
Function Calling 正是解决这些问题的关键技术,它让大模型从"只会说话"升级为"能动手做事"。
Function Calling 工作流程
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐│ 用户 │────▶│ 大模型 │────▶│ 生成调用 │────▶│ 外部执行 │────▶│ 返回结果 ││ 提问 │ │ 理解意图 │ │ 请求 │ │ 函数 │ │ 生成回复 │└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ └──────────── 循环(多轮调用)──────────────────┘详细步骤:
- 用户提出问题 —— 如"北京今天天气怎么样?"
- 模型判断是否需要工具 —— 识别需要调用天气查询工具
- 生成结构化调用请求 —— 输出标准格式的函数调用(函数名 + 参数)
json {"name": "get_weather", "arguments": {"city": "北京", "date": "今天"}} - 外部系统执行函数 —— 调用天气 API,获取实时数据
- 模型整合结果回复 —— 根据返回数据生成自然语言回答
🎯 核心优势:模型只负责"决策"和"理解",具体的"执行"交给专业的外部工具,实现能力互补。
二、实践:测试大模型的 Tool Calling 能力
以下演示如何通过 API 测试大模型对函数调用的支持。我们将以控制机器人轮子移动为例。
2.1 测试方法
使用兼容 OpenAI API 格式的接口进行测试:
curl http://127.0.0.1:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "kimi-k2.5:cloud", "messages": [{"role": "user", "content": "向前走"}], "tools": [{ "type": "function", "function": { "name": "wheel_move", "description": "控制机器人轮子移动", "parameters": { "type": "object", "properties": { "direction": { "type": "string", "enum": ["forward", "backward", "left", "right"], "description": "移动方向" }, "speed": { "type": "number", "description": "移动速度,范围 0-100" } }, "required": ["direction"] } } }], "tool_choice": "required" }'关键参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
tools | Array | 定义可用的函数列表,每个函数需包含名称、描述、参数结构 |
tool_choice | String | "required" 强制调用工具;"auto" 由模型自行判断;"none" 禁止调用 |
functions.parameters | Object | 使用 JSON Schema 定义参数类型、约束和描述 |
⚠️ 注意:
description字段很重要,它帮助模型理解函数的用途,影响调用决策的准确性。
2.2 返回结果解析
{ "id": "chatcmpl-376", "object": "chat.completion", "created": 1776310139, "model": "kimi-k2.5:cloud", "system_fingerprint": "fp_ollama", "choices": [{ "index": 0, "message": { "role": "assistant", "content": "我来帮您控制机器人向前移动。", "reasoning": "用户要求向前走,这是中文。我需要使用 wheel_move 函数,direction 参数设置为 \"forward\"。...", "tool_calls": [{ "id": "functions.wheel_move:0", "index": 0, "type": "function", "function": { "name": "wheel_move", "arguments": "{\"direction\":\"forward\"}" } }] }, "finish_reason": "tool_calls" }], "usage": { "prompt_tokens": 41, "completion_tokens": 135, "total_tokens": 176 }}关键字段解读
| 字段 | 说明 |
|---|---|
tool_calls | 模型生成的函数调用列表,可能包含多个调用 |
tool_calls[].id | 调用的唯一标识符,用于匹配请求和结果 |
tool_calls[].function.name | 要调用的函数名称 |
tool_calls[].function.arguments | JSON 格式的函数参数,可直接解析执行 |
finish_reason | "tool_calls" 表示模型选择调用工具;"stop" 表示直接生成回答 |
reasoning | 模型的思考过程(部分模型支持),有助于调试和理解决策逻辑 |
三、完整交互流程示例
一个完整的 Function Calling 交互通常包含多轮对话:
第一轮:用户提问━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━用户:向前走第二轮:模型返回调用请求━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━模型:{ "tool_calls": [{ "function": { "name": "wheel_move", "arguments": "{\"direction\":\"forward\"}" } }]}第三轮:系统执行并返回结果━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━系统:{"role": "tool", "content": "移动成功,当前位置已更新"}第四轮:模型生成最终回复━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━模型:"已完成向前移动指令,机器人正在向前行进。"四、总结与最佳实践
Function Calling 的核心价值
通过 Function Calling,大模型实现了三大能力跃迁:
- 🧠 意图理解 —— 准确识别用户指令背后的真实需求
- 🎯 参数提取 —— 将自然语言精准映射为结构化数据
- ⚡ 能力扩展 —— 无缝集成外部系统,突破模型本身的能力边界
应用场景
- 🤖 机器人控制 —— 语音/文字指令控制硬件动作
- 🔍 智能搜索 —— 实时获取最新信息,增强回答准确性
- 🧮 复杂计算 —— 调用计算器、代码解释器处理精确运算
- 🌐 API 集成 —— 连接企业内部系统,实现自动化工作流
- 📊 数据分析 —— 查询数据库、生成报表、可视化展示
开发建议
| 建议 | 说明 |
|---|---|
| ✅ 清晰的函数描述 | 用准确的 description 帮助模型理解函数用途 |
| ✅ 参数约束明确 | 使用 enum、required 等约束减少错误调用 |
| ✅ 错误处理机制 | 函数执行失败时,将错误信息返回给模型重试 |
| ✅ 权限控制 | 敏感操作需增加身份验证和权限校验 |
| ✅ 日志记录 | 记录工具调用历史,便于调试和审计 |
📚 延伸阅读:Function Calling 是实现 ReAct、LangChain、AutoGPT 等 Agent 框架的基础技术,掌握它是构建复杂 AI 应用的关键一步。
