# 把每项事实放进正确的上下文

> 上下文是暂时的注意力，知识是持续维护的证据，记忆负责延续，缓存负责复用。混在一起，就会产生自信却过时的答案。

**类型：** Learn
**语言：** Python
**前置要求：** [把请求变成可测试的合约](../../03-prompting-and-task-decomposition/)、[上下文工程](../../../../../phases/11-llm-engineering/05-context-engineering/)
**预计时间：** 约 105 分钟

## 学习目标

- 区分聊天上下文、Project 指令、Project 知识、记忆、连接器、检索和 API prompt 缓存。
- 判断哪些内容应持久保存、检索、总结、刷新或丢弃。
- 建立包含权威性、负责人、敏感度和新鲜度元数据的来源登记表。
- 在不删除必需证据的前提下减轻上下文过载。
- 说明哪些 Claude 产品行为可能变化，必须在当前文档中核验。

## 问题所在

某团队为季度规划创建了一个 Claude Project。他们上传政策文件、会议记录、销售导出数据和一份旧产品路线图，还添加了一条 Project 指令：“使用最新获批计划。”

三个月后，Claude 根据旧路线图推荐了发布日期。这个日期存在于 Project 知识中，也出现在多份历史会议记录里，却与连接器中保存的较新决策冲突。由于上下文反复提供错误答案的证据，回复听起来非常确定。

团队把它称作幻觉。这其实是知识管理失败：他们把 Project 当成文档仓库，把记忆当成权威来源，还把检索当成事实保证。

增加上下文不会自动改善结果。可信系统知道哪些事实只是临时信息、哪些具有权威性，以及谁负责让它们保持最新。

## 核心概念

### 七种机制，七种职责

Claude 可以通过多种机制接收或复用信息。确切可用性、限制和名称可能随套餐和产品变化，长期有效的区别在于各自职责。

| 机制 | 主要职责 | 主要风险 |
|---|---|---|
| 当前聊天上下文 | 承载当前对话 | 旧轮次占用注意力或产生冲突 |
| Project 指令 | 设置可复用行为和约束 | 宽泛指令变得过时或含糊 |
| Project 知识 | 提供一组持续维护的参考资料 | 文件缺少负责人或新鲜度控制 |
| 记忆 | 跨对话保留有用的延续信息 | 把记住的偏好错当成获批事实 |
| 连接器 | 在当前权限下访问外部系统 | 误解来源权限、同步状态或新鲜度 |
| 检索 | 从大型语料库中选择相关片段 | 看似相关的文本不完整或权威性低 |
| Prompt 缓存 | 高效复用稳定的 API prompt 前缀 | 缓存动态内容或忽略失效机制 |

一项功能可以承担多种职责，但区分职责能避免类别错误。记忆可以提醒 Claude 你偏好简洁报告，却不应悄悄成为当前退款政策的来源。连接器可以暴露最新文件，却不能证明该文件已经获批。

### 上下文有注意力预算

更大的上下文窗口只提高容量，不能保证结果更确定。每增加一份文档，都会加剧注意力竞争，也多一次产生矛盾的机会。

可以把上下文分成四层：

```text
context package = governing instructions
                + task-specific input
                + retrieved authoritative evidence
                + minimal continuity
```

让稳定指令保持稳定。只添加当前决策必需的任务输入。使用元数据和权威规则检索证据。只有先前对话会改变当前任务时，才继续携带它。

长对话往往会积累已经放弃的计划、纠正过的事实和格式实验。与其无限延续，不如用一份经过核验的简报重新开始，这通常更安全。只有把决策与讨论分开后，才能做总结。

### 检索负责选择，验证另行处理

检索系统通常按相关性对片段排序。相关性无法回答：

- 这个来源获批了吗？
- 它是最新的吗？
- 它覆盖整条规则，还是只截取了一部分？
- 是否有权威性更高的来源与之冲突？
- 当前用户可以访问该来源吗？

为每个来源添加元数据，并在语义相关性排序之前或同时执行过滤。最小登记表包括：

| 字段 | 问题 |
|---|---|
| 来源 ID | 主张能否追溯到它？ |
| 负责人 | 谁对准确性负责？ |
| 权威性 | 它是政策、流程、笔记还是草稿？ |
| 生效日期 | 它从何时开始有效？ |
| 复核日期 | 何时必须再次检查？ |
| 敏感度 | 谁可以处理或查看？ |
| 取代对象 | 哪个早期来源不再具有权威性？ |
| 检索标签 | 它覆盖哪些任务和地区？ |

