过去两三年,我曾为多家公司的资深开发人员开展 Agent 开发培训;最近一个月,我也一直在为毕业生设计和培训 AI Agent。直到本周, 结合 AI 能力的模拟项目 showcase 完成后,我才真正理清楚:如何针对不同阶段的开发者,系统地构建 Agent 的学习路径。这个过程, 也让我深刻体会到“知识诅咒”的存在——原来自己习以为常的知识,对于初学者来说,可能是最大的障碍。
我们可以简单把学习过程分为四部分:
开始之前,按理来说,我们需要简单定义一下 AI Agents,而考虑到 Agent 会有大量的不同定义 => 可以参考 Anthropic 在《Building effective agents》中给出真实世界中的示例:
一些客户将其定义为完全自主运行的系统,能长期独立运作并使用多种工具完成复杂任务;另一些则用它描述遵循预定义工作流程的系统。
因此,围绕一个提示词的简单任务也可以视为一个 AI Agent;而围绕一个复杂系统、多工具、多步骤的任务,也是一个 AI Agent。
尽管 Context Engineering 是一个非常火的词,但是如何写好 Prompt,依然是我们要入门的重点。网上已经有非常多的提示词相关的内容, 但是从我的经验来看,我们可以把重点放在三个部分上:
再配合上一些必要的 AI 框架或者工具,就能非常不错的完成我们的任务。
在现在的开发 Agent 的过程中,尽管模型能生成一部分提示词,但是调提示词依然是工作的重点。我们希望模型输出的内容可以是 JSON、XML 或 Java 类,以便结合其它代码一起使用。
提示词(Prompts)是用于引导 AI 模型生成特定输出而输入设计艺术与科学。通过对输入的精心设计与措辞,可以有效影响并控制模型的响应方向与结果, 使 AI 生成符合预期的输出。
我们可以直接看 Spring AI 文档的 Structured Output Converter 作为示例:
图中的黄色部分即是两个核心:
格式化的输入指令
通常来说,我们需要结构提示词模板来动态生成提示词,采用结构化的文本来设计输入:
转换模型输出结果
即针对不同的场景采用合适的输出格式,并实现对应的解析实现与异常场景处理。
在能力适当的时候,可以基于已有的数据等信息,微调/训练模型来提升在这方面的能力。
在复杂的 AI 系统中,尤其是多 Agent 或多模块协作的场景下,单个提示词往往无法完成所有任务。所以我们需要提示词路由:
提示词路由(Prompt Routing) 是在多任务、多 Agent 或复杂 AI 流程中,将任务拆分、分析输入并智能分配给最合适模型或子任务提示词的工程化模式。
其核心思想是:通过分析输入和上下文,动态决定信息处理路径、使用哪条提示词或调用哪个工具、子 Agent,从而实现非线性、条件化的任务执行。以典型的 QA 场景为例:
通过提示词路由,系统可以根据问题类型智能选择最合适的处理方式,同时保持模块化和可扩展性。在一些 AI 框架里, 诸如 LangChain 里的 RouterChain 就可以提供类似的能力支持,还有诸如于 Routing by semantic similarity 这种方式。
在有提示词路由的前提下,复杂问题可以通过提示链(Prompt Chaining)进行系统化拆解。提示链允许将一个大任务拆分为多个子任务, 每个子任务对应不同的提示词或模型调用,最后将结果整合。这种方式比较适合于有固定的流程,并且有一些步骤是可以跳过的。
这可以实现更好的模块化 设计:
以常见的软件需求为例,产品经理提出的想法可以通过提示链拆解为:
每个环节可以由不同的提示词或子 Agent 处理。例如,创意收集可借助具备搜索功能的 AI Agent,需求逻辑梳理可使用 Dify、 Copilot 365 等工具完成。最终,各环节按链式流程执行,同时保持模块化设计的灵活性,可根据需要随时调整或替换子任务。
通常来说,我们有 NoCode 和 ProCode 来支持带上下文的 Agent 开发。
上下文本身也是提示词的一部分,在没有实现各种自动化之前,我们通常会手动从文档中复制到 AI 聊天工具中。只是随着,我们进入了模型的深水区之后, 我们就需要开始思考自动化的构建方式,也就是用工程化的角度来思考这个问题。开始之前,我们依旧需要定义 AI Agents,这里我们可以引用 Anthropic 官方的 《Effective context engineering for AI agents》给的定义(因为它同样也有科学和艺术):
上下文工程是一门将不断变化的信息宇宙中最相关内容,精心筛选并放入有限上下文窗口的艺术与科学。
简单来说:关注在有限的上下文窗口中挑选最关键的信息,让模型理解和推理更高效。如下是 Langchain 绘制的 Drew Breunig 的总结 的 6 种常见上下文工程技术:
在这里,我会将其简述为:RAG 与上下文窗口的工程化。一个完整的上下文窗口的内容(即 prompts)通常应该包含:
除了固定的系统提示词部分,外部知识的获取与记忆会最大化影响整个窗口,因此对于它们俩的设计与优化便是上下文工程的重中之重。
RAG(检索增强生成,Retrieval-Augmented Generation)是构建 Agent 的核心技术之一,它通过从外部知识库中检索相关信息来增强 大语言模型的生成能力。在代码库问答等复杂场景中,单纯的向量检索往往不够精准,需要组合多种检索策略来提升准确率。
简单来说,就是通过搜索来丰富上下文。根据实现复杂度和场景需求,我们可以将检索策略分为以下几类:
而在检索之前,为了确保生成的检索结果可靠,需要引入查询改写(Query Rewriting),即将用户的模糊意图逐步转化为数据库能够高效执行的精确查询。 修改用户的原始查询来提升其与知识库中文档的相关性,解决了自然语言问题与存储数据块之间的“阻抗不匹配”问题 。
通常来说,多种不同的检索策略可以组合使用,以提升检索效果。如下是向量数据库 LanceDB 官方给的一个Codebase RAG 实现:
除了在 indexing 阶段使用了 TreeSitter 来生成知识,在检索阶段 还会使用:
当然了,在前面的 indexing 阶段,这个示例还会生成元特征数据,即对每个元素或代码片段,我们先生成代码的文本描述,再将该描述进行向量嵌入, 以获取代码的所有元特征,其特征是通过微调后的 LLM 提取的。
两年前,GitHub Copilot 为补全为构建的上下文系统是业内 最值得研究的上下文系统(没有之一):
这也就可以为我们提供一个非常不错的参考:
当然这是一种非常复杂的设计,只值得你在足够高价值的系统中采用这样的设计。而结合现在流行的各种 Cursor Rule/Spec,采用诸如 AGENTS.md 用持久化记忆 (Memory System)存储跨会话的关键信息,为后续查询提供长期背景信息。
Agentic 指的是一种让 AI 系统具备 自主感知、动态决策与目标导向执行能力 的特性,使其能够在任务过程中主动优化上下文、生成检索策略并持续自我迭代。
在 AI Coding 领域,诸如 Cursor、Claude Code 等,我们可以观察其运行的过程,其本质是 Agent 来执行 RAG。它与普通的 RAG 相比,它更加容易拿到 丰富的上下文,进而确保上下文在整个过程中是不缺失的。我们可以看到现有比较成熟的一些 AI 应用的示例:
file + ripgrep
的方式来直接检索代码,在结果不够多时,再调用向量化检查或者 Git 历史等相关的检索简单来说,对于复杂的检索,我们可以将其构建为一个 Agent,由 Agent 来判断采用何种检索工具和策略,在上下文不够的时候,继续使用新的参数调用工具 以拿到足够的上下文。
如下是 Langchain AI 构建的 Open DeepResearch 过程示例:
Deep Research Agent 展示了一种更加系统化的 Agentic 检索方法:
通常观察他们的交互与思考过程,会更好地帮助我们去理解这个过程。在此基础上,也可以看到诸如 Agentic Context Engineering 通过进一步让 LLM 自主生成、整理和迭代上下文,实现智能化、可扩展的上下文管理,从而优化复杂任务的检索与推理效率。
即,基于历史的会话或者经验来优化如何检索,以让 Agent 更加适合于场景。
在构建 Agent 的过程中,工具系统(Tool System) 的设计是最能体现工程思维的一环。它决定了 Agent 能做什么、能做多好,以及能否与外部世界高效协作。 工具可以是一切的 API,如数据查询(如数据库访问)、现实世界操作(如发送邮件、预订会议)或与其他服务协同的接口。如我们在前面提到的 RAG 在 Agentic 下也是 工具的一种类型,诸如 LlamaIndex 便提供了这种显式的封装:
这种围绕数据为中心的方式,可以简化我们对工具的理解。
工具本质上是一类语义可理解的函数接口。它们不仅包含逻辑执行能力,更携带了让模型理解的元信息:
getWeather
。在执行机制上,常见的两种范式是:
我们需要根据模型的支持情况,以及设计的交互、意图来决定使用哪种方式调用。
通常来说,在构建 Coding Agent 的时候,我们会遵循如下的原则:
它也适用于在非编程领域的 AI Agent。基于上述的原则,我们可以将 “为我计划下周去北京的旅行”——分解为一组离散的、具有单一职责的工具。
这种编排方式的关键特征是:可预测性强、逻辑清晰、易于在平台中建模为可视化流程(如 DAG)。它非常适合 流程稳定、任务有依赖关系的 Agent(如旅行、客服、数据管道类场景)。
诸如 Understanding GitHub Copilot’s Internal Architecture 中介绍的 Copilot 编排器会根据“意图分类器”(Intent Classifier)对用户请求的分析结果,决定调用一个或多个内部工具来完成任务:
read_file
(读取文件)、edit_file
(编辑文件)和 create_file
(创建新文件)等,使 Copilot
能够直接与用户的代码库进行交互 。run_in_terminal
工具,Copilot 可以在用户的终端中执行命令,例如运行测试或构建脚本 。grep_search
(文本搜索)、list_code_usages
(列出代码引用),以及最强大的
semantic_search
(语义搜索) 。这种模式的关键特征是:灵活性高、可扩展性强,但依赖良好的分类体系与语义匹配能力。它更适合动态场景,如代码生成、调试、文档问答等。
当工具数量与 Agent数量不断增长时,我们需要一种机制来标准化描述、动态注册与跨 Agent 调用工具。 MCP(Model Context Protocol) 正是为此设计的通用协议层。通过 MCP,AI Agent 不再依赖硬编码的接口或特定系统,而是能够以统一格式调用工具、 获取数据或与其他 Agent协作。MCP 的核心价值在于标准化、动态化和可组合:
结合前面设计的原子工具函数,MCP 可以将这些工具整合为一个可复用、可协作的工具网络,让 Agent 在解决复杂问题时更加灵活和高效。
另外我们也可以看到 GitHub Copilot Extension,或者 Claude Code Plugin 这样的出现也在预示着,哪怕有了 MCP 和 A2A 这样的协议, AI Agent 生态并不会如我们预料的那么统一。诸如 https://github.com/wshobson/agents 项目就记录着(2025.10.14):
一个面向生产环境的综合系统,由 84 个专用 AI Agent、15 个多 Agent工作流编排器 和 44 个开发工具 组成,这些工具被组织为 62 个聚焦且单一职责的插件,用于 Claude Code。
Agent是使用 AI 来实现目标并代表用户完成任务的软件系统。其表现出了推理、规划和记忆能力,并且具有一定的自主性,能够自主学习、适应和做出决定。 - Google Cloud
Agent 是目标为导向的,为了实现目标通常情况下需要感知-规划-行动,还有记忆,而复杂的 AI Agent 系统则会包含协作、自我完善等能力。而在前面的内容里,我们已经介绍了几个基本的能力:
基于此之上,Agent 进一步发展的方向在于:
而由于这是一个快速发展的领域,
构建一个有效的 Agent 的第一步,是定义它的“思维蓝图”——即系统提示词(System Prompt)。优秀的系统提示词设计不仅定义了 Agent 应该做什么,也明确了不应该做什么。在 Coding Agent 领域,一个 Agent 的系统提示词往往极为复杂。例如 Cursor 的系统提示词中,包含了关于角色、工具调用、安全边界、任务规划等详细规范。
结合 Cursor、Claude Code、Augment、Junie 等工具,我们可以总结出一系列模块化设计实践:
read_file
读取多文件,编辑用 search_replace
而非 sed)。required_permissions: ["network"|"git_write"|"all"]
),禁止对 main/master
强推等高风险动作。old_string
在文件中唯一,前后各 3–5 行),多处修改分次执行,避免误改。这种从单体提示词向模块化、层次化、动态化演进的设计,正如从单体应用向微服务架构的转变,为 Agent 的高级推理、系统可扩展性与可维护性提供了结构支撑。
仅仅告诉 Agent “制定一个计划”是远远不够的,我们必须通过一套明确的原则来指导其分解过程,就像为软件模块制定规约一样。 单体 Agent 的智能上限,往往取决于其“规划能力”——能否将模糊目标拆解为明确的、可执行的子任务。
这涉及两种核心策略:
例如,BabyAGI 的架构就体现了这种“任务驱动”型规划: 它包含三个核心 Agent —— task_creation_agent(任务生成)、execution_agent(任务执行)和 prioritization_agent(任务优先级排序),形成了一个不断循环的任务更新与执行系统。
而在现代系统(如 Augment、Claude Code)中,规划逻辑往往以 todo_spec 的形式内嵌在系统提示词中,具备以下特点:
通过这种结构化规划,Agent 能够把“用户需求”转化为“系统计划”,为多 Agent 协作奠定语义接口。
单体 Agent 的能力是有限的,而多 Agent 系统(Multi-Agent System, MAS)则是适合智能体系统发展的工程化方向。 正如微服务体系通过拆解单体应用来实现高内聚、低耦合,多 Agent 系统通过拆分智能体职责,实现了智能的横向扩展。 通过让多个 Agent 能够通过协作实现更复杂的目标,也能类似于“团队”在软件开发中的协同工作。
常见协作拓扑(参考 LangGraph、AutoGen 等):
多 Agent 拓扑结构的选择,直接反映了待解决问题的底层结构。架构并非任意选择,而是试图创建一个能够镜像问题依赖图的“认知模型”。 当然,也不可避免会遇到类似于微服务架构中的复杂度等各种问题。
2A 专为 Agent-to-Agent 通信而设计,与处理 Agent-to-Tool 通信的模型上下文协议(MCP)等其他标准形成互补。它扮演着公共互联网协议的角色,允许不同的 Agent 系统相互连接和互操作。
尽管,我们并不一定需要引入 A2A 架构,如我们在 AutoDev 中实现的机制是,将 A2A 协议的 Agent 以 MCP 工具的形式暴露给 Agent 使用, 在不添加系统复杂度的情况下,实现了 Agent 与 Agent 之间的协作。
一个演化中的 Agent 的真正力量,来自于反思循环与持久记忆系统的紧密整合。
AGENTS.md
、Knowledge Graph),为后续任务提供长期参考。对于记忆而言,应该根据新近度、相关性和重要性对记忆进行加权检索的机制,以及能够自主决定记住什么、忘记什么以及如何组织信息的反思性记忆管理系统 。
一个先进 Agent 架构的最终目标,是创建一个自我强化的飞轮:行动产生经验,反思将经验提炼为知识,记忆存储知识以改进未来的行动。这将 Agent 从一个静态的程序,转变为一个动态的学习实体。
系统提示词(System Prompt)在 Agent 系统中的地位,远超一份简单的指令集;它实际上是 Agent 的核心“操作系统”,需要以系统架构设计的高度来对待提示词和上下文工程。
利用 Markdown 或 XML 等标记语言来构建结构化的指令模块,可以显著提高 LLM 对复杂规则的理解和遵循能力。 通过明确的角色激活、详尽的行为规范、以及“即时”加载数据等上下文工程技术,开发者可以为 Agent 塑造一个稳定、可预测的“认知环境”, 从而将其行为引导至期望的轨道上。优秀的上下文工程是实现 Agent 行为可靠性的基础。
相关资源:
围观我的Github Idea墙, 也许,你会遇到心仪的项目