简介:本教程面向开发者、技术负责人与智能体应用建设人员,讲解如何把大模型、工具、技能、规则、钩子与执行框架组合成可运行的 AI Agent 系统。读者将掌握目标拆解、能力注册、约束配置、流程编排、结果验证与问题排查方法,降低落地难度。
本教程的目标不是只解释“AI Agent 是什么”,而是帮助读者完成一个可落地、可验证、可运维的智能体系统搭建过程。阅读完成后,你应当能够:
本教程适合以下读者:
在动手搭建之前,需要先判断业务是否真的需要 Agent。AI Agent 的优势在于“目标明确、过程可分步、结果可观察、工具可调用”。以下场景通常比较适合:
信息检索与摘要生成
例如“搜集某个行业近三个月的动态,并整理成摘要”。Agent 可以拆解为检索、筛选、阅读、归纳、汇总等步骤。
业务流程辅助
例如客服工单分类、订单查询、售后材料整理等。Agent 可以调用查询工具、判断用户意图,并按规则推进流程。
开发辅助任务
例如代码片段生成、测试用例建议、日志分析、接口调用说明生成等。此类任务通常需要结合代码库、文档或测试环境。
运维排障辅助
例如读取监控指标、查询日志、检查服务状态、生成排障建议。此类场景必须强调权限控制、审计和操作边界。
数据分析问答
例如查询数据库、生成图表说明、解释指标变化。Agent 可通过查询工具获取数据,再形成结构化结论。
需要注意的是,以下场景不建议直接交给全自动 Agent:
对于高风险场景,可以采用“Agent 辅助决策 + 人工确认执行”的模式,将模型输出限定为建议、草案或预案,而不是直接执行。
在开始搭建之前,建议先准备以下内容。
AI Agent 的核心通常是大模型,因此需要一个可调用模型服务的应用环境。模型服务通常需要具备以下能力之一:
如果模型本身不支持稳定的工具调用,也可以通过提示词约束模型输出结构化结果,再由应用层解析。但这种方式需要更严格的校验机制。
Agent 通常需要运行在一个持续可访问的程序环境中,例如后端服务、任务调度服务、容器化应用或批处理任务。运行环境需要具备:
如果 Agent 需要访问业务数据,必须提前准备:
Agent 不应默认拥有全量数据访问权限。工具访问权限应按任务最小化配置。
建议读者了解以下通用知识:
在搭建系统前,需要先把 AI Agent 相关概念对齐。很多人讨论 Agent 时容易产生混淆,原因就在于 Model、Tool、Skill、Rules、Hooks、Harness 并不是同一层级的东西。
Model 是 Agent 的核心推理单元。它负责理解用户目标、分析当前状态、选择下一步动作、生成中间结论或最终结果。
模型不负责实际访问数据库,也不负责执行删除、写入、支付等真实操作。模型的职责是“判断下一步该做什么”,而具体动作通常由工具执行。
Tool 是 Agent 与外部世界交互的桥梁。例如:
工具通常具有明确输入和输出。设计良好的工具应该具备清晰的名称、描述、参数结构、权限边界和错误返回。
Skill 可以理解为“场景化能力包”。它不是单一接口,而是一组工具、提示词、流程和规则的组合。
例如“行业动态摘要”可以封装为一个 Skill:
Skill 的价值在于降低模型反复推理成本,提高任务稳定性。
Rules 用于限制 Agent 可以做什么、不可以做什么。它通常来自业务规范、安全策略、合规要求或成本控制。
例如:
Rules 不应只写在提示词中,而应通过执行层进行强制校验。
Hooks 是生命周期钩子,用于在关键节点执行自定义逻辑。常见节点包括:
Hooks 可用于权限校验、日志记录、敏感信息脱敏、结果缓存、重试判断、人工审核等。
Harness 可以理解为 Agent 的执行壳或运行框架。它负责:
如果说 Model 是大脑,Tool 是手脚,那么 Harness 就是神经系统和运行骨架。
下面按照从零到可运行的过程进行拆解。每一步都会说明“做什么、为什么做、注意什么”。
先明确 Agent 要解决的具体问题。目标必须可描述、可执行、可验证。
例如:
目标:搜集指定行业近三个月的公开动态,整理成一份包含时间、来源、主题和摘要的报告。
如果没有清晰目标,模型很容易在对话中发散,执行过程也无法判断是否完成。
目标定义至少包含:
示例目标模板:
任务目标:输入:- 行业关键词- 时间范围- 来源范围输出:- 事件列表- 每条事件包含:标题、时间、来源、摘要、链接完成标准:- 至少返回 5 条相关事件- 每条事件必须有来源- 若检索失败,需返回失败原因
为 Agent 定义任务状态。一个 Agent 通常不是一次性输出结果,而是经历多轮观察、规划、执行和修正。
推荐状态包括:
status:- created 任务创建- planning 规划中- running 执行中- waiting 等待输入或人工确认- succeeded 执行成功- failed 执行失败- canceled 已取消
同时记录任务上下文:
task:task_idgoalstatuscurrent_stepstepstool_resultserrorsmax_stepsbudgetresult
状态化可以让 Agent 支持暂停、恢复、重试、审计和人工接管。没有状态管理,Agent 很容易变成一次性的不可控调用。
需要明确最大步数、最大工具调用次数、最大耗时和预算。例如:
max_steps: 12max_tool_calls: 20timeout_seconds: 120budget_tokens: 30000
这些限制不是业务规则,而是系统稳定性保障。
根据任务复杂度选择模型,并设计模型输入输出格式。
模型输入通常包括:
系统提示词用户目标当前任务状态已执行步骤可用工具列表规则约束历史上下文
模型输出通常需要结构化,例如:
{"thought": "先检索关键词","action": "call_tool","tool_name": "search","parameters": {"query": "人工智能 行业动态","time_range": "2025-01-01 to 2025-03-31"}}
或者:
{"thought": "信息已经足够","action": "finish","result": "..."}
结构化输出便于执行层解析、校验和调用工具。如果模型输出是自由文本,系统很难稳定判断下一步动作。
模型输出可能不稳定,因此必须增加校验:
如果模型输出格式错误,应触发重试或降级策略。
为 Agent 注册可调用工具。工具应具备清晰定义:
tool:name: searchdescription: 根据关键词检索授权范围内的资料input_schema:type: objectproperties:query:type: stringtime_range:type: stringtop_k:type: integerrequired:- querytimeout_seconds: 15permission: read_only
工具决定 Agent 能否真正完成任务。没有工具,模型只能生成文本,无法查询事实、调用业务系统或执行动作。
工具设计要遵循以下原则:
原子化
一个工具只负责一个明确动作,避免工具过大导致参数复杂、失败率高。
描述清楚
工具名称和描述要帮助模型理解何时调用。
权限最小化
查询类工具、写入类工具、删除类工具应区分权限。
参数校验
调用工具前必须校验必填参数、参数类型和取值范围。
错误可读
工具失败时,应返回可理解错误,而不是只返回异常堆栈。
幂等性
对写入类工具,要支持幂等键或重复调用保护。
将常见任务封装为 Skill。Skill 不是单纯接口,而是一组流程和能力组合。
例如“行业动态摘要 Skill”可以包括:
输入:- 行业关键词- 时间范围处理步骤:1. 调用搜索工具检索候选资料2. 过滤重复项3. 提取标题、时间、来源、正文摘要4. 按时间排序5. 生成汇总摘要6. 返回结构化结果输出:- 事件列表- 汇总摘要- 来源列表- 失败原因
Skill 可以减少模型反复推理,提高任务稳定性,也方便复用和测试。
Skill 应可独立验证。建议为每个 Skill 准备:
为 Agent 配置硬规则和软规则。
硬规则示例:
- 禁止调用未注册工具- 禁止访问未授权数据源- 删除类工具必须人工确认- 单任务最大步数为 12- 单任务最大工具调用次数为 20- 输出中不得包含未脱敏的敏感字段
软规则示例:
- 尽量优先使用权威来源- 输出应附带来源- 若信息不足,应说明缺失原因- 若存在多个结论,应列出不确定性
模型具有一定不确定性,仅靠提示词无法保证安全。Rules 应由执行层强制执行。
规则最好可配置、可版本化、可审计。不要在代码中散落硬编码判断。
示例配置:
rules:- id: read_only_scopetype: harddescription: 只允许访问授权数据源- id: max_stepstype: harddescription: 最大执行步数限制- id: require_sourcetype: softdescription: 输出结果需包含来源- id: manual_confirmtype: harddescription: 高风险操作需人工确认
在关键节点添加钩子:
hooks:before_model:- build_context- check_budgetafter_model:- validate_output_schemabefore_tool:- check_permission- check_parametersafter_tool:- redact_sensitive_fields- log_tool_resulton_error:- retry_or_fallbackon_finish:- persist_result- send_notification
Hooks 可以把安全、审计、缓存、重试、脱敏等能力从主流程中解耦出来,使执行逻辑更清晰。
钩子本身也可能失败,因此要明确失败策略:
Harness 是执行壳。它负责循环调用模型、解析动作、调用工具、校验规则、更新状态、记录日志。
一个通用执行循环如下:
function run_agent(task):state = init_state(task)while state.status == "running":if state.steps >= state.max_steps:return fail("超过最大步数")context = build_context(state)plan = model.generate(context)action = parse_action(plan)if not rules.allow(action, state):return fail("动作被规则拦截")run_hooks("before_tool", action)result = call_tool(action.tool_name, action.parameters)run_hooks("after_tool", result)state.update(result)if action.is_finish:state.status = "succeeded"breakstate.steps = state.steps + 1return finalize(state)
模型只负责决策,但系统是否稳定、安全、可观测,主要由 Harness 决定。
Harness 需要支持以下能力:
状态持久化
任务中断后可以恢复。
最大步数控制
防止无限循环。
预算控制
限制 token、调用次数或时间成本。
重试机制
对可重试错误进行有限次数重试。
幂等处理
避免重复写入、重复通知、重复扣费。
并发隔离
不同任务之间状态不能互相污染。
人工接管
高风险任务可暂停并等待人工确认。
日志与追踪
每次模型调用、工具调用、规则拦截、异常退出都应记录。
不同系统的配置项会有差异,但通常包括以下几类。
model:name: default_reasonertemperature: 0.2max_output_tokens: 2000timeout_seconds: 30
说明:
temperature 越低,输出越稳定,适合工具调用和结构化输出;max_output_tokens 需要根据任务复杂度设置,避免截断;timeout_seconds 应大于模型平均响应时间,并考虑重试。
agent:max_steps: 12max_tool_calls: 20max_duration_seconds: 180retry:max_attempts: 2backoff_seconds: 2
说明:
max_steps 不宜过小,否则复杂任务可能无法完成;max_steps 也不宜过大,否则增加成本和风险;
tools:- name: searchenabled: truetimeout_seconds: 15retry: 1- name: query_dbenabled: truetimeout_seconds: 20retry: 0- name: delete_itemenabled: falserequires_manual_approval: true
说明:
rules:- id: no_external_writetype: hard- id: require_sourcetype: soft- id: sensitive_redacttype: hard
说明:
hooks:before_model:- build_contextafter_model:- validate_schemabefore_tool:- check_permissionafter_tool:- redact_outputon_error:- fallback_modelon_finish:- persist_result
下面以一个通用任务为例,展示完整流程。
搜集指定行业近三个月的重要动态,生成结构化摘要,并标注来源。
task = {goal: "搜集人工智能行业近三个月重要动态",time_range: "近三个月",output_format: "list"}state = create_state(task)while state.status == "running":plan = model.plan(state)if plan.action == "search":results = tool.search(plan.parameters)state.add_results(results)elif plan.action == "summarize":summary = model.summarize(state.results)state.add_summary(summary)elif plan.action == "finish":if rules.require_source and not state.has_source():state.status = "failed"state.error = "结果缺少来源"else:state.status = "succeeded"state.result = state.final_output()
任务状态:成功事件列表:1. 标题:某机构发布行业趋势报告时间:2025-02-10来源:公开资料库摘要:报告关注模型应用、算力需求和行业落地。2. 标题:某会议召开时间:2025-03-05来源:公开资料库摘要:会议围绕智能体应用与安全治理展开讨论。汇总摘要:近三个月行业动态主要集中在模型应用、算力需求和智能体工程化三个方向。
注意:这里只是流程示例,实际实现时需要补充来源、链接、权限、去重和质量评估。
验证应分层进行,不建议只看最终文本。
检查每个工具是否能被正确调用:
检查任务是否能稳定完成:
检查规则是否真正生效:
检查输出质量是否满足业务要求:
可以建立如下观察指标:
现象:模型有时返回 JSON,有时返回自然语言。
原因:提示词约束不足,或缺少输出校验。
解决思路:
现象:模型生成的参数缺失、类型错误或超出范围。
原因:工具描述不清晰,参数校验不足。
解决思路:
现象:模型反复调用同一工具或重复生成相似计划。
原因:缺少状态判断、最大步数或重复动作检测。
解决思路:
现象:输出看似合理,但无法追溯来源。
原因:模型未依赖工具结果,或规则未强制执行。
解决思路:
现象:任务执行到后期,模型响应变慢或遗漏信息。
原因:历史步骤和工具结果累积过多。
解决思路:
现象:Agent 能访问超出业务需要的数据。
原因:权限设计不合理。
解决思路:
现象:任务调用次数多,token 消耗大。
原因:模型选择过大、工具调用过多、缺少预算控制。
解决思路:
AI Agent 不是简单的“会调用工具的大模型”,而是一个以模型为决策核心,通过工具执行动作、通过技能复用流程、通过规则约束边界、通过钩子扩展生命周期、通过执行框架驱动运行的完整系统。
搭建一个可用的 AI Agent,建议遵循以下路径:
当这些组件被清晰地组合在一起后,AI Agent 就不再是一个模糊概念,而是一套可以被设计、测试、部署、监控和迭代的工程系统。