高级策略

上下文工程

RAG、嵌入、函数调用和MCP

理解上下文对于构建真正有效的 AI 应用程序至关重要。本章涵盖了你需要了解的关于在正确时间为 AI 提供正确信息的所有内容。

为什么上下文很重要

AI 模型是无状态的。它们不会记住过去的对话。每次发送消息时,你都需要包含 AI 需要知道的所有信息。这就是所谓的"上下文工程"。

什么是上下文?

上下文是你在提问时一并提供给 AI 的所有信息。可以这样理解:

无上下文

进展如何?

有上下文

你是一个项目管理助手。用户正在进行 Alpha 项目,截止日期是周五。最新进展是:'后端已完成,前端完成 80%。'

用户:进展如何?

没有上下文,AI 不知道你问的是什么"进展"。有了上下文,它就能给出有用的回答。

上下文窗口

还记得前面章节提到的:AI 有一个有限的"上下文窗口"——它一次能看到的最大文本量。这包括:

系统提示

定义 AI 行为的指令

对话历史

此次聊天中的先前消息

检索信息

为此查询获取的文档、数据或知识

当前查询

用户的实际问题

AI 响应

回答(也计入限制!)

AI 是无状态的

重要概念

AI 不会在对话之间记住任何东西。每次 API 调用都是全新开始。如果你想让 AI "记住"某些内容,你必须每次都将其包含在上下文中。

这就是为什么聊天机器人会在每条消息中发送你的整个对话历史。不是 AI 记住了——而是应用程序重新发送了所有内容。

假设这是一个没有历史记录的新对话。

我刚才问了你什么?

AI 会说它不知道,因为它确实无法访问任何先前的上下文。

RAG:检索增强生成

RAG 是一种让 AI 访问其训练数据之外知识的技术。与其试图将所有内容都放入 AI 的训练中,你可以:

  1. 存储 你的文档到可搜索的数据库中
  2. 搜索 用户提问时的相关文档
  3. 检索 最相关的片段
  4. 增强 你的提示词,加入这些片段
  5. 生成 使用该上下文的答案

RAG 工作原理:

1用户问:"我们的退款政策是什么?"
2系统在你的文档中搜索"退款政策"
3从你的政策文档中找到相关部分
4发送给 AI:"根据此政策:[文本],回答:我们的退款政策是什么?"
5AI 使用你的实际政策生成准确答案

为什么使用 RAG?

RAG 优势

  • 使用你实际的、最新的数据
  • 减少幻觉
  • 可以引用来源
  • 易于更新(只需更新文档)
  • 无需昂贵的微调

何时使用 RAG

  • 客户支持机器人
  • 文档搜索
  • 内部知识库
  • 任何特定领域的问答
  • 当准确性很重要时

Embeddings:搜索的工作原理

RAG 如何知道哪些文档是"相关的"?它使用 embeddings——一种将文本转换为能捕获含义的数字的方法。

什么是 Embeddings?

Embedding 是一个表示文本含义的数字列表("向量")。相似的含义 = 相似的数字。

嵌入可视化

点击词语查看其向量和与其他词的相似度:

"快乐" 向量

d1:
0.82
d2:
0.75
d3:
0.15
d4:
0.91

与...的相似度: "快乐"

快乐
100%
高兴
100%
喜悦
100%
愤怒
66%
暴怒
62%
不快
45%
悲伤
42%

意思相似的词(如「高兴」和「快乐」)有相似的向量,获得高相似度分数。

语义搜索

使用 embeddings,你可以按含义搜索,而不仅仅是关键词:

关键词搜索

查询:'退货政策'
找到:包含'退货'和'政策'的文档
遗漏:'如何获得退款'

语义搜索

查询:'退货政策'
找到:所有相关文档,包括:
- '退款指南'
- '如何退回商品'
- '退款保证'

这就是 RAG 如此强大的原因——即使确切的词语不匹配,它也能找到相关信息。

Function Calling / Tool Use

Function calling 让 AI 可以使用外部工具——比如搜索网络、查询数据库或调用 API。

也被称为

不同的 AI 提供商对此有不同的叫法:"function calling"(OpenAI)、"tool use"(Anthropic/Claude)或 "tools"(通用术语)。它们都是同一个意思。

工作原理

  1. 你告诉 AI 有哪些工具可用
  2. AI 决定是否需要工具来回答
  3. AI 输出对工具的结构化请求
  4. 你的代码运行工具并返回结果
  5. AI 使用结果形成答案
Function Calling 示例

这个提示展示了 AI 如何决定使用工具:

你可以使用以下工具:

1. get_weather(city: string) - 获取城市的当前天气
2. search_web(query: string) - 搜索互联网
3. calculate(expression: string) - 进行数学计算

用户:东京现在的天气怎么样?

逐步思考:你需要工具吗?哪一个?什么参数?

摘要:管理长对话

随着对话变长,你会达到上下文窗口限制。由于 AI 是无状态的(它不记得任何东西),长对话可能会溢出。解决方案?摘要

问题所在

不使用摘要

消息 1(500 tokens)
消息 2(800 tokens)
消息 3(600 tokens)
... 还有 50 条消息 ...
────────────────────
= 40,000+ tokens
= 超出限制!

使用摘要