没有负责人或复核日期的文档，应先隔离，不能自动摄取。

### 指令与知识各有职责

指令描述行为，知识提供证据。

指令可以这样写：

```text
For refund questions, cite the governing section and expose regional conflicts.
```

知识中则应包含实际获批的退款政策。把政策正文塞进行为指令会增加维护难度；把行为规则藏在任意知识文件中，则容易被忽略。

Project 指令与用户请求或提供的来源冲突时，解决方式取决于产品的指令层级和组织政策。不要凭空发明层级。应测试实际载体，并记录预期优先级。

### 记忆用于延续上下文

记忆适合保存稳定偏好和持续上下文，例如偏好的语气、长期目标，或某个项目确实存在。把记住的主张当成当前运营事实时，它就会变得危险。

依赖记忆前先问三个问题：

1. 这项事实可能已经变化吗？
2. 是否有核验成本很低的权威来源？
3. 如果记忆中的事实错误，后果是什么？

如果有漂移可能，而且后果重要，就应核验。在工作流中标注来自记忆的上下文，并保留指向实际记录来源的引用。

### Prompt 缓存是一种经济机制

API prompt 缓存可以减少对稳定前缀的重复处理。它不会提高真实性，也不会创造长期记忆。

如果当前 API 的缓存行为支持这种模式，应把可复用内容放在动态内容之前：

```text
stable prefix: system rules + tool definitions + approved reference corpus
dynamic suffix: user request + fresh retrieval + current state
```

适合缓存的内容体积大、重复出现且保持稳定。不合适的内容每个请求都变化，或包含不应超出获批边界持久保存的数据。

缓存生命周期、最小大小、价格、模型支持和失效行为都属于可能变化的产品事实，应在当前官方文档中核验。系统正确性不能依赖过时缓存。

### 上下文质量需要生命周期负责人

知识有自己的生命周期：

```mermaid
flowchart LR
    A["Source created"] --> B["Classified and approved"]
    B --> C["Indexed or uploaded"]
    C --> D["Retrieved for a task"]
    D --> E["Claims validated"]
    E --> F["Reviewed on schedule"]
    F -->|"still valid"| C
    F -->|"superseded"| G["Archived and removed from active retrieval"]
```

难点在批准、刷新和退役。

## 动手构建

### 第 1 步：盘点上下文

为一项重复工作流列出每个信息来源，并进行分类：

```text
Behavioral instruction:
Task input:
Authoritative knowledge:
Reference knowledge:
Conversation continuity:
External connected data:
Temporary calculation:
```

如果同一项内容出现在多个类别中，应决定哪个副本具有权威性，以及如何移除重复项。

### 第 2 步：创建来源登记表

为每个来源建立简单表格或 JSON 记录：

```json
{
  "source_id": "refund-policy-uk",
  "owner": "customer-operations",
  "authority": "approved-policy",
  "effective_date": "2026-07-01",
  "review_date": "2026-10-01",
  "sensitivity": "internal",
  "supersedes": "refund-policy-uk-2025"
}
```

这些日期仅作说明，请使用实际记录。拒绝或标记复核日期已经过期的来源。

### 第 3 步：设计带弃答机制的检索

定义检索合约：

- 按用户权限、地区、产品和启用状态过滤。
- 获批政策优先于讨论笔记。
- 检索足够的周边文本，以保留例外情况。
- 随片段返回来源 ID 和生效日期。
- 缺少必需权威来源时弃答。
- 暴露冲突，而不是暗中合并。

测试正常案例、过时来源、权限不匹配、来源冲突和超出范围的问题。

### 第 4 步：分配 prompt 预算

测量或估算每个上下文部分。如果 prompt 过载，按以下顺序削减：

1. 移除重复和已被取代的材料。
2. 排除无关对话轮次。
3. 检索范围更窄、但保留足够周边上下文的权威章节。
4. 用经过核验的决策记录替代讨论历史。
5. 在验证边界拆分任务。

不要一开始就删除安全约束或必需证据。

### 第 5 步：建立维护机制

指定负责人和节奏：

| 资产 | 负责人 | 复核触发条件 | 退役规则 |
|---|---|---|---|
| Project 指令 | 工作流负责人 | 流程变化 | 替换旧版本 |
| 政策知识 | 政策负责人 | 批准或复核日期 | 移除已被取代的副本 |
| 检索索引 | 平台负责人 | 来源更新 | 重新索引并核验 |
| 评估集 | 质量负责人 | 出现新失败类别 | 添加代表性案例 |

