Agent 框架实操教程:从模型到可执行智能体的完整搭建

作者:菠萝爱吃肉2026.11.04 11:35浏览量:0

简介:本文面向开发者、运维人员和技术负责人,系统讲解如何基于“模型 + 执行框架”的思路搭建一个可落地的 Agent。文章不依赖特定商业平台,重点说明核心架构、任务规划、工具调用、沙箱执行、会话管理、结果验证与故障排查等通用实现方法,帮助读者理解 Agent 框架的运行机制并完成一个最小可用的智能体工程实践。

一、教程目标

本教程要帮助读者完成一件非常具体的事情:基于通用的 Agent 框架思路,搭建一个最小可用的智能体执行环境,并让它能够完成“接收任务—规划步骤—调用工具—执行操作—返回结果”的完整闭环。

很多开发者第一次接触 Agent 时,容易把模型本身误认为 Agent。实际上,模型只负责理解、推理和生成文本,它本身不能操作文件、不能查询数据库、不能调用外部接口。真正让模型“动起来”的,是模型之外的一层执行框架。本教程把这层框架称为 Harness,并围绕它的核心能力展开。

学习完成后,你将能够:

  • 理解 Agent 的基本组成公式:Agent = Model + Harness
  • 明确 Harness 需要承担哪些关键职责
  • 搭建一个不依赖特定商业平台的通用 Agent 执行骨架
  • 实现任务规划、工具注册与调用、沙箱执行、会话保持
  • 对执行结果进行验证和故障排查
  • 根据实际场景对 Agent 做性能、安全和稳定性优化

本教程适合以下读者:

  • 希望理解 Agent 内部机制的开发者
  • 需要为团队搭建智能体执行环境的运维人员
  • 正在评估 Agent 方案可行性的技术负责人
  • 对模型应用落地感兴趣的企业技术决策者

agent-model-harness">二、核心概念:为什么是 Agent = Model + Harness

在进入具体操作之前,必须先把概念边界说清楚。这个边界不清楚,后续所有操作都容易走偏。

模型(Model) 的职责比较纯粹:

  • 理解用户输入的自然语言
  • 根据上下文进行推理
  • 生成回答、计划或代码片段
  • 判断下一步需要调用什么能力

但模型有几个明显边界:

  • 模型无法直接访问你的服务器
  • 模型无法直接读写本地文件
  • 模型无法直接查询业务数据库
  • 模型无法直接调用外部 API
  • 模型执行的操作不能自动持久化
  • 模型无法自己管理长时间运行的任务状态

这些能力必须由 Harness 提供。

Harness 可以理解为一个运行在模型外部的执行环境,它至少承担以下职责:

  1. 工具接入:把文件操作、数据库查询、网络请求、第三方服务调用等能力封装成模型可以识别和调用的工具。
  2. 任务规划:把复杂任务拆解成多个可执行步骤,明确先后依赖关系。
  3. 任务调度:按顺序或按条件执行规划好的步骤。
  4. 沙箱执行:在隔离环境中运行模型生成的代码或命令,避免影响宿主系统。
  5. 存储管理:保存中间结果、会话状态、执行日志和输出文件。
  6. 循环控制:支持“执行—观察结果—再执行”的迭代过程,直到任务完成或达到终止条件。
  7. 会话管理:维护多轮对话上下文,保证 Agent 能记住之前做了什么。

有了这层理解,后续搭建过程就有了清晰的目标。

三、适用场景

这种“模型 + 执行框架”的 Agent 结构,适用范围很广。以下是几类典型场景:

场景一:研发辅助与自动化运维

开发团队希望用自然语言完成部分重复性工作,例如:

  • 根据需求描述生成一段脚本,并在沙箱中试运行
  • 查询某个服务的运行状态并汇总成报告
  • 批量修改配置文件并校验格式是否正确
  • 按照预设流程执行发布前的检查步骤

场景二:业务数据处理

企业用户需要让智能体帮助处理数据,例如:

  • 从数据库中提取指定指标
  • 对数据进行初步清洗和汇总
  • 生成结构化的分析结果
  • 将结果写入指定存储位置

场景三:内部知识管理与问答

