Skip to main content

概述

构建智能体(或任何大型语言模型应用)的难点在于使其足够可靠。虽然它们可能在原型中运行正常,但在实际使用场景中却常常失败。

智能体为何会失败?

当智能体失败时,通常是因为智能体内部的 LLM 调用采取了错误的行为 / 没有按预期执行。LLM 失败的原因有两种:
  1. 底层的 LLM 能力不足
  2. 没有将“正确的”上下文传递给 LLM
通常情况下——实际上是第二种原因导致智能体不可靠。 上下文工程是指以正确的方式提供合适的信息和工具,使 LLM 能够完成任务。这是 AI 工程师的首要工作。缺乏“正确的”上下文是构建更可靠智能体的首要障碍,而 LangChain 的智能体抽象设计独特,旨在促进上下文工程。
对上下文工程不熟悉?从 概念概述 开始,了解不同类型的上下文及其使用时机。

智能体循环

典型的智能体循环包含两个主要步骤:
  1. 模型调用 - 使用提示词和可用工具调用 LLM,返回响应或执行工具的请求
  2. 工具执行 - 执行 LLM 请求的工具,返回工具结果
核心智能体循环图
这个循环会持续进行,直到 LLM 决定结束。

你可以控制什么

要构建可靠的智能体,你需要控制智能体循环每个步骤以及步骤之间的发生情况。

Transient context

LLM 单次调用时看到的内容。你可以修改消息、工具或提示词,而不会改变状态中保存的内容。

Persistent context

在回合之间保存的内容。生命周期钩子和工具写入会永久修改这些内容。

数据源

在整个过程中,你的智能体会访问(读取 / 写入)不同的数据源:

工作原理

LangChain 中间件 是底层机制,使上下文工程对使用 LangChain 的开发者变得实用。 中间件允许你钩入智能体生命周期的任何步骤,并:
  • 更新上下文
  • 跳转到智能体生命周期的其他步骤
在整个指南中,你会频繁看到中间件 API 的使用,作为实现上下文工程的手段。

模型上下文

控制每个模型调用中输入的内容——指令、可用工具、使用的模型以及输出格式。这些决策直接影响可靠性和成本。

System Prompt

开发者向 LLM 发出的基本指令。

Messages

传递给 LLM 的完整消息列表(对话历史)。

Tools

智能体用于执行操作的实用工具。

Model

要调用的实际模型(包括配置)。

Response Format

模型最终响应的架构规范。
所有这些类型的模型上下文都可以从 状态(短期记忆)、存储(长期记忆)或 运行时上下文(静态配置)中获取。

系统提示词

系统提示词设定 LLM 的行为和能力。不同的用户、上下文或对话阶段需要不同的指令。成功的智能体会利用记忆、偏好和配置,为对话的当前状态提供正确的指令。
从状态中访问消息计数或对话上下文::::python
::::::js
:::

消息

消息构成发送给 LLM 的提示词。 管理消息内容至关重要,以确保 LLM 能够获得正确信息以良好响应。
在当前查询相关时,从 State 注入上传文件上下文::::python
::::::js
:::
瞬时与持久消息更新:上述示例使用wrap_model_call进行瞬时更新 - 修改发送给模型的单次调用消息,而不改变保存的状态。对于持久更新(修改状态),您可以::::python
  • 返回一个@[ExtendedModelResponse]并从wrap_model_call获取@[Command]以从模型调用层注入状态更新。
  • 使用生命周期钩子如before_model、after_model或wrap_tool_call(用于工具返回)来更新对话历史。有关更多详细信息,请参阅中间件文档。 :::
:::js
  • 直接从wrapModelCall返回@[Command]以从模型调用层注入状态更新。
  • 使用生命周期钩子如beforeModel、afterModel或wrapToolCall(用于工具返回)来更新对话历史。有关更多详细信息,请参阅中间件文档。 :::
有关更多信息,请参阅状态更新。

工具

工具允许模型与数据库、API和外部系统交互。您如何定义和选择工具直接影响模型完成任务的有效性。

定义工具

每个工具需要一个清晰的名称、描述、参数名称和参数描述。这些不仅仅是元数据,它们指导模型关于何时以及如何使用工具的推理。 :::python
::: :::js
:::

选择工具

