概览
构建智能体(或任何 LLM 应用程序)的难点在于使其足够可靠。虽然它们可能适用于原型,但在实际用例中往往会失败。智能体为何失败?
当智能体失败时,通常是因为智能体内部的 LLM 调用采取了错误的行动/没有达到我们预期的效果。LLM 失败的原因通常有以下两个:- 底层 LLM 的能力不足
- 没有将“正确”的上下文传递给 LLM
刚接触上下文工程?请从概念概述开始,了解不同类型的上下文及其使用时机。
智能体循环
典型的智能体循环包含两个主要步骤- 模型调用 - 使用提示和可用工具调用 LLM,返回响应或执行工具的请求
- 工具执行 - 执行 LLM 请求的工具,返回工具结果

您可以控制什么
要构建可靠的智能体,您需要控制智能体循环的每个步骤以及步骤之间发生的情况。瞬态上下文
LLM 在单次调用中看到的内容。您可以修改消息、工具或提示,而无需更改状态中保存的内容。
持久上下文
跨回合保存在状态中的内容。生命周期钩子和工具写入永久修改此内容。
数据源
在此过程中,您的智能体访问(读取/写入)不同的数据源| 数据源 | 亦称 | 范围 | 示例 |
|---|---|---|---|
| 运行时上下文 | 静态配置 | 对话范围 | 用户 ID、API 密钥、数据库连接、权限、环境设置 |
| 状态 | 短期记忆 | 对话范围 | 当前消息、上传的文件、认证状态、工具结果 |
| 存储 | 长期记忆 | 跨对话 | 用户偏好、提取的见解、记忆、历史数据 |
工作原理
LangChain 中间件是底层机制,它使得使用 LangChain 的开发人员能够进行上下文工程。 中间件允许您钩入智能体生命周期中的任何步骤并:- 更新上下文
- 跳转到智能体生命周期中的不同步骤
模型上下文
控制每次模型调用中包含的内容 - 指令、可用工具、要使用的模型和输出格式。这些决策直接影响可靠性和成本。 所有这些类型的模型上下文都可以从状态(短期记忆)、存储(长期记忆)或运行时上下文(静态配置)中获取信息。系统提示
系统提示设置了 LLM 的行为和功能。不同的用户、上下文或对话阶段需要不同的指令。成功的智能体利用记忆、偏好和配置,为当前的对话状态提供正确的指令。- 状态
- 存储
- 运行时上下文
从状态访问消息计数或对话上下文
消息
消息构成发送给 LLM 的提示。管理消息内容至关重要,以确保 LLM 拥有正确的信息才能做出良好响应。- 状态
- 存储
- 运行时上下文
当与当前查询相关时,从状态注入上传的文件上下文
工具
工具使模型能够与数据库、API 和外部系统交互。您如何定义和选择工具直接影响模型能否有效完成任务。定义工具
每个工具都需要一个清晰的名称、描述、参数名称和参数描述。这些不仅仅是元数据——它们指导模型推理何时以及如何使用工具。选择工具
并非每个工具都适用于每种情况。过多的工具可能会让模型不堪重负(上下文过载)并增加错误;过少则限制了功能。动态工具选择根据身份验证状态、用户权限、功能标志或对话阶段调整可用的工具集。- 状态
- 存储
- 运行时上下文
只有在达到特定对话里程碑后才启用高级工具
模型
不同的模型具有不同的优势、成本和上下文窗口。为手头的任务选择合适的模型,这可能会在智能体运行期间发生变化。- 状态
- 存储
- 运行时上下文
根据状态中的对话长度使用不同的模型
响应格式
结构化输出将非结构化文本转换为经过验证的结构化数据。当提取特定字段或返回数据供下游系统使用时,自由格式文本不足以满足要求。 工作原理: 当您提供模式作为响应格式时,模型的最终响应将保证符合该模式。智能体运行模型/工具调用循环,直到模型完成工具调用,然后将最终响应强制转换为提供的格式。定义格式
模式定义指导模型。字段名称、类型和描述精确指定了输出应遵循的格式。选择格式
动态响应格式选择根据用户偏好、对话阶段或角色调整模式——在早期返回简单格式,在复杂性增加时返回详细格式。- 状态
- 存储
- 运行时上下文
根据对话状态配置结构化输出
工具上下文
工具的特殊之处在于它们既读取也写入上下文。 在最基本的情况下,当工具执行时,它接收 LLM 的请求参数并返回工具消息。工具完成其工作并生成结果。 工具还可以为模型获取重要信息,使其能够执行和完成任务。读取
大多数真实世界的工具需要的不仅仅是 LLM 的参数。它们需要用于数据库查询的用户 ID、用于外部服务的 API 密钥或当前会话状态来做出决策。工具从状态、存储和运行时上下文读取以访问此信息。- 状态
- 存储
- 运行时上下文
从状态读取以检查当前会话信息
写入
工具结果可用于帮助智能体完成给定任务。工具既可以直接将结果返回给模型,也可以更新智能体的记忆,以便未来的步骤可以使用重要的上下文。- 状态
- 存储
使用命令写入状态以跟踪会话特定信息
生命周期上下文
控制核心智能体步骤之间发生的事情——拦截数据流以实现跨领域关注点,如摘要、安全措施和日志记录。 正如您在模型上下文和工具上下文中所见,中间件是使上下文工程变得实用的机制。中间件允许您钩入智能体生命周期中的任何步骤,并执行以下操作之一:- 更新上下文 - 修改状态和存储以持久化更改、更新对话历史记录或保存见解
- 跳转生命周期 - 根据上下文移动到智能体循环中的不同步骤(例如,如果满足条件则跳过工具执行,使用修改后的上下文重复模型调用)

示例:摘要
最常见的生命周期模式之一是当对话历史记录过长时自动进行压缩。与模型上下文中所示的瞬态消息修剪不同,摘要会持久更新状态——永久地用摘要替换旧消息,该摘要会保存到所有未来的回合中。 LangChain 为此提供了内置中间件:SummarizationMiddleware 会自动执行以下操作
- 使用单独的 LLM 调用摘要旧消息
- 在状态中用摘要消息替换它们(永久)
- 保持最近的消息完整以提供上下文
有关内置中间件、可用钩子以及如何创建自定义中间件的完整列表,请参阅中间件文档。
最佳实践
- 从简单开始 - 从静态提示和工具开始,仅在需要时添加动态特性
- 逐步测试 - 一次添加一个上下文工程功能
- 监控性能 - 跟踪模型调用、token 使用和延迟
- 使用内置中间件 - 利用
SummarizationMiddleware、LLMToolSelectorMiddleware等 - 记录您的上下文策略 - 明确传递了哪些上下文以及原因
- 理解瞬态与持久:模型上下文更改是瞬态的(每次调用),而生命周期上下文更改则持久保存到状态中
相关资源
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。