在过去两三年中,我为多家公司的高级开发者进行了代理开发培训;而在上个月,我一直在设计并训练毕业生使用的AI代理。直到本周, 在完成AI集成模拟项目展示后,我终于弄清楚了如何系统地为不同阶段的开发者定制一个代理学习路径。这一过程, 也让我深刻意识到“知识诅咒”的存在——我认为理所当然的知识实际上可能是初学者最大的障碍。
我们可以简单地将学习过程分为四个部分:
在我们开始之前,公平起见,我们需要简要定义一下AI代理,考虑到代理的不同定义——实际例子可以从Anthropic的“构建有效的代理”中参考。
一些客户将其定义为能够长期独立运行并使用多种工具执行复杂任务的完全自主系统,而另一些则将其用于描述遵循预定义工作流的系统。
因此,围绕一个提示的简单任务也可以被视为一个AI代理;同样,涉及多个系统、工具和步骤的复杂任务也是AI代理。
尽管“上下文工程”是一个非常流行的术语,掌握如何编写有效的提示仍然是我们开始的关键重点。网上已经有很多关于提示的内容, 但从我的经验来看,我们可以专注于三个部分:
结合一些必要的AI框架或工具,我们可以非常有效地完成我们的任务。
在当前开发代理的过程中,虽然模型可以生成一些提示,但调整这些提示仍然是工作的关键重点。我们希望模型输出的内容可以 与其它代码配合使用的JSON、XML或Java类。
提示用于引导AI模型生成特定输出输入设计是一种艺术和科学。通过精心设计和措辞输入,它可以有效影响和控制模型响应的方向和结果, 让AI生成预期的输出。
我们可以直接查看Spring AI文档中的结构化输出转换器作为示例:

图中的黄色部分代表两个核心:
格式化的输入命令
一般来说,我们需要结构化的提示模板来动态生成提示,使用结构化文本设计输入
转换模型输出结果
根据不同的场景采用适当的输出格式,并实现相应的解析机制异常场景处理。
当能力适当的时候,可以根据现有数据和其他信息对模型进行微调或训练,以增强其在此领域的性能。
在复杂的AI系统中,特别是在涉及多代理或多模块协作的场景中,单个提示往往无法完成所有任务。因此,我们需要提示路由:

提示路由是一种工程方法,它涉及拆分任务、分析输入,并智能地将它们分配给最合适的模型或子任务提示,在多任务、多代理或复杂AI工作流程中。
核心思想是:通过分析输入和上下文,动态确定信息处理路径,使用哪个提示,或者调用哪个工具、子代理,从而实现非线性、条件任务执行。在典型的 以QA场景为例:
通过提示路由,系统可以根据问题类型智能选择最合适的处理方法,同时保持模块化和可扩展性。在某些AI框架中,如LangChain中的RouterChain 可以提供类似的能力支持,以及诸如基于语义相似性的路由 这样的方式。
有了提示路由,可以通过提示链系统地分解复杂问题,将大型任务划分为多个子任务, 每个子任务对应不同的提示或模型调用,最后整合结果。这种方法非常适合具有固定工作流程的过程,其中某些步骤可以跳过。

这可以实现更好的模块化 设计:
以常见的软件需求为例,产品经理提出的思路可以通过提示链分解为:

每一步都可以由不同的提示或子代理处理。例如,创意收集可以借助具有搜索功能的AI代理辅助,而需求逻辑组织可以利用Dify 工具如Copilot 365来完成任务。最终,每一步都以链式过程执行,同时保持模块化设计的灵活性,允许根据需要调整或替换子任务。
通常,我们有NoCode和ProCode来支持上下文感知的代理开发。

