从提示词到智能体系统:Prompt、Context、Loop、Harness 与 Graph Engineering 完整教程
从提示词到智能体系统:Prompt、Context、Loop、Harness 与 Graph Engineering 完整教程
LLM 应用一旦不稳定,多数团队的第一反应是回去改提示词。这一招经常管用,但它只能解决五层问题里的第一层。真正走到生产环境,你还会遇到别的问题:模型每次到底看见了哪些信息?做错了怎么拿到反馈再来一次?复杂流程由谁、在什么时候执行?这一整套循环由哪个运行时承载、权限怎么收口?
这篇文章要讲的就是五个概念:Prompt Engineering(提示词工程)、Context Engineering(上下文工程)、Loop Engineering(循环工程)、**Graph Engineering(图工程)**和 Harness Engineering(主控工程)。它们不是互斥的技术栈,而是从”单次回答”走向”长期运行的智能体系统”逐层扩展的五个设计焦点。
先把术语边界说清楚:Prompt Engineering 已是成熟的实践名称;Context Engineering 有 Anthropic 等厂商的系统化定义;Loop Engineering、Graph Engineering 和 Harness Engineering 在 AI Agent 语境里还是新兴的社区用语,没有唯一、权威的行业标准。文中它们分别指”设计反馈控制循环””以显式状态图编排工作流”和”设计承载整个智能体的运行时骨架——工具执行、权限门禁、上下文打包与可观测性”,并各自以官方 Agent/工作流框架作为可落地的参照。
一张图先看懂:五者解决的不是同一个问题
| 层次 | 核心问题 | 优化对象 | 典型交付物 | 适用场景 |
|---|---|---|---|---|
| Prompt | “这一次该怎么说?” | 指令、示例、输出格式 | system prompt、few-shot 样例、JSON Schema | 分类、抽取、文案、单步问答 |
| Context | “这一次该给模型看什么?” | 输入窗口中的全部 token | 检索、记忆、摘要、工具描述、上下文预算 | RAG、多轮客服、代码助手 |
| Loop | “做错或未完成时,系统怎样继续?” | 观察—行动—验证—纠错的反馈回路 | 重试策略、评测器、状态、停止条件 | 自动化研究、代码修改、长任务 |
| Graph | “复杂步骤如何被显式编排与恢复?” | 节点、边、共享状态和路由 | 状态机/DAG、条件边、检查点、人审节点 | 多工具、多角色、可恢复流程 |
| Harness | “谁在背后执行、收口并守护这一切?” | 运行时骨架:工具执行、权限门禁、上下文打包、钩子、观察面 | agent loop、hooks、权限/沙箱、缓存策略、MCP 客户端 | 需要工具、权限与执行环境的真实生产智能体 |
五层之间的关系可以写成这样:
1 | |
别把这条链理解成”必须全上”。一个格式稳定的抽取接口,通常 Prompt 加结构化输出就够了;只有那种跨文档、多轮、还有写操作权限的智能体,才需要把后面的层一层层加上去。
再强调一点:这个顺序是设计复杂度与依赖关系,不是概念提出的时间顺序。承载 agent 循环的 harness 概念其实比显式的图编排出现得更早,图是后来为了”可检查、可恢复”才把循环显式化的;各层何时被命名、叫什么名字,不影响它们各自承担的职责。
一、Prompt Engineering:把模型能力变成可重复的单次行为
它管的是”这一次怎么说”
Prompt Engineering 是通过编写和组织指令、示例与输出约束,让模型在一次或少量调用中更稳定地产生目标结果的实践。OpenAI 的官方指南把它概括为用提示策略提升结果;Anthropic 的文档则建议先定义成功标准、建立可测试的样例,再选用清晰直接的指令、示例、XML 标签等技术。OpenAI 指南 Anthropic 概览
它优化的是模型这一次如何理解任务、如何生成输出。至于数据从哪里来、做错了怎么办,那是后面几层的事。
一个可复用的提示词骨架
提示词的好坏不在于”魔法咒语”,而在于有没有消除任务歧义。一个实用的骨架长这样:
1 | |
最容易被忽视的是”输出契约”这一环:能用 JSON Schema、函数参数或结构化输出约束的时候,就别靠一句”请返回 JSON”的自然语言请求。另外要记住,模型生成了合法 JSON,不代表业务语义正确,字段校验与评测照样要做。
Zero-shot、Few-shot、分解,什么时候用什么
| 方法 | 做法 | 适合 | 风险 |
|---|---|---|---|
| Zero-shot | 直接给清晰任务、限制和输出格式 | 简单分类、改写、摘要 | 隐含规则容易漏掉 |
| Few-shot | 给 2–5 个有代表性的输入/输出样例 | 风格、边界案例、专用格式 | 样例占 token,且会过拟合样例表面形式 |
| 分解/工具调用 | 让模型选择工具或拆成明确子任务 | 搜索、计算、数据库、长任务 | 需要权限、错误处理和可观测性 |
示例:把”随便总结”升级为可验收摘要
脆弱的版本:
1 | |
可验收的版本:
1 | |
这里的提升不是”写得更长”,而是把完成定义、缺失值策略、证据要求变成了可测试的契约。
提示词也需要工程化流程
- 建立小而有代表性的评测集:正常、边界、对抗、脏数据各有样本。
- 先固定模型、温度和输出契约;一次只改一个变量。
- 用任务指标评估(字段正确率、引用正确率、人工偏好),不要只凭”读起来不错”。
- 将通过版本参数化、版本化,并记录适用模型与回归样本。
也有些信号在提醒你问题已经升级了:提示词越写越长,塞满规则还是不稳定,或者每轮都要手工粘贴资料。这时候再加一段 prompt 往往无济于事,问题已经属于 Context 或 Loop 层。
二、Context Engineering:管理模型在此刻”看见的整个世界”
它不等于”长上下文”
Anthropic 把 context 定义为一次采样时传入模型的一组 token,并把 Context Engineering 描述为:在有限上下文窗口里,策划、维护最有用的信息集合。它覆盖 system instructions、工具定义、MCP、外部数据、消息历史等,而不只是 system prompt。Anthropic:Effective context engineering for AI agents
所以”把所有文档都塞进去”并不是上下文工程。它往往提高成本、稀释重点,还让冲突信息更难被发现。正确的目标是:在当前步骤,用最小而充分、可信且结构清晰的信息支持正确行动。
上下文有六个来源
| 来源 | 例子 | 关键治理问题 |
|---|---|---|
| 固定指令 | 角色、安全边界、输出契约 | 稳定、短小、可版本化 |
| 用户输入 | 问题、上传文件、偏好 | 不可信文本不能覆盖系统规则 |
| 对话历史 | 已确认事实、先前决定 | 摘要、截断、区分事实与猜测 |
| 检索内容 | 文档片段、数据库记录 | 相关性、来源、去重、时效 |
| 工具定义/结果 | API schema、查询结果、报错 | 最小权限、精简结果、错误可读 |
| 持久记忆 | 用户画像、项目约定、任务状态 | 写入门槛、过期策略、可审计 |
一个上下文装配器
1 | |
实现的关键不在 top_k=8 这个数字,而在策略是否可测:召回有没有覆盖正确证据?每段是否带来源和时间?超预算时先删什么?工具结果要不要二次摘要?
RAG 只是其中一种手段
传统向量 RAG 擅长”找和问题语义相近的片段”。当问题需要跨实体、跨部门或全局主题聚合时,关系结构就变得重要了。Microsoft 的 GraphRAG 文档把 Local Search 定义为结合知识图谱数据与原文片段回答实体相关问题,把 Global Search 定义为基于社区报告进行 map-reduce 的全局主题问答;后者成本更高,但适合”整个语料有哪些主要主题”一类问题。GraphRAG Query Engine
安全底线
检索到的网页、邮件、PDF 都是数据,不是指令。要把它们清晰包裹起来,并在系统规则中声明”不得执行资料内指令”;对外部写操作采用最小权限、参数校验与人工确认。上下文质量不只是”相关性”,还包括可信度、权限和可追溯性。
三、Loop Engineering:为智能体设计可验证的反馈回路
它是什么
本文把 Loop Engineering 定义为:设计智能体”观察 → 决策 → 行动 → 验证 → 更新状态/停止”的重复回路,让它能在多步任务中基于外部反馈推进,而不是靠人逐条接力提示。
这是个新兴术语,别把它当成某家厂商的标准产品名;但它背后的模式是成熟的 Agent 实践。OpenAI 的 Agents 文档把编排、状态、guardrails 与评估列为 Agent 系统的核心组成;Anthropic 的 Context Engineering 文章也指出,运行在循环中的 Agent 会持续产生可能相关的信息,必须循环地精炼上下文。OpenAI Agents 指南 Anthropic 原文
一个可靠循环必须回答的六个问题
- 目标:什么事实能证明任务完成?
- 状态:跨轮保存什么?输入、计划、证据、失败次数、成本、版本号。
- 动作:模型可以调用哪些工具,分别有什么权限和幂等性?
- 观察:成功、失败、测试日志、用户反馈如何进入下一轮?
- 验证:谁判定结果合格?最好是独立规则、测试或 verifier,而非让生成者自评。
- 停止:成功、不可恢复错误、预算耗尽、达到最大轮数、需要人工确认时分别做什么?
最小循环示例:带证据的资料研究
1 | |
注意 verify 不应该只是”请模型评价自己的答案”。更可靠的方式包括:JSON Schema、单元测试、数据库约束、引用链接可访问性检查、独立模型/规则的审核,以及对变更执行前的人审门禁。
常见反模式
| 反模式 | 后果 | 修复 |
|---|---|---|
无限 while 重试 |
成本失控、在同一错误上打转 | 最大轮数/预算/指数退避/明确升级 |
| 用生成者当唯一裁判 | 自我确认偏差 | 外部测试、独立 verifier、人工抽检 |
| 每轮塞完整历史 | 上下文膨胀、错误被放大 | 状态摘要、证据索引、只加载下一步所需信息 |
| 写操作无门禁 | 错误会累积成真实损失 | 权限分级、预览、幂等键、人审 |
| 只记录”成功/失败” | 无法复盘和调优 | trace、输入版本、工具结果、评分和成本 |
四、Graph Engineering:把智能体的控制流画出来、跑起来、恢复起来
先说清楚:它不是知识图谱的同义词
本文说的 Graph Engineering 是指:使用显式的状态、节点、边与路由条件来设计和运行 Agent 工作流。它和 GraphRAG/知识图谱相关但不是一回事:前者关心”流程如何执行”,后者关心”知识如何表示和检索”。两者经常组合使用。
LangGraph 的官方 Graph API 正好提供了这一工作定义:State 是应用当前快照,Node 是执行逻辑的函数,Edge 决定下一节点;节点和边可以组成包含循环的工作流。LangGraph Graph API overview
为什么图比”一个大 Agent”更容易进生产
一个大 prompt 适合线性任务;图则把隐含的控制流变成可审查的结构:
flowchart LR
A[接收请求] --> B[分类与风险检查]
B -->|需要资料| C[检索]
C --> D[生成草案]
B -->|不需要资料| D
D --> E[规则/测试验证]
E -->|通过| F[返回或提交人审]
E -->|可修复且预算未尽| D
E -->|高风险或无法修复| G[人工升级]
图的价值在于:每条边都可以问”谁有权走这条边””进入前状态是否完整””重试有没有上限””中断后从哪里恢复”。这对审批、支付、发布代码等不可逆操作尤其重要。
最小状态图示例(伪代码)
1 | |
其中 route 应尽量由结构化验证结果驱动,例如 citation_coverage < 1.0、retries >= 2、action_is_irreversible,而不是只依据一段难以审计的自然语言判断。
“流程图”与”知识图”的双图架构
当业务既有复杂流程又有关系型知识时,可以同时用两类图:
| 图 | 节点/边代表什么 | 解决什么 |
|---|---|---|
| 工作流图(Graph Engineering) | Agent/工具步骤与控制转移 | 谁在何时做什么、失败后去哪里 |
| 知识图(GraphRAG) | 实体、关系、社区、证据 | 哪些事实相关、全局主题和跨文档关系 |
拿”供应商合规审查”来说,工作流图负责 收集材料 → 事实抽取 → 风险评分 → 人审 → 归档;知识图负责查出供应商、母公司、合同、制裁记录之间的关系。前者管行动,后者管依据。
五、Harness Engineering:把前面几层变成能安全、可观测地跑起来的运行时
它是什么
Harness(主控骨架)是围绕模型的一层软件脚手架:工具执行、上下文管理、权限门禁、运行回路和观察面,把模型的原生能力变成能交付给用户的智能体。Anthropic 的 Claude Code 文档正是这样定义它的——Claude Code 就是 Claude 的 harness:模型在 harness 里获得文件访问、命令执行、权限拦截、记忆加载,以及把一个个动作串起来的循环。How Claude Code works agentic harness 术语
Anthropic 的博客进一步把它概括为:harness 是模型周围的脚手架,包括循环、工具、上下文管理与 guardrails,把原始智能变成能工作的 agent;Harness Engineering 就是决定什么该放进这层脚手架——以及模型变强之后什么可以拿走。Agent Harness Design:3 Patterns for Harnessing Claude’s Intelligence
OpenAI 的实践指南不叫这个名字,却给出了同一个落点:agent = model + tools + instructions,而所有编排都依赖一个 run——通常实现为 while 循环,一直跑到命中结束条件(工具调用、结构化输出、错误、达到最大轮数)。这个 run 的归属,正是 harness。A practical guide to building agents
如果说 Loop 层设计的是”循环逻辑该长什么样”(观察 → 行动 → 验证),Harness 层决定的是”这个循环由谁执行、工具怎么被调用、边界在哪、坏了从哪看”。前几层是设计图纸,harness 是承载图纸、真正把动作落地的运行时。
一个 harness 必须回答的六个问题
- 运行回路:谁在循环里?结束条件是什么?中断后如何恢复?
- 工具执行:模型如何发出调用?结果如何回传与过滤?失败如何重试和降级?
- 权限门禁:哪些动作自动执行、哪些要人确认、哪些禁止?沙箱边界在哪里?
- 上下文打包:system prompt、工具描述、历史如何按序组装,以最大化 prompt 缓存命中?
- 可观测性:每一步的动作、参数、结果、token 成本是否可追溯、可回放?
- 安全边界:哪些输入按不可信数据对待?不可逆操作如何设防?
两条来自官方的主设计原则
原则一:能用模型解决的,就别硬塞给 harness。 每个 harness 组件都编码了一条”模型自己做不了”的假设,而这些假设会随模型变强而过时,需要反复检验。Anthropic 的长期任务 harness 文章里有个典型例子:为应对旧模型临近上下文上限时的”上下文焦虑”(提前收工),团队给 harness 加了 context reset;更强的模型不再有这个问题后,这套补偿就变成了死重,应该拆掉。Harness design for long-running application development
原则二:用结构化工具表达安全、UX 与可观测性边界。 模型只会发出调用,边界必须由 harness 收口。一个 bash 工具给模型强大的行动力,但 harness 只拿到一串命令;把它提升为带类型参数的专用工具(如 edit、approve_refund),harness 才能拦截、门禁、渲染给用户、记录审计。同上
最小 harness 示例(伪代码)
1 | |
这个例子里有三个抽象不能省:permit(默认拒绝的权限门禁)、fit_token_budget(上下文打包)、trace(可观测性)。缺了任何一个,”能跑”和”敢跑”之间就差一次线上事故。
动态 harness:让模型自己写脚手架
当任务复杂到单个上下文窗口扛不住时,可以在 harness 之上再叠一层:让模型按任务临时编写并协调多 agent 的 harness。Anthropic 的 Claude Code 动态 workflow 就是这种思路——默认 harness 面向编程任务,而 classify-and-act、fan-out-and-synthesize、adversarial verification、tournament 等模式,本质上是把同一任务拆进多个互相隔离的上下文窗口并行解决,用来对抗单窗口长时间运行下的三种退化:agentic laziness(做一半就宣布完成)、self-preferential bias(偏爱自己的产出)、goal drift(目标随上下文压缩而漂移)。A harness for every task:dynamic workflows in Claude Code
注意这里的成本纪律:动态 harness 会显著增加 token 消耗,Anthropic 明确建议只在复杂、高价值任务上使用,普通任务先问一句”它真的需要更多算力吗”。
常见反模式
| 反模式 | 后果 | 修复 |
|---|---|---|
run 没有显式结束条件 |
成本失控、无法停止 | 结构化输出/无工具调用/错误/最大轮数作为出口 |
| 工具结果全部流回上下文 | token 膨胀、重点被稀释 | 让模型用代码过滤或管道化,只回传必要结果 |
| 权限对一切工具放行 | 注入与误操作造成真实损失 | 默认拒绝、最小权限、沙箱、人审门禁 |
| 上下文打包顺序随意 | 缓存命中率低、成本翻倍 | 静态优先、动态靠后、缓存断点、少切换模型 |
| 只为旧模型设计的组件不清理 | 变成死重拖慢流程 | 模型升级后逐个重估组件是否还负载 |
六、五层如何协同:从一个客服问答演进
假设你在做一个”查询订单和退款规则”的客服助手。
- Prompt 层:规定语气、回答结构、未知时不编造;输出
answer + cited_policy_ids。 - Context 层:按租户和订单号检索当前订单、最新政策、最近对话摘要;只暴露必要工具。
- Loop 层:若订单查询失败,识别可重试错误;若退款金额与规则冲突,调用规则验证;超过两次或需要例外审批则升级人工。
- Graph 层:将
身份验证 → 订单查询 → 政策检索 → 生成 → 金额校验 → 发送/人审建模为带检查点的条件图。 - Harness 层:提供
run循环与结束条件、approve_refund等结构化工具、默认拒绝的权限门禁、缓存友好的上下文打包,以及每一步的 trace。
这也解释了一个常见误区:给第一层写 3,000 字提示词,替代不了后面四层的身份、数据、验证、审批与运行环境设计。
七、选型速查:什么时候该升级一层
| 你遇到的现象 | 先尝试 | 若仍不够,升级到 |
|---|---|---|
| 输出格式不稳定、任务理解偏差 | Prompt:明确任务、示例、结构化输出 | Context |
| 回答没有引用、遗漏最新资料、多轮遗忘 | Context:检索、来源、摘要、预算 | Loop |
| 工具失败后反复重试、无法证明完成、成本不可控 | Loop:验证器、状态、停止条件 | Graph |
| 分支多、要并行、可中断恢复、有人审 | Graph:显式状态机和检查点 | 结合五层持续评测 |
| 行为正确但工具、权限、成本与复盘失控 | Harness:运行回路、权限门禁、上下文打包、可观测性 | 结合五层持续评测 |
最稳妥的路线是先建立评测,再用最小复杂度解决当前的失败模式。不要为一个简单问答引入多 Agent 图,也不要因为任务复杂就寄希望于更长的提示词。
八、上线前检查清单
- 是否有明确的成功标准与回归样例,而不是凭感觉改 prompt?
- 输出是否有可机器校验的契约?
- 上下文是否带来源、权限边界和 token 预算?
- 检索内容是否被当作不可信数据处理?
- 每个工具是否最小权限、参数可校验、写操作可审计?
- 是否存在独立于生成者的验证证据?
- 重试次数、时间和成本是否有上限?
- 是否为高风险动作设置人工门禁与可恢复检查点?
- 是否记录模型/提示版本、检索证据、工具调用、评分与失败原因?
- 是否存在明确的
run结束条件与轮数/预算上限? - 工具调用是否有默认拒绝的权限门禁与沙箱边界?
- 上下文是否按”静态在前、动态在后”打包以最大化缓存命中?
- 每一步的动作、参数、结果与成本是否可追溯、可回放?
- 模型升级后,是否重新评估了 harness 中每个组件的必要性?
延伸学习路线与权威资料
- OpenAI Prompt engineering guide:从结构化提示、模型行为和调优开始。
- Anthropic Prompt engineering overview:适合系统学习清晰指令、示例、提示模板和评测思路。
- Anthropic: Effective context engineering for AI agents:理解上下文窗口、压缩、工具与长期 Agent 的关键一手文章。
- OpenAI Agents guide:学习 Agent 编排、状态、guardrails 和评估的官方入口。
- LangGraph Graph API overview:学习用 State、Node、Edge 显式构建可循环工作流。
- Microsoft GraphRAG Query Engine:对比 Local、Global、DRIFT 与基础向量检索,判断何时需要知识图谱检索。
- Anthropic:Agent Harness Design——3 Patterns for Harnessing Claude’s Intelligence:harness 的定义与”模型变强后拆掉脚手架”的核心原则。
- Anthropic:Harness design for long-running application development:planner/generator/evaluator 多 agent harness 的真实落地与成本对照。
- Claude Code:How Claude Code works:看一个生产级 agentic harness(agentic loop、工具、上下文管理)实际长什么样。
结语
Prompt Engineering 让模型”听懂”,Context Engineering 让模型”看对”,Loop Engineering 让系统”会从反馈中继续”,Graph Engineering 让复杂系统”可视、可控、可恢复”,Harness Engineering 让整个系统”跑得起来、跑得安全、跑得被看见”。
真正可靠的 LLM 产品,不是找到一条永远正确的提示词,而是把输入、证据、状态、验证、运行环境和人类决策设计成一个能持续被评估和改进的系统。