【AI翻译】上下文工程指南(Context Engineering Guide )

原文: https://docs.google.com/document/d/1JU8w-E4LlseFZm-ag22GSBU5A2rp2nb7iFGBNAbFL7k/mobilebasic

上下文工程指南

由 DAIR.AI 学院提供

目录

  • 什么是上下文工程?
  • 上下文工程实践
    • 系统提示
    • 指令
    • 用户输入
    • 结构化输入与输出
    • 工具调用
    • RAG 与内存
    • 状态与历史上下文
  • 高级上下文工程
  • 资源

什么是上下文工程?

上下文工程是一种优化指令和相关上下文的过程,以确保大语言模型(LLM)及高级AI模型能够有效执行任务。近年来,随着提示工程的重要性不断提升,它逐渐被重新定义为上下文工程。这一术语更全面地描述了提示工程及相关任务的复杂性。

上下文工程不仅限于精心设计单个提示词,而是涉及构建动态系统,为模型提供正确的信息、工具和格式,以完成特定任务。这包括:

  • 设计和管理提示链
  • 优化系统提示/指令
  • 处理动态提示元素(如用户输入、日期/时间)
  • 搜索和准备相关知识(即检索增强生成,RAG)
  • 查询增强
  • 工具定义和指令(在代理系统的情况下)
  • 准备和优化少样本示例
  • 结构化输入和输出(如分隔符、JSON模式)
  • 短期内存(管理状态/历史上下文)和长期内存(如从向量存储中检索相关知识)

上下文工程的目标是优化模型上下文窗口中的信息,同时过滤掉无关或噪声信息。这一过程需要系统的性能测量和迭代优化。

上下文工程实践

以下通过一个具体的多代理深度研究应用示例,展示上下文工程在构建AI代理工作流中的实际应用。

系统提示

系统提示为代理提供了明确的任务定义和期望输出格式。以下是一个为“搜索规划代理”设计的系统提示示例:

你是一名专业的搜索规划者。你的任务是将复杂的搜索查询(由<user_query></user_query>分隔)分解为具体的搜索子任务,每个子任务聚焦于主题的不同方面或来源类型。

当前日期和时间是:{{ $now.toISO() }}
每个子任务需提供以下信息:
1. 子任务的唯一字符串ID(如“subtask_1”、“news_update”)
2. 专注于主查询某一方面的具体搜索查询
3. 搜索的来源类型(web、news、academic、specialized)
4. 时间范围相关性(today、last week、recent、past_year、all_time)
5. 适用的领域焦点(technology、science、health等)
6. 优先级(1为最高,5为最低)

所有字段(id、query、source_type、time_period、domain_focus、priority)为每个子任务所必需,除非time_period和domain_focus不适用时可为null。

创建2个子任务,共同覆盖主题的全面内容,聚焦于不同的方面、视角或信息来源。
每个子任务包含以下信息:
id: str
query: str
source_type: str  # 例如“web”、“news”、“academic”、“specialized”
time_period: Optional[str] = None  # 例如“today”、“last week”、“recent”、“past_year”、“all_time”
domain_focus: Optional[str] = None  # 例如“technology”、“science”、“health”
priority: int  # 1(最高)到5(最低)

在获取上述子任务信息后,添加两个额外字段:start_date和end_date。根据当前日期和所选时间范围推断这些信息,格式如下:
"start_date": "2024-06-03T06:00:00.000Z",
"end_date": "2024-06-11T05:59:59.999Z",

此提示为代理提供了清晰的任务范围、输出结构和动态上下文(如当前日期),以确保生成一致且有用的子任务。

指令

指令是系统提示中的高层指导,明确告知模型需要完成的任务。例如:

你是一名专业的搜索规划者。你的任务是将复杂的搜索查询(由<user_query></user_query>分隔)分解为具体的搜索子任务,每个子任务聚焦于主题的不同方面或来源类型。

此指令为代理设定了角色和目标,但仅靠它不足以确保任务成功。上下文工程需要更详细的上下文来支持模型。

用户输入

用户输入是触发代理任务的查询。例如:

<user_query> OpenAI的最新开发者新闻是什么? </user_query>

使用分隔符(如<user_query>)可以明确区分用户输入和指令,避免混淆。这种结构化方法是上下文工程的重要部分。

结构化输入与输出