企业内部希望构建一个能够“动手”的助手,而不是只会回答问题的聊天机器人,例如:

  • 根据用户问题检索内部文档
  • 按权限策略返回可公开的内容
  • 将检索结果整理成规范格式
  • 在得到授权时执行某些内部操作

场景四:监控告警与应急响应

运维人员希望智能体在收到告警后自动执行排查流程,例如:

  • 读取告警信息并判断严重程度
  • 自动查询相关服务的日志和指标
  • 执行预定义的诊断命令
  • 生成初步处理建议或触发工单

在这些场景中,模型负责“理解与决策”,Harness 负责“执行与反馈”。二者缺一不可。

四、前置准备

在开始搭建之前,需要准备以下基础环境与能力。这里只描述通用要求,不绑定特定商业平台。

4.1 基础运行环境

准备一台可用的开发服务器或本地开发机,建议具备以下条件:

  • 操作系统:主流 Linux 发行版或兼容环境
  • 内存:至少 4GB,推荐 8GB 以上
  • 磁盘:至少 10GB 可用空间
  • 网络:能够访问模型推理服务,以及后续需要接入的外部接口

4.2 模型访问能力

你需要有一个可用的模型推理入口。可以是:

  • 企业自建的模型推理服务
  • 云服务商提供的模型 API 网关
  • 本地部署的开源模型推理服务

无论哪种方式,关键是要获得一个规范的请求接口,能够发送 prompt 并接收生成结果。本教程不假设任何具体模型品牌或服务商。

4.3 基础软件开发能力

需要掌握以下基础技能:

  • 至少熟悉一门通用编程语言,例如 Python、Go 或 Java
  • 了解 HTTP 请求与 JSON 数据格式
  • 了解进程管理、文件权限、环境变量等操作系统基础概念
  • 了解容器或沙箱的基本概念

4.4 安全与权限准备

Agent 执行环境涉及执行代码和调用工具,必须提前规划权限边界:

  • 准备一个专用运行账号,避免使用 root 或高权限账号
  • 明确哪些目录允许读写
  • 明确哪些外部服务允许访问
  • 准备审计日志的存储位置
  • 对敏感操作设置人工确认机制

五、实施步骤

下面从零开始,按顺序搭建一个最小可用的 Agent 执行环境。

5.1 定义 Agent 的职责边界

在写代码之前,先回答三个问题:

  • 这个 Agent 要解决什么类型的问题?
  • 它允许执行哪些操作?
  • 它在什么条件下必须停止或请求人工介入?

这一步看似简单,但决定了后续所有模块的设计。以“运维辅助 Agent”为例,职责边界可以定义为:

  • 可以执行只读查询,例如查看日志、查看服务状态
  • 可以执行低风险操作,例如生成诊断报告
  • 不允许直接修改生产配置
  • 所有命令必须在沙箱中执行
  • 涉及敏感操作时必须返回人工确认请求

把这些边界写成一个简短的配置文件或常量定义,后续模块都从这个定义中读取限制条件。

5.2 设计 Harness 的核心结构

Harness 的核心结构建议包含以下组件:

  1. 任务接收入口
  2. ↓
  3. 会话管理器
  4. ↓
  5. 任务规划器
  6. ↓
  7. 调度器
  8. ↓
  9. 工具注册中心 → 沙箱执行器 → 结果收集器
  10. ↓
  11. 循环控制器
  12. ↓
  13. 结果输出与存储

每个组件的职责如下:

  • 任务接收入口:接收用户输入,统一转换为标准任务对象。
  • 会话管理器:维护本轮任务的上下文,包括历史消息、中间结果、当前状态。
  • 任务规划器:调用模型,将用户输入拆解为可执行步骤。
  • 调度器:按顺序或条件调度步骤执行。
  • 工具注册中心:维护可用工具的元信息,供模型选择和调用。
  • 沙箱执行器:在隔离环境中执行具体命令或代码。
  • 结果收集器:捕获执行输出、错误信息和执行时间。
  • 循环控制器:根据结果决定继续执行、修正还是终止。

5.3 定义任务对象与状态模型

