在 RAG(Retrieval-Augmented Generation,检索增强生成) 架构中,Indexing(索引) 是整个系统的"地基"与"入库准备"阶段。
简单来说:大模型(LLM)虽然聪明,但它不知道你公司的内部文档、私有代码库或最新的实时数据。Indexing 的目的,就是把这些大模型看不懂的、零散的原始文档(PDF、Word、网页、数据库),通过一系列标准化的流水线加工,转化成一种"检索算法能秒级看懂、大模型能高效读取"的数据库索引结构。
如果把 RAG 比作一个高效率的开卷考试系统 ,那么 Indexing 就是在考试前,把整座图书馆的原始书籍重新整理、贴上标签、编好目录,并全部存入高档档案柜的过程。
1. Indexing 的标准工业流水线(Pipeline)
在实际的 AI 工程中,Indexing 绝对不是直接把文件丢给数据库,而是必须要经历以下 4 个教科书级的核心步骤:
① 文档加载 (Document Loading)
-
任务:把各种杂乱格式的原始数据读取进来。
-
操作 :使用各类 Loader(如 LangChain 或 LlamaIndex 的 PyPDFLoader、Docx2txt、MarkdownLoader),将 PDF、Notion 笔记、企业 Wiki 网页等统一剥离、清洗,转换成纯文本的
Document对象。
② 文本切片 (Chunking / Text Splitting)
-
任务:把动辄大几万字的长篇大论,切成一段一段、大小适中的"文本块(Chunks)"。
-
为什么?:
-
大模型的上下文限制:不能把整本书一次性塞给大模型。
-
检索的精准度:如果一整本书对应一个检索标签,找出来的答案会非常宽泛。切成 300~500 字的小段,检索时就能精准定位到"某书第 4 页的某一段话"。
-
-
常见策略 :固定长度切分、按段落切分,或者使用
RecursiveCharacterTextSplitter保持句子的语义完整性,并设置一定的重叠度(Overlap)防止上下文在切缝处断裂。
③ 向量化 (Embedding)
-
任务 :将切好块的纯文本段落,翻译成计算机和检索算法唯一能理解的语言------数学向量(高维密集的数字阵列)。
-
操作 :把每个 Chunk 喂给 Embedding 模型(如 OpenAI 的
text-embedding-3-small,或开源的bge-large-zh)。模型会输出一个比如 1536 维的数字向量。 -
本质 :这个向量代表了这段话的"语义生死簿"。 含义相近的话(比如"西红柿多少钱一斤"和"番茄怎么卖"),即便字面完全不同,它们转换出的向量在数学空间里的距离也会极度接近。
④ 向量存储 (Vector Storage)
-
任务:把"原始文本块"和它对应的"高维向量"成对地锁进专用的数据库里,建立索引。
-
操作 :将数据持久化写入向量数据库(Vector DB),如 Pinecone、Milvus、Chroma、Qdrant 或 pgvector。至此,Indexing 阶段完美闭环。
2. 为什么 Indexing 的质量直接决定 RAG 的生死?
在 RAG 领域有一句名言:"Garbage in, garbage out"(垃圾进,垃圾出)。如果你的 Indexing 做得很烂,后面的大模型就算用 GPT-4o 也没用,因为"开卷考试"时发给它的参考资料本身就是错的。
以下是 Indexing 设计不好会引发的真实灾难:
-
切片太大(Chunk Size 过大) :检索出来一万字,里面只有一句话有用。大模型读了大量废话,不仅浪费 Token 费用,还容易被杂音干扰,产生幻觉(Hallucination)。
-
切片太小(Chunk Size 过小):一句话被拦腰截断。大模型拿到了答案,却丢失了前因后果(上下文缺失),导致回答断章取义。
-
没有建立高级索引(高级 Indexing) :在复杂的企业级 RAG 中,简单的向量检索极易失效(比如查特定报表、对比数据)。因此现代 Indexing 会引入 Parent-Child Chunking(父子分块索引) 、Summary Indexing(摘要索引) 或是 Knowledge Graph(知识图谱索引,即 GraphRAG)。
💡 总结
在 RAG 中,Indexing 是一切离线数据的"数字飞升"过程 。它通过加载 \\rightarrow 切片 \\rightarrow 向量化 \\rightarrow 入库 ,将死板的人类文本打造成了随时待命的"智能知识库"。只有地基扎实、索引精准,后面的 Retrieval(检索阶段) 才能精准定位,最后的 Generation(大模型生成阶段) 才能对答如流。