# Part 5 · 进阶应用：让 AI 懂你的私有数据

> **本篇定位**：理解当前 80% 企业 AI 应用的工作机制。学完本篇，你能向非技术人员解释"AI 客服为什么能回答我司产品问题"。
> **阅读时长**：20 分钟
> **心流产出**：用流程图描述一次完整的 RAG 问答全过程。

---

## 一、三个第三层概念

| # | 概念 | 重要度 | 一句话 |
| --- | --- | --- | --- |
| 10 | **Embedding** | ⭐⭐⭐⭐ | 文本转数字向量 |
| 11 | **Vector Database** | ⭐⭐⭐⭐ | 存储与检索向量的数据库 |
| 12 | **RAG** | ⭐⭐⭐⭐⭐ | 检索 + 生成的复合范式 |

---

## 二、概念 10：Embedding（向量嵌入）

### 类比

把每句话拍扁成"指纹"——一段数字。这串数字**保留了语义信息**：

- 语义相近的句子，指纹在高维空间里**距离近**。
- 语义无关的句子，指纹距离**远**。

```python
from openai import OpenAI
client = OpenAI()

resp = client.embeddings.create(
    model="text-embedding-3-small",
    input="今天天气真好"
)
vector = resp.data[0].embedding
print(len(vector))    # 1536 个数字
print(vector[:5])     # 形如 [0.012, -0.034, 0.056, 0.021, -0.078]
```

> **关键认知**：**Embedding 是 AI 实现"语义理解"而非"关键词匹配"的基础。** 不是"包含'游戏机'三个字才算相关"，而是"意思接近就算相关"。

---

## 三、概念 11：Vector Database（向量数据库）

### 类比

传统数据库按"精确字段"查（SQL：`WHERE name = '张三'`），**向量数据库按"距离近不近"查**（"找出和'推荐游戏'最像的 10 条记录"）。

### 行为示例

你问："推荐游戏"。

| 候选文档 | 关键词匹配 | 向量距离 | 是否被召回 |
| --- | --- | --- | --- |
| "PS5 评测" | ❌ 关键词无重叠 | **近** | ✅ |
| "游戏机分类介绍" | ✅ 包含"游戏机" | **近** | ✅ |
| "Switch 使用心得" | ❌ 关键词无重叠 | **近** | ✅ |
| "今日股市收盘" | ❌ | **远** | ❌ |

**用户感受到的是"AI 真的懂我意思"——背后是向量数据库在做毫秒级语义检索。**

### 常见向量数据库

| 名称 | 特点 |
| --- | --- |
| **Chroma** | 轻量、Python 原生，入门首选 |
| **Milvus** | 国产、开源、企业级 |
| **Pinecone** | 云托管、按量付费，省心 |
| **Weaviate** | 开源、模块化设计 |

---

## 四、概念 12：RAG（Retrieval-Augmented Generation，检索增强生成）

### 为什么需要 RAG？

大模型有两个固有缺陷：

1. **知识陈旧**：训练数据有截止日期，问"昨天发生了什么"它答不上来。
2. **私有数据无法访问**：模型不知道你公司产品手册里的内容。

**RAG 就是解决这两个问题的标准范式。**

### RAG 的两步流程

```
┌──────────────────────────────────────────┐
│  步骤 1：检索（Retrieval）                │
│  ├─ 用户提问 → 转 Embedding              │
│  ├─ 在向量数据库中找 Top-K 相似文档        │
│  └─ 把找到的文档片段收集起来               │
│                                           │
│  步骤 2：生成（Generation）               │
│  ├─ 把"用户提问 + 检索到的文档"拼成 Prompt │
│  └─ 发给大模型，让它基于这些资料回答        │
└──────────────────────────────────────────┘
```

### 一个真实例子

**用户问题**："我们的旗舰产品 X-Pro 的保修期是多久？"

**步骤 1（检索）**：
- 提问转 Embedding → 在产品手册向量库中检索
- 召回：「X-Pro 保修期 24 个月，自激活日起算」

**步骤 2（生成）**：
- 拼接 Prompt：
  ```
  基于以下资料回答用户问题。如果资料中没有答案，请说"我不确定"。

  【资料】
  X-Pro 保修期 24 个月，自激活日起算。

  【用户问题】
  我们的旗舰产品 X-Pro 的保修期是多久？
  ```
- 模型回答："X-Pro 的保修期为 24 个月，自激活日起算。"

> **关键认知**：**理解 RAG = 理解当前 80% 企业 AI 应用的工作机制。** 智能客服、企业知识库、文档问答助手，本质都是 RAG。

---

## 五、最小可运行 RAG 流程（概念代码）

```python
# 1. 准备文档 → Embedding → 存入向量库
import chromadb
from openai import OpenAI

client = OpenAI()
chroma = chromadb.PersistentClient(path="./chroma_db")
collection = chroma.get_or_create_collection("products")

docs = [
    "X-Pro 保修期 24 个月，自激活日起算。",
    "Y-Lite 保修期 12 个月。",
    "Z-Max 提供 7 天无理由退货。"
]

# Embedding + 存入
embeddings = [
    client.embeddings.create(model="text-embedding-3-small", input=d).data[0].embedding
    for d in docs
]
collection.add(documents=docs, embeddings=embeddings, ids=["1", "2", "3"])

# 2. 提问 → 检索 → 生成
question = "X-Pro 保修期多久？"
q_emb = client.embeddings.create(model="text-embedding-3-small", input=question).data[0].embedding
results = collection.query(query_embeddings=[q_emb], n_results=1)
context = results["documents"][0][0]

# 3. 拼 Prompt 让 LLM 回答
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "你是产品客服，仅基于提供的资料回答。"},
        {"role": "user", "content": f"【资料】{context}\n\n【问题】{question}"}
    ]
)
print(response.choices[0].message.content)
```

---

## 六、本篇动手任务（20 分钟）

### 任务 A：流程图描述

不写代码，**用纸笔画出**一次 RAG 问答的完整流程：用户问题 → Embedding → 向量检索 → Prompt 拼接 → LLM 生成 → 返回答案。每一步标注用到的概念。

### 任务 B（选做进阶）：跑通上面的最小 RAG

如果你已能访问 OpenAI / DeepSeek，按上面的代码把 3 条产品资料存入 Chroma，然后问"X-Pro 保修期多久？"，观察是否返回了正确答案。

---

## 七、进入下一篇

RAG 流程已懂。进入 [Part 6 · 调试与信息窗口](./p6-调试与信息窗口.md)，我们学习**程序员的"透视眼"**——所有"AI 调不通"问题的根因定位方法。