建议使用统一的任务对象贯穿整个流程。一个通用示例:

  1. 任务对象:
  2. {
  3. "task_id": "唯一标识",
  4. "session_id": "会话标识",
  5. "user_input": "用户原始输入",
  6. "plan": [
  7. {
  8. "step_id": "步骤标识",
  9. "step_type": "tool_call | model_call | condition | stop",
  10. "tool_name": "工具名称,当 step_type 为 tool_call 时必填",
  11. "tool_args": {},
  12. "depends_on": ["依赖的步骤 id"],
  13. "status": "pending | running | success | failed | skipped",
  14. "result": null,
  15. "error": null
  16. }
  17. ],
  18. "status": "pending | running | success | failed | waiting_human",
  19. "created_at": "创建时间",
  20. "updated_at": "更新时间"
  21. }

定义清楚状态流转规则:

  • pending → running:调度器开始执行步骤
  • running → success:步骤执行成功
  • running → failed:步骤执行失败
  • failed → running:循环控制器决定重试
  • running → waiting_human:需要人工确认
  • 所有步骤成功或终止条件达成后,任务整体状态变为 success 或 failed

5.4 实现任务规划器

任务规划器的核心工作是调用模型,根据用户输入生成结构化的执行计划。

一个通用的规划 prompt 模板如下:

  1. 你是一个任务规划助手。请将用户的任务拆解为可执行步骤。
  2. 可用工具列表:
  3. - query_logs: 查询服务日志
  4. - query_status: 查询服务运行状态
  5. - run_diagnostic: 运行诊断命令
  6. - generate_report: 生成报告文件
  7. 要求:
  8. 1. 每个步骤必须使用可用工具之一
  9. 2. 明确步骤之间的依赖关系
  10. 3. 如果任务无法完成,明确说明原因
  11. 4. 输出格式为 JSON 数组
  12. 用户任务:{{user_input}}

模型返回后,Harness 需要做以下校验:

  • 步骤中引用的工具是否存在
  • 依赖的步骤是否在计划中
  • 参数是否符合工具定义的 schema
  • 是否包含不允许执行的操作

校验通过后,将计划写入任务对象并进入调度阶段。

5.5 实现工具注册中心

工具注册中心的目的是让模型知道“有哪些工具可用”,同时让 Harness 能够“真正执行这些工具”。

每个工具需要提供:

  • 工具名称:唯一标识
  • 工具描述:告诉模型这个工具是做什么的
  • 参数 schema:定义入参的类型、必填项和默认值
  • 执行函数:真正执行操作的代码入口
  • 风险等级:low、medium、high
  • 是否需要人工确认:布尔值

一个通用工具定义示例:

  1. 工具名称:query_logs
  2. 工具描述:查询指定服务的最近日志,返回最多 N 条记录
  3. 参数 schema:
  4. {
  5. "service_name": {"type": "string", "required": true},
  6. "lines": {"type": "integer", "required": false, "default": 50}
  7. }
  8. 风险等级:low
  9. 需要人工确认:false
  10. 执行函数:query_logs_handler

注册中心维护一个工具列表和名称索引。规划器生成计划时,只会引用注册中心中已存在的工具。

5.6 实现沙箱执行器

沙箱执行器负责在隔离环境中运行具体命令或代码。隔离方式可以根据实际条件选择:

方式一:容器隔离

使用通用容器技术创建临时运行环境。每次执行任务时,从基础镜像启动一个新的容器实例,任务结束后销毁。这种方式的优点是环境干净,缺点是启动开销较大。

方式二:进程级隔离

在宿主机上使用受限用户运行子进程,并通过文件系统权限限制可访问范围。这种方式的优点是轻量,缺点是隔离性不如容器。

方式三:虚拟环境隔离

在语言层面使用虚拟环境隔离依赖,例如 Python 虚拟环境。这种方式的优点是简单,缺点是只能隔离依赖,不能隔离文件系统和网络。

无论采用哪种方式,沙箱执行器都需要做到:

  • 设置执行超时时间
  • 限制内存和 CPU 使用
  • 限制网络访问范围
  • 捕获标准输出和标准错误
  • 返回结构化的执行结果

一个执行结果的通用结构:

  1. 执行结果:
  2. {
  3. "exit_code": 0,
  4. "stdout": "命令输出内容",
  5. "stderr": "",
  6. "duration_ms": 320,
  7. "truncated": false
  8. }

