01.AI Agent:从核心定义到 Function Calling 实战全解析
摘要:本文基于个人学习笔记,系统梳理了 AI Agent 的核心定义、运作原理、主流开发框架对比,并深入剖析了 Agent 的核心技能——Function Calling 的全链路与代码实现。
一、AI Agent 核心定义
什么是 AI Agent?
简单来说,AI Agent 是一个能够理解人类自然语言命令,感知环境,做出决策并采取行动的系统。
与传统的大语言模型(LLM)相比,Agent 的设计初衷是为了解决 LLM 无法直接处理的复杂问题(如涉及多步骤推理、需要使用外部工具或数据的场景)。
我们可以用一个公式来概括 AI Agent 的构成:
💡 AI Agent = LLM (大脑) + 记忆 + 工具 + 规划
- LLM:负责接收输入、思考逻辑、输出内容。
- 记忆:存储短期和长期信息。
- 工具:连接外部世界的能力。
- 规划:自主拆解任务和决策的能力。
二、AI Agent 运作原理解析
Agent 的运作主要依赖四大要素,其中最核心的是规划与记忆/工具。
1. 规划
规划可以理解为 Agent 的“认知框架”。就像人类接到任务会先思考一样,Agent 也会经历以下过程:
- 任务拆解:将大型复杂任务分解为更小的、可控的子任务。
- 自我反思:在执行过程中进行反思和完善,吸取教训。
- 终止判断:思考任务何时可以结束。
2. 记忆与工具
- 记忆来源:主要来自大模型的预训练与微调、上下文窗口以及外部记忆库(向量数据库)。
- 工具使用:这是 Agent 的核心技能之一。通过函数调用或MCP等技术,Agent 可以获取额外数据、处理能力和专业知识。
三、主流开发框架与低代码平台对比
在开发 Agent 时,选择合适的框架和平台至关重要。以下是整理的详细对比:
1. 开发框架对比
| 框架 | 模式 | 核心特性与架构 |
|---|---|---|
| LangChain | 单/多智能体 | 模块化设计(链、代理、记忆),生态最丰富,V1.0 基于 LangGraph 构建。 |
| LangGraph | 复杂状态流 | 基于有向图结构,适合需要高度定制化和严格控制延迟的复杂场景。 |
| Semantic Kernel | 单智能体 | 微软出品,插件化架构,紧密绑定 Azure/.NET 生态。 |
| AutoGen | 多智能体 | 多角色协作设计,支持自主对话协商,适合学术研究和复杂交互。 |
| CrewAI | 多智能体 | 强调角色分工(Role-Playing),流程可视化,适合模拟团队协作业。 |
2. 低代码平台对比
| 平台 | 易用性 | 功能深度 | 部署方式 |
|---|---|---|---|
| Coze | ✅ 零代码,非技术友好 | ✅ 对话优化强,插件生态丰富 | ⚠️ 仅公有云 |
| Dify | ✅ 非技术较友好 | ✅ 多模型调度,支持私有化部署 | ✅ 支持私有化 |
| FastGPT | ⚠️ 技术门槛较高 | ⚠️ 聚焦对话,工具调用较弱 | ✅ 支持私有化 |
| n8n | ⚠️ 需代码基础 | ⚠️ 通用流程编排之王,无内置 Agent 框架 | ✅ 支持私有化 |
四、Agent 核心技能:Function Calling 实战
Function Calling是赋予大模型调用外部 API 能力的关键技术,也是 Agent 能够“行动”的基础。
1. 为什么需要 Function Calling?
相比传统的提示词工程,Function Calling 具有显著优势:
- 可靠性:结构化输出,无需正则解析,稳定可靠。
- 安全性:框架层自动校验参数,隔离风险。
- 开发效率:只需定义函数描述,框架自动生成规范。
- 可调试性:可追踪调用链路(如 LangSmith)。
2. 全链路解析:Function Calling 是如何工作的?
整个过程通常包含两次模型调用:
- 定义工具:编写函数规范(
name,description,parameters)。 - 第一次调用(意图识别):
- 将用户提问和函数说明传给 LLM。
- LLM 判断是否需要调用工具,并返回结构化的
function_call(包含函数名和参数)。
- 本地执行:
- 代码解析 LLM 返回的参数。
- 执行真实的本地函数(如查询数据库、调用天气 API)。
- 将结果封装为
role: function的消息追加到上下文。
- 第二次调用(结果润色):
- 将“用户提问 + 工具调用记录 + 工具返回结果”再次传给 LLM。
- LLM 整合信息,生成自然语言回复给用户。
3. 多工具与多步调用
在多工具场景下,Agent 需要解决功能重叠、多意图混合和工具依赖(链式调用)的问题。
示例场景:查询北京天气,并预订次日飞上海的机票。
- 调用
get_weather("北京")获取天气。 - 调用
book_flight("北京", "上海", "明天")预订机票。 - 模型整合两条数据,生成最终建议。
4. 代码实战(Python)
以下是一个基于 OpenAI SDK 的 Function Calling 最小实现示例:
from openai import OpenAI import json # 1. 模拟工具函数 def get_weather(city): weather_data = { "北京": {"weather": "晴", "temp": "5-15℃"}, "上海": {"weather": "阴", "temp": "8-18℃"} } return weather_data.get(city, {"weather": "未知", "temp": "未知"}) # 2. 定义工具描述 (Tools Schema) tools = [ { "type": "function", "function": { "name": "get_weather", "description": "获取指定城市的天气信息", "parameters": { "type": "object", "properties": { "city": {"type": "string", "description": "城市名称"} }, "required": ["city"] } } } ] client = OpenAI() # 3. 第一次调用:让模型决定做什么 response = client.chat.completions.create( model="gpt-4", messages=[{"role": "user", "content": "北京天气怎么样?"}], tools=tools, tool_choice="auto" ) message = response.choices[0].message # 4. 解析并执行工具 messages = [{"role": "user", "content": "北京天气怎么样?"}] # 追加模型的工具调用请求 messages.append({ "role": "assistant", "content": message.content or "", "tool_calls": message.tool_calls }) # 循环执行工具调用(处理多工具情况) if message.tool_calls: for tool_call in message.tool_calls: args = json.loads(tool_call.function.arguments) # 执行真实函数 res = get_weather(**args) # 追加函数执行结果 messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(res, ensure_ascii=False) }) # 5. 第二次调用:生成最终回复 second_response = client.chat.completions.create( model="gpt-4", messages=messages ) print("最终回复:", second_response.choices[0].message.content)结语:
AI Agent 正在重新定义我们与软件的交互方式。掌握 Function Calling 和主流框架的使用,是通往 AI 应用开发进阶之路的必经之地。希望这篇笔记能为你带来启发!
(本文基于个人学习笔记整理,如有疏漏欢迎评论区指正)
