<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RAG | Home</title><link>https://wzhai-hub.github.io/Tony/ai/rag/</link><atom:link href="https://wzhai-hub.github.io/Tony/ai/rag/index.xml" rel="self" type="application/rss+xml"/><description>RAG</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Wed, 05 Aug 2026 00:00:00 +0000</lastBuildDate><image><url>https://wzhai-hub.github.io/Tony/media/icon_hua2ec155b4296a9c9791d015323e16eb5_11927_512x512_fill_lanczos_center_3.png</url><title>RAG</title><link>https://wzhai-hub.github.io/Tony/ai/rag/</link></image><item><title>Advanced RAG：从向量检索到智能知识检索系统</title><link>https://wzhai-hub.github.io/Tony/ai/rag/advanced-rag/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/advanced-rag/</guid><description>&lt;h2 id="引言rag-的真正难点从来不是接一个-vector-database">引言：RAG 的真正难点，从来不是“接一个 Vector Database”&lt;/h2>
&lt;p>Retrieval-Augmented Generation（RAG）最初给人的印象非常简单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种架构可以很好地解决一部分知识问答问题。&lt;/p>
&lt;p>但是，一旦进入真实生产环境，问题马上出现：&lt;/p>
&lt;ul>
&lt;li>用户的问题表达不准确；&lt;/li>
&lt;li>Query 和文档中的语言不一致；&lt;/li>
&lt;li>一个问题涉及多个知识点；&lt;/li>
&lt;li>关键词检索和语义检索各有缺陷；&lt;/li>
&lt;li>Top-K 中存在大量相似但不相关的 Chunk；&lt;/li>
&lt;li>正确答案分散在多个文档中；&lt;/li>
&lt;li>Chunk 本身缺少上下文；&lt;/li>
&lt;li>文档存在权限和版本问题；&lt;/li>
&lt;li>LLM Context Window 被大量无关内容占用；&lt;/li>
&lt;li>Retrieval 正确，但最终答案仍然错误；&lt;/li>
&lt;li>无法解释为什么检索到这些文档；&lt;/li>
&lt;li>无法系统评估 RAG 到底哪里出了问题。&lt;/li>
&lt;/ul>
&lt;p>于是，真正的生产级 RAG 不再是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding → Vector DB → LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而逐渐演化成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Transformation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────┴──────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Dense Retrieval Sparse Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────┬──────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Set
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Assembly
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer Validation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是 Advanced RAG 的核心。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Advanced RAG 的本质，不是增加更多组件，而是让 Retrieval 从“单次相似度搜索”演变成一个多阶段、可控制、可评估的知识检索系统。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="1-naive-rag-的问题到底在哪里">1. Naive RAG 的问题到底在哪里？&lt;/h1>
&lt;p>首先来看最基本的 RAG。&lt;/p>
&lt;p>假设知识库：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Chunk N
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Index：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How can I configure Redis cluster failover?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>转换：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5 Chunks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理论上非常简单。&lt;/p>
&lt;p>但是这里隐含了一个非常强的假设：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Query 的 embedding 与正确答案 Chunk 的 embedding 足够接近。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>现实世界并不总是如此。&lt;/p>
&lt;hr>
&lt;h1 id="2-semantic-gapquery-和-document-的语言可能完全不同">2. Semantic Gap：Query 和 Document 的语言可能完全不同&lt;/h1>
&lt;p>例如用户问：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Why did my Redis cluster automatically switch to another node?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>文档可能写的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">When the master node becomes unavailable,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster performs replica promotion.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户没有使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">master
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replica
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">promotion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些关键词。&lt;/p>
&lt;p>但是语义上：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">automatically switch to another node
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其实对应：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">replica promotion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>Semantic Gap&lt;/p>
&lt;/blockquote>
&lt;p>Vector Search 可以解决一部分 Semantic Gap，但不是全部。&lt;/p>
&lt;p>因此 Advanced RAG 的第一个方向就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Query Transformation&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="3-query-transformation">3. Query Transformation&lt;/h1>
&lt;p>Query Transformation 的思想是：&lt;/p>
&lt;blockquote>
&lt;p>不要直接拿用户原始 Query 去搜索。&lt;/p>
&lt;/blockquote>
&lt;p>而是先理解 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Transformed Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="4-query-rewriting">4. Query Rewriting&lt;/h1>
&lt;p>最简单的方法：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Original:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Why did my Redis cluster automatically switch to another node?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Rewrite：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster replica promotion after master node failure
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以显著改善：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>的匹配质量。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Original Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search Query
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但 Query Rewriting 也有一个风险：&lt;/p>
&lt;blockquote>
&lt;p>LLM 可能在 Rewrite 时改变用户原始意图。&lt;/p>
&lt;/blockquote>
&lt;p>所以生产环境中应该保留：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">original_query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rewritten_query
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而不是直接覆盖原 Query。&lt;/p>
&lt;hr>
&lt;h1 id="5-multi-query-retrieval">5. Multi-Query Retrieval&lt;/h1>
&lt;p>一个 Query 有时候存在多个合理的表达方式。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How does Redis failover work?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以生成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How does Redis detect master failure?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How is a Redis replica promoted?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How does Redis Cluster recover from node failure?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query 4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster automatic failover mechanism
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后分别进行 Retrieval：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Original Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Generator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┼──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Q1 Q2 Q3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Search Search Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────────┼──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Merge Results
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以提高 Recall。&lt;/p>
&lt;p>但是也会增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以 Multi-Query 不应该对所有 Query 默认开启。&lt;/p>
&lt;hr>
&lt;h1 id="6-hyde先生成假答案再进行-retrieval">6. HyDE：先生成“假答案”，再进行 Retrieval&lt;/h1>
&lt;p>HyDE（Hypothetical Document Embeddings）是一个非常有意思的思想。&lt;/p>
&lt;p>传统 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>HyDE：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hypothetical Answer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How does Redis failover work?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LLM 先生成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster detects master failure and promotes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">one of the replicas to become the new master...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Hypothetical Answer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>为什么可能有效？&lt;/p>
&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常非常短。&lt;/p>
&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Hypothetical Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>包含更多与知识库文档相似的语言。&lt;/p>
&lt;p>于是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query ↔ Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Hypothetical Answer ↔ Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>语义空间可能更加接近。&lt;/p>
&lt;hr>
&lt;h1 id="7-multi-queryrewritehyde-的本质">7. Multi-Query、Rewrite、HyDE 的本质&lt;/h1>
&lt;p>虽然它们实现方式不同，但本质上都在解决：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Representation Mismatch&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>也就是说：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ≠
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Representation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query Transformation 的目标就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Transform Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Make Query Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">closer to Document Representation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是 Advanced RAG 的第一个重要升级。&lt;/p>
&lt;hr>
&lt;h1 id="8-hybrid-search为什么-vector-search-不够">8. Hybrid Search：为什么 Vector Search 不够？&lt;/h1>
&lt;p>另一个经典问题：&lt;/p>
&lt;blockquote>
&lt;p>Vector Search 并不擅长所有类型的查询。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">INC-2026-001827
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ERR_CONNECTION_RESET
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">java.lang.NullPointerException
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种 Query 对关键词非常敏感。&lt;/p>
&lt;p>如果用户问：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Find incident INC-2026-001827
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>传统 Dense Retrieval 未必是最好的方法。&lt;/p>
&lt;p>这时需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dense Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sparse Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="9-dense-retrieval">9. Dense Retrieval&lt;/h1>
&lt;p>Dense Retrieval：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Similarity Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优势：&lt;/p>
&lt;ul>
&lt;li>语义理解；&lt;/li>
&lt;li>同义词；&lt;/li>
&lt;li>自然语言表达；&lt;/li>
&lt;li>Concept-level matching。&lt;/li>
&lt;/ul>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">automatically switch node
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以匹配：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">replica promotion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="10-sparse-retrieval">10. Sparse Retrieval&lt;/h1>
&lt;p>Sparse Retrieval 典型方法：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心优势是：&lt;/p>
&lt;blockquote>
&lt;p>Exact Keyword Matching&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">INC-2026-001827
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RedisTemplate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">OpenTelemetry Java Agent
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种专有名词、错误码、ID、类名、API 名称，Sparse Search 往往非常有效。&lt;/p>
&lt;hr>
&lt;h1 id="11-hybrid-retrieval">11. Hybrid Retrieval&lt;/h1>
&lt;p>因此生产级 RAG 通常采用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────┴─────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Dense Retrieval Sparse Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50 Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─────────┬─────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这实际上是在组合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Lexical Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="12-reciprocal-rank-fusion">12. Reciprocal Rank Fusion&lt;/h1>
&lt;p>Hybrid Search 的一个常见问题是：&lt;/p>
&lt;blockquote>
&lt;p>Dense Search 和 Sparse Search 的 score 不能直接比较。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dense Score:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.92
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.87
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.83
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而 BM25：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">18.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">12.7
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">9.3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两个 score scale 完全不同。&lt;/p>
&lt;p>因此可以使用：&lt;/p>
&lt;blockquote>
&lt;p>Reciprocal Rank Fusion（RRF）&lt;/p>
&lt;/blockquote>
&lt;p>基本思想：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RRF(d) =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Σ 1 / (k + rank(d))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dense:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document A → Rank 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B → Rank 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B → Rank 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C → Rank 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时在两个 Retriever 中排名靠前，因此最终排名会上升。&lt;/p>
&lt;p>RRF 的价值在于：&lt;/p>
&lt;blockquote>
&lt;p>不要求不同 Retriever 的 score 具有相同尺度。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="13-rerankingretrieval-的第二阶段">13. Reranking：Retrieval 的第二阶段&lt;/h1>
&lt;p>Hybrid Search 解决了 Recall。&lt;/p>
&lt;p>但是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>仍然太多。&lt;/p>
&lt;p>所以进入第二阶段：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Candidate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>Multi-Stage Retrieval&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="14-bi-encoder-vs-cross-encoder">14. Bi-Encoder vs Cross-Encoder&lt;/h1>
&lt;p>这是理解 RAG Retrieval Architecture 的关键。&lt;/p>
&lt;h2 id="bi-encoder">Bi-Encoder&lt;/h2>
&lt;p>Embedding Model：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity(Query, Document)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优势：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Fast
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scalable
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Pre-computable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因为 Document Embedding 可以提前计算。&lt;/p>
&lt;hr>
&lt;h2 id="cross-encoder">Cross-Encoder&lt;/h2>
&lt;p>Cross-Encoder：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">(Query, Document)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它直接同时理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此通常具有更强的相关性判断能力。&lt;/p>
&lt;p>但是计算成本更高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query × Candidate Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Bi-Encoder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;blockquote>
&lt;p>First-stage Retrieval&lt;/p>
&lt;/blockquote>
&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cross-Encoder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;blockquote>
&lt;p>Second-stage Reranking&lt;/p>
&lt;/blockquote>
&lt;p>于是形成经典架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Dense Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Sparse Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cross Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="15-context-compression">15. Context Compression&lt;/h1>
&lt;p>即使经过 Reranking：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 5 Chunks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每个 Chunk 可能仍然有大量无关内容。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster consists of...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[大量背景介绍]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When a master node fails...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[真正答案]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Monitoring...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[大量无关信息]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果直接送给 LLM：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>会浪费大量 Context Window。&lt;/p>
&lt;p>所以 Advanced RAG 会增加：&lt;/p>
&lt;blockquote>
&lt;p>Context Compression&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="16-context-compression-的核心思想">16. Context Compression 的核心思想&lt;/h1>
&lt;p>不是：&lt;/p>
&lt;blockquote>
&lt;p>找更多内容。&lt;/p>
&lt;/blockquote>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>从已经找到的内容中提取真正有用的内容。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10 Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Passages
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这可以降低：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Tokens
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Noise
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="17-parent-child-retrieval">17. Parent-Child Retrieval&lt;/h1>
&lt;p>这是解决 Chunking 与 Context 问题的重要技术。&lt;/p>
&lt;p>Index：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Parent Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Child Chunk 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Child Chunk 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Child Chunk 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Child Chunk 4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Child Chunk → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retrieval：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Child Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是说：&lt;/p>
&lt;blockquote>
&lt;p>用小 Chunk 找，用大 Chunk 读。&lt;/p>
&lt;/blockquote>
&lt;p>这是一个非常漂亮的设计：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval Granularity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ≠
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generation Granularity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这两个问题不应该强行使用同一个 Chunk。&lt;/p>
&lt;hr>
&lt;h1 id="18-multi-hop-retrieval">18. Multi-Hop Retrieval&lt;/h1>
&lt;p>很多企业问题不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question → One Chunk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question → Chunk A + Chunk B + Chunk C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;blockquote>
&lt;p>Which service owns the API, who is the technical lead, and what Kubernetes namespace is it deployed in?&lt;/p>
&lt;/blockquote>
&lt;p>需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ownership
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Technical Lead
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Deployment
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kubernetes Namespace
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种问题需要：&lt;/p>
&lt;blockquote>
&lt;p>Multi-Hop Retrieval&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="19-multi-hop-rag">19. Multi-Hop RAG&lt;/h1>
&lt;p>可以设计：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Complex Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Decomposition
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌────────┼────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Q1 Q2 Q3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Search Search Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────┼────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Intermediate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Knowledge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Next Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里 Retrieval 不再是一次性的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieve once
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reason
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reason
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这已经开始接近：&lt;/p>
&lt;blockquote>
&lt;p>Agentic Retrieval。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="20-query-decomposition">20. Query Decomposition&lt;/h1>
&lt;p>复杂问题可以拆成多个 Sub-Queries。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How does our payment service handle
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">failure recovery and what monitoring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">metrics should we use?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以拆成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How does payment service failure recovery work?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">What are the recovery mechanisms?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">What monitoring metrics are available?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>分别 Retrieval：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q1 → Architecture Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q2 → Recovery Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q3 → Monitoring Docs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Merge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这对于复杂企业知识库非常重要。&lt;/p>
&lt;hr>
&lt;h1 id="21-self-rag">21. Self-RAG&lt;/h1>
&lt;p>传统 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Self-RAG 的核心思想是：&lt;/p>
&lt;blockquote>
&lt;p>LLM 自己判断什么时候需要 Retrieval，以及检索结果是否足够支持答案。&lt;/p>
&lt;/blockquote>
&lt;p>可以抽象为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Need Retrieval?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─┴─┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">No Yes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Relevant?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└──┬──┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Critique
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 RAG 从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Pipeline
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>开始向：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Decision Loop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>演化。&lt;/p>
&lt;hr>
&lt;h1 id="22-corrective-rag">22. Corrective RAG&lt;/h1>
&lt;p>Corrective RAG（CRAG）的核心思想：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval 结果可能是错误的，所以需要对 Retrieval Quality 进行判断。&lt;/p>
&lt;/blockquote>
&lt;p>流程：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieved Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Evaluator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Good
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Generate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Bad
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Correct / Reformulate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> External Search / Another Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Generate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里增加了：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Critic&lt;/p>
&lt;/blockquote>
&lt;p>这说明一个非常重要的架构思想：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Retriever 不是绝对可靠的。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="23-graph-rag">23. Graph RAG&lt;/h1>
&lt;p>普通 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Graph RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Entities
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relationships
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Knowledge Graph
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PaymentService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── calls → OrderService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── uses → Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── deployed-in → payment-prod
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户问：&lt;/p>
&lt;blockquote>
&lt;p>Which services depend on Redis?&lt;/p>
&lt;/blockquote>
&lt;p>Vector Search 可能找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PaymentService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OrderService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RiskService
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但 Graph Query 可以直接：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uses
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Services
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这对于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relationship Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-hop Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dependency Analysis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Architecture Analysis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>非常有效。&lt;/p>
&lt;hr>
&lt;h1 id="24-vector-rag-和-graph-rag-不是互斥的">24. Vector RAG 和 Graph RAG 不是互斥的&lt;/h1>
&lt;p>高级系统通常不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┼──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector BM25 Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Search Search Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────────┼──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这才是真正意义上的：&lt;/p>
&lt;blockquote>
&lt;p>Multi-Retriever Architecture。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="25-metadata-filtering">25. Metadata Filtering&lt;/h1>
&lt;p>企业 RAG 还有一个非常重要的问题：&lt;/p>
&lt;blockquote>
&lt;p>不是所有用户都有权限访问所有知识。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── department = HR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── department = Finance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── department = Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── department = Security
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">department = Engineering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么 Retrieval 应该首先限制：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">department = Engineering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>再进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authorization Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve unauthorized documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>后者存在严重的数据泄露风险。&lt;/p>
&lt;hr>
&lt;h1 id="26-temporal-retrieval">26. Temporal Retrieval&lt;/h1>
&lt;p>企业知识库还存在：&lt;/p>
&lt;blockquote>
&lt;p>Version Problem&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">API Documentation v1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API Documentation v2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API Documentation v3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户问：&lt;/p>
&lt;blockquote>
&lt;p>What is the current timeout configuration?&lt;/p>
&lt;/blockquote>
&lt;p>如果 Retrieval 同时找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">v2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">v3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LLM 可能把旧版本和新版本混在一起。&lt;/p>
&lt;p>所以 Metadata 应该包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">effective_from
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">effective_to
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Current Version Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>Temporal-Aware Retrieval。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="27-advanced-rag-的完整架构">27. Advanced RAG 的完整架构&lt;/h1>
&lt;p>把前面的技术组合起来，可以形成一个生产级 Advanced RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Classification
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┼──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Rewrite Decomposition HyDE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────────┼──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Multi-Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────────┼───────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Dense Search BM25 Search Graph Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────────┼───────────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion / RRF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Set
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Parent Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Assembly
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer Validation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Final Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这已经远远超过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector DB + LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="28-advanced-rag-的关键不是组件而是-pipeline-design">28. Advanced RAG 的关键不是组件，而是 Pipeline Design&lt;/h1>
&lt;p>一个常见错误是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">我们增加 BM25。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">我们增加 Reranker。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">我们增加 Graph RAG。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">系统越来越复杂。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但效果却没有明显提高。&lt;/p>
&lt;p>原因是：&lt;/p>
&lt;blockquote>
&lt;p>Advanced RAG 不是组件堆砌。&lt;/p>
&lt;/blockquote>
&lt;p>真正应该考虑的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">What kind of question?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">What retrieval strategy?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How many candidates?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How to rank?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How much context?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Is evidence sufficient?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Should we retrieve again?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Can the answer be supported?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是说：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Advanced RAG 的核心是 Retrieval Control。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="29-query-router">29. Query Router&lt;/h1>
&lt;p>因此，一个高级 RAG 系统通常需要 Query Router。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┼──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Simple FAQ Keyword Complex Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Search BM25 Multi-Hop RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────────┼──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;How do I reset my password?&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>直接 FAQ Retrieval。&lt;/p>
&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Which services depend on Redis and
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">what happens if Redis becomes unavailable?&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>则进入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Graph + Vector + Multi-Hop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这比所有 Query 都走同一条 Pipeline 更高效。&lt;/p>
&lt;hr>
&lt;h1 id="30-rag-evaluationadvanced-rag-的核心基础设施">30. RAG Evaluation：Advanced RAG 的核心基础设施&lt;/h1>
&lt;p>如果没有 Evaluation：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RAG Pipeline
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>很容易变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Engineering Guess
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>成熟系统应该至少分成三层 Evaluation。&lt;/p>
&lt;hr>
&lt;h2 id="301-retrieval-evaluation">30.1 Retrieval Evaluation&lt;/h2>
&lt;p>衡量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hit Rate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心问题：&lt;/p>
&lt;blockquote>
&lt;p>正确知识有没有被找回来？&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="302-context-evaluation">30.2 Context Evaluation&lt;/h2>
&lt;p>即使 Retrieval 正确，也要判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Relevance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Completeness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心问题：&lt;/p>
&lt;blockquote>
&lt;p>找回来的内容是否足够支持回答？&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="303-generation-evaluation">30.3 Generation Evaluation&lt;/h2>
&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Answer Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Faithfulness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Groundedness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Citation Correctness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心问题：&lt;/p>
&lt;blockquote>
&lt;p>LLM 是否基于证据正确回答？&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="31-rag-evaluation-应该形成一条完整链路">31. RAG Evaluation 应该形成一条完整链路&lt;/h1>
&lt;p>不要只测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而应该：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Relevance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Completeness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Noise
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Faithfulness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Citation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样才能定位：&lt;/p>
&lt;blockquote>
&lt;p>到底是 Retrieval 错了，还是 Generation 错了。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="32-observabilityrag-也需要-distributed-tracing">32. Observability：RAG 也需要 Distributed Tracing&lt;/h1>
&lt;p>Advanced RAG 系统越来越像一个分布式系统。&lt;/p>
&lt;p>一次请求可能经过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">API
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector DB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph DB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此非常适合建立完整 Trace：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">trace_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── query_rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── vector_search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── bm25_search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── graph_search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── llm_generation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每一个 Span 记录：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">token_usage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">top_k
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">scores
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">document_ids
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">retrieval_strategy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样当用户说：&lt;/p>
&lt;blockquote>
&lt;p>“为什么这个回答错了？”&lt;/p>
&lt;/blockquote>
&lt;p>工程师可以真正追踪：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieved Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>RAG Observability。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="33-advanced-rag-的成本模型">33. Advanced RAG 的成本模型&lt;/h1>
&lt;p>RAG 不只是 Accuracy 问题。&lt;/p>
&lt;p>还需要考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Throughput
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scalability
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dense Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果每一个 Query 都走完整 Pipeline：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以生产系统通常应该：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>根据 Query Complexity 动态选择 Pipeline。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Simple Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Complex Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-Hop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="34-从-advanced-rag-到-agentic-rag">34. 从 Advanced RAG 到 Agentic RAG&lt;/h1>
&lt;p>Advanced RAG 仍然主要是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Pipeline
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而 Agentic RAG 更进一步：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Goal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Reason
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Search Again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Call Tool
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Validate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Search Again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>区别可以简单理解为：&lt;/p>
&lt;h3 id="traditional-rag">Traditional RAG&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="advanced-rag">Advanced RAG&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Transform
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compress
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="agentic-rag">Agentic RAG&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Goal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Plan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reason
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Evaluate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve Again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tool Call
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Verify
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这代表 RAG 从：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Pipeline&lt;/p>
&lt;/blockquote>
&lt;p>逐渐演化成：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Knowledge-Seeking Agent。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="35-advanced-rag-技术栈可以如何分层">35. Advanced RAG 技术栈可以如何分层？&lt;/h1>
&lt;p>可以把整个技术体系划分成六层。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">┌──────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Generation Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ LLM / Citation │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├──────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Context Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Compression / Assembly │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├──────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Ranking Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Reranker / Fusion │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├──────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Retrieval Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Vector / BM25 / Graph │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├──────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Query Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Rewrite / HyDE / Decompose │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├──────────────────────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Knowledge Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Chunking / Metadata / Index │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└──────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样看，RAG 就不再是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector DB + LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是一整套：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Knowledge Retrieval Architecture&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="36-advanced-rag-的核心设计原则">36. Advanced RAG 的核心设计原则&lt;/h1>
&lt;p>最终可以总结出几个非常重要的工程原则。&lt;/p>
&lt;h2 id="原则一不要迷信-vector-search">原则一：不要迷信 Vector Search&lt;/h2>
&lt;p>Vector Search 只是 Retriever 之一。&lt;/p>
&lt;p>应该根据 Query 类型组合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dense
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sparse
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="原则二不要把-top-k-当作-retrieval-的终点">原则二：不要把 Top-K 当作 Retrieval 的终点&lt;/h2>
&lt;p>真正的 Pipeline 应该是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fuse
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compress
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Assemble
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="原则三retrieval-granularity-和-generation-granularity-可以不同">原则三：Retrieval Granularity 和 Generation Granularity 可以不同&lt;/h2>
&lt;p>这是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Parent-Child Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最核心的思想。&lt;/p>
&lt;hr>
&lt;h2 id="原则四复杂-query-应该分解">原则四：复杂 Query 应该分解&lt;/h2>
&lt;p>不要强迫一个 Retriever 解决：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A + B + C + D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q1 + Q2 + Q3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Merge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="原则五retrieval-结果应该被验证">原则五：Retrieval 结果应该被验证&lt;/h2>
&lt;p>不要假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever = Always Correct
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>应该增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Evaluator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Critic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Corrective Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="原则六rag-必须可观测">原则六：RAG 必须可观测&lt;/h2>
&lt;p>如果不知道：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">What was retrieved?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Why was it retrieved?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">What was the score?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">What context reached LLM?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么生产环境很难真正维护 RAG。&lt;/p>
&lt;hr>
&lt;h1 id="37-一个成熟的-advanced-rag-blueprint">37. 一个成熟的 Advanced RAG Blueprint&lt;/h1>
&lt;p>如果让我设计一个企业级 RAG 平台，我会优先考虑如下架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> User
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> API / Gateway
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────┴─────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Simple Query Complex Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Basic Retrieval Query Planner
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────┼───────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Rewrite Decompose HyDE
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────┼───────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────────┼──────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector BM25 Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────────────┼──────────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Parent Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Assembly
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer Validator
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────┴───────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Pass Fail
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer Retrieve Again
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>外围再增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Evaluation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Observability
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Security
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authorization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Caching
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost Control
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这才是真正可以进入生产环境的 RAG Architecture。&lt;/p>
&lt;hr>
&lt;h1 id="38-conclusionadvanced-rag-的本质">38. Conclusion：Advanced RAG 的本质&lt;/h1>
&lt;p>如果用一句话定义 Advanced RAG：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Advanced RAG 是通过 Query Understanding、多路 Retrieval、Ranking、Context Engineering、Validation 和 Feedback Loop，将一次简单的向量搜索升级为一个可控制、可评估、可优化的知识检索系统。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Naive RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Advanced RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Understand
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Transform
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Decompose
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compress
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Assembly
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Validate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而进一步的 Agentic RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Goal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Plan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reason
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Evaluate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve Again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tool
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Verify
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此，真正值得研究的 RAG 已经不再是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>How do I connect an LLM to a Vector Database?&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>How do I build a reliable knowledge retrieval and reasoning system around an LLM?&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这也是 Advanced RAG 与普通 RAG 最大的区别。&lt;/p>
&lt;p>从架构演进的角度看，可以把整个路线总结为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Naive RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking Optimization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Transformation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-Hop Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Corrective / Self RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agentic RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终，RAG 的竞争力并不只是来自一个更强的 LLM，而越来越来自：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Better Knowledge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Better Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Better Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Better Reasoning
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Better Evaluation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Better Observability
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而这也意味着，对于希望从传统后端/全栈工程师向 &lt;strong>AI Full-Stack / AI Engineer / AI Architect&lt;/strong> 转型的开发者来说，真正值得掌握的并不是某一个 RAG Framework 的 API，而是背后的这套 &lt;strong>Retrieval Architecture 思维&lt;/strong>。&lt;/p></description></item><item><title>Chunking：RAG 系统中最容易被低估的核心技术</title><link>https://wzhai-hub.github.io/Tony/ai/rag/chunking/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/chunking/</guid><description>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>在 Retrieval-Augmented Generation（RAG）系统中，很多工程团队会把主要精力放在 Vector Database、Embedding Model、LLM 和 Retrieval Algorithm 上，却忽略了一个看似简单、实际上决定整个系统上限的问题：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>如何把一份长文档切成适合检索的 Chunk？&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Chunking 并不是简单地把文本按照固定字符数切成若干段。&lt;/p>
&lt;p>一个好的 Chunk 应该同时满足：&lt;/p>
&lt;ul>
&lt;li>语义完整；&lt;/li>
&lt;li>检索粒度合理；&lt;/li>
&lt;li>Embedding 后具有良好的语义表达能力；&lt;/li>
&lt;li>能够独立回答或者支持回答一个问题；&lt;/li>
&lt;li>不产生过多冗余；&lt;/li>
&lt;li>不破坏原始文档结构；&lt;/li>
&lt;li>能够携带足够的上下文；&lt;/li>
&lt;li>能够被准确地召回。&lt;/li>
&lt;/ul>
&lt;p>因此，从 RAG Pipeline 的角度来看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parsing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Chunking 位于 &lt;strong>Document Processing 和 Retrieval 之间的关键边界&lt;/strong>。&lt;/p>
&lt;p>如果 Chunking 做错了，后面的 Embedding、Vector Database、Reranking 甚至 LLM 都很难完全弥补。&lt;/p>
&lt;p>可以把它概括为：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Chunking 决定了 RAG 系统“以什么粒度理解知识”。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="1-为什么-chunking-如此重要">1. 为什么 Chunking 如此重要？&lt;/h1>
&lt;p>假设我们有一份 200 页的企业技术文档。&lt;/p>
&lt;p>用户提出：&lt;/p>
&lt;blockquote>
&lt;p>How do I configure Redis Cluster failover?&lt;/p>
&lt;/blockquote>
&lt;p>如果直接把整个文档作为一个向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document → Embedding → Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么这个向量实际上表达的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Deployment
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Security
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Monitoring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Backup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Performance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它包含大量不同主题。&lt;/p>
&lt;p>用户查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster failover configuration
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但整个 Document 的 embedding 是一个非常粗粒度的语义表示。&lt;/p>
&lt;p>这会导致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>只能回答：&lt;/p>
&lt;blockquote>
&lt;p>这篇文档大概和 Redis Cluster 有关。&lt;/p>
&lt;/blockquote>
&lt;p>而不是：&lt;/p>
&lt;blockquote>
&lt;p>这篇文档中具体哪一段描述了 failover configuration？&lt;/p>
&lt;/blockquote>
&lt;p>因此我们需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── Introduction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── Architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── Redis Cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── Node Configuration
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ ├── Replication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ └── Recovery
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── Security
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── Monitoring
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进一步切成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk N
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>于是 Retrieval 的目标从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Find the relevant document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Find the relevant knowledge unit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这实际上是 RAG 最重要的一次粒度变化。&lt;/p>
&lt;hr>
&lt;h1 id="2-chunking-的本质知识粒度设计">2. Chunking 的本质：知识粒度设计&lt;/h1>
&lt;p>从更抽象的角度来看，Chunking 本质上是在解决：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Knowledge Granularity Problem&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>假设一个文档：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">D = {p1, p2, p3, ..., pn}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>我们需要将它划分成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">C = {c1, c2, c3, ..., cm}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中每个：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ci ⊂ D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理想情况下，每一个 Chunk 都应该尽可能满足：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Cohesion(ci) → high
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Noise(ci) → low
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以及：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval Utility(ci) → high
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>换句话说，一个 Chunk 不应该只是：&lt;/p>
&lt;blockquote>
&lt;p>长度合适。&lt;/p>
&lt;/blockquote>
&lt;p>而应该是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>一个具有独立语义价值的知识单元。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="3-chunking-的三个核心矛盾">3. Chunking 的三个核心矛盾&lt;/h1>
&lt;p>Chunking 最难的地方在于存在三个天然矛盾。&lt;/p>
&lt;h2 id="31-chunk-太大">3.1 Chunk 太大&lt;/h2>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size = 4000 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优点：&lt;/p>
&lt;ul>
&lt;li>上下文完整；&lt;/li>
&lt;li>不容易丢失信息；&lt;/li>
&lt;li>适合复杂问题。&lt;/li>
&lt;/ul>
&lt;p>缺点：&lt;/p>
&lt;ul>
&lt;li>Embedding 语义被稀释；&lt;/li>
&lt;li>无关内容增多；&lt;/li>
&lt;li>Retrieval Precision 下降；&lt;/li>
&lt;li>LLM Context 消耗增加。&lt;/li>
&lt;/ul>
&lt;p>例如一个 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster Architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Security
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Backup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Monitoring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Performance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户只问：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How does Redis failover work?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个 Chunk 包含大量无关信息。&lt;/p>
&lt;hr>
&lt;h2 id="32-chunk-太小">3.2 Chunk 太小&lt;/h2>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size = 100 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能产生：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster consists of...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Each master node...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A replica is promoted...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The promotion process...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>虽然每个 Chunk 都很精确，但是语义可能不完整。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A replica is promoted...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果不知道前面的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Under master node failure...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么这句话本身的语义是不完整的。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Small Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ High Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Low Context Completeness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="33-chunk-太多">3.3 Chunk 太多&lt;/h2>
&lt;p>如果 Chunk 很小：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1 Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ 1000 Chunks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么 Retrieval Search Space 会迅速扩大。&lt;/p>
&lt;p>这可能造成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">More Candidates
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">More Similar Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">More Redundancy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Lower Context Diversity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终 LLM 收到的 Top-K 结果可能是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 11
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 12
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 13
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它们实际上都来自同一个段落。&lt;/p>
&lt;p>这就是典型的：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Retrieval Redundancy&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="4-fixed-size-chunking">4. Fixed-Size Chunking&lt;/h1>
&lt;p>最简单的 Chunking 方法是固定长度切分。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">chunk_size = 500 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>算法：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">chunk&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">chunk_size&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chunks&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="nb">range&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">chunk_size&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">chunks&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="n">chunk_size&lt;/span>&lt;span class="p">])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">chunks&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>实际上生产环境中通常还会增加 overlap。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">chunk_size = 500
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">overlap = 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0 ───────────── 500
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">400 ───────────── 900
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">800 ───────────── 1300
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以避免句子或语义在 Chunk 边界处被完全切断。&lt;/p>
&lt;hr>
&lt;h1 id="5-overlap-为什么重要">5. Overlap 为什么重要？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster uses a master-replica architecture.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When the master node fails, Sentinel detects...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果恰好在这里切断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster uses a master-replica architecture.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When the master node fails...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentinel detects the failure and promotes...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>缺失：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">What failure?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过 overlap：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When the master node fails,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentinel detects...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When the master node fails,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentinel detects the failure and promotes...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Chunk 2 的语义完整性明显提高。&lt;/p>
&lt;hr>
&lt;h1 id="6-overlap-不是越大越好">6. Overlap 不是越大越好&lt;/h1>
&lt;p>很多初学者会认为：&lt;/p>
&lt;blockquote>
&lt;p>overlap 越大，信息丢失越少。&lt;/p>
&lt;/blockquote>
&lt;p>实际上不是。&lt;/p>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">chunk_size = 500
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">overlap = 400
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1: 0 - 500
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2: 100 - 600
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3: 200 - 700
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 4: 300 - 800
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>大量文本被重复 embedding。&lt;/p>
&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Storage ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Cost ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Redundancy ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Size ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而实际获得的 recall improvement 可能非常有限。&lt;/p>
&lt;p>因此 Overlap 的目标不是：&lt;/p>
&lt;blockquote>
&lt;p>最大化重叠。&lt;/p>
&lt;/blockquote>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>降低 Chunk Boundary Information Loss。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="7-recursive-chunking">7. Recursive Chunking&lt;/h1>
&lt;p>比 Fixed-Size 更好的方法是：&lt;/p>
&lt;blockquote>
&lt;p>Recursive Chunking&lt;/p>
&lt;/blockquote>
&lt;p>核心思想是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentence
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Phrase
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Token
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优先按照更高层次的语义边界切分。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1. Introduction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph 6
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>系统可以优先尝试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Section
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Paragraph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Sentence
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Token
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>只有当上一层粒度超过目标 Chunk Size 时，才继续向下一层切分。&lt;/p>
&lt;p>这种策略比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">every 500 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更符合自然语言结构。&lt;/p>
&lt;hr>
&lt;h1 id="8-semantic-chunking">8. Semantic Chunking&lt;/h1>
&lt;p>进一步的思路是：&lt;/p>
&lt;blockquote>
&lt;p>不按照长度切，而按照语义变化切。&lt;/p>
&lt;/blockquote>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Sentence 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster contains multiple nodes.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentence 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Each master node can have replicas.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentence 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replicas provide redundancy.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentence 4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prometheus can monitor Redis metrics.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentence 5:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Grafana provides visualization.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>前 3 句话属于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Architecture
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>后 2 句话属于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Monitoring
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster contains multiple nodes.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Each master node can have replicas.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replicas provide redundancy.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prometheus can monitor Redis metrics.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Grafana provides visualization.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里的核心不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="9-semantic-chunking-的基本算法">9. Semantic Chunking 的基本算法&lt;/h1>
&lt;p>可以把每个 Sentence 转换成 embedding：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">S1 → E1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">S2 → E2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">S3 → E3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">S4 → E4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">S5 → E5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>计算相邻句子的 cosine similarity：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sim(E1, E2)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sim(E2, E3)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sim(E3, E4)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sim(E4, E5)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">0.91
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.89
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.32
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.93
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">S1 ─ S2 ─ S3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ semantic boundary
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">S4 ─ S5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1 = S1 + S2 + S3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2 = S4 + S5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方法可以自动发现 Topic Boundary。&lt;/p>
&lt;hr>
&lt;h1 id="10-structure-aware-chunking">10. Structure-Aware Chunking&lt;/h1>
&lt;p>对于企业文档、技术文档、PDF、Markdown、HTML，单纯 Semantic Chunking 仍然不够。&lt;/p>
&lt;p>因为文档本身包含大量结构信息：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Title
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Heading
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Subheading
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Paragraph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">List
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Table
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Quote
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Figure
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Caption
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些结构实际上也是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Metadata&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-markdown" data-lang="markdown">&lt;span class="line">&lt;span class="cl">&lt;span class="gu">## Redis Cluster
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">### Failover
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="gu">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When a master node fails...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果只保存：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">When a master node fails...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么 embedding 之后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How does Redis Cluster failover work?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能无法很好地理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">When a master node fails...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>真正有价值的信息是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ When a master node fails...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此可以构建：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Text =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Title
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section Title
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Subsection Title
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Content
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document: Redis Architecture Guide
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section: Redis Cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Subsection: Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Content:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When a master node fails, a replica can be promoted...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这比单独 embedding：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">When a master node fails...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>具有更好的语义定位能力。&lt;/p>
&lt;hr>
&lt;h1 id="11-parent-child-chunking">11. Parent-Child Chunking&lt;/h1>
&lt;p>这是生产级 RAG 中非常重要的一种方法。&lt;/p>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Parent Chunk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>保存完整上下文：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Child 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Child 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Child 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Child 4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>检索时：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Child Chunk Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Find relevant child
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Load Parent Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Child Chunk:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When a master fails, the replica with the highest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replication offset can be promoted.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个 Child 非常适合 Retrieval。&lt;/p>
&lt;p>但是 LLM 最终获得：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Parent Chunk:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis uses replicas to provide high availability.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When a master fails, the replica with the highest
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">replication offset can be promoted.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The cluster then redirects traffic...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>于是同时获得：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">High Retrieval Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">High Context Completeness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这实际上解决了：&lt;/p>
&lt;blockquote>
&lt;p>Search Granularity 与 Generation Context 之间的矛盾。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="12-document-hierarchy-chunking">12. Document Hierarchy Chunking&lt;/h1>
&lt;p>对于大型知识库，可以进一步构建层次结构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Section
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ ├── Subsection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ ├── Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ ├── Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ └── Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ └── Subsection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Section
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样 Retrieval 不再只是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector → Chunk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Subsection Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这实际上已经开始接近：&lt;/p>
&lt;blockquote>
&lt;p>Hierarchical Retrieval&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="13-chunk-metadata">13. Chunk Metadata&lt;/h1>
&lt;p>Chunk 不应该只有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>生产系统应该尽可能保留丰富 Metadata：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;document_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;redis-guide-001&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;section&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Redis Cluster&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;subsection&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Failover&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;chunk_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;chunk-042&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;parent_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;section-07&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;page&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">42&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;redis-cluster-guide.pdf&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;language&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;en&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;v3&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;created_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-08-18&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些 Metadata 可以参与：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authorization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Debugging
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Observability
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Citation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version Control
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">document_type = architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version = v3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">department = engineering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后再进行 Vector Search。&lt;/p>
&lt;p>这通常比单纯依赖 embedding 更可靠。&lt;/p>
&lt;hr>
&lt;h1 id="14-chunking-与-embedding-的关系">14. Chunking 与 Embedding 的关系&lt;/h1>
&lt;p>一个经常被忽略的问题：&lt;/p>
&lt;blockquote>
&lt;p>Chunk Size 应该和 Embedding Model 配合设计。&lt;/p>
&lt;/blockquote>
&lt;p>假设 Embedding Model 的输入窗口非常大，并不意味着：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Larger Chunk = Better Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 的目标是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果一个 Chunk 同时包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Security
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Networking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Monitoring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Deployment
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么最终 Vector 很可能成为这些 Topic 的混合表示。&lt;/p>
&lt;p>可以粗略理解为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">≈
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Topic A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Topic B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Topic C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Topic D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>于是 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Database indexing
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能无法很好地和这个 Chunk 对齐。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Embedding Context Window 是 Chunk Size 的上限，而不是 Chunk Size 的目标。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="15-chunking-与-retrieval-的关系">15. Chunking 与 Retrieval 的关系&lt;/h1>
&lt;p>Chunking 最终必须通过 Retrieval 来验证。&lt;/p>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-K = 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理想情况：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk A ★★★
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk B ★★★
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk C ★★
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Chunk D ★
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Chunk E ★
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但如果 Chunk 太大：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk A:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">很多主题混合
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Similarity 可能不够集中。&lt;/p>
&lt;p>如果 Chunk 太小：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能全部来自同一个语义片段。&lt;/p>
&lt;p>于是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Diversity ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Chunking 实际上会直接影响：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Relevance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer Faithfulness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="16-chunking-与-reranking">16. Chunking 与 Reranking&lt;/h1>
&lt;p>很多团队发现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>效果不好，于是增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 确实可以改善 Retrieval。&lt;/p>
&lt;p>但是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Reranking 不能完全解决错误 Chunking。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>假设正确答案被错误地切成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk A:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">When Redis master fails...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk B:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">The replica with highest replication offset...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk C:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is promoted to master...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>三个 Chunk 分别只有一句。&lt;/p>
&lt;p>Reranker 即使发现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A + B + C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>相关，也需要把多个 Chunk 拼起来。&lt;/p>
&lt;p>这会增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Length
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redundancy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Good Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Good Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Good Reranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>才是完整方案。&lt;/p>
&lt;hr>
&lt;h1 id="17-query-aware-chunking">17. Query-Aware Chunking&lt;/h1>
&lt;p>更加高级的思路是：&lt;/p>
&lt;blockquote>
&lt;p>Chunking 不一定应该完全独立于 Query。&lt;/p>
&lt;/blockquote>
&lt;p>传统方式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query-Aware Retrieval 则可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fine-grained Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Understand Intent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Merge related chunks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如用户问：&lt;/p>
&lt;blockquote>
&lt;p>What happens when Redis master fails and how does the cluster recover?&lt;/p>
&lt;/blockquote>
&lt;p>这个问题实际上包含两个 sub-topics：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1. Failure Detection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Recovery / Promotion
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>系统可以将 Query 分解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How is master failure detected?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How is a replica promoted?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q1 → Chunk A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q2 → Chunk B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A + B → LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这比单纯：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding(Query) → Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更加适合复杂问题。&lt;/p>
&lt;hr>
&lt;h1 id="18-code-chunking">18. Code Chunking&lt;/h1>
&lt;p>对于代码知识库，普通文本 Chunking 往往效果很差。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kd">class&lt;/span> &lt;span class="nc">RedisService&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kt">void&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">save&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="kd">public&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nf">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">key&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果简单按照 500 tokens 切：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">public class RedisService {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> public void save(...)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">public String get(...)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么代码结构被破坏。&lt;/p>
&lt;p>更合理的方法是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Repository
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Package
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Class
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ ├── Method
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ ├── Method
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ └── Method
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Test
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Class = RedisService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Method = save
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">public void save(String key, String value) {
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Metadata：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;language&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;java&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;class&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;RedisService&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;method&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;save&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;package&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;com.example.redis&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这比普通文本 Chunking 更适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Code Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Code RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Repository QA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bug Analysis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="19-table-chunking">19. Table Chunking&lt;/h1>
&lt;p>表格是 RAG 中另一个非常容易出问题的场景。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Region&lt;/th>
&lt;th style="text-align:right">Q1 Revenue&lt;/th>
&lt;th style="text-align:right">Q2 Revenue&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>US&lt;/td>
&lt;td style="text-align:right">100&lt;/td>
&lt;td style="text-align:right">120&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>EU&lt;/td>
&lt;td style="text-align:right">80&lt;/td>
&lt;td style="text-align:right">95&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>APAC&lt;/td>
&lt;td style="text-align:right">60&lt;/td>
&lt;td style="text-align:right">90&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>如果 PDF Parser 把它变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">US 100 120
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">EU 80 95
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">APAC 60 90
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">What was APAC revenue in Q2?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能仍然可以检索。&lt;/p>
&lt;p>但如果问题是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Compare APAC revenue growth between Q1 and Q2.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>就需要保留：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Column Headers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Row
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Table Title
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此更合理的 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Table:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Regional Revenue
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Columns:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Region | Q1 Revenue | Q2 Revenue
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Row:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">APAC | 60 | 90
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>甚至可以进一步转换成结构化文本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Regional Revenue.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">APAC revenue was 60 in Q1 and 90 in Q2.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于复杂表格，结构化处理通常优于简单文本切分。&lt;/p>
&lt;hr>
&lt;h1 id="20-chunking-pipeline">20. Chunking Pipeline&lt;/h1>
&lt;p>一个成熟的企业 RAG Pipeline 可以设计为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Document Parser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Structure Analysis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌────────┴────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Markdown PDF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────┬────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Semantic Units
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Structure-Aware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Parent / Child Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Metadata Enrich
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个 Pipeline 比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">split every N characters
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>成熟得多。&lt;/p>
&lt;hr>
&lt;h1 id="21-如何选择-chunk-size">21. 如何选择 Chunk Size？&lt;/h1>
&lt;p>没有一个适用于所有场景的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Best Chunk Size
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是一个非常重要的工程认知。&lt;/p>
&lt;p>Chunk Size 应该由以下因素共同决定：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Type
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Type
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Strategy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Context Window
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer Complexity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个可以用于实验的起始范围：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>场景&lt;/th>
&lt;th style="text-align:right">Chunk Size&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FAQ&lt;/td>
&lt;td style="text-align:right">100–300 tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Technical Documentation&lt;/td>
&lt;td style="text-align:right">300–800 tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>General Articles&lt;/td>
&lt;td style="text-align:right">300–700 tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legal Documents&lt;/td>
&lt;td style="text-align:right">500–1000 tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Academic Papers&lt;/td>
&lt;td style="text-align:right">500–1200 tokens&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Code&lt;/td>
&lt;td style="text-align:right">Function/Class based&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tables&lt;/td>
&lt;td style="text-align:right">Structure based&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>这些不是固定标准，而应该作为：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Experimental Starting Point&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="22-chunk-size-应该通过实验决定">22. Chunk Size 应该通过实验决定&lt;/h1>
&lt;p>不要问：&lt;/p>
&lt;blockquote>
&lt;p>Chunk Size 应该设置成 500 还是 1000？&lt;/p>
&lt;/blockquote>
&lt;p>更专业的问题应该是：&lt;/p>
&lt;blockquote>
&lt;p>在我的 Query Distribution 下，哪个 Chunk Size 能获得最好的 Retrieval Quality？&lt;/p>
&lt;/blockquote>
&lt;p>例如建立实验：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">200
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">400
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">600
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">800
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>分别测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall@10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Faithfulness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如实验结果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">200 → Recall 82%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">400 → Recall 89%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">600 → Recall 93%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">800 → Recall 92%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1000 → Recall 88%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">600
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能是更合理的选择。&lt;/p>
&lt;hr>
&lt;h1 id="23-chunking-evaluation">23. Chunking Evaluation&lt;/h1>
&lt;p>Chunking 不能只通过：&lt;/p>
&lt;blockquote>
&lt;p>看起来切得挺好。&lt;/p>
&lt;/blockquote>
&lt;p>来判断。&lt;/p>
&lt;p>应该建立 Evaluation Dataset：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ground Truth Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Expected Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;question&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;How does Redis failover work?&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;relevant_chunks&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;redis-failover-042&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compare Ground Truth
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>计算：&lt;/p>
&lt;h3 id="recallk">Recall@K&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Chunks Retrieved
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Total Relevant Chunks
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="precisionk">Precision@K&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Precision@K =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Chunks Retrieved
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">-------------------------
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="mrr">MRR&lt;/h3>
&lt;p>如果正确 Chunk 排名越靠前：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">MRR ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这意味着：&lt;/p>
&lt;blockquote>
&lt;p>Chunking 不再是一个“经验参数”，而成为可以通过数据优化的系统参数。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="24-chunking-的一个更深层理解">24. Chunking 的一个更深层理解&lt;/h1>
&lt;p>如果从 Information Retrieval 的角度来看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是一个非常大的 Information Unit。&lt;/p>
&lt;p>Chunking 做的实际上是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Information Units
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Units
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Chunk 并不是：&lt;/p>
&lt;blockquote>
&lt;p>Document 的一小段。&lt;/p>
&lt;/blockquote>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Searchable Knowledge Unit&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这是理解 Chunking 最关键的一点。&lt;/p>
&lt;hr>
&lt;h1 id="25-chunking-的最终目标">25. Chunking 的最终目标&lt;/h1>
&lt;p>优秀的 Chunking Strategy 应该让：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Knowledge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Correct Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>形成一条稳定的信息链。&lt;/p>
&lt;p>而糟糕的 Chunking 往往形成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Wrong Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">More Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hallucination
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以很多所谓：&lt;/p>
&lt;blockquote>
&lt;p>“RAG 效果不好”&lt;/p>
&lt;/blockquote>
&lt;p>实际上并不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM 不够强
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Database 不够好
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而可能是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunking Strategy 不合理
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="26-推荐的企业级-chunking-architecture">26. 推荐的企业级 Chunking Architecture&lt;/h1>
&lt;p>如果设计一个生产级 RAG 系统，我更推荐：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Document Parser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Structure Extraction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────┴───────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Text Structure Tables / Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Semantic / Recursive Specialized Parser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Chunking │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────┬───────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Parent / Child
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Metadata Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Builder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里最重要的思想是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>不同类型的数据，不应该使用同一种 Chunking Strategy。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="27-chunking-strategy-decision-matrix">27. Chunking Strategy Decision Matrix&lt;/h1>
&lt;p>可以建立如下决策模型：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────┼──────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> FAQ Article Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Small Semantic Function
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Chunk Chunking Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────┼──────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Enterprise RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进一步：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>文档类型&lt;/th>
&lt;th>推荐策略&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>FAQ&lt;/td>
&lt;td>Question-Answer Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Markdown&lt;/td>
&lt;td>Heading-Aware Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>HTML&lt;/td>
&lt;td>DOM-Aware Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PDF&lt;/td>
&lt;td>Layout + Semantic Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Technical Docs&lt;/td>
&lt;td>Hierarchical Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Code&lt;/td>
&lt;td>AST / Function Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tables&lt;/td>
&lt;td>Table-Aware Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Legal&lt;/td>
&lt;td>Section / Clause Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Email&lt;/td>
&lt;td>Thread / Message Chunk&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Logs&lt;/td>
&lt;td>Time-window / Event Chunk&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>这说明：&lt;/p>
&lt;blockquote>
&lt;p>Chunking 应该是 Data-Type Aware 的。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="28-从-chunking-走向-context-engineering">28. 从 Chunking 走向 Context Engineering&lt;/h1>
&lt;p>Chunking 最终会自然演化成：&lt;/p>
&lt;blockquote>
&lt;p>Context Engineering&lt;/p>
&lt;/blockquote>
&lt;p>因为真正的问题不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How to split documents?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How to construct the optimal context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">for an LLM?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会进一步涉及：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Expansion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Conversation Context
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终形成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Assembly
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Chunking 是 Context Engineering 的基础设施。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="29-最值得记住的几个结论">29. 最值得记住的几个结论&lt;/h1>
&lt;p>如果只记住这篇文章的几个核心观点，可以总结为：&lt;/p>
&lt;h3 id="第一">第一&lt;/h3>
&lt;blockquote>
&lt;p>Chunking 不是文本切割问题，而是知识粒度设计问题。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第二">第二&lt;/h3>
&lt;blockquote>
&lt;p>Chunk Size 没有 universally optimal value，必须通过 Retrieval Evaluation 确定。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第三">第三&lt;/h3>
&lt;blockquote>
&lt;p>Chunk 应该优先保持 Semantic Cohesion，而不是机械追求固定长度。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第四">第四&lt;/h3>
&lt;blockquote>
&lt;p>Overlap 的目标是减少 Boundary Information Loss，而不是越大越好。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第五">第五&lt;/h3>
&lt;blockquote>
&lt;p>Structure-aware Chunking 通常优于纯 Fixed-size Chunking。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第六">第六&lt;/h3>
&lt;blockquote>
&lt;p>Parent-Child Chunking 可以同时解决 Retrieval Precision 和 Context Completeness。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第七">第七&lt;/h3>
&lt;blockquote>
&lt;p>Code、Table、PDF、Legal Document 等不同数据类型应该使用不同 Chunking Strategy。&lt;/p>
&lt;/blockquote>
&lt;h3 id="第八">第八&lt;/h3>
&lt;blockquote>
&lt;p>Chunking 的质量最终应该通过 Recall、Precision、MRR、NDCG 和 End-to-End Answer Quality 来验证。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="30-conclusion">30. Conclusion&lt;/h1>
&lt;p>在 RAG 系统中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding 决定如何表示知识
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database 决定如何存储知识
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever 决定如何寻找知识
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker 决定哪些知识更重要
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM 决定如何利用知识
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>决定的是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>系统究竟把什么东西定义为“知识”。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这是为什么 Chunking 看似简单，却是 RAG 系统中最值得深入研究的基础技术之一。&lt;/p>
&lt;p>一个成熟的 RAG 系统不应该简单地使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">text&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="mi">500&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后认为问题已经解决。&lt;/p>
&lt;p>真正生产级的 Chunking 应该逐渐演化为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Structure-Aware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic-Aware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata-Aware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query-Aware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Domain-Aware
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Evaluation-Driven
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终目标不是生成更多 Chunk，而是生成：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>更容易被检索、更容易被理解、更容易被正确利用的 Knowledge Units。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>从这个角度来看，Chunking 并不是 RAG Pipeline 中一个简单的 preprocessing step。&lt;/p>
&lt;p>它实际上是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Knowledge Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Unit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Construction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Reasoning
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的关键桥梁。&lt;/p>
&lt;p>而这也是为什么：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>RAG 的效果上限，很大程度上取决于你如何切分知识。&lt;/strong>&lt;/p>
&lt;/blockquote></description></item><item><title>Embedding 深度技术解析：从向量空间到 RAG 与 Agent 的语义基础设施</title><link>https://wzhai-hub.github.io/Tony/ai/rag/embedding/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/embedding/</guid><description>&lt;blockquote>
&lt;p>&lt;strong>摘要&lt;/strong>&lt;/p>
&lt;p>Embedding 是现代 AI 应用最容易被低估的一项基础技术。&lt;/p>
&lt;p>很多人对 Embedding 的理解停留在一句话：&lt;/p>
&lt;blockquote>
&lt;p>“Embedding 就是把文本转换成向量。”&lt;/p>
&lt;/blockquote>
&lt;p>这句话没有错，但远远不够。&lt;/p>
&lt;p>从工程角度看，Embedding 真正解决的问题是：&lt;/p>
&lt;p>&lt;strong>如何把原本无法直接进行数学比较的非结构化信息，映射到一个具有语义结构的向量空间，使系统能够通过距离、方向和邻近关系判断信息之间的语义关联。&lt;/strong>&lt;/p>
&lt;p>因此，Embedding 是 RAG、Semantic Search、推荐系统、知识库、Agent Memory、代码搜索、多模态检索以及向量数据库的基础设施。&lt;/p>
&lt;p>本文将从数学原理、模型训练、向量空间、相似度计算开始，一直到 Chunking、Retrieval、Reranking、Vector Database、RAG、Agent Memory 和生产系统设计，系统理解 Embedding。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="一embedding-到底是什么">一、Embedding 到底是什么？&lt;/h1>
&lt;p>假设我们有两句话：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A：Redis 是一种内存数据库。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B：Redis 是一种基于内存的数据存储系统。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>传统字符串比较可能认为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A != B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>甚至：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">String Similarity ≈ 很低
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是人类很容易理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A ≈ B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 的目标就是让机器也能理解这种关系。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[0.12, -0.34, 0.78, ..., 0.21]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>B：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[0.14, -0.31, 0.75, ..., 0.19]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两个向量在空间中比较接近。&lt;/p>
&lt;p>于是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Distance(A, B)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>较小。&lt;/p>
&lt;p>这意味着：&lt;/p>
&lt;blockquote>
&lt;p>Embedding 的本质不是“生成数字”，而是建立一个&lt;strong>可计算的语义空间&lt;/strong>。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="二为什么需要-embedding">二、为什么需要 Embedding？&lt;/h1>
&lt;p>计算机最擅长处理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Numbers
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Strings
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但自然语言是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Information
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Java 中如何实现线程安全？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>与：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Java 并发环境下如何保证共享数据的一致性？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>字符串完全不同。&lt;/p>
&lt;p>但语义高度相关。&lt;/p>
&lt;p>如果我们希望计算机：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到语义最相关的信息
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>就需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Natural Language
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>于是问题从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">字符串比较
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">向量距离计算
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是 Embedding 的核心价值。&lt;/p>
&lt;hr>
&lt;h1 id="三embedding-的数学本质">三、Embedding 的数学本质&lt;/h1>
&lt;p>可以把 Embedding Model 看成一个函数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">f(x) → v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">x = 原始输入
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">v = 向量
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">f(&amp;#34;Redis is an in-memory database&amp;#34;)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v ∈ R^1536
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>假设模型维度是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1536
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 0.123,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> -0.238,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 0.912,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 0.041
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以一个文本被映射到了：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">R^1536
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个空间叫：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Embedding Space / Vector Space&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="四向量维度到底意味着什么">四、向量维度到底意味着什么？&lt;/h1>
&lt;p>这是一个非常容易产生误解的问题。&lt;/p>
&lt;p>如果 Embedding 是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1536 dimensions
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并不意味着：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dimension 1 = Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dimension 2 = Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dimension 3 = Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常不是这样。&lt;/p>
&lt;p>每一个维度并不一定对应一个人类可以直接解释的概念。&lt;/p>
&lt;p>更合理的理解是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1536-dimensional latent semantic space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型通过训练学习：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Relationships
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">JVM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些信息最终形成某种高维空间中的结构。&lt;/p>
&lt;hr>
&lt;h1 id="五embedding-最重要的不是向量而是空间">五、Embedding 最重要的不是“向量”，而是“空间”&lt;/h1>
&lt;p>这是理解 Embedding 最关键的地方。&lt;/p>
&lt;p>如果只有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>没有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Meaningful Geometry
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么 Embedding 就没有价值。&lt;/p>
&lt;p>真正重要的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Spring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ●
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这不是实际的二维 Embedding，而只是概念图。&lt;/p>
&lt;p>真实空间可能是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">384D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">768D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1024D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1536D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3072D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>甚至更高。&lt;/p>
&lt;p>模型训练的目标之一，就是让：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在这个空间里表现为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Geometric Proximity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>语义相似 → 向量接近&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="六cosine-similarity">六、Cosine Similarity&lt;/h1>
&lt;p>Embedding 检索最常见的相似度之一是：&lt;/p>
&lt;blockquote>
&lt;p>Cosine Similarity&lt;/p>
&lt;/blockquote>
&lt;p>公式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">cos(θ) =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(A · B)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">────────
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">||A|| ||B||
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A · B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是向量点积。&lt;/p>
&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">||A||
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是向量长度。&lt;/p>
&lt;p>所以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>主要关注的是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>两个向量的方向是否相似。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="七为什么-cosine-similarity-很重要">七、为什么 Cosine Similarity 很重要？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A = [1, 2]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B = [2, 4]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>B 是 A 的两倍。&lt;/p>
&lt;p>欧氏距离：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">distance(A,B)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并不为 0。&lt;/p>
&lt;p>但它们方向完全一致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A →
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B ↗
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Cosine Similarity：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">≈ 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以 Cosine Similarity 很适合表示：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Direction
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="八euclidean-distance">八、Euclidean Distance&lt;/h1>
&lt;p>另外一种常见方式是欧氏距离：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">d(A,B)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sqrt(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Σ(Ai-Bi)^2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A ───────── B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>空间中的直线距离。&lt;/p>
&lt;p>Embedding 检索中常见：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Euclidean Distance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dot Product
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不同模型和向量数据库对距离函数的支持不同。&lt;/p>
&lt;p>因此选择 Embedding Model 时不能只看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">dimension
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还要确认：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">metric
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">normalization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">index
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="九dot-product">九、Dot Product&lt;/h1>
&lt;p>点积：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A · B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Σ AiBi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果两个向量方向相似，并且长度较大：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dot Product
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能更高。&lt;/p>
&lt;p>很多 Embedding 系统会对向量进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">L2 Normalization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">||A|| = 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种情况下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">≈
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dot Product
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此工程上经常可以看到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Inner Product
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>的选择。&lt;/p>
&lt;hr>
&lt;h1 id="十embedding-model-是怎么训练出来的">十、Embedding Model 是怎么训练出来的？&lt;/h1>
&lt;p>这是 Embedding 最值得深入理解的部分。&lt;/p>
&lt;p>一个 Embedding Model 并不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">文本
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">随机算法
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">向量
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是经过大量训练得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">文本
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Neural Network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Training Objective
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型需要学习：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">哪些文本应该接近？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">哪些文本应该远离？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="十一contrastive-learning">十一、Contrastive Learning&lt;/h1>
&lt;p>现代 Embedding 模型大量使用：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Contrastive Learning&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何实现 Redis 分布式锁？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Positive:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Distributed Lock Implementation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Negative:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PostgreSQL Index Optimization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型需要学习：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">distance(Query, Positive)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变小。&lt;/p>
&lt;p>同时：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">distance(Query, Negative)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变大。&lt;/p>
&lt;p>于是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Positive
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Negative
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>逐渐形成结构化的语义空间。&lt;/p>
&lt;hr>
&lt;h1 id="十二triplet-learning">十二、Triplet Learning&lt;/h1>
&lt;p>可以进一步抽象成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Anchor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Positive
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Negative
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Anchor:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java concurrency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Positive:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java thread synchronization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Negative:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">React component lifecycle
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>目标：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity(anchor, positive)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Similarity(anchor, negative)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常会增加一个 margin：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity(A,P)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Similarity(A,N) + margin
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是典型的 Triplet Learning 思路。&lt;/p>
&lt;hr>
&lt;h1 id="十三embedding-的训练目标">十三、Embedding 的训练目标&lt;/h1>
&lt;p>可以概括为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Learning Objective
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Geometry
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Useful Vector Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是说：&lt;/p>
&lt;blockquote>
&lt;p>Embedding Model 真正学习的是“如何组织语义空间”。&lt;/p>
&lt;/blockquote>
&lt;p>所以不同 Embedding Model 最大的区别之一不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">向量长度
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">它学到了什么样的语义空间。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="十四为什么不同-embedding-model-不能直接混用">十四、为什么不同 Embedding Model 不能直接混用？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Model A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Model B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后直接计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">CosineSimilarity(A_vector, B_vector)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常没有意义。&lt;/p>
&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Model A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>学习的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Space A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Model B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>学习的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Space B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即使都是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1536 dimensions
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也不意味着：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Space A == Space B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以生产系统必须保证：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Same Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是一个非常重要的工程原则。&lt;/p>
&lt;hr>
&lt;h1 id="十五embedding-dimension-越大越好吗">十五、Embedding Dimension 越大越好吗？&lt;/h1>
&lt;p>不一定。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">384
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">768
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1024
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1536
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3072
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>维度越高：&lt;/p>
&lt;p>优点：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Representation Capacity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但缺点：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Storage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1 million vectors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">×
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1536 dimensions
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">×
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4 bytes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>大约需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">6.1 GB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>仅仅是原始 float32 数据，还没有计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Overhead
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Embedding Dimension 是准确率与成本之间的工程权衡。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="十六embedding-的存储成本">十六、Embedding 的存储成本&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000,000 documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每个向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1536 dimensions
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>float32：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">4 bytes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000,000 × 1536 × 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">≈ 6.14 GB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10 million vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">≈ 61.4 GB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还没有考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HNSW Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replication
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以企业级 Vector Database 很快就会进入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory Optimization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Quantization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sharding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Optimization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="十七quantization">十七、Quantization&lt;/h1>
&lt;p>为了降低成本，可以进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">FP32
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FP16
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">INT8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Binary
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">FP32
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4 bytes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">INT8
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1 byte
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理论上存储降低：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">4x
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是会产生：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Precision Loss
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此需要通过 Evaluation 判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的平衡。&lt;/p>
&lt;hr>
&lt;h1 id="十八embedding-与-chunking">十八、Embedding 与 Chunking&lt;/h1>
&lt;p>Embedding 本身并不负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">如何切文档
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但 Embedding 的质量高度依赖 Chunking。&lt;/p>
&lt;p>例如一份：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100-page PDF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果直接：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PDF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">One Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么检索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Redis timeout 怎么解决？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>会得到一个包含大量无关信息的巨大向量。&lt;/p>
&lt;p>所以通常需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="十九chunk-太大有什么问题">十九、Chunk 太大有什么问题？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk = 10,000 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>里面包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PostgreSQL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kubernetes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 最终表达的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">综合语义
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>检索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis timeout
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>时可能不够精准。&lt;/p>
&lt;hr>
&lt;h1 id="二十chunk-太小有什么问题">二十、Chunk 太小有什么问题？&lt;/h1>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk = 50 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能导致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context 不完整
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如原文：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster 使用 hash slot 将 key 分布到不同节点。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>被切成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster 使用 hash slot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">将 key 分布到不同节点。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>语义可能被破坏。&lt;/p>
&lt;p>所以：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Chunking 是 Embedding Retrieval 的第一层质量控制。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="二十一overlap">二十一、Overlap&lt;/h1>
&lt;p>常见方式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size = 500 tokens
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Overlap = 100 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0 ───────── 500
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">400 ───────── 900
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">800 ───────── 1300
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以避免：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Boundary
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>刚好被切断。&lt;/p>
&lt;hr>
&lt;h1 id="二十二semantic-chunking">二十二、Semantic Chunking&lt;/h1>
&lt;p>更高级的方法不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">每 500 tokens 切一次
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是根据：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Paragraph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Heading
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Topic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Boundary
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>切。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"># Redis Cluster
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster provides...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">## Hash Slot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster uses...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">## Failover
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster supports...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以形成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster Overview
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hash Slot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Failover
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常比简单固定长度 Chunk 更合理。&lt;/p>
&lt;hr>
&lt;h1 id="二十三metadata-比-embedding-本身还重要">二十三、Metadata 比 Embedding 本身还重要&lt;/h1>
&lt;p>一个优秀的 Vector Record 不应该只有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还应该有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;doc-001&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;vector&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;redis-guide&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;document_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;technical&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;language&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;en&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;product&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;redis&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;version&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;7&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;section&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;cluster&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;timestamp&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2026-08-01&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以先：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Filter:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">product = redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">version = 7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>再：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="二十四vector-search-不等于-semantic-search">二十四、Vector Search 不等于 Semantic Search&lt;/h1>
&lt;p>这两个概念经常被混淆。&lt;/p>
&lt;p>Vector Search：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Nearest Neighbors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Semantic Search 更完整：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Results
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Vector Search 是 Semantic Search 的一个组件。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="二十五为什么-hybrid-search-很重要">二十五、为什么 Hybrid Search 很重要？&lt;/h1>
&lt;p>假设用户搜索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Spring Boot 3.4.5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 可能理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Spring Boot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">3.4.5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种精确版本号更适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>再例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Error code: ERR_CONNECTION_RESET
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种字符串：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ERR_CONNECTION_RESET
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 未必比 BM25 更有效。&lt;/p>
&lt;p>所以生产 RAG 经常使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Hybrid Search&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="二十六reranking">二十六、Reranking&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>返回：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是最终只需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>流程：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 可以更加精细地判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的相关性。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Embedding 负责快速召回，Reranker 负责精确排序。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="二十七embedding-retrieval-的完整架构">二十七、Embedding Retrieval 的完整架构&lt;/h1>
&lt;p>现代 RAG 更接近：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────┴───────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Keyword Search Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────┬───────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50/100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 处在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这个关键位置。&lt;/p>
&lt;hr>
&lt;h1 id="二十八embedding-与-rag">二十八、Embedding 与 RAG&lt;/h1>
&lt;p>RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval-Augmented Generation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心流程：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 解决的是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Retrieval&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>而 LLM 解决：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Generation / Reasoning&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RAG Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并不只是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还包括：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Construction
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="二十九一个非常重要的认知rag-的瓶颈可能不是-llm">二十九、一个非常重要的认知：RAG 的瓶颈可能不是 LLM&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM = GPT-level model
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>找错了文档：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何解决 Redis Cluster 的脑裂问题？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieved:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis 基础数据结构
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis String
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis List
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Set
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即使很强，也没有正确 Context。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Garbage In
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Garbage Out
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 RAG 系统中尤其明显。&lt;/p>
&lt;hr>
&lt;h1 id="三十embedding-与-agent-memory">三十、Embedding 与 Agent Memory&lt;/h1>
&lt;p>Embedding 不仅用于 RAG。&lt;/p>
&lt;p>还可以用于：&lt;/p>
&lt;blockquote>
&lt;p>Agent Memory Retrieval&lt;/p>
&lt;/blockquote>
&lt;p>例如用户过去说过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">我主要使用 Java。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>系统存储：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>下一次用户问：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">帮我设计一个微服务。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>系统进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">用户主要使用 Java / Spring Boot
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注入 LLM。&lt;/p>
&lt;p>于是 Agent 可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Remember Relevant Information
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Semantic Memory Retrieval&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="三十一embedding-与-agent-memory-的局限">三十一、Embedding 与 Agent Memory 的局限&lt;/h1>
&lt;p>但是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory = Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也是错误的。&lt;/p>
&lt;p>不同 Memory 类型应该使用不同机制：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Episodic Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Event Store
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ SQL / KV
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Working Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Agent State
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Long-term Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Persistent Store
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Embedding 是 Memory Architecture 的一个组件，而不是 Memory 本身。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="三十二代码-embedding">三十二、代码 Embedding&lt;/h1>
&lt;p>对于 Code Agent，普通文本 Embedding 可能不够。&lt;/p>
&lt;p>代码具有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Syntax
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structure
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dependency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Call Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Type
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Symbol
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Control Flow
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">orderService&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">createOrder&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>真正相关的代码可能是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">OrderService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OrderRepository
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">InventoryService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PaymentService
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以代码搜索通常需要结合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Code Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AST
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Symbol Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dependency Graph
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="三十三代码-embedding-的核心问题">三十三、代码 Embedding 的核心问题&lt;/h1>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">用户：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到处理订单退款的代码。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 可能找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">refund()
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">refundOrder()
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">processRefund()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但还应该找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PaymentService
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RefundRepository
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RefundController
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RefundEvent
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Semantic Retrieval + Structural Retrieval&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>也是 Code Agent 比普通 RAG 更复杂的原因。&lt;/p>
&lt;hr>
&lt;h1 id="三十四多语言-embedding">三十四、多语言 Embedding&lt;/h1>
&lt;p>现代系统可能同时处理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">中文
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">英文
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">日文
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">代码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Markdown
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PDF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Embedding Model 是否支持：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Multilingual
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>非常重要。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">什么是 Redis Cluster？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Cluster is a distributed implementation...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Embedding Space 支持跨语言语义对齐：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">中文 Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">English Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>仍然可以检索出来。&lt;/p>
&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Cross-lingual Semantic Retrieval&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="三十五多模态-embedding">三十五、多模态 Embedding&lt;/h1>
&lt;p>Embedding 不再局限于文本。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Image
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以及：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果两个 Embedding 位于共享空间：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">“一个人在海边骑自行车”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以检索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Image:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">海边骑自行车的人
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Multimodal Embedding&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>典型应用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Image Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Video Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Visual RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multimodal Agent
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="三十六embedding-model-如何选择">三十六、Embedding Model 如何选择？&lt;/h1>
&lt;p>不要只看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dimension
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>应该至少考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1. Retrieval Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Language Support
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Domain Support
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">4. Dimension
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">5. Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">6. Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">7. Context Length
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">8. Query/Document Compatibility
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">9. Licensing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10. Deployment Model
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">中文知识库
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重点：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chinese Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Code Repository
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>重点：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Code Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="三十七不要迷信-benchmark">三十七、不要迷信 Benchmark&lt;/h1>
&lt;p>Embedding Benchmark 很重要。&lt;/p>
&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">MTEB Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不能直接等价：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">你的 RAG Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>原因是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Benchmark Dataset
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">≠
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Your Dataset
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>真正可靠的方法是建立自己的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Evaluation Dataset
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;query&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Redis Cluster 如何进行故障转移？&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;relevant_documents&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;redis-cluster-failover.md&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="三十八recallk">三十八、Recall@K&lt;/h1>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">K = 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果正确文档出现在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@5 = 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>否则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@5 = 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>大量 Query 求平均：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以很好地衡量：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval 是否找到了正确内容。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="三十九mrr">三十九、MRR&lt;/h1>
&lt;p>MRR：&lt;/p>
&lt;blockquote>
&lt;p>Mean Reciprocal Rank&lt;/p>
&lt;/blockquote>
&lt;p>如果正确答案：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1/2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1/10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它非常适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Search Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>评估。&lt;/p>
&lt;hr>
&lt;h1 id="四十ndcg">四十、NDCG&lt;/h1>
&lt;p>NDCG 更适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">多个结果具有不同相关程度
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 1 → highly relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rank 2 → relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rank 3 → somewhat relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rank 4 → irrelevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>NDCG 可以衡量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Ranking Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以生产 Retrieval Evaluation 通常不会只看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而会结合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十一embedding-pipeline-的生产架构">四十一、Embedding Pipeline 的生产架构&lt;/h1>
&lt;p>一个企业级系统可以设计成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Parser/OCR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Chunker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Metadata Enrichment
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Store
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────┴──────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Metadata Vector Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Filter │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────┬──────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十二embedding-pipeline-的版本管理">四十二、Embedding Pipeline 的版本管理&lt;/h1>
&lt;p>这是生产环境一个经常被忽略的问题。&lt;/p>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v1 Embedding Model
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>已经生成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100 million vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>现在升级：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v2 Embedding Model
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>怎么办？&lt;/p>
&lt;p>不能简单地：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → v2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document → v1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>已经改变。&lt;/p>
&lt;p>正确方式通常是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">v1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Old Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">v2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">New Index
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Shadow Testing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Evaluation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Migration
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Switch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Embedding Model Version 是数据 Schema 的一部分。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="四十三embedding-schema">四十三、Embedding Schema&lt;/h1>
&lt;p>建议 Vector Record 至少包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;chunk-123&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;embedding_model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;embedding-v2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;embedding_dimension&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1536&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content_hash&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;abc123&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;document_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;doc-001&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;chunk_id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;chunk-003&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;...&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;metadata&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以支持：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Re-index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Migration
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Debugging
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A/B Testing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rollback
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十四embedding-cache">四十四、Embedding Cache&lt;/h1>
&lt;p>如果同一个 Query 重复出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">How to configure Redis Cluster?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>没有必要每次都：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding API
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Local Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CDN-like Cache
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以降低：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API Load
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十五embedding-与-redis">四十五、Embedding 与 Redis&lt;/h1>
&lt;p>如果系统已经使用 Redis：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不仅可以作为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cache
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还可以用于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>典型架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Application
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Metadata │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Vector │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Cache │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于中小规模应用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Redis Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以减少：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Additional Infrastructure
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十六embedding-与-postgresql">四十六、Embedding 与 PostgreSQL&lt;/h1>
&lt;p>如果系统已经使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PostgreSQL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也可以通过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">pgvector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>实现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Storage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Similarity Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PostgreSQL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── Business Tables
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── Vector Column
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这对：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">企业内部 RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>非常实用。&lt;/p>
&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Business Data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以在同一个数据库体系中管理。&lt;/p>
&lt;hr>
&lt;h1 id="四十七专用-vector-database">四十七、专用 Vector Database&lt;/h1>
&lt;p>当规模变大，可以考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Milvus
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Qdrant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Weaviate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Pinecone
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>等专门的 Vector Database。&lt;/p>
&lt;p>核心能力包括：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ANN Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sharding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Management
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但不要因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">AI Application
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>就立即引入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100K documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>PostgreSQL + pgvector&lt;/p>
&lt;p>可能已经足够。&lt;/p>
&lt;p>架构设计首先应该考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Scale
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Operational Complexity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十八ann为什么向量搜索不能暴力计算">四十八、ANN：为什么向量搜索不能暴力计算？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10 million vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每次 Query 都计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10 million × Cosine Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>显然成本很高。&lt;/p>
&lt;p>因此需要：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Approximate Nearest Neighbor&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>即：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ANN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>目标不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100% exact
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Very good recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Much lower latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四十九hnsw">四十九、HNSW&lt;/h1>
&lt;p>HNSW：&lt;/p>
&lt;blockquote>
&lt;p>Hierarchical Navigable Small World&lt;/p>
&lt;/blockquote>
&lt;p>是现代 Vector Search 中非常重要的 ANN Index。&lt;/p>
&lt;p>可以简单理解成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Layer 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> A ───── D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> / \
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> B F
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Layer 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A ─ B ─ C ─ D ─ E ─ F
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Layer 0
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A-B-C-D-E-F-G-H-I...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>搜索时：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Find approximate region
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Lower Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Refine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Nearest Neighbors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从而避免：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Scan all vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="五十hnsw-的工程参数">五十、HNSW 的工程参数&lt;/h1>
&lt;p>常见参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">efConstruction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">efSearch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">M
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>影响图连接数量。&lt;/p>
&lt;p>通常：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">M ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Memory ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Build Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">efSearch ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ Latency ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以 Vector Search 本质上也是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>的优化问题。&lt;/p>
&lt;hr>
&lt;h1 id="五十一embedding-的三个核心工程层次">五十一、Embedding 的三个核心工程层次&lt;/h1>
&lt;p>如果把整个技术体系压缩，可以分成三层。&lt;/p>
&lt;h2 id="第一层representation">第一层：Representation&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>解决：&lt;/p>
&lt;blockquote>
&lt;p>如何表达语义？&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="第二层retrieval">第二层：Retrieval&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ANN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>解决：&lt;/p>
&lt;blockquote>
&lt;p>如何找到相关信息？&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="第三层context">第三层：Context&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieved Information
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Construction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>解决：&lt;/p>
&lt;blockquote>
&lt;p>如何把相关信息提供给模型？&lt;/p>
&lt;/blockquote>
&lt;p>这三层共同组成现代 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Engineering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="五十二embeddingragcontext-engineering-的关系">五十二、Embedding、RAG、Context Engineering 的关系&lt;/h1>
&lt;p>可以把三者理解成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────┴────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval Generation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而 Context Engineering 又横跨其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Assembly
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以：&lt;/p>
&lt;blockquote>
&lt;p>Embedding 是 Context Engineering 的重要基础设施之一。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="五十三embedding-不是理解">五十三、Embedding 不是“理解”&lt;/h1>
&lt;p>这是最后需要强调的一个认知。&lt;/p>
&lt;p>Embedding 并不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">AI 已经理解了这句话。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更准确地说：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Learned Representation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它把：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">High-dimensional semantic information
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>映射成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dense Vector Representation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Distance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以作为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity Signal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity ≠ Reasoning
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A 和 B 很相似
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并不意味着：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A 能推出 B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也不意味着：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A 和 B 逻辑等价
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>擅长：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Clustering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Matching
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recommendation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Classification
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更擅长：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reasoning
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Transformation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Planning
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两者是互补关系。&lt;/p>
&lt;hr>
&lt;h1 id="五十四最终架构认知">五十四、最终架构认知&lt;/h1>
&lt;p>现代 AI 应用可以抽象成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> User
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Agent / App │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬──────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Context Engine │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────┬────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────┼─────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Memory RAG Tools
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里可以看到：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Embedding 并不是 RAG 的附属功能，而是现代 AI 系统中的语义基础设施。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="五十五总结真正理解-embedding">五十五、总结：真正理解 Embedding&lt;/h1>
&lt;p>如果只记住本文最重要的几个观点，可以记住下面这些。&lt;/p>
&lt;h3 id="1-embedding-不只是文本转向量">1. Embedding 不只是“文本转向量”&lt;/h3>
&lt;p>它真正建立的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Vector Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="2-embedding-的核心是空间关系">2. Embedding 的核心是空间关系&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Geometric Proximity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="3-embedding-model-决定向量空间">3. Embedding Model 决定向量空间&lt;/h3>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>必须使用兼容的 Embedding Model。&lt;/p>
&lt;hr>
&lt;h3 id="4-embedding-dimension-不是越高越好">4. Embedding Dimension 不是越高越好&lt;/h3>
&lt;p>需要综合考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="5-chunking-会直接影响-retrieval-quality">5. Chunking 会直接影响 Retrieval Quality&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Bad Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bad Embedding Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bad RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="6-vector-search-不等于完整-semantic-search">6. Vector Search 不等于完整 Semantic Search&lt;/h3>
&lt;p>生产系统通常需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="7-embedding-是-rag-的基础但不是-rag-的全部">7. Embedding 是 RAG 的基础，但不是 RAG 的全部&lt;/h3>
&lt;p>完整链路是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="8-embedding-也是-agent-memory-的基础设施">8. Embedding 也是 Agent Memory 的基础设施&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory ≠ Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="9-embedding-需要独立-evaluation">9. Embedding 需要独立 Evaluation&lt;/h3>
&lt;p>不要只测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还要测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="10-embedding-最终属于-ai-基础设施">10. Embedding 最终属于 AI 基础设施&lt;/h3>
&lt;p>它连接：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Unstructured Data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agent
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以可以用一个公式概括：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Space
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Infrastructure
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而进一步把它放进你前面学习的 &lt;strong>Context Engineering&lt;/strong> 体系中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Context Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────────┼─────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Memory RAG Tools
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼ ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────┬──────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ▼
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Agent
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>因此，如果 Prompt Engineering 解决的是“怎么告诉 LLM”，Context Engineering 解决的是“LLM 当前需要知道什么”，那么 Embedding 解决的就是：&lt;/strong>&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>“系统如何在海量非结构化信息中找到与当前任务最相关的东西？”&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这三者结合起来，才构成现代 RAG 和 Agent 系统真正的技术基础：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Prompt Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding / Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agent Runtime / Harness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>RAG</title><link>https://wzhai-hub.github.io/Tony/ai/rag/ragbasic/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/ragbasic/</guid><description>&lt;h2 id="一什么是-rag">一、什么是 RAG？&lt;/h2>
&lt;p>&lt;strong>RAG = Retrieval-Augmented Generation&lt;/strong>&lt;/p>
&lt;p>中文通常叫：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>检索增强生成&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>简单来说：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>RAG = 先从外部知识库找到相关资料，再把资料交给大模型，让大模型基于这些资料回答问题。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>传统 ChatGPT 类大模型主要依赖训练阶段学到的知识：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">用户问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成答案
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>RAG 则变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">用户问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">检索知识库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到相关资料
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">把资料 + 用户问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成答案
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如你有一个公司内部知识库：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">公司员工手册.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java开发规范.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">项目架构文档.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">HR政策.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">产品说明书.pdf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户问：&lt;/p>
&lt;blockquote>
&lt;p>“公司的年假政策是什么？”&lt;/p>
&lt;/blockquote>
&lt;p>传统 LLM：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">问题 → LLM → 根据训练知识猜答案
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到 HR政策.pdf 中相关内容
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">把相关内容交给 LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM 根据公司真实文档回答
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以 RAG 的核心价值是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>让大模型能够使用“外部知识”。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="二为什么需要-rag">二、为什么需要 RAG？&lt;/h1>
&lt;p>RAG 主要解决 LLM 的几个问题。&lt;/p>
&lt;h3 id="1-llm-不知道你的私有数据">1. LLM 不知道你的私有数据&lt;/h3>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">公司内部代码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">公司数据库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">内部技术文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">员工手册
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">客户资料
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">产品文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">项目 Wiki
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些通常没有参与公共大模型训练。&lt;/p>
&lt;p>RAG 可以让 LLM 查询这些资料。&lt;/p>
&lt;hr>
&lt;h3 id="2-llm-的知识存在时效性">2. LLM 的知识存在时效性&lt;/h3>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">2026年的公司政策
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2026年的产品价格
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">最新 API 文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">最新项目代码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">最新数据库数据
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型训练数据不一定包含这些信息。&lt;/p>
&lt;p>RAG 可以实时检索最新资料。&lt;/p>
&lt;hr>
&lt;h3 id="3-减少-hallucination幻觉">3. 减少 Hallucination（幻觉）&lt;/h3>
&lt;p>例如用户问：&lt;/p>
&lt;blockquote>
&lt;p>“我们公司的退款政策是什么？”&lt;/p>
&lt;/blockquote>
&lt;p>如果 LLM 不知道，很容易：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">根据公司政策，退款期限是30天……
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是这个答案可能是&lt;strong>编造的&lt;/strong>。&lt;/p>
&lt;p>RAG 可以要求：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">只根据检索出来的公司政策回答
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此可以显著降低幻觉。&lt;/p>
&lt;p>注意：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>RAG 不能保证 100% 消除幻觉。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="三rag-的核心架构">三、RAG 的核心架构&lt;/h1>
&lt;p>一个典型 RAG 系统可以理解成两个阶段：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> ┌───────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Documents │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Document Loader
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Vector Database│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">User Question → Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Similarity Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Relevant Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Prompt + Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中非常重要的组件有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Loader
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prompt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="四rag-有哪些主要功能">四、RAG 有哪些主要功能？&lt;/h1>
&lt;p>如果从企业级 RAG 系统来看，我建议你把功能分成 &lt;strong>10 个部分&lt;/strong>来理解。&lt;/p>
&lt;h2 id="1-文档导入">1. 文档导入&lt;/h2>
&lt;p>RAG 首先需要获取知识。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PDF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Word
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Excel
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TXT
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Markdown
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">HTML
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">网页
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">数据库
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Git Repository
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Confluence
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SharePoint
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java-Interview.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring-Boot.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Company-Handbook.pdf
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Architecture.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="2-document-parsing">2. Document Parsing&lt;/h1>
&lt;p>把各种格式转换成文本。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PDF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PDF Parser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>比如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PDF：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chapter 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot Introduction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chapter 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Security
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>转换成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Spring Boot Introduction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Security
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>企业 RAG 中，这一步其实非常重要。&lt;/p>
&lt;p>因为现实中的 PDF 可能包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">文字
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">表格
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">图片
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">页眉
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">页脚
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">代码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">扫描件
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以需要比较复杂的 Document Parsing。&lt;/p>
&lt;hr>
&lt;h1 id="3-chunking">3. Chunking&lt;/h1>
&lt;p>这是 RAG 最核心的功能之一。&lt;/p>
&lt;p>假设一个 PDF 有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">500 pages
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不能直接把整个 PDF 给 LLM。&lt;/p>
&lt;p>需要拆成很多小块：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 1000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot 是一个快速开发框架……
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot 自动配置机制……
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot Starter……
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot Actuator……
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>为什么要 Chunk？&lt;/p>
&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM Context Window
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是有限的。&lt;/p>
&lt;p>而且 Chunk 越精准，检索结果通常越准确。&lt;/p>
&lt;hr>
&lt;h1 id="4-embedding">4. Embedding&lt;/h1>
&lt;p>这是理解 RAG 的另一个核心概念。&lt;/p>
&lt;p>Embedding 的作用是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>把文字转换成向量。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Java Spring Boot&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能转换成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">[0.12, -0.53, 0.82, 0.11, ...]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>另一个句子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Spring Boot framework&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">[0.14, -0.50, 0.79, 0.13, ...]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两个向量比较接近。&lt;/p>
&lt;p>说明：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java Spring Boot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ≈
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot framework
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>语义比较相似。&lt;/p>
&lt;hr>
&lt;h1 id="5-vector-database">5. Vector Database&lt;/h1>
&lt;p>Embedding 之后，需要保存向量。&lt;/p>
&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Vector Database（向量数据库）&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>常见的有：&lt;/p>
&lt;ul>
&lt;li>pgvector&lt;/li>
&lt;li>Milvus&lt;/li>
&lt;li>Pinecone&lt;/li>
&lt;li>Weaviate&lt;/li>
&lt;li>Qdrant&lt;/li>
&lt;li>Elasticsearch&lt;/li>
&lt;li>OpenSearch&lt;/li>
&lt;li>Redis&lt;/li>
&lt;li>azure openAI search&lt;/li>
&lt;/ul>
&lt;p>如果你本身已经熟悉 &lt;strong>Redis、PostgreSQL、Elasticsearch&lt;/strong>，其实非常有优势。&lt;/p>
&lt;p>例如 PostgreSQL：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PostgreSQL + pgvector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>就可以构建一个 RAG 知识库。&lt;/p>
&lt;hr>
&lt;h1 id="6-retrieval">6. Retrieval&lt;/h1>
&lt;p>用户提出问题：&lt;/p>
&lt;blockquote>
&lt;p>“Spring Boot 如何实现事务？”&lt;/p>
&lt;/blockquote>
&lt;p>首先把问题进行 Embedding：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后去 Vector Database 搜索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk 27
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 81
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 125
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk 322
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些就是：&lt;/p>
&lt;blockquote>
&lt;p>Relevant Context&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="7-reranking">7. Reranking&lt;/h1>
&lt;p>仅仅 Vector Search 有时候还不够。&lt;/p>
&lt;p>例如搜索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Spring Boot transaction
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Search 找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是相关性可能不是特别准确。&lt;/p>
&lt;p>于是可以再使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 会重新判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 1 → 95%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 2 → 87%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 3 → 63%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 4 → 42%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终只把最相关的内容交给 LLM。&lt;/p>
&lt;p>这在企业级 RAG 中非常重要。&lt;/p>
&lt;hr>
&lt;h1 id="8-context-injection">8. Context Injection&lt;/h1>
&lt;p>得到相关文档以后，把它们放进 Prompt。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">System:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">You are a Java expert.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring transaction is implemented using...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">User:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How does Spring @Transactional work?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context + Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Augmented Generation&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>也就是 RAG 中的 &lt;strong>AG&lt;/strong>。&lt;/p>
&lt;hr>
&lt;h1 id="9-answer-generation">9. Answer Generation&lt;/h1>
&lt;p>LLM 最终根据：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">用户问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">检索结果
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">System Prompt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>生成答案。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">用户：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring @Transactional 为什么会失效？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">检索 Spring 官方文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到 @Transactional proxy 机制
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">回答：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">因为 @Transactional 通常基于 Spring AOP Proxy，
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">self-invocation 不会经过 proxy……
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样回答的依据就来自知识库。&lt;/p>
&lt;hr>
&lt;h1 id="10-citation--source">10. Citation / Source&lt;/h1>
&lt;p>企业级 RAG 很重要的功能：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>告诉用户答案来自哪里。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">答案：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring 的 @Transactional 默认基于代理机制。
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">来源：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Transaction Management
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">第 3.2 节
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>甚至可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Source 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Source 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Source 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户可以点击来源查看原始文档。&lt;/p>
&lt;p>这对企业系统非常重要，因为它可以提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">可信度
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">可审计性
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">可追溯性
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="五rag-的完整流程">五、RAG 的完整流程&lt;/h1>
&lt;p>你可以把整个 RAG 记成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> 【离线阶段】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parse
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 【在线阶段】
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">User Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prompt Construction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Citation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="六rag-不只是-vector-search">六、RAG 不只是 Vector Search&lt;/h1>
&lt;p>这是很多初学者容易误解的地方。&lt;/p>
&lt;p>很多人认为：&lt;/p>
&lt;blockquote>
&lt;p>RAG = Vector Database&lt;/p>
&lt;/blockquote>
&lt;p>实际上：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Vector Database 只是 RAG 的一个组件。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>现代 RAG 通常还会使用：&lt;/p>
&lt;h3 id="1-vector-search">1. Vector Search&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">语义搜索
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-keyword-search">2. Keyword Search&lt;/h3>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java Class Name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API Name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Error Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Exception
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Product ID
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>比如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">NullPointerException
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ERR-50001
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">@Transactional
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种精确关键词搜索有时候比 Vector Search 更好。&lt;/p>
&lt;hr>
&lt;h3 id="3-hybrid-search">3. Hybrid Search&lt;/h3>
&lt;p>把：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>结合起来。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Vector Search│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├─────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────▼─────▼──┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Hybrid Search │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是目前企业 RAG 很常见的架构。&lt;/p>
&lt;hr>
&lt;h1 id="七rag-可以解决哪些实际问题">七、RAG 可以解决哪些实际问题？&lt;/h1>
&lt;p>你作为 Java / Full Stack 开发者，可以重点关注这些场景。&lt;/p>
&lt;h3 id="企业知识库">企业知识库&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">员工问：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">公司的报销政策是什么？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">HR Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">回答
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="it-support">IT Support&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">用户：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">这个错误怎么解决？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Knowledge Base
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">找到历史解决方案
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成解决方案
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="code-assistant">Code Assistant&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">开发人员：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">我们的 PaymentService 怎么调用？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Git Repository
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">检索代码
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">解释代码
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="customer-service">Customer Service&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">客户问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">产品文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">FAQ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">历史知识
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AI Customer Service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="企业内部搜索">企业内部搜索&lt;/h3>
&lt;p>传统搜索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">关键词 → 文档
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">自然语言问题
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">理解语义
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">搜索知识
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">生成答案
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以它实际上可以变成：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>AI Search Engine&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="八rag-和-fine-tuning-的区别">八、RAG 和 Fine-tuning 的区别&lt;/h1>
&lt;p>这是 AI 面试非常常见的问题。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;/th>
&lt;th>RAG&lt;/th>
&lt;th>Fine-tuning&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>目的&lt;/td>
&lt;td>增加外部知识&lt;/td>
&lt;td>改变模型行为/能力&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据变化&lt;/td>
&lt;td>很容易更新&lt;/td>
&lt;td>需要重新训练&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>私有知识&lt;/td>
&lt;td>非常适合&lt;/td>
&lt;td>可以，但成本高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>实时数据&lt;/td>
&lt;td>很适合&lt;/td>
&lt;td>不适合&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>成本&lt;/td>
&lt;td>相对低&lt;/td>
&lt;td>相对高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>可追溯&lt;/td>
&lt;td>很好&lt;/td>
&lt;td>较差&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>最新知识&lt;/td>
&lt;td>很好&lt;/td>
&lt;td>较差&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>改变回答风格&lt;/td>
&lt;td>一般&lt;/td>
&lt;td>很好&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>改变模型能力&lt;/td>
&lt;td>有限&lt;/td>
&lt;td>更适合&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>简单记：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>知识问题 → RAG&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;strong>行为/能力问题 → Fine-tuning&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">公司的最新员工手册
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">让模型始终使用某种特殊格式回答
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fine-tuning
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当然，实际项目中也可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RAG + Fine-tuning
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一起使用。&lt;/p>
&lt;hr></description></item><item><title>Reranking：从 Top-K 召回到高精度检索的深度技术解析</title><link>https://wzhai-hub.github.io/Tony/ai/rag/reranking/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/reranking/</guid><description>&lt;h1 id="reranking从-top-k-召回到高精度检索的深度技术解析">Reranking：从 Top-K 召回到高精度检索的深度技术解析&lt;/h1>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>在现代 RAG（Retrieval-Augmented Generation）系统中，Retrieval 决定“哪些候选文档能够进入候选集合”，而 &lt;strong>Reranking 决定这些候选文档中，哪些真正值得交给 LLM&lt;/strong>。&lt;/p>
&lt;p>很多 RAG 系统的架构停留在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种架构简单，但在企业知识库、技术文档、法律文档、金融知识库和复杂问答中，往往会遇到一个关键问题：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Vector Similarity 高，并不代表 Query 与 Document 真正相关。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>Reranking 的本质，就是在第一阶段高召回 Retrieval 的基础上，对候选文档进行更加精细的相关性判断。&lt;/p>
&lt;p>典型架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50 / Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 5 / Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此，现代 RAG 可以抽象为：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Retriever 负责 Recall，Reranker 负责 Precision。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>本文将从 Information Retrieval、Bi-Encoder、Cross-Encoder、Late Interaction、Reranking Score、Batching、Latency、Multilingual Reranking、Hybrid Search、Context Selection、Reranking Evaluation，以及生产级 Reranking Architecture 等方面，对 Reranking 进行系统分析。&lt;/p>
&lt;hr>
&lt;h1 id="1-为什么需要-reranking">1. 为什么需要 Reranking？&lt;/h1>
&lt;p>先看一个简单例子。&lt;/p>
&lt;p>用户查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">如何解决 Java 应用中的内存泄漏？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Search 返回：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Heap Dump Analysis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">JVM Garbage Collection Tuning
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Memory Leak Troubleshooting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document D:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot Performance Optimization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document E:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Memory Optimization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>假设 Vector Search 排名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A 0.89
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B 0.87
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D 0.86
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C 0.85
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">E 0.82
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从向量距离来看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A &amp;gt; B &amp;gt; D &amp;gt; C &amp;gt; E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但从用户真正的需求来看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">C &amp;gt; A &amp;gt; B &amp;gt; D &amp;gt; E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>真正的问题是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Embedding Similarity 并不等价于 Query-Document Relevance。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>因此需要第二阶段模型重新判断。&lt;/p>
&lt;hr>
&lt;h1 id="2-retrieval-与-reranking-的职责不同">2. Retrieval 与 Reranking 的职责不同&lt;/h1>
&lt;p>一个成熟的搜索系统通常分成两个阶段：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>第一阶段：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>目标：&lt;/p>
&lt;blockquote>
&lt;p>尽可能不要漏掉相关文档。&lt;/p>
&lt;/blockquote>
&lt;p>第二阶段：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>目标：&lt;/p>
&lt;blockquote>
&lt;p>从候选文档中精确识别最相关的文档。&lt;/p>
&lt;/blockquote>
&lt;p>所以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever → Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker → Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是两者最重要的区别。&lt;/p>
&lt;hr>
&lt;h1 id="3-为什么-retriever-不能直接完成-ranking">3. 为什么 Retriever 不能直接完成 Ranking？&lt;/h1>
&lt;p>这是理解 Reranking 的关键。&lt;/p>
&lt;p>假设 Embedding Model：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">0.91
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.89
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.87
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.85
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>问题在于：&lt;/p>
&lt;blockquote>
&lt;p>Embedding Vector 是一种压缩后的语义表示。&lt;/p>
&lt;/blockquote>
&lt;p>它丢失了部分细粒度信息。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How can I prevent Kafka consumer rebalancing?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两个 Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka consumer rebalancing is triggered when...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document B:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka consumer configuration and consumer groups...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>二者 Embedding 可能都很接近。&lt;/p>
&lt;p>但是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A = directly answers the question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B = related background
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Similarity 很难稳定地区分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Directly Relevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Generally Related
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而 Reranker 可以进一步判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的真实关系。&lt;/p>
&lt;hr>
&lt;h1 id="4-reranking-的数学抽象">4. Reranking 的数学抽象&lt;/h1>
&lt;p>给定：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query = q
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retriever 产生：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">D = {d1, d2, ..., dn}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score(q, di)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank(D)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以整个流程：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">q
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever(q)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker(q, D&amp;#39;)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ranked Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意：&lt;/p>
&lt;blockquote>
&lt;p>Reranker 通常不搜索整个知识库。&lt;/p>
&lt;/blockquote>
&lt;p>它只处理 Retriever 返回的 Candidate Set。&lt;/p>
&lt;hr>
&lt;h1 id="5-为什么不能让-reranker-搜索整个数据库">5. 为什么不能让 Reranker 搜索整个数据库？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Knowledge Base = 10M documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Reranker 对每一个 Document 都计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10M model inference
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>显然不可接受。&lt;/p>
&lt;p>因此采用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;h1 id="two-stage-retrieval">Two-Stage Retrieval&lt;/h1>
&lt;p>也可以称为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Coarse Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fine Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="6-bi-encoder第一阶段-retrieval">6. Bi-Encoder：第一阶段 Retrieval&lt;/h1>
&lt;p>理解 Reranker，必须先理解 Bi-Encoder。&lt;/p>
&lt;p>Bi-Encoder：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity(Query Vector, Document Vector)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Document Vector 可以提前计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query 到达之后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ANN Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种架构非常快。&lt;/p>
&lt;hr>
&lt;h1 id="7-bi-encoder-的优势">7. Bi-Encoder 的优势&lt;/h1>
&lt;p>Bi-Encoder 最大优势：&lt;/p>
&lt;blockquote>
&lt;p>Document Embedding 可以离线计算。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000,000 documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以提前：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document → Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后存储在 Vector Database。&lt;/p>
&lt;p>用户 Query 到来：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → Embedding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>只需要一次 Query Embedding。&lt;/p>
&lt;p>然后进行 ANN：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">HNSW / IVF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以非常适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Large Scale Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">High QPS
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Low Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="8-cross-encoderreranker-的核心">8. Cross-Encoder：Reranker 的核心&lt;/h1>
&lt;p>Cross-Encoder 与 Bi-Encoder 最大的区别：&lt;/p>
&lt;p>Bi-Encoder：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Cross-Encoder：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Relevance Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">[CLS]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">How to solve JVM memory leak?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[SEP]
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">JVM heap dump can be used to analyze object retention...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>整个 Query 和 Document 一起进入 Transformer。&lt;/p>
&lt;p>模型直接输出：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevance = 0.94
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Cross-Encoder 能看到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间更加细粒度的交互。&lt;/p>
&lt;hr>
&lt;h1 id="9-为什么-cross-encoder-更准确">9. 为什么 Cross-Encoder 更准确？&lt;/h1>
&lt;p>因为 Transformer 可以直接建立：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Token
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Token
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的 Attention。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka consumer rebalancing problem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Kafka consumer group rebalancing happens when...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型可以直接学习：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">consumer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">consumer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rebalancing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rebalancing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">problem
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">happens when
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种 Token-Level Interaction。&lt;/p>
&lt;p>而 Bi-Encoder 在进入 Similarity 阶段之前：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>已经把大量信息压缩掉了。&lt;/p>
&lt;p>因此通常：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cross-Encoder Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bi-Encoder Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cross-Encoder Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bi-Encoder Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="10-bi-encoder-vs-cross-encoder">10. Bi-Encoder vs Cross-Encoder&lt;/h1>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>特性&lt;/th>
&lt;th>Bi-Encoder&lt;/th>
&lt;th>Cross-Encoder&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Query/Document&lt;/td>
&lt;td>分开编码&lt;/td>
&lt;td>一起编码&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Document Embedding&lt;/td>
&lt;td>可预计算&lt;/td>
&lt;td>不可直接预计算&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>搜索规模&lt;/td>
&lt;td>百万/亿级&lt;/td>
&lt;td>候选几十/几百&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Latency&lt;/td>
&lt;td>低&lt;/td>
&lt;td>高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Recall&lt;/td>
&lt;td>高&lt;/td>
&lt;td>不负责召回&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ranking Precision&lt;/td>
&lt;td>中&lt;/td>
&lt;td>高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ANN&lt;/td>
&lt;td>支持&lt;/td>
&lt;td>不适合&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>典型用途&lt;/td>
&lt;td>Retrieval&lt;/td>
&lt;td>Reranking&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Bi-Encoder 和 Cross-Encoder 不是竞争关系，而是互补关系。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="11-reranking-pipeline">11. Reranking Pipeline&lt;/h1>
&lt;p>典型 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌───────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Reranker │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Query + Document │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Query + Document │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Query + Document │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────┬─────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Builder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 的主要任务：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">High Quality Top 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="12-reranking-并不是简单重新排序">12. Reranking 并不是简单重新排序&lt;/h1>
&lt;p>很多人认为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sort
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>实际上 Reranker 需要解决的是：&lt;/p>
&lt;blockquote>
&lt;p>Query-Document Relevance Modeling。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何避免 Redis 缓存击穿？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document A:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cache Penetration
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cache Breakdown
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Distributed Lock
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document D:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Cluster
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型需要理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A ≈ Direct Match
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B ≈ Direct Match
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C ≈ Possible Solution
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D ≈ Related Background
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这已经不是简单的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Distance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Relevance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="13-reranking-score">13. Reranking Score&lt;/h1>
&lt;p>Reranker 输出通常可以抽象成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score(q, d)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A → 0.95
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B → 0.91
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C → 0.67
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document D → 0.41
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后排序：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是需要注意：&lt;/p>
&lt;blockquote>
&lt;p>不同 Reranker 的 score 不一定具有跨模型可比较性。&lt;/p>
&lt;/blockquote>
&lt;p>因此不要简单认为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">0.9 = 90% relevance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它通常只是：&lt;/p>
&lt;blockquote>
&lt;p>模型内部用于排序的 relevance score。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="14-reranker-score-threshold">14. Reranker Score Threshold&lt;/h1>
&lt;p>有时可以增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score &amp;gt; threshold
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score &amp;gt;= 0.7
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>才进入 Context。&lt;/p>
&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Score Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top N
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是 Threshold 不能拍脑袋设置。&lt;/p>
&lt;p>应该通过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Evaluation Dataset
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>确定。&lt;/p>
&lt;hr>
&lt;h1 id="15-reranking-的最大工程问题latency">15. Reranking 的最大工程问题：Latency&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Top-K = 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100 documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果单次推理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">20 ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>串行执行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100 × 20ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2 seconds
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>显然不可接受。&lt;/p>
&lt;p>因此生产系统必须：&lt;/p>
&lt;h1 id="batch-inference">Batch Inference&lt;/h1>
&lt;hr>
&lt;h1 id="16-batch-reranking">16. Batch Reranking&lt;/h1>
&lt;p>把：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Doc1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query + Doc2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query + Doc3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>组成 Batch：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Batch
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query + Doc1,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query + Doc2,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query + Doc3,
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一次送入 GPU：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">GPU
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Batch Inference
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scores
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以显著提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">GPU Utilization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Throughput
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>降低：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Per-Document Inference Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="17-dynamic-batching">17. Dynamic Batching&lt;/h1>
&lt;p>生产环境通常不会简单使用固定 Batch。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Request A → 50 documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Request B → 20 documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Request C → 100 documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Inference Server 可以动态组合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Batch
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Request A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Request B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Request C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">GPU Utilization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但需要控制：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Max Batch Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Max Waiting Time
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Max Tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>否则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Batch Size ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能导致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="18-reranking-candidate-size-如何选择">18. Reranking Candidate Size 如何选择？&lt;/h1>
&lt;p>这是非常关键的参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-N Retriever
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 200
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理论上：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Candidate Size ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Top 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不一定比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Top 50
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更好。&lt;/p>
&lt;p>需要通过实验寻找：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>的最佳平衡点。&lt;/p>
&lt;hr>
&lt;h1 id="19-candidate-generation-的原则">19. Candidate Generation 的原则&lt;/h1>
&lt;p>一个非常重要的原则：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Reranker 无法找回 Retriever 没有召回的文档。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>假设真正答案：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document X
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Top 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>没有 X。&lt;/p>
&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker Top 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也不可能出现 X。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval Recall
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>永远是 Reranking 的上限。&lt;/p>
&lt;hr>
&lt;h1 id="20-recall100-的意义">20. Recall@100 的意义&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Recall@100 = 95%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>说明：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">95% relevant information
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>已经进入 Reranker Candidate Set。&lt;/p>
&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@100 = 60%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即使 Reranker 非常优秀：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">NDCG ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也无法解决剩余：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">40%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>没有被召回的问题。&lt;/p>
&lt;p>所以优化顺序通常应该是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1. Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Ranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Context
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而不是反过来。&lt;/p>
&lt;hr>
&lt;h1 id="21-reranking-与-hybrid-search">21. Reranking 与 Hybrid Search&lt;/h1>
&lt;p>如果 Retrieval 同时使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25 Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RRF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是非常强大的生产架构。&lt;/p>
&lt;p>完整流程：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────┴───────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> BM25 Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top50 Top50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RRF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="22-为什么-reranker-可以解决-hybrid-score-问题">22. 为什么 Reranker 可以解决 Hybrid Score 问题？&lt;/h1>
&lt;p>BM25：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score = 12.8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score = 0.83
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>二者无法直接比较。&lt;/p>
&lt;p>RRF 可以根据：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行融合。&lt;/p>
&lt;p>然后 Reranker 再对：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行统一判断。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RRF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>形成一个完整的 Multi-Stage Ranking Pipeline。&lt;/p>
&lt;hr>
&lt;h1 id="23-reranking-与-chunk-size">23. Reranking 与 Chunk Size&lt;/h1>
&lt;p>Reranker 并不能解决所有 Chunk 问题。&lt;/p>
&lt;p>假设 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>虽然 Reranker 能判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是信息本身可能不完整。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“它可以通过增加副本解决。”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 很难知道：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">它 = Kafka Consumer？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Database？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Reranking 之前：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Contextualization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>仍然非常重要。&lt;/p>
&lt;hr>
&lt;h1 id="24-parent-child--reranking">24. Parent-Child + Reranking&lt;/h1>
&lt;p>一种高级 RAG 架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Small Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 50 Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10 Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Construction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Small Chunk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Precision Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Parent：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Completeness
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>三者结合效果通常优于简单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document → Embedding → Top-K → LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="25-context-compression--reranking">25. Context Compression + Reranking&lt;/h1>
&lt;p>进一步可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Sentences
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里有三个不同层次：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ 找候选文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ 找最相关文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compressor
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">→ 找文档中最相关内容
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以理解成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Level
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk Level
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sentence Level
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是非常重要的层级化 Retrieval Architecture。&lt;/p>
&lt;hr>
&lt;h1 id="26-multi-stage-ranking">26. Multi-Stage Ranking&lt;/h1>
&lt;p>现代搜索系统实际上可以设计成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Stage 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25 / ANN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 1000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Stage 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 200
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Stage 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cross-Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Stage 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM / Contextual Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每一层：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Candidate Count ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compute Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>越靠后的 Ranking Stage 越精确，也越昂贵。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="27-reranking-的模型选择">27. Reranking 的模型选择&lt;/h1>
&lt;p>可以从三个维度选择：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;h3 id="小模型">小模型&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Latency ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Accuracy 中等
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">High QPS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="中型模型">中型模型&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Accuracy ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency 中等
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Enterprise RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="大型-reranker">大型 Reranker&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Accuracy ↑↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost ↑↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">High-value Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Complex QA
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Legal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Financial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Research
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此不存在：&lt;/p>
&lt;blockquote>
&lt;p>最大模型一定最好。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="28-cross-encoder-的输入长度问题">28. Cross-Encoder 的输入长度问题&lt;/h1>
&lt;p>Reranker 需要处理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Document 很长：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10,000 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cross-Encoder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>计算成本会明显增加。&lt;/p>
&lt;p>因此通常需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Truncation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Max Sequence Length
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query = 50 tokens
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document = 500 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query = 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document = 5000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更适合高吞吐 Reranking。&lt;/p>
&lt;hr>
&lt;h1 id="29-token-complexity">29. Token Complexity&lt;/h1>
&lt;p>Transformer 的 Attention 计算通常与序列长度高度相关。&lt;/p>
&lt;p>粗略理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Sequence Length ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Attention Cost ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Chunk 太大
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能导致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranking Cost ↑↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这也是为什么：&lt;/p>
&lt;blockquote>
&lt;p>Chunking 不仅影响 Retrieval Quality，也直接影响 Reranking Performance。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="30-multilingual-reranking">30. Multilingual Reranking&lt;/h1>
&lt;p>企业知识库可能同时存在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">中文
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">English
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">日文
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">韩文
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户可能：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">中文 Query
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而文档：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">English
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何配置 Kafka consumer？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka consumer configuration can be customized through...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Multilingual Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multilingual Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>否则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能已经失败。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Reranker 的语言覆盖范围必须与 Embedding / Retrieval Strategy 一致。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="31-domain-specific-reranking">31. Domain-Specific Reranking&lt;/h1>
&lt;p>通用 Reranker：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">General Language
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但企业领域可能有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Medical
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Legal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Financial
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cybersecurity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Software Engineering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如软件工程 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Why does HikariCP connection pool timeout?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个通用模型可能认为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Database Connection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>相关就可以。&lt;/p>
&lt;p>而专业 Reranker 可以进一步理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HikariCP
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Connection Pool
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">maxPoolSize
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">connectionTimeout
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的关系。&lt;/p>
&lt;p>因此对于专业知识库：&lt;/p>
&lt;blockquote>
&lt;p>Domain-Specific Reranker Fine-Tuning 可能带来明显收益。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="32-reranker-fine-tuning">32. Reranker Fine-Tuning&lt;/h1>
&lt;p>如果企业拥有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>数据集：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">q1, d1, relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">q1, d2, irrelevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">q2, d3, relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">q2, d4, irrelevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以用于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Supervised Fine-Tuning
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Pairwise Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="33-pointwise-ranking">33. Pointwise Ranking&lt;/h1>
&lt;p>Pointwise：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">(Query, Document)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">0.93
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>训练目标：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevant = 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Irrelevant = 0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>比较简单。&lt;/p>
&lt;hr>
&lt;h1 id="34-pairwise-ranking">34. Pairwise Ranking&lt;/h1>
&lt;p>Pairwise：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>目标：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A &amp;gt; B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A = Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B = Irrelevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>训练：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score(A) &amp;gt; score(B)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方式更加直接地优化：&lt;/p>
&lt;blockquote>
&lt;p>Ranking。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="35-listwise-ranking">35. Listwise Ranking&lt;/h1>
&lt;p>Listwise：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[D1, D2, D3, D4, D5]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型直接学习：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">最佳排序：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D3 &amp;gt; D1 &amp;gt; D5 &amp;gt; D2 &amp;gt; D4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方法直接关注整个 Ranking List。&lt;/p>
&lt;p>但训练复杂度通常更高。&lt;/p>
&lt;hr>
&lt;h1 id="36-reranking-evaluation">36. Reranking Evaluation&lt;/h1>
&lt;p>Reranker 最重要的指标不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Accuracy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是 Ranking Metrics。&lt;/p>
&lt;p>常见：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hit Rate@K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="37-ndcg-为什么特别重要">37. NDCG 为什么特别重要？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Highly Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Partially Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Irrelevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理想：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A &amp;gt; B &amp;gt; C &amp;gt; D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">D &amp;gt; C &amp;gt; B &amp;gt; A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>虽然：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevant Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能仍然存在，但 Ranking Quality 非常差。&lt;/p>
&lt;p>NDCG 可以很好地衡量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Position
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以它非常适合 Reranker Evaluation。&lt;/p>
&lt;hr>
&lt;h1 id="38-reranker-evaluation-dataset">38. Reranker Evaluation Dataset&lt;/h1>
&lt;p>不要只建立：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query → Relevant Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更好的 Dataset：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance Grade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何避免 Kafka Consumer Rebalance？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document A → 3 Highly Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B → 2 Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C → 1 Weakly Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document D → 0 Irrelevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">NDCG@5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并更准确地比较不同 Reranker。&lt;/p>
&lt;hr>
&lt;h1 id="39-ab-testing">39. A/B Testing&lt;/h1>
&lt;p>生产环境中不要仅仅依赖离线 Evaluation。&lt;/p>
&lt;p>可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Version A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Old Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">New Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A/B Testing
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>观察：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Search CTR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">User Feedback
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Task Success Rate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>特别是在 RAG 中：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Quality 的提升最终应该体现在业务指标上。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="40-reranking-的-observability">40. Reranking 的 Observability&lt;/h1>
&lt;p>一个完整 Trace：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;Kafka consumer lag troubleshooting&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RRF:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 80
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scores:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.98
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.95
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.93
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.88
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时记录：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Count
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Final Count
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Score Distribution
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Token Count
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以发现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">为什么 Top 10 质量下降？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Recall:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">95%
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>说明：&lt;/p>
&lt;blockquote>
&lt;p>问题主要在 Ranking。&lt;/p>
&lt;/blockquote>
&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever Recall:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">60%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;blockquote>
&lt;p>优先修 Retriever，而不是继续调 Reranker。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="41-reranking-与-cache">41. Reranking 与 Cache&lt;/h1>
&lt;p>Reranker 的计算通常比较昂贵。&lt;/p>
&lt;p>可以缓存：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Document ID
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">hash(query, document_id)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">relevance score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果相同 Query 再次出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cache Hit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以直接使用。&lt;/p>
&lt;p>但需要注意：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tenant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Permission
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>否则可能出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Old Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="42-model-versioning">42. Model Versioning&lt;/h1>
&lt;p>Reranker 模型升级：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">v2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能导致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Score Distribution
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>发生变化。&lt;/p>
&lt;p>因此 Cache Key 最好包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">model_version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">document_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">model_version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>否则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能错误使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">v1 score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="43-reranking-service-architecture">43. Reranking Service Architecture&lt;/h1>
&lt;p>企业级 Reranking Service 可以设计为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Retrieval Service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranking Gateway
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────┴──────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> CPU Model GPU Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬──────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Batch Scheduler
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Model Inference
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Scores
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranking Gateway
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Routing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Batching
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fallback
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rate Limit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="44-gpu-与-cpu-的选择">44. GPU 与 CPU 的选择&lt;/h1>
&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">QPS Low
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Short
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Small
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>CPU 可能已经足够。&lt;/p>
&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">QPS High
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Batch Large
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Large
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Long
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>GPU 更有优势。&lt;/p>
&lt;p>所以不要简单认为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker = GPU
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>应该根据：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Throughput
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Batch Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sequence Length
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行 Benchmark。&lt;/p>
&lt;hr>
&lt;h1 id="45-reranking-failure-handling">45. Reranking Failure Handling&lt;/h1>
&lt;p>生产环境中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Unavailable
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GPU OOM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Overloaded
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不能让：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">整个 RAG
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>完全不可用。&lt;/p>
&lt;p>可以设计：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Success → Top-K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Failure → Retriever Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;h1 id="graceful-degradation">Graceful Degradation&lt;/h1>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker Timeout
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Fallback:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector/BM25 Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Quality ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Availability remains high
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这对于生产系统非常重要。&lt;/p>
&lt;hr>
&lt;h1 id="46-reranking-的-cost-optimization">46. Reranking 的 Cost Optimization&lt;/h1>
&lt;p>主要手段：&lt;/p>
&lt;h3 id="1-减少-candidate-size">1. 减少 Candidate Size&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 200
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="2-更小模型">2. 更小模型&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Large Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Small Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="3-batch-inference">3. Batch Inference&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Single
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Batch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="4-context-compression">4. Context Compression&lt;/h3>
&lt;p>减少输入 Token。&lt;/p>
&lt;hr>
&lt;h3 id="5-query-cache">5. Query Cache&lt;/h3>
&lt;p>重复 Query 直接使用结果。&lt;/p>
&lt;hr>
&lt;h3 id="6-routing">6. Routing&lt;/h3>
&lt;p>简单 Query 使用轻量 Reranker：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Complex Query → Large Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Simple Query → Small Model
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="47-adaptive-reranking">47. Adaptive Reranking&lt;/h1>
&lt;p>更高级的架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Complexity Classifier
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌───────────────┬────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Simple │ Complex │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Small Reranker Large Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Redis 是什么？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能只需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“比较 Redis Cluster、Sentinel 和 Codis 的一致性、故障转移和扩展机制。”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Large Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方法可以在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间取得更好的平衡。&lt;/p>
&lt;hr>
&lt;h1 id="48-llm-reranking">48. LLM Reranking&lt;/h1>
&lt;p>除了专门的 Cross-Encoder，还可以让 LLM 进行 Ranking：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rank
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">D1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D4
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>要求 LLM：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">根据 Query 相关性排序。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方法可能具有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">强语义理解
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">复杂推理能力
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但成本通常更高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Token Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>LLM Reranking 更适合高价值、复杂 Query，而不是所有请求。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="49-llm-reranking-的另一个问题">49. LLM Reranking 的另一个问题&lt;/h1>
&lt;p>LLM 可能出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Position Bias
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型可能倾向于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">第一项
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">最后一项
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此生产环境可能需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Randomization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Pairwise Comparison
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multiple Passes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Output
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>来降低排序偏差。&lt;/p>
&lt;hr>
&lt;h1 id="50-reranking-与-lost-in-the-middle">50. Reranking 与 Lost in the Middle&lt;/h1>
&lt;p>LLM Context 中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Middle
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bottom
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不同位置的信息利用率可能不同。&lt;/p>
&lt;p>因此即使：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>都相关，也不能简单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>全部塞给 LLM。&lt;/p>
&lt;p>需要进一步：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Ordering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>把最重要的信息放在更合适的位置。&lt;/p>
&lt;hr>
&lt;h1 id="51-reranking-不只是重新排序">51. Reranking 不只是“重新排序”&lt;/h1>
&lt;p>从更高层次看，Reranking 实际上承担三个任务：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1. Relevance Estimation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">2. Candidate Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3. Context Optimization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>解决：&lt;/p>
&lt;blockquote>
&lt;p>What could be relevant?&lt;/p>
&lt;/blockquote>
&lt;p>Reranker：&lt;/p>
&lt;blockquote>
&lt;p>What is most relevant?&lt;/p>
&lt;/blockquote>
&lt;p>Context Manager：&lt;/p>
&lt;blockquote>
&lt;p>What should the LLM actually see?&lt;/p>
&lt;/blockquote>
&lt;p>这是三个不同的问题。&lt;/p>
&lt;hr>
&lt;h1 id="52-一个完整的-rag-retrieval-pipeline">52. 一个完整的 RAG Retrieval Pipeline&lt;/h1>
&lt;p>综合所有技术，可以形成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────┼───────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> BM25 Vector Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────┼───────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cross-Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 20
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 5-10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Ordering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这才是现代 RAG 中真正成熟的 Retrieval Architecture。&lt;/p>
&lt;hr>
&lt;h1 id="53-reranking-的关键-trade-off">53. Reranking 的关键 Trade-off&lt;/h1>
&lt;p>Reranking 永远存在几个核心 Trade-off：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compute Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Inference Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>不存在“最好的 Reranker”，只有适合当前系统约束的 Reranking Strategy。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="54-从架构师角度理解-reranking">54. 从架构师角度理解 Reranking&lt;/h1>
&lt;p>如果只是知道：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">CrossEncoder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还不够。&lt;/p>
&lt;p>真正需要掌握：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">为什么 Retriever Top-100？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么不是 Top-10？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Reranker 不能搜索整个数据库？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Cross-Encoder 比 Bi-Encoder 更精确？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Batch Inference？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Candidate Size 会影响 Latency？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Recall 是 Reranking 的上限？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 NDCG？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Reranker Fallback？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Reranker 需要 Model Versioning？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Query Complexity 可以决定 Reranker Model？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Reranker 应该成为独立服务？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些问题才是真正的：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Reranking Engineering。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="55-reranking-的技术全景">55. Reranking 的技术全景&lt;/h1>
&lt;p>可以把整个技术体系总结为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌────────────────────┼────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Models Pipeline Systems
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Bi-Encoder Candidate Set Batching
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cross-Encoder Fusion GPU
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Late Interaction Reranking Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM Reranker Context Timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Selection Fallback
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────────────────┼────────────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Evaluation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┼──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> NDCG MRR Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="56-retrievalreranking-与-generation-的关系">56. Retrieval、Reranking 与 Generation 的关系&lt;/h1>
&lt;p>可以用一个非常清晰的三层模型理解现代 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">┌─────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Generation │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ LLM │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Generate Answer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└──────────────┬──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌──────────────┴──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Reranking │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Query-Document Relevance │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Precision Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└──────────────┬──────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Candidates
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌──────────────┴──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Retrieval │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ BM25 / Vector / Hybrid │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Recall Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>三者分别解决：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">“可能相关的是什么？”
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">“真正相关的是什么？”
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generation:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">“如何利用这些信息回答问题？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="57-最终总结">57. 最终总结&lt;/h1>
&lt;p>Reranking 是现代 RAG Retrieval Pipeline 中非常关键的一层。&lt;/p>
&lt;p>它解决的不是：&lt;/p>
&lt;blockquote>
&lt;p>如何从海量数据库中搜索文档？&lt;/p>
&lt;/blockquote>
&lt;p>这是 Retriever 的任务。&lt;/p>
&lt;p>Reranking 解决的是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>在已经召回的候选文档中，哪些文档与当前 Query 真正最相关？&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>因此典型架构是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10M Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Optimization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> = Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> = Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> = Generation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从模型角度：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Bi-Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fast Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cross-Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precise Reranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从系统角度：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Candidate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从性能角度：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Candidate Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Batch Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Sequence Length
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Model Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GPU Utilization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fallback
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从质量角度：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hit Rate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从架构角度：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Generation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>共同构成现代 RAG 的核心链路。&lt;/p>
&lt;p>最终可以用一句话概括 Reranking：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Retrieval 的目标是“不漏掉正确答案”，Reranking 的目标是“把正确答案排到最前面”，而 Context Engineering 的目标则是“让 LLM 看到最有价值的信息”。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这三层结合起来，才构成真正意义上的高质量 RAG Retrieval Architecture。&lt;/p></description></item><item><title>Retrieval：从信息检索到 RAG 核心引擎的深度技术解析</title><link>https://wzhai-hub.github.io/Tony/ai/rag/retrieval/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/retrieval/</guid><description>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>Retrieval 是 RAG（Retrieval-Augmented Generation）、AI Search、Enterprise Knowledge Base 和 Agent 系统中的核心环节。很多工程实践把 RAG 简化成“Embedding + Vector Database + LLM”，但真正决定 AI 应用回答质量的，往往不是 LLM 本身，而是 &lt;strong>Retrieval 能否在海量、异构、动态变化的数据中，准确、高效、安全地找到真正有价值的信息&lt;/strong>。&lt;/p>
&lt;p>从技术本质上看，Retrieval 解决的是一个信息检索问题：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>给定一个 Query，从大规模知识集合中召回最可能与 Query 相关的信息，并在有限的延迟、计算和 Context Window 内，为下游 LLM 提供最高价值的证据。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>现代 Retrieval 已经从传统的 Keyword Search 演进到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-Stage Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Routing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agentic Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>本文从 Information Retrieval 的基本原理开始，深入讨论 BM25、Dense Retrieval、Embedding、ANN、Hybrid Search、Reranking、Query Expansion、Metadata Filtering、Multi-Query、Parent-Child Retrieval、Context Compression、Evaluation，以及生产级 Retrieval Architecture，并进一步分析 Retrieval 在 RAG 和 AI Agent 中的演进方向。&lt;/p>
&lt;hr>
&lt;h1 id="1-retrieval-到底是什么">1. Retrieval 到底是什么？&lt;/h1>
&lt;p>Retrieval 的中文通常翻译为：&lt;/p>
&lt;blockquote>
&lt;p>信息检索。&lt;/p>
&lt;/blockquote>
&lt;p>最简单的定义是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval System
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如用户输入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">如何解决 Java 应用的内存泄漏？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>知识库中可能存在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Heap Dump Analysis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">JVM Memory Leak Troubleshooting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot Performance Tuning
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document D:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka Consumer Optimization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document E:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis Memory Management
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retrieval 的任务不是回答问题。&lt;/p>
&lt;p>它的任务是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">找到：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后将这些信息交给：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此必须区分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval ≠ Generation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retrieval 负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Find Evidence
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LLM 负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Generate Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="2-retrieval-为什么是-rag-的核心">2. Retrieval 为什么是 RAG 的核心？&lt;/h1>
&lt;p>一个典型 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Retrieval 找错了：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Wrong Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Wrong Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即使 LLM 本身能力非常强，也可能因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Missing Information
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Irrelevant Information
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Outdated Information
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Unauthorized Information
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而生成错误结果。&lt;/p>
&lt;p>所以 RAG 的一个核心原则是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Garbage In, Garbage Out。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>对于 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Bad Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bad Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bad Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Quality 往往是 RAG Quality 的上限之一。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="3-retrieval-的数学抽象">3. Retrieval 的数学抽象&lt;/h1>
&lt;p>假设知识库：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">D = {d1, d2, d3, ..., dn}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">q
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retrieval 的目标是找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-K(d | q)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;blockquote>
&lt;p>根据 Query q，找到最相关的 K 个 Document。&lt;/p>
&lt;/blockquote>
&lt;p>可以抽象为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score(q, d)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">q = Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d = Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">sort(score(q,d))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">d1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Retrieval 的核心其实是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Relevance Estimation。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="4-retrieval-的两个核心阶段">4. Retrieval 的两个核心阶段&lt;/h1>
&lt;p>现代 Retrieval 通常可以拆成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Candidate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>第一阶段：&lt;/p>
&lt;blockquote>
&lt;p>尽可能找到所有可能相关的候选文档。&lt;/p>
&lt;/blockquote>
&lt;p>第二阶段：&lt;/p>
&lt;blockquote>
&lt;p>从候选文档中挑选最相关的文档。&lt;/p>
&lt;/blockquote>
&lt;p>所以典型架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 50 / Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5 / Top 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;h1 id="multi-stage-retrieval">Multi-Stage Retrieval&lt;/h1>
&lt;hr>
&lt;h1 id="5-第一代-retrievalkeyword-search">5. 第一代 Retrieval：Keyword Search&lt;/h1>
&lt;p>最传统的信息检索方式是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java memory leak
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>搜索系统寻找包含：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">leak
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>的文档。&lt;/p>
&lt;p>典型技术：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Inverted Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">TF-IDF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="6-inverted-index">6. Inverted Index&lt;/h1>
&lt;p>传统搜索引擎通常不会每次扫描所有 Document。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Redis Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Spring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis PostgreSQL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>建立倒排索引：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Doc1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Doc2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Doc1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Doc3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Doc1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Doc2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java Redis
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以快速定位：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Doc1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Doc2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Doc3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而不是扫描全部文档。&lt;/p>
&lt;p>这就是：&lt;/p>
&lt;blockquote>
&lt;p>Inverted Index。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="7-tf-idf">7. TF-IDF&lt;/h1>
&lt;p>TF-IDF 是经典 Information Retrieval 方法。&lt;/p>
&lt;p>TF：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Term Frequency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>表示一个词在文档中出现的频率。&lt;/p>
&lt;p>IDF：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Inverse Document Frequency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用于降低常见词的权重。&lt;/p>
&lt;p>核心思想：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">词在当前文档出现很多次
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">这个词在整个语料库中比较少见
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">这个词更加重要
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">the
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">is
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">and
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在大量文档中都出现。&lt;/p>
&lt;p>它们的信息量并不高。&lt;/p>
&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">KafkaConsumer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OutOfMemoryError
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RedisCluster
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能更有区分度。&lt;/p>
&lt;hr>
&lt;h1 id="8-bm25">8. BM25&lt;/h1>
&lt;p>BM25 是现代 Keyword Retrieval 中非常重要的 Ranking Function。&lt;/p>
&lt;p>它解决的问题是：&lt;/p>
&lt;blockquote>
&lt;p>一个词出现很多次，是不是意味着这个文档一定更相关？&lt;/p>
&lt;/blockquote>
&lt;p>答案并不是。&lt;/p>
&lt;p>因此 BM25 对：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Term Frequency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Frequency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Length
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行综合计算。&lt;/p>
&lt;p>可以抽象为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25(Query, Document)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终得到一个 relevance score。&lt;/p>
&lt;p>BM25 的一个重要特点是：&lt;/p>
&lt;blockquote>
&lt;p>对 Term Frequency 存在饱和效应。&lt;/p>
&lt;/blockquote>
&lt;p>也就是说：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">第一次出现
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">价值很高
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">第二次出现
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">价值增加
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">出现 100 次
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">不会变成 100 倍重要
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="9-keyword-retrieval-的优势">9. Keyword Retrieval 的优势&lt;/h1>
&lt;p>Keyword Search 并没有因为 Vector Search 出现而失去价值。&lt;/p>
&lt;p>它特别适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Exact Match
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Error Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Product ID
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Class Name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API Name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">File Name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Technical Term
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ERR_CONNECTION_RESET
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果使用纯 Semantic Search：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“网络连接错误”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能得到一些语义相近的信息。&lt;/p>
&lt;p>但用户真正需要的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ERR_CONNECTION_RESET
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对应的知识。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>精确标识符通常应该保留 Keyword Retrieval。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="10-dense-retrieval">10. Dense Retrieval&lt;/h1>
&lt;p>随着 Embedding 技术的发展，Retrieval 开始从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Matching
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Matching
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">如何降低 JVM 内存使用？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Techniques for reducing Java heap consumption
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两者没有完全相同的关键词。&lt;/p>
&lt;p>但是语义非常接近。&lt;/p>
&lt;p>Dense Retrieval 的思想是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity(Query Vector, Document Vector)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="11-dense-retrieval-的核心">11. Dense Retrieval 的核心&lt;/h1>
&lt;p>可以抽象为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">q → f(q)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">d → f(d)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">f()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是 Embedding Model。&lt;/p>
&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">score(q,d)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">=
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">similarity(f(q), f(d))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常见：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dot Product
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Euclidean Distance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这使得 Retrieval 从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Lexical Matching
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>升级到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Matching
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="12-sparse-retrieval-vs-dense-retrieval">12. Sparse Retrieval vs Dense Retrieval&lt;/h1>
&lt;p>两者可以这样理解：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>特性&lt;/th>
&lt;th>Sparse Retrieval&lt;/th>
&lt;th>Dense Retrieval&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>典型方法&lt;/td>
&lt;td>BM25&lt;/td>
&lt;td>Embedding&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>匹配方式&lt;/td>
&lt;td>Keyword&lt;/td>
&lt;td>Semantic&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Exact Match&lt;/td>
&lt;td>强&lt;/td>
&lt;td>中&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>同义表达&lt;/td>
&lt;td>弱&lt;/td>
&lt;td>强&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>技术术语&lt;/td>
&lt;td>强&lt;/td>
&lt;td>视模型而定&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>未知词&lt;/td>
&lt;td>较差&lt;/td>
&lt;td>视模型&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>计算方式&lt;/td>
&lt;td>倒排索引&lt;/td>
&lt;td>Vector Search&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>典型系统&lt;/td>
&lt;td>Elasticsearch&lt;/td>
&lt;td>Vector DB&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>因此二者并不是简单的替代关系。&lt;/p>
&lt;hr>
&lt;h1 id="13-hybrid-retrieval">13. Hybrid Retrieval&lt;/h1>
&lt;p>生产系统经常采用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> +
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dense Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;h1 id="hybrid-retrieval">Hybrid Retrieval&lt;/h1>
&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌────────┴────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> BM25 Search Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50 Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────┬────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以同时利用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Lexical Signal
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Signal
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="14-为什么-hybrid-retrieval-很重要">14. 为什么 Hybrid Retrieval 很重要？&lt;/h1>
&lt;p>假设 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Spring Boot 3.2.5 Actuator
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Keyword Search：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">能够准确匹配：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Boot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3.2.5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Actuator
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Search：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">可能理解：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot monitoring endpoint
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>二者结合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Exact Match
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Understanding
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常比任何一种单独 Retrieval 更鲁棒。&lt;/p>
&lt;hr>
&lt;h1 id="15-retrieval-fusion">15. Retrieval Fusion&lt;/h1>
&lt;p>Hybrid Retrieval 必须解决：&lt;/p>
&lt;blockquote>
&lt;p>BM25 Score 和 Vector Score 如何融合？&lt;/p>
&lt;/blockquote>
&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25 Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cosine Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并不一定处于相同的数值空间。&lt;/p>
&lt;p>直接：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">0.5 × BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.5 × VectorScore
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>未必合理。&lt;/p>
&lt;p>因此一种常见方法是：&lt;/p>
&lt;h1 id="rrf">RRF&lt;/h1>
&lt;p>Reciprocal Rank Fusion。&lt;/p>
&lt;p>核心思想：&lt;/p>
&lt;blockquote>
&lt;p>不直接比较原始 score，而比较排名。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>根据 Rank 计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RRF Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以避免不同 Search Engine Score Scale 不一致的问题。&lt;/p>
&lt;hr>
&lt;h1 id="16-retrieval-的真正难点recall">16. Retrieval 的真正难点：Recall&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">知识库中真正相关文档：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A B C D E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retriever 返回：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A B C X Y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@5 = 3 / 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">60%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Retriever 没有召回：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么后面的 Reranker：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">再强
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也没有意义。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Reranker 只能重新排序已经召回的文档。&lt;/p>
&lt;/blockquote>
&lt;p>这意味着：&lt;/p>
&lt;h1 id="retrieval-recall-是整个-pipeline-的基础">Retrieval Recall 是整个 Pipeline 的基础。&lt;/h1>
&lt;hr>
&lt;h1 id="17-recall-与-precision">17. Recall 与 Precision&lt;/h1>
&lt;p>信息检索中两个非常重要的概念：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Recall：&lt;/p>
&lt;blockquote>
&lt;p>所有相关文档中，我找到了多少？&lt;/p>
&lt;/blockquote>
&lt;p>Precision：&lt;/p>
&lt;blockquote>
&lt;p>我找出来的文档中，有多少是真正相关的？&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevant Documents = 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieved = 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Retrieved = 8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall = 8 / 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision = 8 / 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 RAG 中通常需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">第一阶段：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall First
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">第二阶段：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision Optimization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="18-为什么需要-reranker">18. 为什么需要 Reranker？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些文档只是：&lt;/p>
&lt;blockquote>
&lt;p>“可能相关”。&lt;/p>
&lt;/blockquote>
&lt;p>接下来需要一个更精确的模型重新判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;h1 id="reranking">Reranking&lt;/h1>
&lt;hr>
&lt;h1 id="19-bi-encoder-vs-cross-encoder">19. Bi-Encoder vs Cross-Encoder&lt;/h1>
&lt;p>Dense Retrieval 常见的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Bi-Encoder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">q → Encoder → vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">d → Encoder → vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后比较：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vector(q)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vector(d)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>优势：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Fast
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scalable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因为 Document Vector 可以提前计算。&lt;/p>
&lt;hr>
&lt;h1 id="20-cross-encoder">20. Cross-Encoder&lt;/h1>
&lt;p>Reranker 可以使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query + Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cross Encoder
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何解决 JVM 内存泄漏？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Heap Dump 可以用于分析对象引用链...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>模型直接判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevance = 0.93
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因为 Query 和 Document 同时输入模型：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Cross-Encoder
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常具有更高的相关性判断能力。&lt;/p>
&lt;p>但代价是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query × Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>需要大量模型计算。&lt;/p>
&lt;p>所以：&lt;/p>
&lt;blockquote>
&lt;p>Cross-Encoder 更适合 Reranking，而不是全库 Retrieval。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="21-两阶段-retrieval">21. 两阶段 Retrieval&lt;/h1>
&lt;p>现代 RAG 常见架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Dense Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这实际上是一种：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Coarse Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fine Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也就是：&lt;/p>
&lt;blockquote>
&lt;p>先快后精。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="22-query-understanding">22. Query Understanding&lt;/h1>
&lt;p>很多 Retrieval 问题其实不是 Retriever 的问题。&lt;/p>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>Query 本身就不好。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Kafka 不行了怎么办？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是一个非常模糊的 Query。&lt;/p>
&lt;p>可能实际意思是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Kafka Consumer Lag
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka Broker Failure
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka Producer Timeout
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka Rebalance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka Partition
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此现代 Retrieval Pipeline 往往增加：&lt;/p>
&lt;h1 id="query-understanding">Query Understanding&lt;/h1>
&lt;hr>
&lt;h1 id="23-query-rewrite">23. Query Rewrite&lt;/h1>
&lt;p>LLM 可以把：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Kafka 不行了怎么办？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>转换成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Kafka consumer lag troubleshooting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka broker availability
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka consumer rebalance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka producer timeout
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后分别 Retrieval。&lt;/p>
&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Original Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以显著改善 Retrieval Quality。&lt;/p>
&lt;hr>
&lt;h1 id="24-multi-query-retrieval">24. Multi-Query Retrieval&lt;/h1>
&lt;p>对于复杂问题：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">如何设计一个高并发订单系统？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以生成多个 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">high concurrency order system architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">distributed order processing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">inventory consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">order idempotency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q5:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">distributed transaction
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>分别 Retrieval：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Q1 → Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q2 → Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q3 → Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q4 → Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Q5 → Docs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Merge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Deduplicate
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种方法称为：&lt;/p>
&lt;h1 id="multi-query-retrieval">Multi-Query Retrieval&lt;/h1>
&lt;hr>
&lt;h1 id="25-query-expansion">25. Query Expansion&lt;/h1>
&lt;p>另一种方法是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Original Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Synonym / Related Terms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Expanded Query
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">JVM memory leak
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>扩展：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java heap leak
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OutOfMemoryError
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">heap dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">memory retention
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GC memory issue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样可以提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>特别是对于术语差异较大的知识库。&lt;/p>
&lt;hr>
&lt;h1 id="26-hyde">26. HyDE&lt;/h1>
&lt;p>另一个有趣的方法是：&lt;/p>
&lt;h1 id="hypothetical-document-embeddings">Hypothetical Document Embeddings&lt;/h1>
&lt;p>简称：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HyDE
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>思路：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hypothetical Answer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如用户：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">什么是 JVM Metaspace？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>先让 LLM 生成一个假想回答：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Metaspace is an area used by JVM to store class metadata...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后对这个“假想文档”进行 Embedding。&lt;/p>
&lt;p>这样 Query Vector 更接近真正的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Knowledge Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从而可能改善 Retrieval。&lt;/p>
&lt;hr>
&lt;h1 id="27-metadata-filtering">27. Metadata Filtering&lt;/h1>
&lt;p>Retrieval 不能只考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;tenant&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;enterprise-a&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;department&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;engineering&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;year&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2026&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;document_type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;architecture&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant = enterprise-a
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AND department = engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AND year &amp;gt;= 2025
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这叫：&lt;/p>
&lt;h1 id="filtered-retrieval">Filtered Retrieval&lt;/h1>
&lt;hr>
&lt;h1 id="28-为什么权限过滤必须进入-retrieval">28. 为什么权限过滤必须进入 Retrieval？&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>没有权限读取：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Salary.xlsx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果流程是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authorization Filter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Salary.xlsx
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>已经被 Retrieval 召回。&lt;/p>
&lt;p>如果后续流程出现错误：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM Context
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能泄露敏感信息。&lt;/p>
&lt;p>更安全的方式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Authorization Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Space
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Access Control 必须成为 Retrieval Constraint。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="29-parent-child-retrieval">29. Parent-Child Retrieval&lt;/h1>
&lt;p>RAG 中经常遇到一个问题：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval 粒度与 Context 粒度并不一致。&lt;/p>
&lt;/blockquote>
&lt;p>例如一个章节：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chapter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Section A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Section B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Section C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── Section D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 时：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Section A → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section B → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section C → Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section D → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Query 命中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Section B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终给 LLM 的可能不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Section B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Parent Chapter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;h1 id="parent-child-retrieval">Parent-Child Retrieval&lt;/h1>
&lt;hr>
&lt;h1 id="30-为什么-parent-child-有价值">30. 为什么 Parent-Child 有价值？&lt;/h1>
&lt;p>小 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval Precision ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>大 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Completeness ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Parent-Child Retrieval 可以同时实现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Small Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Accurate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Large Parent Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此它解决了：&lt;/p>
&lt;blockquote>
&lt;p>Search Granularity 与 Context Granularity 的冲突。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="31-contextual-retrieval">31. Contextual Retrieval&lt;/h1>
&lt;p>普通 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“它可以通过增加副本解决这个问题。”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果单独 Embedding：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context 不完整
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">它
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>指什么？&lt;/p>
&lt;p>可以在 Chunk 前增加上下文：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka Consumer Architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Section:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consumer Scaling
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Contextualized Chunk:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">In Kafka Consumer Scaling, increasing the number
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">of consumer instances can improve throughput...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后再 Embedding。&lt;/p>
&lt;p>这样 Retrieval 更容易理解 Chunk 的语义。&lt;/p>
&lt;hr>
&lt;h1 id="32-context-compression">32. Context Compression&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每个 Chunk：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">20,000 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是其中可能只有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">2,000 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>真正有价值。&lt;/p>
&lt;p>因此可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieved Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Sentences
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这可以减少：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Token Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Noise
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="33-retrieval-与-context-window">33. Retrieval 与 Context Window&lt;/h1>
&lt;p>LLM Context Window 越来越大，但：&lt;/p>
&lt;blockquote>
&lt;p>Context Window 大，不代表应该把更多文档全部塞进去。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 100 Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即使 LLM 可以容纳：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100K tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也可能出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Dilution
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Attention Competition
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Noise
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval 的目标不是最大化 Context，而是最大化 Context Utility。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="34-retrieval-的最终目标">34. Retrieval 的最终目标&lt;/h1>
&lt;p>因此一个优秀 Retrieval System 应该优化：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevant Information
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency + Cost + Context
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieved Documents Count
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="35-retrieval-evaluation">35. Retrieval Evaluation&lt;/h1>
&lt;p>这是很多 RAG 项目最容易忽略的部分。&lt;/p>
&lt;p>如果没有 Evaluation：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever 改了
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG 似乎更好了
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但无法知道：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall 是否提高？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision 是否提高？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency 是否下降？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此必须建立 Evaluation Dataset。&lt;/p>
&lt;hr>
&lt;h1 id="36-retrieval-evaluation-dataset">36. Retrieval Evaluation Dataset&lt;/h1>
&lt;p>可以构建：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Expected Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何解决 Redis 热 Key？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevant:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">doc-123
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">chunk-45
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后测试：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-10
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-20
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="37-retrieval-evaluation-metrics">37. Retrieval Evaluation Metrics&lt;/h1>
&lt;p>重要指标包括：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision@K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">MRR
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hit Rate
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="38-hit-rate">38. Hit Rate&lt;/h1>
&lt;p>最简单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>中是否包含至少一个正确文档。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevant:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieved Top-5:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B C A D E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Hit@5 = 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它适合快速判断：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval 是否至少找到了正确答案。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="39-mrr">39. MRR&lt;/h1>
&lt;p>MRR：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Mean Reciprocal Rank
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果正确文档排名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1/2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank 10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1/10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以：&lt;/p>
&lt;blockquote>
&lt;p>正确答案越靠前，MRR 越高。&lt;/p>
&lt;/blockquote>
&lt;p>它非常适合评估：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Ranking Quality
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="40-ndcg">40. NDCG&lt;/h1>
&lt;p>NDCG 更适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">多个相关文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">不同相关程度
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document A = Highly Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document B = Relevant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document C = Slightly Relevant
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>NDCG 可以同时考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relevance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ranking Position
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此在复杂 Retrieval Evaluation 中非常有价值。&lt;/p>
&lt;hr>
&lt;h1 id="41-retrieval-evaluation-与-llm-evaluation">41. Retrieval Evaluation 与 LLM Evaluation&lt;/h1>
&lt;p>应该区分：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval Evaluation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Generation Evaluation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以拆成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall / Precision / NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Faithfulness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Correctness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Relevance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样才能定位问题。&lt;/p>
&lt;p>如果答案错误：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">是 Retriever 找错了？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retriever 找对了，
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM 没有正确使用 Context？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="42-retrieval-failure-taxonomy">42. Retrieval Failure Taxonomy&lt;/h1>
&lt;p>生产环境可以把 Retrieval Failure 分成几类。&lt;/p>
&lt;h2 id="1-query-failure">1. Query Failure&lt;/h2>
&lt;p>用户 Query 本身不清晰。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“这个怎么解决？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="2-index-failure">2. Index Failure&lt;/h2>
&lt;p>数据没有正确建立索引。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Failure
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Missing Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="3-chunk-failure">3. Chunk Failure&lt;/h2>
&lt;p>Chunk 切分错误：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context 被拆散
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="4-retrieval-failure">4. Retrieval Failure&lt;/h2>
&lt;p>正确文档没有被召回。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="5-ranking-failure">5. Ranking Failure&lt;/h2>
&lt;p>正确文档被召回，但是排名太低。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall OK
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision / Ranking ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="6-context-failure">6. Context Failure&lt;/h2>
&lt;p>文档正确，但是上下文被截断。&lt;/p>
&lt;hr>
&lt;h2 id="7-generation-failure">7. Generation Failure&lt;/h2>
&lt;p>Retrieval 正确，LLM 仍然回答错误。&lt;/p>
&lt;hr>
&lt;h1 id="43-retrieval-observability">43. Retrieval Observability&lt;/h1>
&lt;p>生产环境必须能够看到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retriever
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidates
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Final Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此应该记录：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">query_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">tenant_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">retrieval_method
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">top_k
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">candidate_count
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reranker_score
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Retrieval Trace
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query: &amp;#34;Kafka consumer lag&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 42 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 18 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fusion:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 3 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> 86 ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Final:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样才能定位：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">为什么 RAG 慢？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="44-retrieval-latency-budget">44. Retrieval Latency Budget&lt;/h1>
&lt;p>假设整个 API：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">P95 &amp;lt; 2 seconds
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以设计：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Rewrite 150ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding 50ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search 50ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search 30ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Fusion 5ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker 200ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM 1200ms
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Network 100ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>总计：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">≈ 1.785 seconds
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样才能进行真正的：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Performance Engineering。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="45-retrieval-cache">45. Retrieval Cache&lt;/h1>
&lt;p>对于高频 Query：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“什么是 Kubernetes？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能重复出现。&lt;/p>
&lt;p>可以使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Cache
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Result Cache
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Normalize
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cache
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但需要注意：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Knowledge Base 更新
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>以后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Old Retrieval Result
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能失效。&lt;/p>
&lt;p>因此 Cache 必须考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">TTL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Knowledge Base Revision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tenant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Permission
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="46-retrieval-与数据新鲜度">46. Retrieval 与数据新鲜度&lt;/h1>
&lt;p>企业知识库通常不断更新：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document v1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document v2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document v3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 Retrieval 返回旧版本：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Outdated Context
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>LLM 可能生成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Outdated Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Retrieval 需要考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Updated At
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Effective Date
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Expiration
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">WHERE effective_from &amp;lt;= now()
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AND effective_to &amp;gt; now()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="47-temporal-retrieval">47. Temporal Retrieval&lt;/h1>
&lt;p>有些问题具有时间语义：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">2024 年公司的报销政策是什么？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>和：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">2026 年公司的报销政策是什么？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>答案可能不同。&lt;/p>
&lt;p>因此 Retrieval 不仅需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Temporal Filtering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Time Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="48-retrieval-router">48. Retrieval Router&lt;/h1>
&lt;p>不同 Query 最适合不同 Retrieval Strategy。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Redis Cluster 是什么？”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“Redis 7.2.1 configuration”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>复杂问题：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“为什么 Redis Cluster 在网络分区下可能出现……”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此可以增加：&lt;/p>
&lt;h1 id="retrieval-router">Retrieval Router&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Classifier / LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌─────────────┬─────────────┬─────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Keyword │ Vector │ Hybrid │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────┴─────────────┴─────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="49-agentic-retrieval">49. Agentic Retrieval&lt;/h1>
&lt;p>传统 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieve
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Agentic Retrieval：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Plan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Analyze
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Need More Information?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├── Yes → Search Again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └── No
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“比较 Kafka、Pulsar 和 RabbitMQ 在高吞吐场景下的优缺点。”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Agent 可以拆成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka throughput
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Pulsar architecture
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query 3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RabbitMQ performance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query 4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compare messaging semantics
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Parallel Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Merge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Evidence Analysis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这标志着 Retrieval 从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Static Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>向：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Dynamic Information Seeking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>演进。&lt;/p>
&lt;hr>
&lt;h1 id="50-graph-retrieval">50. Graph Retrieval&lt;/h1>
&lt;p>并不是所有知识都适合纯 Vector Retrieval。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Employee
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">works_for
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Company
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">owns
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Project
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">uses
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Technology
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种关系型知识更适合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Knowledge Graph
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此未来 Retrieval 很可能变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────┼───────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Keyword Vector Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────┼───────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是：&lt;/p>
&lt;h1 id="multi-modal-retrieval-architecture">Multi-Modal Retrieval Architecture&lt;/h1>
&lt;p>这里的“Multi-Modal”不仅可以指：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Image
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Audio
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也可以理解为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>多种 Retrieval Modality 的融合。&lt;/p>
&lt;hr>
&lt;h1 id="51-retrieval-与-ai-agent-memory">51. Retrieval 与 AI Agent Memory&lt;/h1>
&lt;p>AI Agent 需要记住：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Conversation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">User Preferences
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Previous Tasks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Knowledge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tool Results
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些信息可以进入不同 Memory：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Short-Term Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Long-Term Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Episodic Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Memory
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Retrieval 则负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">当前任务
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">需要什么历史信息？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval 是 Agent Memory 被“取出来”的核心机制。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="52-一个成熟-retrieval-architecture">52. 一个成熟 Retrieval Architecture&lt;/h1>
&lt;p>综合前面的技术，可以得到一个生产级架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────┴────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Rewrite Query Routing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────┬────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Retrieval Layer │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ BM25 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Vector Search │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Metadata Filter │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Graph Retrieval │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────┬──────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Set
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion / Merge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这已经不是简单的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector DB Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是完整的：&lt;/p>
&lt;h1 id="retrieval-system">Retrieval System&lt;/h1>
&lt;hr>
&lt;h1 id="53-retrieval-system-的五层架构">53. Retrieval System 的五层架构&lt;/h1>
&lt;p>可以进一步抽象为五层。&lt;/p>
&lt;h2 id="layer-1query-layer">Layer 1：Query Layer&lt;/h2>
&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Expansion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Classification
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="layer-2retrieval-layer">Layer 2：Retrieval Layer&lt;/h2>
&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dense Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="layer-3ranking-layer">Layer 3：Ranking Layer&lt;/h2>
&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Scoring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Deduplication
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="layer-4context-layer">Layer 4：Context Layer&lt;/h2>
&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Context Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ordering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Token Budget
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="layer-5evaluation--observability">Layer 5：Evaluation &amp;amp; Observability&lt;/h2>
&lt;p>负责：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tracing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Quality Evaluation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="54-retrieval-的本质information-bottleneck">54. Retrieval 的本质：Information Bottleneck&lt;/h1>
&lt;p>从架构角度看，LLM 的 Context Window 是有限的。&lt;/p>
&lt;p>假设知识库：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10M documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但 LLM 最终只能看到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10 documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么 Retrieval 就成为一个：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Information Bottleneck。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>它必须完成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1000
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">100
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每一次压缩都会产生信息损失。&lt;/p>
&lt;p>因此 Retrieval 真正解决的是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>如何在有限的信息预算中最大化有效信息密度。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这比单纯的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“找到相似文档”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>要深得多。&lt;/p>
&lt;hr>
&lt;h1 id="55-retrieval-的核心-trade-off">55. Retrieval 的核心 Trade-off&lt;/h1>
&lt;p>一个生产级 Retrieval System 永远存在以下权衡：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Precision
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context Noise
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Freshness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Accuracy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking Quality
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↕
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compute Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不存在一个：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Best Retrieval Algorithm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>只有：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>针对特定业务场景的最佳 Retrieval Architecture。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="56-从架构师角度重新理解-retrieval">56. 从架构师角度重新理解 Retrieval&lt;/h1>
&lt;p>如果只会：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vector_db.search()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>只能说明：&lt;/p>
&lt;blockquote>
&lt;p>会调用 Retrieval API。&lt;/p>
&lt;/blockquote>
&lt;p>真正理解 Retrieval，需要能够回答：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">为什么使用 BM25？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么使用 Vector Search？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Hybrid Search？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Retriever Top-100？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Reranker Top-10？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Query Rewrite？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Metadata Filter？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Parent-Child Retrieval？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Recall 比 Precision 更先优化？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么需要 Evaluation Dataset？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Retrieval Latency 会成为 RAG 性能瓶颈？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么权限必须进入 Retrieval？
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">为什么 Agent 需要 Iterative Retrieval？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当能够回答这些问题时，才真正进入：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Architecture。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="57-retrieval-技术栈全景">57. Retrieval 技术栈全景&lt;/h1>
&lt;p>可以把现代 Retrieval 技术体系总结成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────┼────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Retrieval Ranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Processing Engine Engine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Rewrite BM25 RRF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Expansion Vector Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Multi-Query Hybrid NDCG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> HyDE Graph Dedup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────┼────────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Management
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="58-总结">58. 总结&lt;/h1>
&lt;p>Retrieval 是 AI 应用中连接：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Knowledge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>的核心桥梁。&lt;/p>
&lt;p>它经历了：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dense Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Optimization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-Stage Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Agentic Retrieval
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个成熟的 Retrieval Pipeline 通常是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Understanding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Routing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌───────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Keyword Retrieval │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Vector Retrieval │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Metadata Filtering │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ Graph Retrieval │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└───────────┬───────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Set
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Fusion / Merge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Compression
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而 Retrieval 的最终目标不是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>找到最多的文档。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>也不是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>找到最相似的向量。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>在有限的延迟、计算、Token 和安全约束下，为下游模型提供最相关、最可靠、最新且用户有权限访问的信息。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>因此，如果把现代 AI Application 抽象成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">AI Application
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Agent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌─────┼──────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25 Vector Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────┼──────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么可以认为：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>LLM 决定 AI 能不能“理解和生成”，而 Retrieval 决定 AI 能不能“找到正确的信息”。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这也是为什么在企业级 AI 系统中，Retrieval 正逐渐从一个简单的 Search Component，演变为独立的 &lt;strong>Retrieval Engineering / Retrieval Architecture&lt;/strong> 领域。&lt;/p></description></item><item><title>Vector Database：从向量表示、近似最近邻搜索到生产级 RAG 架构的深度解析</title><link>https://wzhai-hub.github.io/Tony/ai/rag/vector-database/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://wzhai-hub.github.io/Tony/ai/rag/vector-database/</guid><description>&lt;h1 id="1-为什么需要-vector-database">1. 为什么需要 Vector Database？&lt;/h1>
&lt;p>传统数据库最擅长的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">SELECT * FROM documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">WHERE category = &amp;#39;Java&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AND author = &amp;#39;Vincent&amp;#39;;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这种查询依赖的是：&lt;/p>
&lt;ul>
&lt;li>精确匹配&lt;/li>
&lt;li>范围查询&lt;/li>
&lt;li>排序&lt;/li>
&lt;li>聚合&lt;/li>
&lt;li>Join&lt;/li>
&lt;/ul>
&lt;p>但是 AI 应用经常面对另外一种问题：&lt;/p>
&lt;blockquote>
&lt;p>“找出与这段问题语义最相关的 10 个文档。”&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">如何解决 Java 应用中的内存泄漏？
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户真正希望找到的可能是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">JVM Memory Leak Troubleshooting
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Java Heap Dump Analysis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GC Tuning
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">OutOfMemoryError Investigation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这些文档可能根本没有出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">“如何解决 Java 应用中的内存泄漏”
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此传统 SQL 的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LIKE &amp;#39;%内存泄漏%&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>并不能很好地解决问题。&lt;/p>
&lt;p>Vector Database 的思路是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding Model
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Similarity Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K Documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>核心变化是：&lt;/p>
&lt;blockquote>
&lt;p>从“关键词匹配”转向“语义空间中的相似性匹配”。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="2-vector-database-的本质">2. Vector Database 的本质&lt;/h1>
&lt;p>理解 Vector Database，首先必须理解 Vector。&lt;/p>
&lt;p>假设一个 Embedding Model 把一句话转换成 4 维向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Java memory leak&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[0.12, 0.83, -0.21, 0.47]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>另外一句：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;JVM memory troubleshooting&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[0.15, 0.79, -0.18, 0.44]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两个向量在空间中的位置非常接近。&lt;/p>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Similarity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Geometric Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就是 Embedding + Vector Search 的基础。&lt;/p>
&lt;p>真实系统中的向量维度通常远高于 4，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">384
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">768
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1024
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1536
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">3072
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Vector Database 实际面对的是：&lt;/p>
&lt;blockquote>
&lt;p>高维空间中的海量向量近邻搜索问题。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="3-embedding向量数据库的入口">3. Embedding：向量数据库的入口&lt;/h1>
&lt;p>Vector Database 本身并不理解：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring Boot
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它理解的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">[0.123, -0.293, 0.831, ...]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding Model 负责完成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Human Language
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Dense Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Redis is an in-memory database&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">[0.021, 0.193, -0.823, ...]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding 的核心思想是：&lt;/p>
&lt;blockquote>
&lt;p>将语义相近的数据映射到向量空间中相近的位置。&lt;/p>
&lt;/blockquote>
&lt;p>因此：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Java Memory Leak&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;JVM Heap Problem&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常会比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Java Memory Leak&amp;#34;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&amp;#34;Pizza Recipe&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更加接近。&lt;/p>
&lt;hr>
&lt;h1 id="4-vector-space">4. Vector Space&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Java
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Spring
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Pizza
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Football
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>被映射到二维空间。&lt;/p>
&lt;p>可以抽象成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Java ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Spring ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● Pizza
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● Football
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>虽然真实 Embedding 通常是数百或数千维，但数学原理类似。&lt;/p>
&lt;p>Vector Database 的主要任务就是：&lt;/p>
&lt;blockquote>
&lt;p>给定一个 Query Vector，快速找到空间中距离它最近的 K 个向量。&lt;/p>
&lt;/blockquote>
&lt;p>这就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">K-Nearest Neighbor
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>简称：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">KNN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="5-为什么不能直接暴力搜索">5. 为什么不能直接暴力搜索？&lt;/h1>
&lt;p>假设数据库中有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000,000 vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>每个向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1536 dimensions
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最简单的方法是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector 1 → calculate distance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector 2 → calculate distance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector 3 → calculate distance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector 1,000,000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>复杂度近似：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">O(N × D)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">N = vector count
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D = vector dimension
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">N = 100M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">D = 1536
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>暴力计算会非常昂贵。&lt;/p>
&lt;p>因此 Vector Database 的核心技术实际上是：&lt;/p>
&lt;blockquote>
&lt;p>如何牺牲少量召回精度，换取数量级的搜索性能提升。&lt;/p>
&lt;/blockquote>
&lt;p>这就是：&lt;/p>
&lt;h1 id="approximate-nearest-neighbor">Approximate Nearest Neighbor&lt;/h1>
&lt;hr>
&lt;h1 id="6-annapproximate-nearest-neighbor">6. ANN：Approximate Nearest Neighbor&lt;/h1>
&lt;p>ANN 的核心思想：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Exact Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">100% 精确
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">成本高
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Approximate Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">接近最优答案
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">性能大幅提升
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000,000 vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>暴力搜索可能需要比较：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">1,000,000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>个向量。&lt;/p>
&lt;p>ANN 索引可能只需要探索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">几百
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">几千
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>个候选向量。&lt;/p>
&lt;p>最终得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-K approximate nearest neighbors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这也是 Vector Database 的核心竞争力之一。&lt;/p>
&lt;hr>
&lt;h1 id="7-distance-metric">7. Distance Metric&lt;/h1>
&lt;p>向量数据库并不是简单判断：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vectorA == vectorB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是计算两个向量之间的距离或相似度。&lt;/p>
&lt;p>常见方法包括：&lt;/p>
&lt;ol>
&lt;li>Cosine Similarity&lt;/li>
&lt;li>Euclidean Distance&lt;/li>
&lt;li>Inner Product / Dot Product&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h1 id="8-cosine-similarity">8. Cosine Similarity&lt;/h1>
&lt;p>Cosine Similarity：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">cos(A,B) =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">(A · B) / (||A|| ||B||)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它关注的是：&lt;/p>
&lt;blockquote>
&lt;p>两个向量方向是否相似。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A →
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B →
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>方向非常接近：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">cos(A,B) ≈ 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果方向相反：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">cos(A,B) ≈ -1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在很多语义搜索场景中，Cosine Similarity 非常常见。&lt;/p>
&lt;hr>
&lt;h1 id="9-euclidean-distance">9. Euclidean Distance&lt;/h1>
&lt;p>欧氏距离：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">d(A,B) =
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sqrt(
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Σ(ai - bi)^2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>二维情况下就是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> B ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> /
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两点之间的直线距离越小：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Distance ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="10-inner-product">10. Inner Product&lt;/h1>
&lt;p>内积：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A · B
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>对于归一化向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">||A|| = ||B|| = 1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Cosine Similarity 与 Inner Product 在排序意义上可以等价。&lt;/p>
&lt;p>因此很多系统会进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Normalize Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Inner Product Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>来优化计算。&lt;/p>
&lt;hr>
&lt;h1 id="11-vector-index-的核心">11. Vector Index 的核心&lt;/h1>
&lt;p>Vector Database 的性能，很大程度上取决于：&lt;/p>
&lt;blockquote>
&lt;p>使用什么 Vector Index。&lt;/p>
&lt;/blockquote>
&lt;p>常见索引：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HNSW
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">IVF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PQ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">IVF-PQ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DiskANN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ScaNN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中工程实践中最重要的之一就是：&lt;/p>
&lt;h1 id="hnsw">HNSW&lt;/h1>
&lt;hr>
&lt;h1 id="12-hnswhierarchical-navigable-small-world">12. HNSW：Hierarchical Navigable Small World&lt;/h1>
&lt;p>HNSW 是现代 Vector Search 中非常重要的一种 ANN 算法。&lt;/p>
&lt;p>它的思想来源于：&lt;/p>
&lt;blockquote>
&lt;p>Small World Network。&lt;/p>
&lt;/blockquote>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A —— B —— C —— D —— E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果增加一些远距离连接：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A ───────── D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B ──────── E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么从 A 到 E 就可以快速跳跃。&lt;/p>
&lt;p>HNSW 就利用类似思想构建多层图。&lt;/p>
&lt;hr>
&lt;h1 id="13-hnsw-的层级结构">13. HNSW 的层级结构&lt;/h1>
&lt;p>可以抽象成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Layer 2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A -------------------- G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Layer 1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A ------- C ---------- G
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> |
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Layer 0:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A -- B -- C -- D -- E -- F -- G
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最高层：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">节点少
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">连接跨度大
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>底层：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">节点多
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">局部连接密集
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>搜索过程类似：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">快速定位大致区域
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Lower Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">逐渐缩小搜索范围
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Base Layer
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="14-hnsw-为什么快">14. HNSW 为什么快？&lt;/h1>
&lt;p>如果没有索引：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1M vectors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">calculate all distances
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>HNSW：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Entry Point
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Navigate Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Nodes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此不需要遍历整个数据库。&lt;/p>
&lt;hr>
&lt;h1 id="15-hnsw-的核心参数">15. HNSW 的核心参数&lt;/h1>
&lt;p>HNSW 常见参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">efConstruction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">efSearch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="m">M&lt;/h3>
&lt;p>表示节点连接数量的控制参数。&lt;/p>
&lt;p>M 越大：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Graph Connectivity ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Build Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="efconstruction">efConstruction&lt;/h3>
&lt;p>控制构建索引时搜索候选数量。&lt;/p>
&lt;p>通常：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">efConstruction ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Quality ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Build Time ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="efsearch">efSearch&lt;/h3>
&lt;p>控制查询阶段搜索范围。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">efSearch ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>efSearch 是一个非常典型的 Recall / Latency Trade-off。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="16-ivfinverted-file-index">16. IVF：Inverted File Index&lt;/h1>
&lt;p>另一类重要方法是 IVF。&lt;/p>
&lt;p>核心思想：&lt;/p>
&lt;blockquote>
&lt;p>先把向量空间划分成多个 Cluster。&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Space
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cluster A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● ● ● ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cluster B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● ● ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cluster C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● ● ● ● ●
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Cluster D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ● ●
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">K-Means
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>建立：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Centroids
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="17-ivf-search">17. IVF Search&lt;/h1>
&lt;p>查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Find nearest centroid
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search selected clusters
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100 clusters
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查询时可能只搜索：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">5 clusters
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100 clusters
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样就降低了计算量。&lt;/p>
&lt;hr>
&lt;h1 id="18-pqproduct-quantization">18. PQ：Product Quantization&lt;/h1>
&lt;p>当 Vector 数量非常大时，还有一个重要问题：&lt;/p>
&lt;blockquote>
&lt;p>Memory。&lt;/p>
&lt;/blockquote>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100M vectors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dimension = 1536
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">float32 = 4 bytes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>仅原始向量大约需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100M × 1536 × 4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">≈ 614.4 GB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还没有计算：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Overhead
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此必须压缩。&lt;/p>
&lt;p>这就是：&lt;/p>
&lt;h1 id="product-quantization">Product Quantization&lt;/h1>
&lt;hr>
&lt;h1 id="19-pq-的核心思想">19. PQ 的核心思想&lt;/h1>
&lt;p>例如一个向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">[1,2,3,4,5,6,7,8]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以拆成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">[1,2] [3,4] [5,6] [7,8]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后每个子空间使用 Codebook 进行量化。&lt;/p>
&lt;p>原始：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Float Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Compact Codes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从而显著降低：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Storage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Bandwidth
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>代价是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Accuracy ↓
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 PQ 本质上是：&lt;/p>
&lt;blockquote>
&lt;p>用一定的精度损失换取巨大的存储效率。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="20-hnsw-vs-ivf-vs-pq">20. HNSW vs IVF vs PQ&lt;/h1>
&lt;p>可以简单理解：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>技术&lt;/th>
&lt;th>核心思想&lt;/th>
&lt;th>优势&lt;/th>
&lt;th>代价&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>HNSW&lt;/td>
&lt;td>Graph&lt;/td>
&lt;td>高 Recall、低延迟&lt;/td>
&lt;td>内存高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>IVF&lt;/td>
&lt;td>Cluster&lt;/td>
&lt;td>搜索效率高&lt;/td>
&lt;td>参数敏感&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>PQ&lt;/td>
&lt;td>Compression&lt;/td>
&lt;td>节省大量内存&lt;/td>
&lt;td>精度损失&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>IVF-PQ&lt;/td>
&lt;td>Cluster + Compression&lt;/td>
&lt;td>大规模场景&lt;/td>
&lt;td>系统复杂度高&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DiskANN&lt;/td>
&lt;td>Disk-based Graph&lt;/td>
&lt;td>超大规模&lt;/td>
&lt;td>工程复杂&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>因此实际系统通常不是简单选择一个算法，而是组合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">IVF + PQ
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HNSW + Quantization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="21-vector-database-并不只是-vector">21. Vector Database 并不只是 Vector&lt;/h1>
&lt;p>一个成熟的 Vector Database 通常存储：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ID
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Timestamp
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tenant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Category
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Permission
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;doc-001&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;vector&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="mf">0.12&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.38&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="err">...&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;text&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Spring Boot transaction management&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;metadata&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;category&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Java&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;author&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Vincent&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;tenant&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;enterprise-a&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Vector Database 实际上更接近：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search Engine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Distributed Storage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="22-metadata-filtering">22. Metadata Filtering&lt;/h1>
&lt;p>这是生产环境非常重要的问题。&lt;/p>
&lt;p>假设数据库中有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">10M documents
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户属于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant-A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么搜索不能仅仅：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vector similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>还必须：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant = A
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此查询实际上变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Similarity Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">WHERE tenant_id = &amp;#39;A&amp;#39;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AND document_type = &amp;#39;technical&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后再进行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Similarity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者反过来：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Set
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>两种执行方式的性能可能完全不同。&lt;/p>
&lt;hr>
&lt;h1 id="23-filtering-是-vector-search-的难点">23. Filtering 是 Vector Search 的难点&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100M vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant-A only = 10K vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果先做 ANN：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100M → ANN → candidates → filter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能浪费大量计算。&lt;/p>
&lt;p>如果先 Filter：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100M → filter → 10K → ANN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>则可能非常高效。&lt;/p>
&lt;p>但如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant-A = 80M
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>情况又不同。&lt;/p>
&lt;p>所以生产级 Vector Engine 必须考虑：&lt;/p>
&lt;blockquote>
&lt;p>Filter Selectivity。&lt;/p>
&lt;/blockquote>
&lt;p>这也是 Vector Search Engine 与简单 ANN Library 的重要区别之一。&lt;/p>
&lt;hr>
&lt;h1 id="24-hybrid-search">24. Hybrid Search&lt;/h1>
&lt;p>纯 Vector Search 并不能解决所有搜索问题。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">&amp;#34;Spring Boot 3.2.5&amp;#34;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">3.2.5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>是一个非常精确的版本号。&lt;/p>
&lt;p>Semantic Search 不一定比：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">BM25
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更好。&lt;/p>
&lt;p>因此现代 AI Search 通常采用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;h1 id="hybrid-search">Hybrid Search&lt;/h1>
&lt;hr>
&lt;h1 id="25-bm25--vector">25. BM25 + Vector&lt;/h1>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">BM25 Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Semantic
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Score Score
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Rank Fusion
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样既能处理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Exact Match
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>也能处理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Semantic Match
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="26-rrfreciprocal-rank-fusion">26. RRF：Reciprocal Rank Fusion&lt;/h1>
&lt;p>一种常见的融合方法是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RRF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A, B, C, D
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">B, D, A, E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可以根据排名计算综合得分。&lt;/p>
&lt;p>核心思想不是直接比较：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Score
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是利用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Rank
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行融合。&lt;/p>
&lt;p>这通常比简单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">0.5 × Vector Score
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">0.5 × Keyword Score
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>更加稳定。&lt;/p>
&lt;hr>
&lt;h1 id="27-vector-database-与-rag">27. Vector Database 与 RAG&lt;/h1>
&lt;p>Vector Database 最重要的应用之一就是：&lt;/p>
&lt;h1 id="rag">RAG&lt;/h1>
&lt;p>完整流程：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>用户提问：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K Chunks
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prompt Construction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>Vector Database 是 RAG Retrieval Layer 的核心基础设施。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="28-rag-中最容易被忽视的问题chunking">28. RAG 中最容易被忽视的问题：Chunking&lt;/h1>
&lt;p>很多人认为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RAG = Embedding + Vector Database + LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是不完整的。&lt;/p>
&lt;p>实际上：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Chunking 对最终 Recall 有巨大影响。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">一个 100 页 PDF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果整个 PDF 只生成一个向量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PDF → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么检索粒度太粗。&lt;/p>
&lt;p>如果切得太碎：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">每 20 个字符一个 Chunk
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>又会丢失上下文。&lt;/p>
&lt;p>因此需要设计：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Chunk Size
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunk Overlap
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parent-Child Chunk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="29-retrieval-的完整链路">29. Retrieval 的完整链路&lt;/h1>
&lt;p>一个生产级 RAG Retrieval Pipeline 可以是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ANN Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Candidate Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里最值得注意的是：&lt;/p>
&lt;blockquote>
&lt;p>Vector Database 只是 Retrieval Pipeline 的一个组件。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="30-reranker">30. Reranker&lt;/h1>
&lt;p>Vector Search 找到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是最终给 LLM 的可能只有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>中间可以增加：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector DB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top 5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding Model 更擅长：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">快速召回
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Reranker 更擅长：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">精确判断 Query 与 Document 的相关性
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此可以形成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding → Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker → Precision
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是现代 RAG 中非常重要的两阶段检索架构。&lt;/p>
&lt;hr>
&lt;h1 id="31-recall-与-precision-的平衡">31. Recall 与 Precision 的平衡&lt;/h1>
&lt;p>假设真正相关的文档有：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A B C
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Search 返回：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A B X Y Z
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall = 2 / 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A B C X Y Z
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Recall 提高。&lt;/p>
&lt;p>但是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Noise ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Context ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Retrieval 的核心不是：&lt;/p>
&lt;blockquote>
&lt;p>“找到最多的数据。”&lt;/p>
&lt;/blockquote>
&lt;p>而是：&lt;/p>
&lt;blockquote>
&lt;p>在有限延迟和 Token Budget 下，找到最有价值的数据。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="32-vector-database-的性能指标">32. Vector Database 的性能指标&lt;/h1>
&lt;p>生产环境不能只看：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">QPS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>至少需要关注：&lt;/p>
&lt;h3 id="recall">Recall&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="latency">Latency&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">P50
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">P95
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">P99
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="throughput">Throughput&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">QPS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="memory">Memory&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">GB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="index-build-time">Index Build Time&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Index Construction Duration
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="update-latency">Update Latency&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Insert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Delete
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="freshness">Freshness&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document → Searchable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>之间的时间。&lt;/p>
&lt;hr>
&lt;h1 id="33-recallk">33. Recall@K&lt;/h1>
&lt;p>假设：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Ground Truth:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">A B C D E
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Search：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">A B C X Y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>那么：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall@5 = 3 / 5 = 60%
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Recall 是评估 ANN Index 最重要的指标之一。&lt;/p>
&lt;p>通常需要建立：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">vs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>曲线。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">efSearch ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>最终寻找：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Best Operating Point
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="34-vector-database-的分布式架构">34. Vector Database 的分布式架构&lt;/h1>
&lt;p>当数据规模达到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">100M
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10B vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>单机已经无法解决所有问题。&lt;/p>
&lt;p>因此需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Client
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Partition
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Nodes
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Storage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常见设计包括：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Sharding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Load Balancing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Distributed Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Object Storage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">WAL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="35-sharding">35. Sharding&lt;/h1>
&lt;p>可以按照：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Tenant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hash
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Partition
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>进行分片。&lt;/p>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Shard 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10M vectors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Shard 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10M vectors
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Shard 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">10M vectors
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Router
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Shard 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Shard 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Shard 3
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Local Top-K
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Global Merge
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里会产生一个重要问题：&lt;/p>
&lt;h1 id="distributed-top-k">Distributed Top-K&lt;/h1>
&lt;p>每个节点只返回：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Local Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后 Router：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Merge
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>得到：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Global Top-K
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="36-replication">36. Replication&lt;/h1>
&lt;p>Vector Search 通常是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Read Heavy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此可以通过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Leader
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replica 1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replica 2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replica 3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>提高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Read Throughput
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Availability
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是更新时需要解决：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Index Consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Data Consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replica Lag
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="37-vector-database-的一致性问题">37. Vector Database 的一致性问题&lt;/h1>
&lt;p>传统数据库通常讨论：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Strong Consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Eventual Consistency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Database 还有一个非常特殊的问题：&lt;/p>
&lt;blockquote>
&lt;p>数据已经写入，但索引是否已经更新？&lt;/p>
&lt;/blockquote>
&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">t0:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Insert Document
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">t1:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Document stored
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">t2:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding generated
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">t3:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector index updated
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">t4:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Searchable
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此生产系统需要定义：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Write-to-Search Latency
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>即：&lt;/p>
&lt;blockquote>
&lt;p>一条数据写入之后，需要多长时间才能被搜索到？&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="38-delete-也非常复杂">38. Delete 也非常复杂&lt;/h1>
&lt;p>删除：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不意味着：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cache
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时消失。&lt;/p>
&lt;p>可能需要：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Tombstone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compaction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Rebuild
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Garbage Collection
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Vector Database 的数据生命周期通常是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Insert
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tombstone
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compaction
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="39-vector-database-与传统数据库">39. Vector Database 与传统数据库&lt;/h1>
&lt;p>Vector Database 并不是：&lt;/p>
&lt;blockquote>
&lt;p>“MongoDB / PostgreSQL 的替代品。”&lt;/p>
&lt;/blockquote>
&lt;p>更合理的理解是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Relational DB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Transactional Data
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search Engine
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Semantic Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>现代系统经常是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">PostgreSQL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Redis
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Kafka
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Elasticsearch
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Object Storage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>不同组件解决不同问题。&lt;/p>
&lt;hr>
&lt;h1 id="40-postgresql--pgvector">40. PostgreSQL + pgvector&lt;/h1>
&lt;p>对于很多中小型系统，并不一定需要部署独立 Vector Database。&lt;/p>
&lt;p>如果已经使用 PostgreSQL，可以通过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">pgvector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>增加向量能力。&lt;/p>
&lt;p>架构：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Application
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PostgreSQL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Relational DB │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Vector │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Metadata │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>它的优势是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Architecture Simplicity
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Transaction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">SQL
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Metadata Filtering
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此对于中小规模 RAG：&lt;/p>
&lt;blockquote>
&lt;p>PostgreSQL + pgvector 往往是一个非常值得优先考虑的架构。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="41-专业-vector-database">41. 专业 Vector Database&lt;/h1>
&lt;p>当系统进一步扩大，可以考虑专门的 Vector Database / Vector Search Engine。&lt;/p>
&lt;p>典型技术路线包括：&lt;/p>
&lt;ul>
&lt;li>Milvus&lt;/li>
&lt;li>Qdrant&lt;/li>
&lt;li>Weaviate&lt;/li>
&lt;li>Pinecone&lt;/li>
&lt;li>Elasticsearch Vector Search&lt;/li>
&lt;li>OpenSearch Vector Search&lt;/li>
&lt;li>MongoDB Atlas Vector Search&lt;/li>
&lt;li>PostgreSQL + pgvector&lt;/li>
&lt;/ul>
&lt;p>不同系统在：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Scale
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Performance
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cloud Integration
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Operational Complexity
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>方面各有取舍。&lt;/p>
&lt;p>因此不要简单认为：&lt;/p>
&lt;blockquote>
&lt;p>“某个 Vector Database 性能最高，所以一定应该使用它。”&lt;/p>
&lt;/blockquote>
&lt;p>真正应该问的是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Data Size?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">QPS?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filtering?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Multi-tenancy?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Update Frequency?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Deployment Model?
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Operational Capability?
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="42-vector-database-的-cap-视角">42. Vector Database 的 CAP 视角&lt;/h1>
&lt;p>对于分布式 Vector Search，可以从三个角度分析：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Availability
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Partition Tolerance
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>但 Vector Database 与传统 OLTP 最大不同之一是：&lt;/p>
&lt;blockquote>
&lt;p>Retrieval Quality 本身也是系统设计指标。&lt;/p>
&lt;/blockquote>
&lt;p>因此实际上需要同时考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Consistency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Availability
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Recall
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Freshness
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这是一种更加符合 AI Search 的工程权衡。&lt;/p>
&lt;hr>
&lt;h1 id="43-多租户架构">43. 多租户架构&lt;/h1>
&lt;p>企业级 RAG 通常不是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">One User
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">One Knowledge Base
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Tenant A
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tenant B
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Tenant C
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此 Vector Database 必须解决：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Tenant Isolation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authorization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Isolation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Resource Isolation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个常见设计是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">metadata:
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> tenant_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> document_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> user_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> permission
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查询：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant_id = currentTenant
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AND permission ...
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Similarity Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这里有一个极其重要的安全原则：&lt;/p>
&lt;blockquote>
&lt;p>Authorization Filter 必须成为 Retrieval 的一部分，而不是 Retrieval 完成后再过滤。&lt;/p>
&lt;/blockquote>
&lt;p>否则可能出现：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">召回了无权限文档
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这会造成严重的数据泄露风险。&lt;/p>
&lt;hr>
&lt;h1 id="44-vector-search-security">44. Vector Search Security&lt;/h1>
&lt;p>企业 RAG 中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">User
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authentication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Authorization
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>权限模型应该进入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Metadata Filter
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">tenant_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">department_id
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">document_acl
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">security_level
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此：&lt;/p>
&lt;blockquote>
&lt;p>RAG 的安全边界不仅在 LLM，也在 Retrieval Layer。&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h1 id="45-vector-database-的-cost-model">45. Vector Database 的 Cost Model&lt;/h1>
&lt;p>Vector Search 的成本主要来自：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Storage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compute
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Network
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Replication
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>尤其需要注意：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding Cost
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Storage
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Token Cost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>一个看似简单的：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">RAG Question
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>实际上可能经过：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query Rewrite
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此应该从端到端角度优化，而不是只优化 Vector Database。&lt;/p>
&lt;hr>
&lt;h1 id="46-一个生产级-rag-架构">46. 一个生产级 RAG 架构&lt;/h1>
&lt;p>可以设计成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ User │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ API Gateway │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Query Service│
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Query Processing │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────┬─────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Hybrid Retrieval │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Keyword + Vector │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └───────────┬────────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Vector Database │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └────────┬────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Candidate Docs
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌───────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Reranker │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └─────┬─────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Top-K Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌─────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ LLM │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──┬──┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Document ingestion：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Documents
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Parser
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="47-如何选择-vector-index">47. 如何选择 Vector Index？&lt;/h1>
&lt;p>可以建立一个简单的决策模型：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">数据规模较小
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Exact Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">中等规模
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">HNSW
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">超大规模
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">IVF / PQ / Disk-based ANN
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory Plenty
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Low Latency
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">High Recall
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常可以优先考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">HNSW
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Huge Scale
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Memory Sensitive
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>则需要考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">IVF
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">PQ
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">DiskANN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Quantization
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="48-vector-database-最容易出现的误区">48. Vector Database 最容易出现的误区&lt;/h1>
&lt;h2 id="误区一向量维度越高越好">误区一：向量维度越高越好&lt;/h2>
&lt;p>不是。&lt;/p>
&lt;p>维度越高：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Memory ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Compute ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Size ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Embedding Dimension 应该通过实验确定。&lt;/p>
&lt;hr>
&lt;h2 id="误区二top-k-越大越好">误区二：Top-K 越大越好&lt;/h2>
&lt;p>不是。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">K ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>可能导致：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Recall ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Noise ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Context ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM Cost ↑
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Latency ↑
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="误区三vector-search-可以替代-keyword-search">误区三：Vector Search 可以替代 Keyword Search&lt;/h2>
&lt;p>不是。&lt;/p>
&lt;p>对于：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Product ID
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Error Code
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Class Name
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">API Name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Keyword Search 往往更可靠。&lt;/p>
&lt;p>所以：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通常比纯 Vector Search 更适合企业应用。&lt;/p>
&lt;hr>
&lt;h2 id="误区四vector-database-就是-rag">误区四：Vector Database 就是 RAG&lt;/h2>
&lt;p>不是。&lt;/p>
&lt;p>完整 RAG：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Document Processing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Chunking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Prompt Engineering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Evaluation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Database 只是其中的重要基础设施。&lt;/p>
&lt;hr>
&lt;h1 id="49-vector-database-的未来方向">49. Vector Database 的未来方向&lt;/h1>
&lt;p>Vector Database 正在从：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Storage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>逐渐演变成：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">AI Search Engine
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>未来重点可能包括：&lt;/p>
&lt;h3 id="1-multimodal-search">1. Multimodal Search&lt;/h3>
&lt;p>不再只是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text → Vector
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Text
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Image
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Audio
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Video
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Code
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>统一进入：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Multimodal Embedding Space
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="2-hybrid-retrieval">2. Hybrid Retrieval&lt;/h3>
&lt;p>进一步融合：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Keyword
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Graph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">+
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Structured Data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="3-learned-retrieval">3. Learned Retrieval&lt;/h3>
&lt;p>使用机器学习动态优化：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Query
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval Strategy
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Index Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Ranking
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="4-agentic-retrieval">4. Agentic Retrieval&lt;/h3>
&lt;p>AI Agent 不再只进行一次：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而可能：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Question
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Plan
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Analyze
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Search Again
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Rerank
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Vector Database 将成为 Agent Memory 和 Knowledge Retrieval 的基础设施之一。&lt;/p>
&lt;hr>
&lt;h1 id="50-从架构师角度理解-vector-database">50. 从架构师角度理解 Vector Database&lt;/h1>
&lt;p>如果只把 Vector Database 理解为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">存向量
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>理解还比较浅。&lt;/p>
&lt;p>真正的架构问题应该是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Embedding │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────┬───────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Vector Index
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ANN Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Metadata Filter
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Hybrid Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>同时还需要考虑：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> ┌──────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Scalability │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├──────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Availability │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├──────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Consistency │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├──────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Security │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├──────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Recall │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├──────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Latency │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ├──────────────┤
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ Cost │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这才是生产级 Vector Database Architecture。&lt;/p>
&lt;hr>
&lt;h1 id="51-总结">51. 总结&lt;/h1>
&lt;p>Vector Database 的核心并不是“数据库里保存了一堆向量”，而是解决：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>如何在高维向量空间中，对海量数据进行低延迟、高召回率、可扩展的相似性搜索。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>它背后的核心技术可以总结为：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Embedding
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Vector Representation
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Distance Metric
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ANN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">HNSW / IVF / PQ / DiskANN
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Filtering
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Hybrid Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Reranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Distributed Vector Search
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而在 AI 应用中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Vector Database
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Retrieval
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">RAG
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">AI Application
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>真正成熟的 AI Search 架构并不是简单地：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">LLM + Vector DB
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>而是：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl"> AI Application
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Query Processing
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ┌──────────┴──────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓ ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Keyword Search Vector Search
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> │ │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> └──────────┬──────────┘
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Hybrid Ranking
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Reranker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Context Selection
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> LLM
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> ↓
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> Answer
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>因此，从架构师视角看，Vector Database 最值得掌握的不是某一个产品的 API，而是下面这条完整技术链：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Embedding → Vector Space → Similarity Metric → ANN → Index → Filtering → Hybrid Retrieval → Reranking → Distributed Search → RAG&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>掌握这条链路之后，无论面对 Milvus、Qdrant、Weaviate、Pinecone、pgvector、Elasticsearch Vector Search，还是未来新的 AI Search Engine，都能够从底层原理、性能、架构和生产实践层面进行分析，而不仅仅停留在“会调用 Vector DB API”的层面。&lt;/p></description></item></channel></rss>