5.7 实现循环控制器

循环控制器让 Agent 具备“执行—观察—再执行”的能力。当一个步骤失败或结果不符合预期时,循环控制器可以采取以下策略:

  • 重试:对于瞬时错误,例如网络超时,可以自动重试。
  • 修正:将错误信息反馈给模型,请求模型生成修正后的计划。
  • 降级:尝试使用替代工具或替代参数。
  • 终止:错误不可恢复或达到最大重试次数时终止任务。
  • 人工介入:错误涉及敏感操作或需要业务判断时,暂停并请求人工处理。

循环控制器的核心逻辑可以概括为:

  1. while 任务未完成 and 重试次数未超限:
  2. 执行当前步骤
  3. 收集结果
  4. if 步骤成功:
  5. 进入下一个步骤
  6. else if 错误可重试:
  7. 重试当前步骤
  8. else if 错误可通过模型修正:
  9. 调用模型生成修正方案
  10. else if 需要人工确认:
  11. 暂停任务,等待人工输入
  12. else:
  13. 终止任务,返回失败原因

5.8 实现会话管理器

会话管理器保证多轮对话中 Agent 能记住上下文。它需要维护:

  • 当前会话的历史消息列表
  • 已执行步骤及结果摘要
  • 当前任务状态
  • 用户偏好或约束条件

在多轮交互中,Harness 不能把完整历史上下文全部无脑塞给模型。当上下文过大时,需要做摘要压缩,只保留关键信息:

  • 用户最初的目标
  • 已成功完成的操作和结果
  • 当前待解决的问题
  • 最近几轮的详细对话

这样可以避免上下文超限,同时让模型保持对整体目标的认知。

六、结果验证

搭建完成后,需要验证 Agent 是否能正确完成完整闭环。建议使用以下测试用例逐项验证。

6.1 基础闭环测试

发送一个简单的、可明确拆解的只读任务,例如:

“查询某服务的最近日志,并生成一份简要报告。”

预期行为:

  1. 规划器将任务拆解为 query_logs 和 generate_report 两个步骤。
  2. 调度器先执行 query_logs。
  3. 沙箱执行器返回日志内容。
  4. 调度器再执行 generate_report。
  5. 最终返回报告文件路径和内容摘要。

验证点:

  • 计划是否合理
  • 工具是否被正确调用
  • 步骤依赖关系是否正确
  • 最终结果是否完整

6.2 异常处理测试

发送一个会触发错误的请求,例如查询一个不存在的服务:

“查询一个不存在的服务的日志。”

预期行为:

  1. 工具执行失败,返回非零退出码。
  2. 循环控制器捕获错误。
  3. 根据策略决定重试或终止。
  4. 最终向用户返回清晰的错误信息,而不是无限循环。

验证点:

  • 超时机制是否生效
  • 错误信息是否清晰
  • 是否按预期终止或请求人工介入

6.3 多轮会话测试

进行连续多轮交互:

第一轮:

“查询服务 A 的状态。”

第二轮:

“如果状态异常,把最近的错误日志找出来。”

预期行为:

  • 第二轮中,模型能理解“服务 A”和“状态异常”指代的是第一轮的结果。
  • Harness 能从会话管理器中恢复上下文。
  • 第二轮的执行依赖第一轮的结果。

验证点:

  • 会话上下文是否在轮次间正确传递
  • 依赖前序结果的场景是否能正常执行

七、常见问题与排查

在实际落地过程中,经常会遇到以下几类问题。

7.1 规划结果不符合预期

现象:模型拆分出的步骤不可执行,或者调用了不存在的工具。

原因分析:

  • 工具描述不够清晰,模型无法准确理解工具用途
  • prompt 中可用工具列表与注册中心不同步
  • 模型对参数 schema 的理解有偏差

解决思路:

  • 优化工具描述,包含用途、适用场景和限制条件
  • 在 prompt 和注册中心之间建立自动同步机制
  • 在规划结果进入调度前增加严格校验
  • 对常见的错误规划模式做后处理修正

7.2 沙箱执行超时

现象:执行步骤在沙箱中卡住,长时间没有返回。

原因分析:

  • 执行的命令本身耗时过长
  • 命令等待输入,但沙箱没有提供输入通道
  • 网络请求无响应