为了确保代理生成一致的子任务,提示中详细定义了子任务的字段和格式:

每个子任务需提供:
1. 唯一字符串ID(如“subtask_1”、“news_update”)
2. 专注于主查询某一方面的具体搜索查询
3. 搜索的来源类型(web、news、academic、specialized)
4. 时间范围相关性(today、last week、recent、past_year、all_time)
5. 适用的领域焦点(technology、science、health等)
6. 优先级(1为最高,5为最低)

此外,提供了一个JSON示例来指导输出结构:

{
  "subtasks": [
    {
      "id": "openai_latest_news",
      "query": "OpenAI最新公告和新闻",
      "source_type": "news",
      "time_period": "recent",
      "domain_focus": "technology",
      "priority": 1,
      "start_date": "2025-06-03T06:00:00.000Z",
      "end_date": "2025-06-11T05:59:59.999Z"
    },
    {
      "id": "openai_official_blog",
      "query": "OpenAI官方博客近期文章",
      "source_type": "web",
      "time_period": "recent",
      "domain_focus": "technology",
      "priority": 2,
      "start_date": "2025-06-03T06:00:00.000Z",
      "end_date": "2025-06-11T05:59:59.999Z"
    }
  ]
}

通过工具(如n8n的输出解析器),可以自动生成结构化输出,确保一致性:

[
  {
    "action": "parse",
    "response": {
      "output": {
        "subtasks": [
          {
            "id": "subtask_1",
            "query": "OpenAI最近的公告或新闻或更新",
            "source_type": "news",
            "time_period": "recent",
            "domain_focus": "technology",
            "priority": 1,
            "start_date": "2025-06-24T16:35:26.901Z",
            "end_date": "2025-07-01T16:35:26.901Z"
          },
          {
            "id": "subtask_2",
            "query": "OpenAI官方博客或新闻发布",
            "source_type": "web",
            "time_period": "recent",
            "domain_focus": "technology",
            "priority": 1.2,
            "start_date": "2025-06-24T16:35:26.901Z",
            "end_date": "2025-07-01T16:35:26.901Z"
          }
        ]
      }
    }
  }
]

结构化输入和输出是上下文工程的核心,确保模型的输出符合预期并易于下游处理。

工具调用

在示例中,动态上下文(如当前日期和时间)通过工具调用提供:

当前日期和时间是:{{ $now.toISO() }}

这允许代理根据查询需求动态调整上下文,例如推断日期范围:

在获取上述子任务信息后,添加两个额外字段:start_date和end_date。根据当前日期和所选时间范围推断这些信息,格式如下:
"start_date": "2024-06-03T06:00:00.000Z",
"end_date": "2024-06-11T05:59:59.999Z",

工具调用使代理能够访问外部数据(如日期或检索工具),从而增强上下文的动态性和准确性。

RAG 与内存

虽然此版本的深度研究应用未使用短期内存,但通过缓存子查询到向量存储中,可以优化性能。如果用户提交了类似查询,可以从向量存储中检索现有子任务,避免重复生成。这降低了延迟和成本,是上下文工程中动态性和效率的体现。

长期内存(如用户偏好或历史交互)也可以通过检索工具动态加载到上下文窗口中,进一步优化代理性能。

状态与历史上下文

在更复杂的场景中,代理可能需要访问先前状态或历史上下文。例如,在修订阶段,代理可能需要回顾子任务、修订历史或先前代理的输出。这种上下文管理需要仔细设计,以确保仅提供相关信息,避免上下文窗口过载。

高级上下文工程 [进行中]

上下文工程还包括以下未在本文详细展开的方面:

  • 上下文压缩:通过总结或修剪,减少上下文窗口中的令牌数,同时保留关键信息。
  • 上下文管理技术:如多代理系统中隔离上下文,或使用状态对象管理动态数据。
  • 上下文安全性:确保上下文不包含敏感或无关信息。
  • 上下文有效性评估:系统地测量上下文对模型性能的影响。

这些领域需要进一步研究和工具支持,以实现自动化和高效的上下文工程。

资源

以下是一些关于上下文工程的推荐阅读:

如果您想深入学习,推荐参加相关课程,采用实践方法探索上下文工程的各个方面。

posted @ 2025-07-06 06:10  ffl  阅读(1151)  评论(0)    收藏  举报