Retrieval-Augmented Generation (RAG) 检索增强生成

Retrieval-Augmented Generation (RAG) 检索增强生成 Retrieval-Augmented Generation (RAG) 检索增强生成一、通俗定义检索增强生成给大模型外挂外部知识库回答前先从自有文档检索相关内容再交给模型生成答案。 解决原生大模型两大痛点知识截止模型训练数据有时间上限不知道最新信息幻觉Hallucination凭空编造不存在的事实、数据。你前面全套工具链all-MiniLM-L6-v2RecursiveCharacterTextSplitterHuggingFaceEmbeddings Chroma就是标准 RAG 底层组件。二、完整两大阶段索引阶段 查询阶段阶段 1离线索引文档入库一次性执行加载文档PDF/Markdown/TXT/ 网页等原始资料Document Chunking 文档分块用RecursiveCharacterTextSplitter切小块避免超长文本超出 Embedding 模型 512token 限制保留局部完整语义设置 overlap 防止逻辑断裂。Embedding 向量化通过HuggingFaceEmbeddings调用蒸馏轻量模型all-MiniLM-L6-v2每段 chunk 转为 384 维数值向量。存入向量数据库Chroma/FAISS/Milvus 保存「文本 chunk 对应向量」支持快速相似度检索。阶段 2在线问答用户提问实时流程Query Embedding用户问题编码成相同维度向量语义检索 Retrieval在向量库计算余弦相似度召回 Top-K 最相关文档片段Prompt 拼接增强上下文把检索到的真实文档片段 用户问题一起塞进 Prompt限制模型只能基于提供的资料作答LLM Generation 生成回答大模型依据检索到的真实素材输出答案大幅减少瞎编。三、极简流程图原始文档 → 分块 → Embedding 向量 → 向量库存储 用户提问 → 向量化 → 检索相似 Chunk → 拼接上下文 Prompt → LLM 生成答案四、核心组件对应你之前学的内容表格环节工具 / 模型作用分块RecursiveCharacterTextSplitter切割长文本控制 token 长度嵌入封装langchain_huggingface.HuggingFaceEmbeddingsLangChain 统一接口加载向量化模型向量模型all-MiniLM-L6-v2蒸馏轻量化语义编码384 维归一化向量快速余弦匹配向量存储Chroma本地轻量向量数据库存储并检索文本向量五、RAG 的核心优势消除幻觉所有回答依托自有真实文档模型不能随意编造数据、案例、条款动态更新知识新增文档只需重新分块入库不用重新微调 / 蒸馏大模型成本极低降低微调成本不需要大量标注数据训练大模型纯检索方案轻量化落地节约上下文窗口只检索相关片段不用把全部文档喂给 LLM节省 token 开销、提升速度、降低 API 费用可溯源回答可以附带引用对应的原始文档片段方便核验信息真伪。六、基础 RAG 代码完整串联整合你所有知识点python运行from langchain_huggingface import HuggingFaceEmbeddings from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma # 1. 加载蒸馏嵌入模型 all-MiniLM-L6-v2 embeddings HuggingFaceEmbeddings( model_nameall-MiniLM-L6-v2, model_kwargs{device: cpu}, encode_kwargs{normalize_embeddings: True} ) # 2. 定义token统计函数 def token_counter(text): return len(embeddings.client.tokenizer.encode(text)) # 3. 递归字符分块器 splitter RecursiveCharacterTextSplitter( chunk_size400, chunk_overlap80, length_functiontoken_counter, separators[\n\n, \n, . , ! , ? ] ) # 自有知识库文本 docs_raw Retrieval Augmented Generation (RAG) combines retrieval and LLM generation. First split documents into chunks via RecursiveCharacterTextSplitter. Then encode chunks with distilled embedding model all-MiniLM-L6-v2. Vectors are stored in vector database like Chroma for semantic search. When user asks a question, retrieve relevant chunks as context for LLM, reduce hallucination. Knowledge distillation compresses large BERT into small MiniLM without heavy performance loss. # 分块 chunks splitter.split_text(docs_raw) # 构建向量库 vector_db Chroma.from_texts( textschunks, embeddingembeddings, persist_directory./rag_db ) vector_db.persist() # 检索环节用户查询 query What is RAG and how does MiniLM work in the pipeline? relevant_chunks vector_db.similarity_search(query, k2) # 打印检索到的增强上下文 for idx, doc in enumerate(relevant_chunks): print(f检索片段{idx1}\n{doc.page_content}\n)七、RAG 分层演进行业分级基础 RAG上面代码单次检索、简单拼接上下文适合简单知识库进阶 RAG重写 QueryHyde/Query Expansion优化检索语句提升召回分层分块父子检索 Parent-Child小块检索、大块提供完整上下文重排序 Rerank检索后用交叉编码器过滤无关片段高级 Agentic RAG搭配工具调用、多轮检索、自校验、反思处理复杂多步骤问答。八、常见局限与优化方向检索不准→ 优化 chunk 大小 /overlap、使用 rerank 模型、更换更强 Embedding上下文溢出→ 限制 Top-K 数量、精简 chunk无关噪声片段→ 增加重排序过滤低相似度内容领域语义弱→ 使用领域微调 Embedding而非通用 MiniLM。九、一句话总结RAG 依靠文档分块 蒸馏嵌入模型语义检索调取私有资料给大模型提供真实外部上下文是低成本解决大模型知识滞后、生成幻觉的主流工程方案。