Prompt、RAG、上下文与 MCP

前置阅读核心概念卡(先把这 4 个名词当"用过的东西"再读这页)。 预期收获:读完你能画出一个 RAG 系统的标准流程,并说出 5 个常见失败模式。

这份文档整理 Agent 周边的 AI 原生基础设施。

如果你还不清楚一次请求里有哪些字段,先读 Token、上下文与一次请求结构

Prompt 工程

Prompt 工程应当被当作工程纪律,而不是一次性文案技巧。

核心原则

原则 含义 示例
清晰明确 任务必须具体、可测试 “为 SaaS 产品写 150 字介绍,突出自动化与节约成本。”
结构化表达 拆分背景、任务、约束、样例、输出格式 使用“背景、目标、约束、输出格式”组织提示词
渐进优化 通过样例、评测和版本迭代提升质量 草稿 -> 评估 -> 修订 -> 版本化

推荐结构

角色:
任务:
上下文:
输入:
约束:
可用工具:
输出格式:
质量标准:
失败处理:

PromptOps

重要提示词要像代码一样管理:

  • 使用 Jinja2 或类似模板系统。
  • 放入版本控制。
  • 配套测试输入和黄金样例。
  • 自动检查输出结构。
  • 跟踪回归。
  • 上线前评审。
  • 指标下降时可回滚。

当提示词成为运营依赖时,PromptOps 尤其重要,例如 PRD 生成、客服分流、销售分析、数据解释、合规审查。

RAG

RAG 是检索增强生成,用于在生成时为模型接入外部知识。

它解决的问题:

  • 业务知识持续变化。
  • 私有文档不能进入训练集。
  • 最新政策或内部流程需要实时访问。
  • 产品知识库太大,无法全部放入上下文。
  • 模型需要基于来源回答,而不是凭记忆猜测。

标准流程

文档 -> 切片 -> 向量化 -> 向量库/索引
用户问题 -> 查询改写 -> 召回 -> 精排 -> 上下文拼装 -> 生成 -> 引用/评估

关键组件

组件 作用 注意点
切片 把文档拆成可检索单元 太小丢上下文,太大引入噪音
Embedding 把文本转成语义向量 模型要匹配业务领域
向量库 存储和检索高维向量 Milvus、Qdrant、Weaviate、Elasticsearch、PgVector
Retriever 选择候选文档 可用向量、BM25、混合检索、元数据过滤
Reranker 对候选结果精排 生产准确率常依赖这一步
上下文拼装 生成最终上下文 去重、压缩、解决冲突
Generator 生成有依据的答案 应该引用或关联来源
Evaluator 检查正确性和覆盖率 需要离线用例和在线监控

RAG 层级

层级 技术 示例
L1 关键词/BM25 检索 Elasticsearch、ripgrep 式匹配
L2 向量语义检索 Embedding 模型 + 向量库
L3 混合检索 BM25 + Embedding
L4 GraphRAG 或 CodeRAG 基于图关系和调用路径
L5 Agentic RAG Agent 自主决定检索、精排和追问

常见问题

  • Chunk 切片策略不合理。
  • 用户问题不完整,需要 Query 改写。
  • 单一检索方式不稳定。
  • 缺少 Rerank,召回噪音太大。
  • 多文档上下文互相矛盾。
  • 上下文过长、过旧或过噪。
  • 没有引用和来源。
  • 没有评测集。

上下文工程

上下文工程就是决定模型应该看到什么、以什么顺序看到、哪些内容不能覆盖系统规则。

上下文类型

类型 示例
系统上下文 角色、策略、约束、输出规则
动态上下文 用户输入、当前任务状态、近期历史
外部上下文 RAG 片段、数据库行、API/工具结果
记忆上下文 用户偏好、历史任务、可复用流程
环境上下文 当前日期、工作区、权限、运行状态

设计规则

  • 相关性比长度更重要。
  • 保留来源。
  • 明确处理冲突。
  • 工具输出要结构化。
  • 长历史要压缩成任务状态摘要。
  • 指令和证据要分开。
  • 检索文本不能覆盖系统规则和安全约束。

MCP

MCP 的价值是让工具和上下文接入更标准化。

工具调用生命周期

无论是否使用 MCP,工具调用都要按一个可审计的生命周期设计:

声明工具 -> 模型选择工具 -> 生成参数 -> 参数校验 -> 执行工具 -> 返回结果 -> 结果压缩/结构化 -> 继续推理或停止
环节 关键问题
工具声明 名称是否清楚,描述是否说明适用场景
参数 schema 必填字段、枚举、范围、默认值是否明确
权限 只读、建议写入、确认后写入、直接写入如何区分
执行 超时、重试、幂等、并发如何处理
错误 权限错误、参数错误、外部系统错误、无结果如何返回
结果 是否需要摘要、裁剪、脱敏、结构化
审计 是否记录 trace_id、tool_call_id、参数、结果、耗时、成本

工具调用失败时,不要把一大段错误直接塞回上下文。更好的方式是返回结构化错误:

{
  "ok": false,
  "error_type": "permission_error",
  "message": "用户无权读取该知识库",
  "retryable": false,
  "suggested_next_step": "request_permission_or_handoff"
}

MCP 风格的工具应包含:

  • 工具名称。
  • 语义描述。
  • 输入结构。
  • 输出结构。
  • 认证方式。
  • 权限边界。
  • 错误模型。
  • 审计和轨迹信息。

为什么 MCP 重要

没有协议边界时,每个 Agent 集成都容易变成一次性胶水代码。有协议化工具后,Agent 可以:

  • 发现工具。
  • 理解工具语义。
  • 稳定调用工具。
  • 替换实现。
  • 保留审计链路。
  • 接入多个系统而不重写 Agent。

设计模型:Prompt -> Context -> Tool -> Agent

可以按这个层次设计:

  1. Prompt 定义行为和输出契约。
  2. Context 提供事实、历史和约束。
  3. Tool 提供外部动作能力。
  4. Agent 循环决定何时推理、检索、调用工具和停止。
  5. Runtime 管理执行、轨迹、成本和安全。

准备度检查

  • Prompt 模板已存在并版本化。
  • 输出结构可校验。
  • RAG 具备切片、元数据、检索、精排和来源。
  • 上下文拼装能处理冲突和长度限制。
  • 工具有权限和审计。
  • Agent 有停止条件和兜底策略。
  • 评测覆盖正常路径、边界路径和对抗路径。

读完自测

  • [ ] 画出 RAG 标准流程(文档进 + 用户问题进 + 中间 6 步 + 最终输出)。
  • [ ] 列出 5 个 RAG 常见失败模式以及对应的修法。
  • [ ] 解释为什么"上下文越长越好"是错的。
  • [ ] 给一个具体场景(如"客服基于产品手册答疑"),你能说出该用 L1 关键词检索、L2 向量、还是 L3 混合检索。
  • [ ] 用一段话解释 MCP 解决了什么过去要重复写的胶水代码。

下一站

你接下来想… 去这里
把 Prompt-RAG-上下文串成一个能跑的系统 Agent 核心概念
看 RAG 的可视化流程 RAG 知识问答流程
真正做一个 RAG 设计 RAG 设计模板
学怎么让 RAG 上生产 工程化与 Runtime
深入 Prompt 工程 Prompt 专题综述
深入上下文工程 上下文工程专题综述