知识管理需要纳入产品设计，不能留到上线后再清理。

## 交互实验

使用上下文缓存图调整稳定前缀大小、请求量、缓存命中率、来源新鲜度和失效行为。比较节省的成本与正确性边界：只有复用前缀仍获批准时，缓存命中才有价值。

```figure
04-context-cache
```

## 实践实验

运行上下文规划器。尝试缓存动态账号来源、在未重新批准时启用已被取代的政策，或让内容超出 prompt 预算。运行器必须把正确性和生命周期规则放在缓存收益之前。

## 交付产物

`outputs/context-registry.json` 是填写完成的退款工作流来源登记表。它区分行为指令、获批政策、已被取代的草稿、对话延续信息和动态连接数据，还包含 prompt 预算与明确的缓存政策。

## 验证

验证登记表：

```bash
cd certifications/claude/lessons/04-context-knowledge-memory-and-caching/code
python3 main.py
python3 -m unittest discover tests -v
```

验证器会检查来源 ID 是否唯一、日期是否为 ISO 格式、负责人、权威性、启用与取代状态、预算总额，以及只有稳定且不含秘密的来源才能进入缓存前缀。

## 综合项目关联

测验会检查来源权威性、检索限制、缓存适配度和上下文重置决策。把登记表与缓存政策用于第 29 至 32 课的综合项目，作为来源追踪和上下文预算产物。

## 上手使用

### 考试决策模式

场景涉及重复工作、过时答案或上下文缺失时：

1. 判断缺失项属于行为、证据、延续信息还是外部数据。
2. 把它放进为该职责设计的机制。
3. 加入权威性、新鲜度、敏感度和负责人控制。
4. 测试检索与权限失败。
5. 只有建立正确性后才使用缓存。

### 常见坑

- **上传所有内容：** 数据量会增加矛盾和维护成本。
- **把记忆当事实：** 把延续信息错当成记录来源。
- **把连接器当批准：** 把文件访问能力错当成权威性。
- **把检索当证明：** 没有检查来源和完整性，就接受相关片段。
- **一个永不结束的聊天：** 已纠正和已放弃的上下文仍然有效。
- **把缓存当记忆：** 误以为 API 优化会保存长期用户状态。
- **没有退役路径：** 已被取代的文件永远可以被检索。

### 练习

1. 把真实工作流中的十项内容分到七种机制中。
2. 为五个来源创建登记表，并找出哪些不应进入主动检索。
3. 使用四层上下文结构重写一个过载的 prompt。
4. 设计五个检索失败测试，包括过时证据和未授权访问。
5. 决定项目一周结束时应持久保存、总结或丢弃哪些内容，并逐项解释。

## 关键术语

- **上下文：** 当前请求中模型可以使用的信息。
- **Project 指令：** 与 Claude Project 关联的可复用行为指导。
- **Project 知识：** 与 Project 关联的参考资料。
- **记忆：** 产品支持的跨对话延续信息，具体取决于当前功能行为。
- **连接器：** 在配置权限下提供外部数据或能力的集成。
- **检索：** 为请求从大型语料库中选择相关材料。
- **Prompt 缓存：** 复用符合条件的 prompt 内容，减少 API 重复处理。
- **记录来源：** 某项事实所依据的权威系统或文档。
- **新鲜度：** 信息对预期用途而言是否足够新。

## 延伸阅读

- [Anthropic 帮助中心：Projects 是什么？](https://support.claude.com/en/articles/9517075-what-are-projects)
- [Anthropic 帮助中心：使用 Claude 的聊天搜索和记忆延续先前上下文](https://support.claude.com/en/articles/11817273-use-claude-s-chat-search-and-memory-to-build-on-previous-context)
- [Anthropic 帮助中心：用连接器扩展 Claude 的能力](https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities)
- [Anthropic：Prompt 缓存](https://platform.claude.com/docs/en/build-with-claude/prompt-caching)
- [AI Engineering from Scratch：检索增强生成](../../../../../phases/11-llm-engineering/06-rag/)
- [AI Engineering from Scratch：仓库记忆与状态](../../../../../phases/14-agent-engineering/34-repo-memory-and-state/)

Projects、记忆、连接器、检索模式和 prompt 缓存的名称、可用性、限制、保留行为与价格都可能变化。这些来源于 2026-08-08 核验。部署或备考前，请核对当前官方产品与隐私文档。
