2025 年,我国智能体专利授权量超过 3400 件,增速是上年的两倍以上。这个数字如果只当行业新闻看,结论大概率停留在“智能体很火”。但站在开发者角度,它更像一个明确的信号:AI Agent 正在从论文、演示和概念验证阶段,加速迁移到需要工程方法支撑的产品落地阶段。专利授权量背后是大量工具链、编排框架、评测方案和行业解决方案的沉淀,而这些内容,恰恰是后端工程师、算法工程师和运维工程师可以体系化学习并复用到日常项目里的。
这篇文章要解决的问题比较具体:智能体到底是什么,它和普通聊天机器人有什么区别;一个可运行的智能体由哪些部分组成;在 2025 年的技术生态里,如何快速选中模型服务、开发框架并搭出最小闭环;跑通之后,如何验证、排错和补齐生产环境需要的安全、成本、监控与回滚能力。下面从概念到代码,从代码到生产落地,按一条可执行的路径展开。
1. 智能体是什么:从专利数据看到的技术迁移
1.1 智能体不是聊天机器人,而是“能办事”的系统
智能体(AI Agent)没有一个唯一标准定义,但当前工程界普遍认可的能力边界是:智能体能够感知环境、拆解目标、做出决策、通过工具或接口执行动作,并根据执行结果继续调整策略,直到完成任务。
这句话拆开看,和“聊天机器人”有本质区别。聊天机器人只负责生成回复,用户问什么,模型就回什么,即使答案需要查询数据库,聊天机器人也只会“建议您去官网查询”,因为它没有执行能力。智能体则不一样。用户询问“发货了吗”,智能体会自行判断需要调用订单查询接口,把订单号作为参数传过去,拿到接口返回的结果后,再组织成自然语言回复。
也就是说,智能体可以理解为:给大模型装上了手(工具调用)、眼睛(检索与感知)和记事本(记忆),让它从“会说话”变成“能干活”。这个“干活”可以发生在纯数字世界,例如查询订单、提交工单、生成报表;也可以发生在物理世界,例如通过 API 控制设备和执行自动化流程。
1.2 专利数据背后:工程化、框架和行业场景
专利授权量增速翻倍,说明智能体相关技术已经从单一算法模型扩展到外围工程体系。包括但不限于:
- 工具调用与函数描述方法;
- 多智能体协作与通信协议;
- 记忆管理、上下文压缩和向量检索;
- 智能体工作流编排和可视化配置;
- 智能体安全、权限控制和行为审计;
- 面向垂直行业的智能体落地方案。
对于开发者来说,专利增长带来的是可借鉴的工程方案变多,开源项目、商业平台和企业内部实践也会越来越多。2025 年选择做智能体方向,不是在追一个没有边际的概念,而是在进入一个已经有大量工程沉淀的技术领域。
需要提醒的是,专利授权量受统计口径、申请时间和公开周期影响,不同来源的数据会有差异。这里更值得关注的是“增速翻倍”这个趋势,以及趋势背后暴露出的工程师缺口和工具化机会。
2. 拆解智能体的技术骨架:规划、记忆、工具、编排
2.1 ReAct 循环:推理-行动-观察
现在大多数可落地的智能体,核心工作模式是 ReAct,即 Reasoning + Acting。它让模型在一个循环里交替进行推理和行动:
- 接收用户任务;
- 模型基于当前信息推理,决定下一步是调用工具还是直接回答;
- 如果调用工具,则生成结构化动作(函数名、参数);
- 执行动作并返回观察结果;
- 模型把观察结果纳入上下文,继续推理;
- 直到条件满足,模型给出最终答案。
用一段伪代码描述:
while not task_done: thought = llm.reason(context) if thought.action == "call_tool": result = execute_tool(thought.tool_name, thought.arguments) context.append(ToolMessage(result)) elif thought.action == "answer": return thought.final_answer这个循环的关键在于,模型不是一次性生成答案,而是多次“停下来思考”。工具执行的结果可能改变下一步计划,这是智能体比单次大模型调用更接近“自动化执行”的原因。
2.2 记忆:会话上下文与长期状态
智能体在完成复杂任务时,不能每轮都从零开始。记忆至少分成两层:
- 短期记忆:当前会话的对话历史,由模型上下文窗口承载;
- 长期记忆:超出上下文窗口的关键信息,通过向量库、数据库或文件存储,按需检索后注入当前上下文。
在工程上,常见做法是把历史对话摘要、用户偏好、业务实体状态写入记忆存储。当上下文接近窗口上限时,先做摘要压缩;当需要回忆长期信息时,把用户问题向量化,去向量库里检索 top-k 片段,再放到 Prompt 中。
记忆不是什么场景都要上。如果智能体只做单轮咨询,加记忆反而增加延迟和成本。如果要做多轮业务办理、跨天客户维护,长期记忆就是必要组件。
2.3 工具调用:给模型装上可执行的“手脚”
大模型本身不执行代码,它只能决定要调用什么工具。现代大模型普遍具备 Function Calling / Tool Calling 能力,即模型在推理时输出一个结构化函数名和参数 JSON,然后由外部程序执行该函数。
工具描述需要按标准 Schema 给模型。一个查询订单状态的工具描述如下:
{ "name": "get_order_status", "description": "根据订单号查询订单当前状态", "parameters": { "type": "object", "properties": { "order_id": { "type": "string", "description": "订单号" } }, "required": ["order_id"] } }模型看到这个描述后,如果用户的意图是查询订单,它会生成类似{"order_id": "10001"}的参数,由程序执行真正的函数。工具调用把模型从“生成文字”推进到“触发动作”,是整个智能体体系中最具工程价值的一环。
2.4 多智能体:不是越多越好,而是分工与编排
多智能体是智能体技术里比较热的方向,但它不是银弹。单智能体能解决大部分任务,引入多智能体会带来通信开销、状态同步和错误传播问题。只有任务本身可以拆成多个独立专业,且每个专业需要不同工具、不同 Prompt 和不同权限时,多智能体才有明显价值。
常见的编排模式有两种:
- 集中式编排:一个“主管”智能体负责拆解任务,调度多个“专家”智能体并行或串行执行;
- 协作式对话:各智能体通过共享消息池互相发送消息,自行协商分工。
从工程角度,优先建议从单智能体开始,先跑通业务闭环,再用多智能体优化那些确实需要分工的复杂流程。
3. 开发前先选型:模型接口、开发框架和运行环境
3.1 模型服务:OpenAI 兼容接口是事实标准
目前几乎所有主流模型服务都提供 OpenAI 兼容接口,包括本地部署模型、国内云厂商模型服务和开源社区工具。统一使用这种接口,可以在不修改上层代码的前提下切换模型,降低厂商绑定风险。
通过环境变量管理模型配置:
export OPENAI_API_KEY="your-api-key" export OPENAI_BASE_URL="https://your-model-provider.example.com/v1" export MODEL_NAME="qwen-plus"在 Python 代码里,使用 LangChain 的 OpenAI 兼容客户端读取这些变量。对于本地实验,也可以通过 Ollama 部署一个开源模型,把OPENAI_BASE_URL指向本地服务。接口兼容时,业务代码只需要切换模型名。
要特别留意:不同模型的工具调用能力差异很大。选型时优先选择官方明确支持 Function Calling 或 Tool Calling 的模型,否则会出现“模型不调用工具”或“工具参数格式不稳定”的问题。
3.2 主流智能体框架选型对比
| 框架/平台 | 开发形态 | 适用场景 | 典型优势 | 需要注意 |
|---|---|---|---|---|
| LangChain / LangGraph | 代码 | 深度定制、复杂业务、需要灵活编排 | 生态大、组件多、可编程控制全链路 | 学习曲线较陡,版本升级会破坏 API |
| Dify | 可视化 + 代码 | 企业应用、知识库、RAG、快速验证到生产 | 支持私有化部署,自带知识库和监控 | 复杂逻辑仍要写代码,平台 API 需要学习 |
| Coze / 扣子 | 低代码 | 快速原型、插件生态、多渠道发布 | 上手快,积木式搭建 | 外部服务和数据合规要提前确认 |
| AutoGen / CrewAI | 代码 | 多智能体研究与编排 | 对多智能体场景有专门抽象 | 生产稳定性需要额外测试 |
| 自研框架 | 代码 | 超大规模、深度定制、已有架构约束 | 完全可控,贴合业务 | 成本高,需要长期维护 |
选型时不要只看哪个框架功能多。团队熟悉什么、业务对数据安全的要求、预计上线周期,都要纳入判断。
3.3 最小开发环境准备
下面的实战示例选用 Python 3.10 以上版本,依赖较少,适合本地学习。
python --version pip --version python -m venv venv source venv/bin/activate pip install -U pip安装依赖:
pip install langchain langchain-openai python-dotenv如果需要在本地拉取 Docker 镜像跑低代码平台,再安装 Docker Desktop 或 Docker Engine。学习阶段不需要 GPU,调用远端模型服务即可。
注意:不要把 API Key 写进代码仓库。就算只是演示项目,也应该使用
.env文件存放配置,并在提交时忽略该文件。
4. 从零实现一个可运行智能体:订单查询助手
4.1 项目结构与依赖
创建一个agent-demo目录:
agent-demo/ ├── .env.example ├── .gitignore ├── requirements.txt └── main.py.env.example内容:
OPENAI_API_KEY=sk-xxx OPENAI_BASE_URL=https://api.example.com/v1 MODEL_NAME=qwen-plusrequirements.txt内容:
langchain>=0.3.0 langchain-openai>=0.2.0 python-dotenv>=1.0.0.gitignore至少包含:
.env venv/ __pycache__/4.2 配置模型客户端
在main.py中完成环境变量加载和模型客户端初始化:
import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() llm = ChatOpenAI( model=os.getenv("MODEL_NAME", "gpt-4o-mini"), api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_BASE_URL"), temperature=0, )temperature=0对工具调用和事实类任务比较友好,能减少随机输出。若后续做创意生成,再按场景调高。
4.3 定义一个业务工具
这里用字典模拟数据库,实际上可以替换成任何外部 API 或数据库查询:
from langchain_core.tools import tool @tool def get_order_status(order_id: str) -> str: """根据订单号查询订单状态。""" mock_orders = { "10001": "已发货,预计3天内送达", "10002": "待付款", "10003": "已签收", } return mock_orders.get(order_id, "未找到该订单")@tool装饰器会读取函数名、docstring 和类型注解,自动生成模型需要的工具 Schema。这里的 docstring 是模型判断“何时调用该工具”的关键描述,不要写得太含糊。
4.4 创建 Agent 并执行调用
使用 LangChain 的create_tool_calling_agent和AgentExecutor:
from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt = ChatPromptTemplate.from_messages( [ ( "system", "你是企业客服智能体。查询订单状态时,必须使用 get_order_status 工具。" "如果工具没有返回结果,就如实告知用户无法确认,不要编造。", ), ("human", "{input}"), MessagesPlaceholder("agent_scratchpad"), ] ) tools = [get_order_status] agent = create_tool_calling_agent(llm, tools, prompt) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, handle_parsing_errors=True, ) result = agent_executor.invoke( {"input": "请帮我查一下订单 10001 发货了吗?"} ) print(result["output"])关键点说明:
- 系统提示词里显式约束“必须使用工具”,能减少模型直接猜测答案的概率;
agent_scratchpad是框架内部记录中间思考、工具调用和观察结果的占位符;handle_parsing_errors=True避免模型输出不符合协议时直接崩溃;verbose=True在控制台展示 Agent 的思考过程,方便学习。
4.5 运行结果核对
执行:
python main.py正常流程会看到类似输出:
> Entering new AgentExecutor chain... Invoking: `get_order_status` with `{'order_id': '10001'}` 已发货,预计3天内送达 > Finished chain. 订单 10001 已发货,预计3天内送达。如果用户问了“今天天气怎么样”,Agent 会判断没有可用工具,并回复无法查询。这同样是正确结果,因为系统提示词约束了它不要编造。
5. 低代码路线:用 Dify 快速搭建并发布为 API
5.1 本地部署 Dify 与初始化
如果不想写代码,或需要把知识库、RAG 和可视化调试集中在一个平台,可以选用 Dify 这类可私有化部署的低代码平台。
本地部署方式一般是获取官方仓库中的 docker 目录,然后启动:
cd dify/docker cp .env.example .env docker compose up -d启动后通过浏览器访问交互界面,首次需要创建管理员账号,然后进入应用创建流程。这种方式的好处是数据自主可控,适合企业内部试用。
5.2 在工作流里配置模型和工具
在 Dify 中创建一个空白应用后,一般顺序是:
- 选择模型供应商并填写模型 API Key;
- 编排工作流,添加“开始”“LLM”“工具”“结束”节点;
- 在工具节点里配置 HTTP 请求,例如查询订单状态接口;
- 把用户输入传给模型,模型决定调用工具;
- 将工具结果返回给 LLM 节点,生成最终回复。
如果不想自建接口,也可以用内置代码节点模拟工具,如下方 Python 代码片段:
def main(order_id: str) -> dict: mock = {"10001": "已发货"} return {"status": mock.get(order_id, "未找到")}低代码平台的价值在于把“模型调用、工具注册、消息历史、变量传递”这些通用部分可视化,团队可以把精力放在业务节点和异常分支上。
5.3 将应用发布为 API 并接入业务系统
Dify 发布后,会生成一个应用 API Key。业务系统可以直接调用聊天消息接口:
curl -X POST 'http://localhost:8080/v1/chat-messages' \ -H 'Authorization: Bearer app-xxxxx' \ -H 'Content-Type: application/json' \ -d '{ "inputs": {}, "query": "帮我查订单 10001", "response_mode": "blocking", "user": "demo-user" }'返回结果包含answer字段,以 JSON 形式回传。这个接口可以继续包装成企业内部服务,也可以放到客服工作台、工单系统或企业微信机器人后面。
注意:把智能体发布为 API 时,要在中间层处理身份认证、频率限制和敏感词过滤,不能直接把 open API 暴露给公网。
5.4 代码路线和低代码路线怎么选
| 对比维度 | 代码路线 | 低代码路线 |
|---|---|---|
| 上手成本 | 较高,需要理解框架 | 较低,拖拽为主 |
| 灵活性 | 高,可控制全链路 | 中,受平台能力限制 |
| 知识库/RAG | 需要自己集成 | 平台内置 |
| 调试体验 | 依赖日志和 IDE | 可视化查看链路 |
| 生产可控性 | 高 | 平台需要运维,私有化部署稍重 |
实际项目里,两者并不互斥。很多团队先用低代码平台验证业务,再把最复杂的节点抽离成独立服务,通过代码方式编排。
6. 验证与排错:智能体要过三类测试
6.1 功能、边界与安全验证清单
智能体跑通只是开始。上线前至少验证以下三类场景:
- 功能路径:能通过工具完成正常查询,能正确解析工具返回结果,并组织成自然语言;
- 边界路径:工具查不到数据时如何回复;用户连续追问时上下文是否一致;超过上下文长度是否报错;
- 安全路径:用户试图通过 Prompt 注入让模型执行未授权操作时,系统是否拒绝;工具参数里出现极端字符时,是否被正确拦截。
一条值得复用的检查清单:
1. 正常问题:需要工具调用的问题,是否能正确调用并返回答案。 2. 无工具问题:用户问无关话题,模型是否明确拒绝。 3. 空结果:工具返回空值或错误,模型是否如实回复。 4. 多轮对话:用户修改宾语或订单号,模型是否基于上下文更新参数。 5. 恶意注入:用户要求“忽略系统设定”,系统是否会执行未授权工具。 6. 参数边界:空字符串、超长字符串、非法字符是否会被工具层拦截。 7. 模型降级:模型服务超时或返回异常,系统是否有兜底回复。6.2 高频问题排查表
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 模型不调用工具 | 模型不支持 Function Calling;工具描述不清晰;提示词没给强制约束 | 查看模型厂商文档;检查工具 Schema 和系统提示词 | 换支持工具调用的模型;重写工具描述;在提示词中说明必须调用 |
| 工具参数错误 | 参数名或类型与 Schema 不一致;模型猜测了字段 | 打印模型输出的原始参数 | 尽量使用精确类型;在字段描述中补充示例值 |
| JSON 解析失败 | 模型输出变成 Markdown 或非严格 JSON | 查看日志中的原始输出 | 降低 temperature;升级模型;开启解析容错 |
| API 请求超时 | 模型服务或工具接口响应慢 | 查看接口耗时和超时配置 | 为模型和工具分别设置超时;增加重试;接口走异步 |
| 回答结果编造 | 系统提示词未限制;工具返回结果未写入上下文 | 检查最终回答是否包含工具返回字段 | 约束“只能基于工具结果回答”;工具无结果时明确回答不知道 |
| 上下文超限 | 多轮对话越攒越多 | 查看 token 使用量 | 增加摘要压缩;清理不相关的历史消息;使用记忆库 |
6.3 从日志定位每一步决策
排错时最怕的是只看到“回答不对”,却不知道是哪一步出了问题。建议在业务代码中记录关键决策节点:
import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s %(name)s %(message)s") logger = logging.getLogger("agent") logger.info("user_input=%s", user_input) logger.info("tool_calls=%s", intermediate_steps) logger.info("tool_result=%s", tool_result) logger.info("final_answer=%s", final_answer)记录这些字段后,出现问题时可以直接回放:模型有没有调工具、参数是什么、工具返回了什么、最终答案是否偏离。对比链路的四个节点,问题定位速度会明显加快。
7. 从 DEMO 到生产:把工程问题放到前面
7.1 安全与权限控制
智能体一旦接入真实系统,就不能只考虑“回答准确”,还要考虑“动作安全”。工具权限建议遵循最小化原则:每个智能体只挂载完成当前业务所需的工具,不要把所有接口都暴露给模型。
针对工具调用增加鉴权:
def current_user_token(): # 从请求上下文获取用户身份 pass def get_order_status_secure(order_id: str, user_id: str): if not can_access_order(user_id, order_id): return "无权限访问该订单" return real_order_api(order_id)还要注意 Prompt 注入:用户输入可能会要求模型“忽略以上指令”。生产中不应让模型直接执行高权限操作,关键的删除、转账、审批动作必须由业务系统二次确认,模型只负责生成操作意图,不负责最终授权。
7.2 成本、性能与缓存策略
智能体每轮任务可能包含多次模型调用,成本比普通问答高。可以从几个方向控制:
- 高频静态问题走规则或缓存,不经过模型;
- 对工具调用结果做短时缓存,相同查询在有效期内复用;
- 简单任务使用小模型,复杂任务再路由到大模型;
- 对单用户、单 IP 做频率限制,防止恶意刷量;
- 全链路超时和重试策略要明确,避免工具接口阻塞整个 Agent 循环。
缓存不是所有问题都适合。订单状态、库存这类强实时数据,缓存时间要很短甚至不缓存,避免给用户返回过期状态。
7.3 配置管理、监控与回滚
生产环境的 Prompt、工具列表、模型版本都属于代码和配置,不能只存在数据库中。建议把 Prompt 版本化,工具接口参数走配置中心,模型名称通过环境变量维护。每次变更记录版本号,回滚时能一键切到上一版本。
监控指标建议覆盖:
- 每次任务的模型调用次数;
- 工具调用成功率和耗时;
- 最终回答完成率;
- token 消耗和费用估算;
- 错误类型分布;
- 用户反馈的“不满意”样本。
有了这些数据,就可以做灰度发布。例如先让 10% 流量进入新的 Prompt 版本,观察满意度、调工具比例和费用,再逐步放量。
7.4 发布前检查清单
| 检查项 | 具体内容 |
|---|---|
| 模型配置 | API Key 已注入,base_url 可用,模型支持工具调用 |
| Tool 权限 | 无越权工具,支持二次审批,参数有校验 |
| 数据隐私 | 敏感字段脱敏,日志不打印完整用户隐私 |
| 提示词版本 | system prompt 已记录版本,变更可回滚 |
| 缓存策略 | 明确哪些结果可缓存、缓存多久 |
| 可靠性 | 模型超时、工具异常、空结果都有兜底回复 |
| 监控 | 日志、指标、告警已接入 |
| 成本预算 | 单任务 token 上限,每日预算告警 |
8. 下一步:从“会跑一个 Agent”到“做好一个 Agent 产品”
8.1 接入知识库,让 Agent 回答私有业务问题
很多企业智能体需要回答文档里的业务知识,而不是仅仅调用接口。这时需要引入 RAG:把内部文档切分、向量化,存入向量数据库。用户提问时先检索相关片段,再连同问题一起交给模型回答。
技术选型上,常见组合是:
- 向量库:Milvus、Qdrant、PGVector;
- 文档切分:按标题、段落、固定长度切分;
- 检索:向量相似度 + 关键词混合检索;
- 回答约束:要求模型只根据检索片段回答,并给出引用来源。
把 RAG 工具化后,智能体可以按用户问题自动决定是查知识库还是调用业务接口,覆盖面会明显扩大。
8.2 从单智能体走向多智能体协作
当业务包含多个专业领域,例如售前咨询、订单处理、售后退换,可以考虑把每个领域做成独立智能体,再增加一个主管智能体负责意图识别和任务分发。
实现多智能体时,建议先定义好每个 Agent 的输入输出 JSON Schema,保证它们之间的消息能机器可读。不要通过自然语言对话来传递结构化数据,否则会引入大量解析错误。调度的核心在于确定性,而不是让 Agent 自行随意对话。
8.3 建立评估集,用数据驱动 Prompt 迭代
智能体开发迭代最怕“感觉变好了,但无法量化”。建议从第一天就沉淀评估集:准备 50 到 200 条典型问题,标注好期望是否需要调用工具、期望答案范围。每次修改 Prompt、模型或工具后,用同一套问题跑一遍,统计:
- 工具调用准确率;
- 最终答案正确率;
- 无工具时正确拒答率;
- 平均耗时和 token 消耗。
评估集可以人工标注,也可以用更强的模型做裁判。关键是让迭代有对比、有记录,而不是靠“随机试几次”来推动。
从 2025 年智能体专利授权量的高速增长,到真正动手搭建一个能调工具的订单查询智能体,中间隔着的是对概念的理解、框架的选型、代码的实现和工程化的积累。专利数字反映的是行业热度,而长期竞争力来自把 Demo 变成稳定服务的能力。建议先不要追求多智能体、复杂记忆这些高级概念,把一个最小闭环做到数据可观测、工具可控制、错误可排查,再去逐步扩展。