上下文工程
RAG、嵌入、函数调用和MCP
理解上下文对于构建真正有效的 AI 应用程序至关重要。本章涵盖了你需要了解的关于在正确时间为 AI 提供正确信息的所有内容。
AI 模型是无状态的。它们不会记住过去的对话。每次发送消息时,你都需要包含 AI 需要知道的所有信息。这就是所谓的"上下文工程"。
什么是上下文?
上下文是你在提问时一并提供给 AI 的所有信息。可以这样理解:
无上下文
进展如何?
有上下文
你是一个项目管理助手。用户正在进行 Alpha 项目,截止日期是周五。最新进展是:'后端已完成,前端完成 80%。' 用户:进展如何?
没有上下文,AI 不知道你问的是什么"进展"。有了上下文,它就能给出有用的回答。
上下文窗口
还记得前面章节提到的:AI 有一个有限的"上下文窗口"——它一次能看到的最大文本量。这包括:
定义 AI 行为的指令
此次聊天中的先前消息
为此查询获取的文档、数据或知识
用户的实际问题
回答(也计入限制!)
AI 是无状态的
AI 不会在对话之间记住任何东西。每次 API 调用都是全新开始。如果你想让 AI "记住"某些内容,你必须每次都将其包含在上下文中。
这就是为什么聊天机器人会在每条消息中发送你的整个对话历史。不是 AI 记住了——而是应用程序重新发送了所有内容。
假设这是一个没有历史记录的新对话。 我刚才问了你什么?
AI 会说它不知道,因为它确实无法访问任何先前的上下文。
RAG:检索增强生成
RAG 是一种让 AI 访问其训练数据之外知识的技术。与其试图将所有内容都放入 AI 的训练中,你可以:
- 存储 你的文档到可搜索的数据库中
- 搜索 用户提问时的相关文档
- 检索 最相关的片段
- 增强 你的提示词,加入这些片段
- 生成 使用该上下文的答案
RAG 工作原理:
为什么使用 RAG?
RAG 优势
- 使用你实际的、最新的数据
- 减少幻觉
- 可以引用来源
- 易于更新(只需更新文档)
- 无需昂贵的微调
何时使用 RAG
- 客户支持机器人
- 文档搜索
- 内部知识库
- 任何特定领域的问答
- 当准确性很重要时
Embeddings:搜索的工作原理
RAG 如何知道哪些文档是"相关的"?它使用 embeddings——一种将文本转换为能捕获含义的数字的方法。
什么是 Embeddings?
Embedding 是一个表示文本含义的数字列表("向量")。相似的含义 = 相似的数字。
嵌入可视化
点击词语查看其向量和与其他词的相似度:
"快乐" 向量
与...的相似度: "快乐"
意思相似的词(如「高兴」和「快乐」)有相似的向量,获得高相似度分数。
语义搜索
使用 embeddings,你可以按含义搜索,而不仅仅是关键词:
关键词搜索
查询:'退货政策' 找到:包含'退货'和'政策'的文档 遗漏:'如何获得退款'
语义搜索
查询:'退货政策' 找到:所有相关文档,包括: - '退款指南' - '如何退回商品' - '退款保证'
这就是 RAG 如此强大的原因——即使确切的词语不匹配,它也能找到相关信息。
Function Calling / Tool Use
Function calling 让 AI 可以使用外部工具——比如搜索网络、查询数据库或调用 API。
不同的 AI 提供商对此有不同的叫法:"function calling"(OpenAI)、"tool use"(Anthropic/Claude)或 "tools"(通用术语)。它们都是同一个意思。
工作原理
- 你告诉 AI 有哪些工具可用
- AI 决定是否需要工具来回答
- AI 输出对工具的结构化请求
- 你的代码运行工具并返回结果
- AI 使用结果形成答案
这个提示展示了 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 = 完美适配!
摘要策略
不同的方法适用于不同的用例。点击每个策略查看它如何处理同一对话:
摘要策略
总结旧消息,保持最近的完整
原始对话
之后: 滚动摘要
摘要 (20t)
用户正在学习Python进行数据分析。已涵盖:变量、数字、列表基础。
保留的消息 (42t)
节省: 47%(116t → 62t)
摘要中应该捕获什么
好的对话摘要应保留重要内容:
试一试:创建摘要
练习从这段对话中创建保留上下文的摘要:
为上下文管理总结这段对话。摘要将替换 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?
为 ChatGPT、Claude、Gemini 分别构建集成... 维护多个代码库。API 变化时会出问题。
构建一次,到处可用。标准协议。AI 可以自动发现和使用你的工具。
MCP 提供
- Resources:AI 可以读取的数据(文件、数据库记录、API 响应)
- Tools:AI 可以执行的操作(搜索、创建、更新、删除)
- Prompts:预构建的提示模板
这个平台有一个 MCP 服务器!你可以将它连接到 Claude Desktop 或其他兼容 MCP 的客户端,直接从你的 AI 助手搜索和使用提示词。
构建上下文:完整图景
上下文游乐场
切换上下文块查看它们如何组合。注意token计数!
--- 系统提示 --- 你是TechStore的客服代理。请友好且简洁地回应。 --- 检索文档(RAG) --- 来自知识库: - 退货政策:30天内,需原包装 - 配送:满200元免运费 - 保修:电子产品1年 --- 对话历史 --- [摘要] 用户询问订单#12345。产品:无线鼠标。状态:昨天已发货。 用户:什么时候到? 助手:根据标准配送,预计3-5个工作日送达。 --- 用户查询 --- 如果不喜欢可以退货吗?
最佳实践
总结
上下文工程是关于为 AI 提供正确的信息:
- AI 是无状态的 - 每次都要包含它需要的所有内容
- RAG 检索相关文档来增强提示词
- Embeddings 实现语义搜索(按含义,而非仅关键词)
- Function calling 让 AI 可以使用外部工具
- 摘要 管理长对话
- MCP 标准化 AI 连接数据和工具的方式
AI 输出的质量取决于你提供的上下文质量。更好的上下文 = 更好的答案。