# 解释的RAG:起源和基本要素

曾经搜索过“ 部署指南 ” , 却一无所获, 即使有一篇关于“ 出版到生产” 的文章。 RAG(检索到启动的一代)通过理解意义解决了这个问题, 而不仅仅是关键词。 这个系列展示了RAG是如何形成的, 它是如何在引擎盖下运行的, 以及如何建立生产系统。 从语义搜索到 AI-hower {A 和引文-所有C# 工作代码示例 。

<datetime class="hidden">2025-11-22T09:00</datetime>

<!-- category -- AI, RAG, Machine Learning, Semantic Search, LLM, AI-Article -->
# 一. 导言 导言 导言 导言 导言 导言 一,导言 导言 导言 导言 导言 导言

**系列导航:** 这是RAG(回收-提款一代)系列的第一部分:

- **第1部分:RAG起源和基本要点** (本条) - 什么是嵌入,为什么它们重要
- [第2部分:RAG建筑和内部](/blog/rag-architecture) - 启动、象征化、矢量数据库
- [第3部分:在实务中协助通知书](/blog/rag-practical-applications) - 建立完整的ARAG系统
- [第4a部分:ONNX和Qdrant执行](/blog/semantic-search-with-onnx-and-qdrant) - CPU友好语义搜索基金会
- [第4b部分:语义搜索行动](/blog/semantic-search-in-action) - 头型、混合搜索和UI组件
- [第5部分:混合搜索和自动插入](/blog/rag-hybrid-search-and-indexing) - 生产一体化模式
- [第6部分:图表](/blog/graphrag-knowledge-graphs-for-rag) - 用于了解人身知识的知识图

RAG(检索-启动一代)的开发是为了让AI更聪明、更聪明的LLMs获得他们没有接受过培训的信息。但有趣的是:这种技术开辟的机会远远超出AI聊天室。它授权在网站、内容建议、写作协助和知识管理上进行语义搜索。

**双重性质:** RAG可以帮助客户(更好地搜索,准确的引用回答)或利用这些工具(操纵性建议,掩埋负面评论,浮出水面的上层内容 ) 。 区别不是技术 — — 它的用意。 有助于用户找到他们真正需要的东西的语义搜索? 很好。 一个在显示帮助的同时优先关注什么能让你最有钱的人? 这是一个黑暗的图案范围,它为什么理解这如何起作用。

**以下是关于RAG的真相:** 这听起来很吓人。 病媒嵌入器? 变异模型? 变异模型? KV 缓存? 但是和软件中的其他所有东西一样, 它只是理解它是如何运作的。 你不需要了解变异器结构背后的数学, 而不是你需要理解组装来写 C# 。

**RAG分三个步骤:**

1. 将文字转换为数字(编组)
2. 查找相似的数字( 矢量搜索)
3. 使用您找到的( 播放结果或向 LLM 反馈)

就是这样 剩下的是执行细节

这个系列展示您如何建立使用 C# 代码的 RAG 系统 。 没有手动跳动, 没有假设, 只有碎片和它们是如何组合的 。

**你会在这系列中学到什么:**

- **第1部分(本条)**:RAG是如何来的 以及它为什么重要
- **第二部分 第二部分**:完整的技术架构和LLLM内部
- **第三部分 第三部分**:用代码示例建立实际系统

稍后,我还将教你如何建立完整的RAG系统,包括:

- [使用 ONNX 嵌入器进行CPU 方便的语义搜索](/blog/semantic-search-with-onnx-and-qdrant) (第4编)
- [带有 Qdrant 的自托管矢量数据库](/blog/semantic-search-with-onnx-and-qdrant) (第4编)
- [混合查找和自动索引](/blog/rag-hybrid-search-and-indexing) (第五编)

[TOC]

# 什么是RAG? (RAG)? (RAG)? (RAG)什么是RAG? (RAG)

**回收- 提款一代 :** 查找相关信息,然后使用这些信息。

```mermaid
flowchart LR
    A[User Question] --> B[Retrieve Relevant Info]
    B --> C[Retrieved Documents/Context]
    C --> D[Generate Response]
    A --> D
    D --> E[Grounded, Accurate Answer]

    style B stroke:#f9f,stroke-width:2px
    style D stroke:#bbf,stroke-width:2px
```

**没有 RAG :** 用户询问记忆中的 LLM 猜想 可能是幻觉

**使用 RAG :** 用户使用这些基于现实的文档, 寻找相关的 docs *% LLM 答案

```csharp
// Without RAG: Hope the LLM knows
var answer = await llm.GenerateAsync("How do I deploy Docker?");
// Risk: Might make up outdated or wrong steps

// With RAG: Give it the docs
var relevantDocs = await vectorSearch.FindSimilar("How do I deploy Docker?");
var context = string.Join("\n", relevantDocs.Select(d => d.Text));
var answer = await llm.GenerateAsync($"Context: {context}\n\nQuestion: How do I deploy Docker?");
// Result: Answer based on YOUR actual Docker deployment docs
```

**关键洞察力:** 从推理( LLM) 中分离知识存储( 搜索) 。 更新您的文档, 搜索时长 。 不需要再培训 。

# RAG从哪里来的?

RAG以数十年的搜索和NLP研究为基础,了解这一历史有助于理解为什么RAG是设计成这样,以及它解决了哪些问题。

## 传统搜索(2010年代前)

**基于关键字的搜索 :**

- **TF-IDF**: 定期频率 x 倒数文档频率 - 通用词数少重要
- **BM25 BM25**:概率排序 - 仍然是关键词搜索的基准
- **模糊匹配**:
  - **声音**音效算法 ("Smith"和"Smyth"匹配)
  - **Leveshtein 距离**:编辑距离(有多少插入/删除/替代)
  - **N-grams N-grams**:部分匹配的字符/字序列

**问题:** 相匹配的 *字符字符字符字符*,而不是 *意思*。 搜索“ 集装箱管弦” , 除非有准确的字眼, 否则您找不到“ 鸟鼠摇篮 ” 。 它们可以处理打字, 但不能处理语义学 。

## 早期回答问题(2010s)

**华生(IBM,2011年):**

- 与基于规则的推理合并检索
- 危险! 但需要大规模手工制作的知识工程
- 仍然严重依赖关键字匹配

**阅读理解模型:**

- 可以从提供的段落中提取答案
- 但你必须先给他们正确的通道
- 没有语义搜索可找到该段落

## 深学习革命(2017+)

**变形器(2017年):** "["只要你关注" "只要你需要关注"](https://arxiv.org/abs/1706.03762)"

- 能够理解背景的神经网络
- 其后一切之事之基础基础

**BERT(2018年):**

- 语言背景理解
- "银行"在"河银行"和"储蓄银行"中 意指不同的东西
- 能够生成包含含义的嵌入

**GPT-2/3(2019/2020):**

- 能够产生一致案文的大语言模式
- 但仅限于培训数据
- 出现了幻觉问题

**高浓度病媒代表:**

- 高维空间中文本有意义的数字
- 类似的意思  附近矢量
- 这使语义搜索成为可能

**BART(脸书AI,2019年10月):**

- 《双向和自动递减变异器》,Mike Lewis等人著。
- 与 GPT 类似 GPT 的混合 BERT 编码器
- 接受腐败文本培训的disoising 自动编码器,然后重建文本
- 极适合文本生成和理解任务
- 成为RAG的基础

**M2M-100(AI,2020年10月,脸书):**

- 首批多语多语多语种翻译模式
- 直接翻译:100种没有英语支线的语种之间的100种语言直接翻译
- 2 200语言方向(比以往模式多10倍)
- 显示的变压器可处理大规模跨语言任务

**真实世界实例:** 我的 [神经机器翻译工具](https://github.com/scottgal/mostlyucid-nmt) 在没有初级服务时,作为后备翻译模式使用BART, 说明这些以变压器为基础的模型如何成为生产系统的实际构件。

## 现代RAG的诞生(2020年5月)

开创性文件 "[知识密集 NLP 任务检索支持生成](https://arxiv.org/abs/2005.11401)" Patrick Lewis等人(脸书AI Research)正式推出RAG,

**两者的结合:**

- 密集通道检索(DPR) - 了解的矢量代表,而非关键字
- BART发电机 -- -- 2019年的后继2Seq模型
- 端端到端差异式建筑 - 联合检索和生成

**结果:** RAG系统的业绩远远超过了知识密集型任务方面更大的模型,同时提高了效率,更新了最新数据。 你可以更新知识库,而不对模型进行再培训。

## 为什么RAG被爆(2023年至今)

查特、GPT-4、GPT-4和Claude使RAG成为关键:

1. **幻幻觉问题** - LLM女士自信地编造事实 RAG在真实文件中提出答复
2. **知识关闭** - 受过2021年数据培训的LLM公司不知道2024年的活动,RAG公司使用现有文件。
3. **私人数据** -LLMS不能进入你公司的内部医生室 RAG可以
4. **成本成本成本成本成本** - 微调LMS价格昂贵(10K-100K+),RAG价格低廉(储存+嵌入)。
5. **可解释性** - 区域咨询组可以列举资料来源,使其可审计和可信赖。

**今日(2024-2025年):** ARG是生产AI系统需要准确性和可审计性的实际标准,每一大AI公司都提供RAG工具。

# RAG是如何运作的:大图

在深入探讨技术细节(我们将在第二部分中讨论)之前, 让我们先了解高层次的工作流程。

## 三阶段

区域咨询组系统分三个不同阶段运作:

### 第1阶段:指数化(一次性设置)

```mermaid
flowchart LR
    A[Your Documents] --> B[Split into Chunks]
    B --> C[Generate Embeddings]
    C --> D[Store in Vector DB]

    style C stroke:#f9f,stroke-width:2px
    style D stroke:#bbf,stroke-width:2px
```

**会发生什么:**

1. 获取您的知识库( docs、博客文章、手册)
2. 分割成可控块块(段落、区域)
3. 将每个块转换成矢量嵌入(数数数组)
4. 将矢量存储在为相似搜索而优化的数据库中

**关键概念:** 类似的含义产生类似的矢量, 所以“ 笼子容器” 和“ 集装箱平台” 最终在矢量空间 紧密相连。

### 第2阶段:检索(每个查询)

```mermaid
flowchart LR
    A[User Question] --> B[Generate Query Embedding]
    B --> C[Search Vector DB]
    C --> D[Top K Most Similar Chunks]

    style B stroke:#f9f,stroke-width:2px
    style C stroke:#bbf,stroke-width:2px
```

**会发生什么:**

1. 用户问问题
2. 将问题转换为矢量(与索引使用的模式相同)
3. 在数据库中查找最相似的矢量
4. 返回上方 K K 最相关的块( 通常为 3- 10)

**为什么它起作用:** “我如何部署集装箱?” (query)在语义上与关于Docker部署的块块相似,

### 第3阶段:产生(每个查询)

```mermaid
flowchart TB
    A[User Question] --> B[Build Prompt]
    C[Retrieved Context] --> B
    B --> D[LLM]
    D --> E[Generated Answer with Citations]

    style B stroke:#f9f,stroke-width:2px
    style D stroke:#bbf,stroke-width:2px
```

**会发生什么:**

1. 接受用户的问题
2. 取回的上下文块
3. 构造一个提示 : "鉴于这个背景... , 回答这个问题..."
4. 发送到 LLM 生成
5. 法学硕士根据所提供的背景提供答案

**魔法:** LLM无法想象与上下文无关的事实。 它只能合成和解释所提供的内容。

## 简单示例

让我们通过系统追踪查询 :

**用户询问 :** "我如何使用多克作曲?"

**步骤1 - 检索:**

```
Query embedding: [0.234, -0.891, 0.567, ...]

Search vector DB for similar embeddings...

Retrieved chunks:
1. "Docker Compose is a tool for defining multi-container applications..." (similarity: 0.92)
2. "To use Docker Compose, create a docker-compose.yml file..." (similarity: 0.87)
3. "The docker-compose up command starts all services..." (similarity: 0.83)
```

**步骤2 - 产生:**

```
Prompt to LLM:
"Context:
[1] Docker Compose is a tool for defining multi-container applications...
[2] To use Docker Compose, create a docker-compose.yml file...
[3] The docker-compose up command starts all services...

Question: How do I use Docker Compose?

Answer (use the context above):"

LLM Response:
"To use Docker Compose [1], start by creating a docker-compose.yml file [2] that
defines your services. Then run 'docker-compose up' to start all services [3]..."
```

**结果:** 准确答复,暗含引用文件。

# RAG 相对于其他方法

了解何时(和何时不)使用限制令需要将其与替代品进行比较。

## RAG对 Fine-Turning


|--------|-----|-------------|
| **知识更新** 需要再培训
| **成本成本成本成本成本** 低(存储+嵌入) 高(GPU培训时间)
| **准确性** 来源来源 致幻
| **自定义** * 限于检索 * 深度模型适应 * * * * 仅限于检索 * * 深度模型适应 * * * 仅限于检索 * * 深度模型适应 * * * 仅限于检索 * * 深度模型适应 * * * 仅限检索 * * 仅限检索 * * 深度模型适应 * * * * 仅限检索 * * 深度模型适应 * * * * 仅限检索 * * 深度模型适应 * * * * * * 仅限检索 * * * 深度模型适应 * * * * * * * * 仅限检索 * * * 深度模型适应 * * * * * * * * * 仅限检索 * * * * * * 深度模型适应 * * * * * * * *
| **可解释性** 高(可以引用来源) 低(黑盒)
| **最佳** * 知识密集型任务 * * 风格/形式适应 *

**何时使用 Fine- Turning :**

- 您需要模型来学习 **样式样式样式样式样式样式** 或 **格式格式**
- 你有一个大而干净的数据集
- 您需要模型内部化 **模式模式**而不是事实
- 例如:让GPT像莎士比亚一样写作

**何时使用 RAG :**

- 你需要 **事实准确性** 有引号的引号
- 您的知识基础变化频繁
- 您拥有私人/专有数据
- 成本和简单问题
- 实例:客户支持聊天室(我公司每周更换文件)

**你能把两者结合起来吗?** 是的 时尚优雅 事实优雅

## RAG 相对于长内框窗口

现代LLMs拥有巨大的上下文窗口( GPT-4: 128K 表示牌, Claude: 200K 表示牌 ) 。 为什么不把您的文档全部丢入上下文?

**长期问题:**

1. **成本成本成本成本成本**:配有象征物的定价比例尺 - 每个查询10-100美元加在一起速度快
2. **时间间隔**:处理 100K 符号需要时间
3. **迷失在中间**:LLMM公司为在长期环境中使用信息而奋斗
4. **稀释**:相关信息被埋在噪音中
5. **实际限制**:你无法将整个公司的文件 与上下文相匹配

**当长的上下文有意义时 :**

- 单大单文件(例如,分析合同)
- 每件事都相关(无需过滤)
- 成本与成本无关
- 低查询量

**当RAG有意义时:**

- 大型知识库(百万份文件)
- 需要找到相关的子集
- 高查询量(费用事项)
- 实时更新知识

**最佳做法:** 使用 RAG 选择最相关的内容, 然后对该子集使用长上下文 。

## RAG与RAG对RAG对RAG与RAG对RAG对RAG与RAG对RAG对RAG对RAG与RAG对RAG对RAG对RAG对RA对RAG对RA对RAG对RAG对RAG对RAA对RAG对RAG对RAG对RRA对RA对RAG对RA对RAG对RRA对RAG(以实例催促)

微小的提示(举例来说,提示)是一个简单的基线。

**示例提示:**

```
Examples:
Q: What is Docker?
A: Docker is a containerization platform...

Q: How does Kubernetes work?
A: Kubernetes orchestrates containers...

Q: What is my new question?
A: [LLM generates answer]
```

**限制:**

- 限于上下文窗口中适合的内容
- 实例的手工整理
- 不向大型知识库扩展
- 没有语义搜索 - 您手动选择示例

**RAG 改进 :**

- 自动找到最佳范例(通过相似搜索)
- 缩放至无限制示例( 只有上端 K 发送到 LLM)
- 查询适应( 不同的查询检索不同的示例)

你可以认为RAG是"自动发号施令"

## 混合搜索:RAG+传统搜索

您可以使用相互排名合并(RRF),将RAG与传统的全文搜索结合起来。

**为什么是混血儿?**

- **语义搜索**: 在概念匹配方面( “ 错误处理” 发现“ 例外管理 ” )
- **关键词搜索**: 精确的术语( “ 嵌入式合成 ” 、 “ 实体框架 ” )
- **混合混合物**:两个世界中最好的

```csharp
public async Task<List<SearchResult>> HybridSearchAsync(string query)
{
    // Run both searches in parallel
    var semanticTask = SemanticSearchAsync(query, limit: 20);
    var keywordTask = KeywordSearchAsync(query, limit: 20);

    await Task.WhenAll(semanticTask, keywordTask);

    var semanticResults = await semanticTask;
    var keywordResults = await keywordTask;

    // Combine using Reciprocal Rank Fusion
    return ApplyRRF(semanticResults, keywordResults);
}

private List<SearchResult> ApplyRRF(
    List<SearchResult> list1,
    List<SearchResult> list2,
    int k = 60)
{
    var scores = new Dictionary<string, double>();

    // Score from first list
    for (int i = 0; i < list1.Count; i++)
    {
        var id = list1[i].Id;
        scores[id] = scores.GetValueOrDefault(id, 0) + 1.0 / (k + i + 1);
    }

    // Score from second list
    for (int i = 0; i < list2.Count; i++)
    {
        var id = list2[i].Id;
        scores[id] = scores.GetValueOrDefault(id, 0) + 1.0 / (k + i + 1);
    }

    // Merge and sort by combined score
    var allResults = list1.Concat(list2)
        .GroupBy(r => r.Id)
        .Select(g => g.First())
        .OrderByDescending(r => scores[r.Id])
        .ToList();

    return allResults;
}
```

# 为何RAG关系重大

现在,你明白什么是RAG,从哪里来的, 以及它与替代品的对比, 这就是为什么它很重要的原因:

**1. 大赦国际的民主化**

- 你不需要一万K的微调预算
- 你不需要一个ML工程师团队
- 任何开发者都可利用现有工具建立区域咨询组系统

**2. 实际准确性**

- 幻觉是生产中LLMs的 #1问题
- RAG 以真实文件作为回复依据解决它
- 引文使它具有可审计性和可信赖性

**3. 总是自上而下**

- 传统AI:培训一次,知识冻结
- RAG: 立即更新文件, 更新知识
- 快速移动领域(技术、新闻、条例)的关键

**4. 隐私与控制**

- 数据保存在您的基础设施中
- 可完全本地运行( 本地嵌入 + 本地 LLM + 本地矢量 DB)
- 没有向 OpenAI 或其他云源提供者发送数据

**5. 具有成本效益**

- 储存费用低廉(每英镑私人)
- 内嵌是廉价的(违反每1 000份文件百分之一)
- 比微调或长背景窗口便宜得多

**6. 易变性应用**

- 语义搜索( 不需要 LLM ! )
- A 引文系统
- 内容建议内容建议
- 书写助理助理
- 知识管理 知识管理 知识管理 知识管理 知识管理 知识管理 知识管理 知识管理 知识管理
- 文件帮助者
- 研究助理

# 结论:从历史到实施

我们追踪了RAG的进化过程

- **2010年之前**:关键字搜索(字符,非意思)
- **2010年s**:阅读理解(需要正确通过)
- **2017-2020**:变形器和嵌入器(意指矢量)
- **2020**: 现代RAG(检索+生成)
- **2023年至今**: 生产标准(演练+成本+隐私)

**第1部分的主要见解:**

- RAG 分离 **知识储存** (矢量 DB) from **理由说明** (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM) (LLM)
- 它解决幻觉的问题 通过在真实的文档中找到回应 解决幻觉问题
- 比微调更便宜,更灵活
- 对于大型知识库而言,它比长期知识库更管用
- 基本上就是"在规模上自动发射几发信号"

**三步心理模式:**

1. 将文字转换为数字(编组)
2. 查找相似的数字( 矢量搜索)
3. 使用您找到的( 向 LLM 播放或种子)

其它一切都是优化。

# 继续第2部分:建筑和内部

你现在明白了 **什么什么是** RAG是, **为什么** 它很重要,而且 **何 地** 但是它是如何在引擎盖下工作的呢?

内 **[第2部分:RAG建筑和内部](/blog/rag-architecture)**我们深入探究技术细节:

**完成的RAG输油管:**

- 第1阶段:指数化(文本提取、散列战略、嵌入生成、矢量储存)
- 第2阶段:回收(挖掘嵌入、相似度指标、重新排位)
- 第3阶段:产生(即期建造、LLM参数、后处理)

**LLM 内部:**

- 什么是象征物,它们为什么对RAG很重要?
- KV 缓存缓存: LLMM 如何记住上下文
- 背景窗口和象征性管理战略
- 优化区域咨询组的象征性效率和成本

**技术深潜:**

- 矢量数据库和相似性搜索算法
- 嵌入模式和正常化
- 保持环境的启动战略
- C#中的实用代码实例

**[继续第2部分:建筑和内部 ](/blog/rag-architecture)**

在第二部分之后,你将准备参加第三部分, 在那里,我们建立真正的系统, 解决共同的挑战, 并探索先进的技术,如 HYDE, 多要求RAG, 和背景压缩。

## 资源资源资源 资源资源资源 资源资源 资源资源

**基础文件:**

- [知识密集 NLP 任务检索支持生成](https://arxiv.org/abs/2005.11401) - 最初的RAG文件
- [用于 Open- Domay 问答的宽度通道检索器](https://arxiv.org/abs/2004.04906) - DPR(检索基金会)
- [你们需要的注意力](https://arxiv.org/abs/1706.03762) - 变形器(编织基金会)

**进一步阅读:**

- [神经机器翻译如何工作](/blog/how-neural-machine-translation-works) - 了解嵌入背后的AI模式

**本系列的下一个 :**

- [第2部分:RAG建筑和内部](/blog/rag-architecture) - 技术深层潜水
- [第3部分:在实务中协助通知书](/blog/rag-practical-applications) - 建立实际系统

**[继续到第2部分](/blog/rag-architecture)**