[摘要]:200 tokens
最近消息:2,000 tokens
当前查询:100 tokens
────────────────────
= 2,300 tokens
= 完美适配!

摘要策略

不同的方法适用于不同的用例。点击每个策略查看它如何处理同一对话:

摘要策略

总结旧消息,保持最近的完整

原始对话

U: 你好,我想学Python(8t)
A: 好选择!你的目标是什么?(10t)
U: 工作中的数据分析(7t)
A: 完美。让我们从变量开始。(12t)
U: 什么是变量?(5t)
A: 变量存储数据,如 name = '小明'(14t)
U: 可以存储数字吗?(6t)
A: 可以!age = 25 或 price = 19.99(12t)
U: 列表呢?(5t)
A: 列表包含多个值:[1, 2, 3](14t)
U: 怎么遍历它们?(7t)
A: 用for循环:for x in list: print(x)(16t)

之后: 滚动摘要

摘要 (20t)

用户正在学习Python进行数据分析。已涵盖:变量、数字、列表基础。

保留的消息 (42t)

U: 列表呢?
A: 列表包含多个值:[1, 2, 3]
U: 怎么遍历它们?
A: 用for循环:for x in list: print(x)

节省: 47%(116t → 62t)

摘要中应该捕获什么

好的对话摘要应保留重要内容:

摘要检查清单0/6

试一试:创建摘要

对话摘要器

练习从这段对话中创建保留上下文的摘要:

为上下文管理总结这段对话。摘要将替换 AI 记忆中的完整对话。

对话:
用户:你好,我正在学习 Python 进行数据分析
助手:欢迎!Python 非常适合数据分析。你目前的经验水平如何?
用户:我懂基本的 Excel。编程完全是初学者。
助手:很好的起点!让我们从变量开始——它们就像存储数据的 Excel 单元格。
用户:你能解释一下变量吗?
助手:变量是存储数据的容器。在 Python 中:name = "Alice" 或 age = 25
用户:列表呢?我需要处理多个值。
助手:列表就像 Excel 列!创建一个:prices = [10, 20, 30]。用 prices[0] 访问项目。
用户:我可以对列表进行计算吗?
助手:可以!使用 sum(prices)、len(prices) 或 max(prices)。对于复杂分析,我们稍后会用 pandas。
用户:什么是 pandas?
助手:Pandas 是一个数据分析库——可以理解为"增强版 Excel"。它有 DataFrames(像电子表格)。

创建一个摘要,捕获:
1. 用户的目标和背景(1 句话)
2. 到目前为止涵盖的主题(1 句话)
3. 用户的学习风格/偏好(1 句话)
4. 接下来要涵盖的内容(1 句话)

何时进行摘要

你正在管理对话的上下文窗口。根据这些条件,决定何时触发摘要:

上下文窗口:最大 8,000 tokens
当前使用情况:
- 系统提示:500 tokens
- 对话历史:6,200 tokens
- 响应缓冲:1,500 tokens

规则:
- 当历史超过可用空间的 70% 时进行摘要
- 保持最后 5 条消息完整
- 保留所有用户偏好和决定

你现在应该进行摘要吗?如果是,哪些消息应该被摘要,哪些应该保持完整?

MCP:模型上下文协议

MCP(Model Context Protocol)是一种将 AI 连接到外部数据和工具的标准方式。MCP 提供了一个通用接口,而不是为每个 AI 提供商构建自定义集成。

为什么使用 MCP?

没有 MCP

为 ChatGPT、Claude、Gemini 分别构建集成... 维护多个代码库。API 变化时会出问题。

有 MCP

构建一次,到处可用。标准协议。AI 可以自动发现和使用你的工具。

MCP 提供

  • Resources:AI 可以读取的数据(文件、数据库记录、API 响应)
  • Tools:AI 可以执行的操作(搜索、创建、更新、删除)
  • Prompts:预构建的提示模板
prompts.chat 使用 MCP

这个平台有一个 MCP 服务器!你可以将它连接到 Claude Desktop 或其他兼容 MCP 的客户端,直接从你的 AI 助手搜索和使用提示词。

构建上下文:完整图景

上下文游乐场

137 / 200 个token

切换上下文块查看它们如何组合。注意token计数!

--- 系统提示 ---
你是TechStore的客服代理。请友好且简洁地回应。

--- 检索文档(RAG) ---
来自知识库:
- 退货政策:30天内,需原包装
- 配送:满200元免运费
- 保修:电子产品1年

--- 对话历史 ---
[摘要] 用户询问订单#12345。产品:无线鼠标。状态:昨天已发货。

用户:什么时候到?
助手:根据标准配送,预计3-5个工作日送达。

--- 用户查询 ---
如果不喜欢可以退货吗?

最佳实践

上下文工程检查清单0/7

总结

上下文工程是关于为 AI 提供正确的信息:

  • AI 是无状态的 - 每次都要包含它需要的所有内容
  • RAG 检索相关文档来增强提示词
  • Embeddings 实现语义搜索(按含义,而非仅关键词)
  • Function calling 让 AI 可以使用外部工具
  • 摘要 管理长对话
  • MCP 标准化 AI 连接数据和工具的方式
记住

AI 输出的质量取决于你提供的上下文质量。更好的上下文 = 更好的答案。