ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

大模型幻觉的“特效药“:RAG 检索增强生成原理与工程实战

大模型幻觉的“特效药“:RAG 检索增强生成原理与工程实战 关键词RAG、检索增强生成、大语言模型、Embedding、向量数据库、LangChain、NLP本文系统讲解 RAG 为什么能缓解大模型幻觉拆解索引—检索—生成全链路的关键技术分块、Embedding、重排序、Prompt 组装并给出一段可以直接跑的代码实战。全文约 4500 字。一、大模型为什么需要 RAG预训练大语言模型LLM有三个绕不开的痛点知识截止Knowledge Cutoff模型的知识冻结在训练数据截止的那一天之后发生的事情它一无所知幻觉Hallucination模型本质是下一个词预测器对不知道的问题也会一本正经地编造答案私有知识缺失公司内部文档、个人笔记从未出现在训练语料里再微调也难以精确记住。继续用预训练/微调往模型里灌知识成本高、见效慢、还容易出现灾难性遗忘。RAGRetrieval-Augmented Generation检索增强生成换了一个思路开卷考试代替闭卷考试。先把相关知识从外部知识库里检索出来塞进 Prompt让模型看着资料作答。这个由 Facebook AI Research 在 2020 年提出的范式如今已成为大模型落地企业知识库问答、智能客服、垂直领域助手事实上的标准方案。二、RAG 的核心架构RAG 分为离线索引Indexing和在线查询Query两个阶段离线文档 → 分块(Chunking) → Embedding → 存入向量数据库在线问题 → Embedding → 向量检索(Top-K) → [重排序] → 拼接Prompt → LLM生成答案2.1 分块Chunking长文档不能直接整体向量化会稀释语义也超上下文窗口需要切成小块。常见策略固定长度分块每 512 token 切一刀块间保留 50~100 token 重叠overlap避免答案被切断语义分块按标题、段落、句子边界切保持语义完整递归分块LangChain 的RecursiveCharacterTextSplitter优先按\n\n→\n→ 句号的层级切分兼顾长度与语义。经验法则块太大则检索噪声多块太小则上下文不完整。一般 256~1024 token 之间调优配合 10%~20% 的 overlap。2.2 Embedding把文本变成向量Embedding 模型把每个文本块映射为一个稠密向量如 768/1024 维语义相近的文本在向量空间中距离也近(余弦相似度)常用选择模型特点OpenAItext-embedding-3-small/large效果好、需调 API、按量计费BGE-M3智源中英双语强、开源免费、支持多粒度M3E / GTE中文场景轻量级选择注意索引和查询必须用同一个 Embedding 模型换模型等于重建整个索引。2.3 向量检索与向量数据库查询时也把问题 Embedding 成向量在库中找余弦相似度最高的 Top-K 个块。小规模10 万向量直接用 numpy 暴力算即可大规模则需要 ANN近似最近邻索引HNSW基于图的索引召回率和速度的性价比之王是大多数向量库的默认选择IVF / PQ聚类 量化压缩适合千万级以上。常用向量数据库FAISS本地库、Chroma轻量、Milvus / Qdrant / Weaviate生产级、pgvectorPostgres 插件少维护一个组件。2.4 重排序Rerank向量检索是粗排Embedding 模型对细粒度相关性区分能力有限。可以再用一个交叉编码器Cross-Encoder如bge-reranker对粗排结果的 Top-20~50 做精排把 query 和文档拼接后一起过模型算相关分精度显著提升代价是只能对少量候选打分。2.5 Prompt 组装与生成最后把检索到的上下文填进模板请基于以下参考资料回答问题。如果资料中没有相关信息请明确说明根据现有资料无法回答不要编造。【参考资料】[1] {chunk_1}[2] {chunk_2}...【问题】{query}最后这条不知道就说不知道的指令是工程上抑制幻觉成本最低、收益最高的一招。三、代码实战50 行搭一个本地文档问答系统下面的例子用sentence-transformers本地 Embedding numpy 暴力检索 任意 LLM API不依赖 LangChain方便看清每一步发生了什么import numpy as np from sentence_transformers import SentenceTransformer # ---------- 1. 离线索引 ---------- embedder SentenceTransformer(BAAI/bge-small-zh-v1.5) # 中文 Embedding docs [ RAG检索增强生成由 Facebook AI Research 于 2020 年提出核心思想是先检索后生成。, 向量数据库通过 ANN 索引如 HNSW加速高维向量的相似度搜索。, 大模型的幻觉指模型编造看似合理但与事实不符的内容RAG 可以显著缓解该问题。, Transformer 架构由 Vaswani 等人在 2017 年的论文《Attention Is All You Need》中提出。, 重排序Rerank使用交叉编码器对粗排结果精排能显著提升检索精度。, ] # BGE 系列建议给查询加指令前缀文档侧不用 doc_vecs embedder.encode(docs, normalize_embeddingsTrue) # (5, 512) # ---------- 2. 在线检索 ---------- def retrieve(query: str, top_k: int 2): q embedder.encode(为这个句子生成表示以用于检索相关文章 query, normalize_embeddingsTrue) scores doc_vecs q # 归一化后点积 余弦相似度 top_idx np.argsort(scores)[::-1][:top_k] return [(docs[i], float(scores[i])) for i in top_idx] # ---------- 3. 组装 Prompt 并生成 ---------- def build_prompt(query: str, contexts: list) - str: ctx \n.join(f[{i1}] {c} for i, (c, _) in enumerate(contexts)) return f请基于以下参考资料回答问题。若资料中没有相关信息请回答根据现有资料无法回答。 【参考资料】 {ctx} 【问题】{query} query 大模型幻觉是什么意思怎么解决 contexts retrieve(query, top_k2) prompt build_prompt(query, contexts) print(prompt) # 之后把 prompt 发给任意 LLMOpenAI / DeepSeek / 本地 Qwen即可 # answer llm.chat(prompt)运行后可以看到retrieve准确地捞出了幻觉和RAG两条相关文档。真实项目中把 numpy 部分换成 FAISS/Chroma把llm.chat接到你的模型 API就是一个可上线的最小 RAG。生产级简化版LangChain Chromafrom langchain_community.document_loaders import DirectoryLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceBgeEmbeddings from langchain_community.vectorstores import Chroma docs DirectoryLoader(./my_docs, glob**/*.md).load() chunks RecursiveCharacterTextSplitter(chunk_size512, chunk_overlap64).split_documents(docs) emb HuggingFaceBgeEmbeddings(model_nameBAAI/bge-small-zh-v1.5) vectordb Chroma.from_documents(chunks, emb, persist_directory./chroma_db) retriever vectordb.as_retriever(search_kwargs{k: 4}) relevant retriever.invoke(大模型幻觉怎么解决)四、RAG 常见翻车点与优化清单症状可能原因优化手段检索不到相关内容分块太碎/太大Embedding 不适合领域调整 chunk 策略换领域 Embedding 或微调检索到了但答错Prompt 没约束上下文太多稀释了重点加只依据资料回答指令控制 Top-K专有名词检索差向量检索对精确匹配弱混合检索BM25关键词 向量RRF 融合问题依赖上下文指代多轮对话中它这个检索不到先用 LLM 改写问题query rewriting再检索需要跨块推理答案分散在多个块中增大 Top-KParent-Child 索引或用 GraphRAG需要评估效果没有指标体系用 RAGAS 评 faithfulness / answer relevancy进阶方向还包括HyDE先让 LLM 生成假想答案再检索、Self-RAG模型自主判断何时检索、自我反思、Agentic RAG把检索作为 Agent 的一个工具多步规划调用。五、小结RAG 检索外脑 生成表达用开卷考试思路缓解幻觉与知识过时核心链路分块 → Embedding → 向量检索 → 重排序 → Prompt → 生成每一环都有调优空间原型一天能搭出来但做好需要持续打磨分块策略、混合检索、Rerank 与评估体系RAG 不会消失上下文窗口再大把最相关的资料给模型依然是成本与效果的最优平衡点。参考资料Lewis et al.Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. NeurIPS 2020.Karpukhin et al.Dense Passage Retrieval for Open-Domain Question Answering. EMNLP 2020.Chen et al.BGE M3-Embedding: Multi-Lingual, Multi-Functionality, Multi-Granularity Text Embeddings. 2024.Gao et al.Retrieval-Augmented Generation for Large Language Models: A Survey. 2023.Asai et al.Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection. ICLR 2024.
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进