§ B5·AI 实践3 prompts

Embedding 与 RAG 原理

Embedding = 把一段文本映射成一个高维向量(768-4096 维浮点数)。语义相近的文本,向量也相近(用*余弦相似度*衡量)。

先读这部分
§ B5

Embedding 与 RAG 原理

Embedding = 把一段文本映射成一个高维向量(768-4096 维浮点数)。语义相近的文本,向量也相近(用*余弦相似度*衡量)。

RAG 的工作流
  1. 把你的文档切块(chunking),每块用 embedding 模型转成向量,存到向量数据库(Chroma / Weaviate / Qdrant / pgvector)。
  2. 用户提问 → 同样的 embedding 模型转成向量。
  3. 在向量库里找最像的 k 个块(k=3-8)。
  4. 把这些块塞进 prompt,让模型基于这些块回答。
为什么 RAG 重要 + 几个常见坑
  • 模型权重是几月前的,RAG 可以用你今天的知识。
  • 模型的上下文是有限的,RAG 把 100 万文档里相关的 5 篇找出来。
  • 模型的回答可以被引用,RAG 让答案可追溯到原文。
  • Chunk 切太大:上下文塞不下、检索粒度太粗。切太小:语义被切碎、检索不准。一般 200-500 token。
  • 只做向量检索:纯相似度匹配对精确匹配(人名、ID、版本号)很差。要 hybrid:BM25(关键词)+ 向量。
  • 不评估:上线后用户感觉「答得不准」,往往是因为从来没量过 retrieval recall / groundedness。
进阶:你要设计 RAG 系统再看
  • 评估指标:retrieval recall@K、groundedness、answer faithfulness、context precision/recall。
  • 高级技巧:query rewriting、HyDE、re-ranking(bge-reranker、cohere rerank)、self-RAG。
  • 读 Anthropic 2025 出的《Contextual Retrieval》,把 chunk 的上下文预先 LLM 一次再 embed,能显著提升 recall。
动手做 · 提示词卡

把这段知识变成一段可执行的练习

以下 3 张卡,每张都是一段可复制的提示词。打开 Claude Code(或任何 LLM 终端),把卡里的提示词粘进去,AI 会陪你完成这一步。遇到不会的概念,把 AI 的回答贴回 卡里继续问下一步。可以一次做完,也可以分几次。

2 操作1 概念
Prompt 01操作★★

最小 RAG 闭环

为什么要学90% 的'AI 不知道我的数据'靠 RAG 解, 不学这个就只剩'训练私模型'一条路。
打个比方RAG 像开卷考试, 把资料摊在桌上, AI 答完会引用第几页。
VibeCoder 场景你做 AI 客服答公司产品问题, 通用模型瞎编——RAG 接到文档, 答案 100% 有出处。

选 10 篇你自己的笔记 → 切块(500 token)→ embed(OpenAI text-embedding-3-small 或 bge)→ 存到 Chroma / Qdrant → 写 1 个最小 demo:query → top-3 → 喂给 LLM → 出答案。

前置Python 基础 · 会装 pip 包
  1. 01选 10 篇你写的笔记(Markdown)
  2. 02写 1 个 Python 脚本:切 500 token 块 → embed → 存 Chroma
  3. 03写 1 个 query 函数:embed 问题 → top-3 → 拼 prompt → 调 LLM
  4. 04测 5 个问题:3 个知识库里有、2 个故意超出知识库
  5. 05评:5 个里有 ≥4 个答案在原文中能找到
粘贴到 Claude Code(或任何 LLM 终端)embedding 用 OpenAI / bge;向量库用 Chroma(最简单)
你拥有以下 10 段笔记内容(每段是 1 个知识块)。\n请基于这些块回答用户问题。如果用户问题在某块中能找到,请引用块编号;找不到请直说'知识库中无此信息'。\n\n[10 块内容]\n\n问题:[用户问题]
✓ 完成判据5 个问题里 ≥4 个答案在原文中能找到;超出知识库的问题 AI 直说不知道。
embedding 模型和 query 端必须用同一个(不能训练用 bge、query 用 OpenAI);chunk 跨段切断语义是最常见失败原因。
参考B5 § RAG 工作流
Prompt 02操作★★

3 种粒度 chunking

为什么要学chunk 切错 retrieval 就废, 这是一个'试过才知道'但必须知道坑在哪的事。
打个比方切 chunk 像把书撕成便签, 太大切不到重点, 太小一句变两句断了逻辑。
VibeCoder 场景你用 500 字切 1 万字文档, 检索'价格策略'返回片段但缺了开头定义, 答得稀烂。

同一份文档,分别按 (a) 200 token 固定块 (b) 500 token 固定块 (c) 按段落切 → 同一组 5 个问题检索,对比 recall@5。

前置完成过 B5-01 最小 RAG 闭环
  1. 01准备 1 份 ≥20K 字的长文档
  2. 02写 3 套 chunker(A / B / C)
  3. 03embed + 存 3 份索引
  4. 04用 5 个问题跑 3 份索引
  5. 05出 recall 对比表
粘贴到 Claude Code(或任何 LLM 终端)
请按以下 3 种 chunk 策略处理文档:\nA) 200 token 固定窗口(带 50 token overlap)\nB) 500 token 固定窗口(带 100 token overlap)\nC) 按 markdown 段落切\n\n对每个 query 计 recall@5;输出 3×5 对比表。
✓ 完成判据至少一种粒度明显胜出(召回率差距 ≥20%)。
跨段切断是最大杀手——markdown 段落切对长文档 recall 高但 token 数不稳;固定窗口稳定但跨段。试试段落 + 固定窗口 hybrid 切。
参考B5 § Chunk 切分
Prompt 03概念★★

Hybrid 检索对照

为什么要学纯向量检索'精确人名'很差, 纯 BM25'理解语义'很差, hybrid 才是工业界标配。
打个比方纯向量 = 找'长得像'的便签, 纯 BM25 = 找'字一样'的便签, hybrid = 两种一起。
VibeCoder 场景你搜'Jensen Huang 怎么看 H100', 纯向量返回一堆'黄仁勋观点', hybrid 精确命中。

同一组问题(5 类 query:通用语义 / 精确人名 / 精确版本号 / 缩写 / 长问句),分别用 (a) 纯向量 (b) 纯 BM25 (c) hybrid,对比 recall 和质量。

前置完成过 B5-02 chunking 实验
  1. 01准备 5 类 query × 各 2-3 个具体 query = 10-15 个
  2. 02实现 3 检索方式(纯向量 / 纯 BM25 / 向量 + BM25 融合)
  3. 0310-15 个 query 各跑 3 次
  4. 04出 3×5 类型对比表
  5. 05总结哪类 query 用哪种检索
粘贴到 Claude Code(或任何 LLM 终端)
我有一组 5 类 query。\nA) 通用语义:'怎么降低延迟'\nB) 精确人名:'Jensen Huang 怎么看 H100'\nC) 精确版本号:'v2.1.0 修复了什么'\nD) 缩写:'RLHF 是什么'\nE) 长问句:[复杂句]\n\n请用 3 种检索方式(纯向量 / 纯 BM25 / hybrid)跑同一组 query,记 recall@5。
✓ 完成判据hybrid 在精确人名 / 精确版本号类 query 上明显胜出纯向量。
hybrid 权重(alpha)需要调;一般 0.5-0.7 偏向量,但精确类 query 多时降到 0.3-0.4 更稳。
参考B5 § hybrid search