并非每个工具都适用于每种情况。工具过多可能会使模型(上下文过载)产生更多错误;工具过少则限制功能。动态工具选择根据认证状态、用户权限、功能标志或对话阶段调整可用工具集。
在达到特定对话里程碑后仅启用高级工具::::python
::::::js
:::
参见 动态工具,用于过滤预注册的工具以及在运行时注册工具(例如,从 MCP 服务器)。

模型

不同的模型具有不同的优势、成本和上下文窗口。为当前任务选择合适的模型,这可能在智能体运行期间发生变化。
根据状态中的对话长度使用不同的模型:
See Dynamic model for more examples.

响应格式

结构化输出将非结构化文本转换为经过验证的结构化数据。当提取特定字段或为下游系统返回数据时,自由文本是不够的。 工作原理: 当你提供响应格式作为模式时,模型的最终响应将保证符合该模式。智能体运行模型/工具调用循环,直到模型完成调用工具,然后最终响应将被强制转换为提供的格式。

定义格式

模式定义指导模型。字段名称、类型和描述指定输出应遵循的确切格式。 :::python
::: :::js
:::

选择格式

动态响应格式选择根据用户偏好、对话阶段或角色调整模式——早期返回简单格式,随着复杂度增加返回详细格式。
根据对话状态配置结构化输出::::python
::::::js
:::

工具上下文

工具的特殊之处在于它们既能读取也能写入上下文。 在最基本的情况下,当工具执行时,它接收 LLM 的请求参数并返回一个工具消息。工具执行其工作并产生结果。 工具还可以为模型获取重要信息,使模型能够执行并完成任务。

读取

大多数现实世界的工具需要的不仅仅是 LLM 的参数。它们需要数据库查询的用户 ID、外部服务的 API 密钥或当前会话状态来做出决策。工具从状态、存储和运行时上下文读取以访问这些信息。
从状态读取以检查当前会话信息::::python
::::::js
:::

写入

工具结果可用于帮助智能体完成指定任务。工具可以直接向模型返回结果,同时更新智能体的记忆,以便在后续步骤中提供重要上下文。
使用命令写入状态以跟踪会话特定信息::::python
::::::js
:::
参见 工具,了解访问状态、存储和运行时上下文在工具中的完整示例。

生命周期上下文

控制智能体核心步骤之间的行为——拦截数据流以实现跨领域关注点,如摘要、约束和日志记录。 如你在 模型上下文 和 工具上下文 中所见,中间件 是使上下文工程实践可行的机制。中间件允许你钩入智能体生命周期的任何步骤,并执行以下操作:
  1. 更新上下文 - 修改状态和存储以持久化更改,更新对话历史记录或保存见解
  2. 跳入生命周期 - 根据上下文在智能体周期中的不同步骤之间移动(例如,如果满足条件则跳过工具执行,使用修改后的上下文重复模型调用)
智能体循环中的中间件钩子

示例:摘要

最常见的生命周期模式之一是在对话历史记录过长时自动压缩。与在 模型上下文 中显示的临时消息修剪不同,摘要会持久更新状态 - 永久替换旧消息,并保存供所有未来回合使用。 LangChain 提供了内置中间件: :::python
::: :::js
::: 当对话超过 Token 限制时,SummarizationMiddleware 会自动:
  1. 使用单独的 LLM 调用摘要旧消息
  2. 将其替换为状态中的摘要消息(永久)
  3. 保留最近的消息以供上下文
摘要后的对话历史记录会永久更新 - 未来的回合将看到摘要而不是原始消息。
有关内置中间件、可用钩子和如何创建自定义中间件的完整列表,请参阅 中间件文档。

最佳实践

  1. 从简单开始 - 先使用静态提示词和工具,仅在需要时添加动态特性
  2. 逐步测试 - 一次添加一个上下文工程特性
  3. 监控性能 - 跟踪模型调用、Token 使用量和延迟
  4. 使用内置中间件 - 利用 SummarizationMiddleware、LLMToolSelectorMiddleware 等
  5. 记录你的上下文策略 - 明确传递了什么上下文以及为什么
  6. 理解临时与持久:模型上下文更改是临时的(每次调用),而生命周期上下文更改会持久化到状态

相关资源


官方原文:src/oss/langchain/context-engineering.mdx · 非官方翻译,译文由 AI 生成,以英文原文为准。
Last modified on November 3, 2026