解决思路:

  • 为每个工具设置合理的默认超时
  • 在执行命令时关闭标准输入或提供空输入
  • 设置网络连接超时和读取超时
  • 对可中断的命令设置取消机制

7.3 上下文超限

现象:多轮对话后,模型请求失败或响应质量下降。

原因分析:

  • 历史消息和中间结果过大
  • 工具返回的内容没有截断
  • 多次重试导致上下文中出现大量重复信息

解决思路:

  • 对工具返回内容设置最大长度限制
  • 在每轮结束后对历史信息做摘要压缩
  • 只保留最近若干轮完整上下文,更早的只保留摘要
  • 对重试过程不重复追加相似的错误信息

7.4 工具被错误复用

现象:模型在不合适的场景调用了某个工具,导致误操作或权限风险。

原因分析:

  • 工具描述中缺少使用限制说明
  • 工具之间的边界不清晰
  • 权限校验存在漏洞

解决思路:

  • 在工具描述中明确“何时不应该使用此工具”
  • 在 Harness 层增加二次权限校验,不依赖模型自觉
  • 对高风险操作强制人工确认
  • 定期审计工具调用日志,发现异常调用模式

八、优化建议

在基本功能跑通之后,可以从以下几个维度进一步优化。

8.1 性能优化

  • 缓存工具结果:对相同参数且短时间内重复调用的工具结果做缓存。
  • 异步执行:对相互独立的步骤采用并行执行,减少整体等待时间。
  • 流式返回:对长任务采用流式返回中间状态,提升用户体验。
  • 连接复用:复用模型推理服务的网络连接和会话资源。

8.2 安全加固

  • 最小权限原则:沙箱账号只授予完成任务所需的最小权限。
  • 网络隔离:默认禁止访问公网,仅放行必须的内部服务。
  • 操作审计:记录所有工具调用,包含参数、结果、时间和执行者。
  • 人工确认:对写操作、配置变更、数据删除等高危动作设置人工确认。
  • 敏感信息过滤:在将工具输出反馈给模型之前,过滤密钥、令牌等敏感信息。

8.3 稳定性提升

  • 幂等设计:让可重试的操作具备幂等性,避免重复执行产生副作用。
  • 降级策略:当某个工具不可用时,提供替代方案或明确失败。
  • 熔断机制:对频繁失败的工具做熔断,避免连续无效调用。
  • 状态持久化:将任务状态实时持久化,支持进程重启后恢复。

8.4 可维护性增强

  • 工具定义与执行解耦:工具元信息与执行函数分离,方便独立更新。
  • 结构化日志:为每个任务和步骤生成结构化日志,方便检索和追踪。
  • 版本管理:对 prompt、工具定义和沙箱镜像做版本管理,支持回滚。
  • 监控指标:采集任务成功率、步骤执行时长、重试次数等指标,建立监控视图。

九、总结

本教程从“Agent = Model + Harness”这个基本认知出发,系统介绍了如何搭建一个不依赖特定商业平台的通用智能体执行框架。

核心要点回顾:

  1. 模型不是 Agent。模型只负责理解与推理,执行能力必须由 Harness 提供。
  2. Harness 承担任务规划、工具接入、沙箱执行、调度、循环、会话和存储等关键职责。
  3. 搭建过程要有明确的职责边界,先定义清楚“能做什么、不能做什么”。
  4. 工具注册中心是模型与执行之间的桥梁,工具描述质量直接影响规划准确率。
  5. 沙箱执行必须做到超时、限流、权限和审计四个维度的管控。
  6. 循环控制器让 Agent 具备从错误中恢复的能力,但要设置清晰的重试和终止条件。
  7. 结果验证要覆盖正常闭环、异常处理和多轮会话三类场景。
  8. 生产落地需要从性能、安全、稳定性和可维护性四个维度持续优化。

后续可以继续关注的方向包括:更复杂的任务规划策略、更细粒度的工具权限控制、更完善的人工审批流程,以及针对具体业务场景的 Agent 模板建设。掌握了本教程搭建的通用框架,再面对具体业务需求时,就能把主要精力放在工具设计和流程优化上,而不是重复搭建基础执行能力。