上下文本身也是提示的一部分。在各种自动化实施之前,我们通常手动将文档内容复制到AI聊天工具中。只有当我们深入研究模型的能力时, 才开始思考如何构建自动化,这意味着从工程角度解决问题。在我们开始之前,仍然需要定义AI代理,这里可以参考Anthropic 《有效上下文工程》的官方定义(因为它既涉及科学又涉及艺术):
上下文工程是精心策划和放置来自不断发展的信息宇宙中最相关的内容到有限的上下文窗口的艺术和科学。
简而言之:关注在有限的上下文窗口内选择最关键的信息,以使模型的理解和推理更有效。以下是Langchain绘图的 Drew Breunig总结的六种常见上下文工程技术:

在这里,我将简要总结为:RAG和上下文窗口的工程。完整的上下文窗口(即提示)通常应包括:
除了固定的系统提示部分,获取外部知识与记忆对整个窗口的影响最大,因此二者的设计和优化是上下文工程的首要任务。

RAG(检索增强生成)是构建代理的核心技术之一,通过从外部知识库检索相关信息来增强大型语言模型的生成能力。在代码库问答等复杂场景中,简单的向量检索往往不足以达到精度要求,需要结合多种检索策略来提高准确性。
简单来说,就是通过搜索丰富上下文。根据实现复杂度和场景要求,我们可以将检索策略分为以下几类:
在检索之前,为了确保生成的搜索结果的可靠性,需要引入查询改写逐步将用户的模糊意图转化为数据库可以高效执行的精确查询。 修改用户的原始查询以增强其与知识库中文档的相关性,解决自然语言问题与存储数据块之间的“阻抗失配”。
通常,可以结合多种不同的检索策略来增强检索效果。以下是向量数据库LanceDB提供的一个示例代码库RAG实现:

除了在索引阶段使用TreeSitter生成知识检索阶段还将使用:
当然,在早期的索引阶段,这个示例也会生成元特征数据对于每个元素或代码片段,我们首先生成代码的文字描述,然后将该描述向量化, 以获得代码的所有元特征,这些元特征是由微调的LLM提取的。
两年前,GitHub Copilot 完成的上下文系统构建是行业领先的 最值得研究的上下文系统(毫无疑问):
这也为我们提供了非常好的参考:
当然,这是一个高度复杂的设计,只适用于价值足够高的系统。结合目前流行的Cursor Rule/Spec,建议使用持久记忆如AGENTS.md (记忆系统)跨会话存储关键信息,为后续查询提供长期背景上下文。

代理特性是指使AI系统具备自主感知、动态决策和目标导向执行能力的特性,使其能够在任务执行过程中主动优化上下文、生成检索策略并持续自我迭代。
在AI编码领域,如Cursor和Claude Code,我们可以观察到它们的操作过程,本质上是代理执行RAG。与普通RAG相比,它更容易获得 丰富的上下文确保在整个过程中上下文不会丢失。我们可以看到一些相对成熟的AI应用示例:
file + ripgrep直接搜索代码,当结果不足时,调用向量化检查或与Git历史相关的搜索简单来说,对于复杂的搜索,我们可以构建一个代理来决定使用哪些检索工具和策略,当上下文不足时,继续调用带有新参数的工具 以获得足够的上下文。
以下是Langchain AI构建的Open DeepResearch过程示例:

Deep Research Agent展示了更为系统的代理检索方法:
观察它们的互动和思维过程通常有助于我们更好地理解这一过程。在此基础上,我们还可以看到代理上下文工程如何进一步使LLMs 自主生成、组织和迭代上下文,实现智能和可扩展的上下文管理,从而优化复杂任务的检索和推理效率。

也就是说,基于历史对话或经验优化检索方法,使代理更适合场景。
在构建代理的过程中,工具系统的设计最能体现工程思维。它决定了代理能做什么,做得有多好,以及是否能与外部世界高效协作。 工具可以是任何API,如数据查询(例如数据库访问)、现实操作(例如发送电子邮件、预订会议)或与其他服务协作的接口。正如我们前面提到的,RAG也是在代理下的 一种工具,如LlamaIndex提供的这种显式封装:
这种以数据为中心的方法可以简化我们对工具的理解。
工具本质上是一类语义可理解的功能接口。它们不仅包含逻辑执行能力,还携带元数据,使模型能够理解它们