当前位置: 首页 > news >正文

周红伟:RAG 与知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是目前最主流的 LLM 落地架构之一。

RAG 的核心思想是:让 LLM 在回答问题时,先从外部知识库中检索相关内容,再基于检索结果生成回答,而不是仅依赖模型训练时记住的知识。

这解决了 LLM 的两个核心痛点:知识截止日期(模型不知道训练后发生的事)和幻觉问题(模型在不确定时会编造答案)。


RAG 基础原理

一个完整的 RAG 系统由两条流水线组成:离线索引流水线(将文档预处理存入向量库)和在线查询流水线(接收用户问题、检索、生成)。

离线阶段将原始文档切分成小块,通过 Embedding 模型转换为向量,存入向量数据库。

在线阶段将用户问题同样转换为向量,从数据库中找到最相近的文档块,拼接成上下文交给 LLM 生成答案。

下图展示了 RAG 的完整请求流程:

用户提问Embedding转为查询向量向量数据库相似度检索 Top-KPrompt 拼接问题 + 文档块LLM 生成基于检索结果作答离线索引(一次性预处理)原始文档切分 / 清洗Embedding转为文档向量写入向量数据库在线查询流程(每次请求都会经过)


数据预处理与文档切分(Chunking)

前置挑战:复杂文档解析

在进行切分前,RAG 往往面临着格式解析的挑战。特别是 PDF、Word 或扫描件中的表格、图片和多栏排版,普通的文本提取极易造成语义错乱。

目前行业主流方案是引入文档解析引擎(如 LlamaParse、Unstructured)或多模态大模型,将复杂图文转换为结构化的 Markdown,为后续高质量切分打下基础。

文档切分策略

文档切分是 RAG 效果的基础,切分粒度直接影响检索质量。块太大会引入噪声,块太小会丢失上下文。常用策略如下:

切分策略适用场景优点缺点
固定大小切分通用文本实现简单,速度快可能切断语义完整的句子
递归字符切分结构化文本(Markdown、代码)优先按段落、句子等语义边界切分实现略复杂,需设定合理的分隔符列表
语义切分 (Semantic)长文档、书籍利用 Embedding 计算相邻句子的相似度,自动寻找语义转折点切分计算成本高,预处理速度慢
父子文档检索
(Small-to-Big)
全面覆盖场景用"小块"进行高精度向量检索,命中后返回对应的"大块"(父文档)给 LLM,兼顾了检索精度和上下文完整性。数据库设计和维护成本翻倍

实践中常在切分时加入重叠(overlap),即相邻块之间共享若干字符,防止重要信息在边界处被截断。典型配置:块大小 512 tokens,重叠 50~100 tokens。

实例:使用 LangChain 进行递归切分

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=512, # 每块最大 token 数
chunk_overlap=50, # 相邻块的重叠 token 数,防止信息在边界处丢失
separators=["\n\n", "\n", "。", ".", " ", ""] # 优先按段落、句子切分
)

chunks = splitter.split_text(document_text)
print(f"切分为 {len(chunks)} 个文档块")


向量检索

Embedding 模型

Embedding 模型负责将文本转换为稠密向量(通常是 768 或 1536 维的浮点数数组)。语义相近的文本在向量空间中距离更近,这正是相似度检索的数学基础。

常用 Embedding 模型对比:

模型维度适用语言特点
text-embedding-3-small(OpenAI)1536多语言性价比高,适合大规模索引
text-embedding-3-large(OpenAI)3072多语言精度最高,成本较高
BAAI/bge-m31024中英文开源,中文效果优秀,支持多语言
sentence-transformers/all-MiniLM-L6-v2384英文体积小,速度快,适合本地极轻量部署

相似度计算与 ANN 算法

检索的核心是度量距离。最常用的是余弦相似度(Cosine Similarity),它计算两个向量的夹角余弦值,值域 [-1, 1],越接近 1 越相似。此外还有点积(Dot Product)和欧氏距离(L2 Distance)。

为了在百万级向量中实现毫秒级检索,数据库通常采用近似最近邻(ANN)算法(如HNSW、IVF)。HNSW 是目前最主流的算法,它通过构建多层跳跃图网络,牺牲极少的精度换取了数量级的搜索速度提升。


Advanced RAG (进阶架构)

基础架构(Naive RAG)常面临检索不准确、冗余信息多导致"上下文淹没"等问题。Advanced RAG 通过预检索优化 → 检索融合 → 后检索优化的三段式架构予以解决。

1、预检索:查询优化

用户的原始问题往往表达不够精确:

  • 查询改写(Query Rewriting):用 LLM 将口语化提问改写为规范化的检索词。
  • HyDE(Hypothetical Document Embedding):让 LLM 先"盲猜"一个假设性答案,由于生成的答案通常比原问题包含更多行业术语,用这个假设答案的向量去检索,往往能召回更高质量的文档。

2、混合检索(Hybrid Search)

向量检索(懂语义,容错率高)与关键词检索(BM25,匹配度高)的结果按权重融合。这在遇到专有名词、产品型号、代码片段时尤为重要,因为传统的向量检索容易在特定的专有名词上"翻车"。

3、后检索优化:重排序(Reranking)

这是一个粗排 → 精排的两阶段设计。向量检索虽然快,但打分不够精确。重排序(Reranking)会引入Cross-Encoder 模型(如 `bge-reranker`),将"问题"和"文档"成对输入模型进行联合推理打分。它的运算量大,只负责精选 Top-20 到 Top-5。

实例:重排序流程伪代码

from sentence_transformers import CrossEncoder

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")

# 1. 粗排:向量检索极速召回 Top-50
candidates = vector_store.similarity_search(query, k=50)

# 2. 精排:构建 [问题, 文档] 对进行精确打分
pairs = [[query, doc.page_content] for doc in candidates]
scores = reranker.predict(pairs)

# 3. 筛选最终传入 LLM 的 Top-5
ranked_docs = sorted(zip(scores, candidates), reverse=True)
final_docs = [doc for _, doc in ranked_docs[:5]]

4、Self-RAG 与 CRAG(修正式 RAG)

加入自我反思机制。例如 CRAG(Corrective RAG)在拿到检索结果后,先由 LLM 充当"评委"打分。如果本地知识库查无此文或质量极低,系统会自动触发 Web Search(如 Google API)作为补充,大幅降低幻觉。


GraphRAG:知识图谱 + 检索融合

传统 RAG 将知识库当作独立的文本碎片,无法回答诸如"找到所有同时由现任 CEO 创办且市值超千亿的公司"这类需要跨文档、多跳推理的复杂问题。GraphRAG引入知识图谱(Knowledge Graph),将实体和关系显式建模。

用户问题向量检索相关文档块图检索实体关系子图上下文融合文档块 + 图路径实体 A → 关系 → 实体 B实体 B → 关系 → 实体 C

GraphRAG 核心步骤

  1. 知识构建:离线阶段使用 LLM 从文档提取三元组(主体、关系、客体),写入 Neo4j 等图数据库。
  2. 双路检索:针对提问中的实体,不仅做传统的向量检索,同时在图谱中触发图遍历(Graph Traversal),提取多跳关系链。
  3. 图文融合生成:将向量检索找回的"片段"与图检索找回的"路径结构"拼装进 Prompt,使得 LLM 既具备全局视野又掌握具体细节。

技术与数据库选型建议

数据库/工具选型类型推荐落地场景
Pinecone / Zilliz Cloud全托管云服务开箱即用,不想维护基础设施。搭配 Cohere Rerank + GPT-4o 是最快商用的方案。
Qdrant开源 + 托管Rust 编写,内存管理优秀,性能极高。适合企业级私有化部署。
Weaviate / Elasticsearch开源 + 托管自带极其成熟的 BM25 + 向量混合检索(Hybrid Search),专有名词较多的场景首选。
Milvus开源分布式适合十亿至百亿级别的超大规模企业级检索平台。
Chroma / FAISS本地库/嵌入式极轻量,无需部署独立服务。非常适合本地开发、个人知识库项目验证。

RAG 评估指标(RAGAS 框架)

RAG 系统的评估不能仅凭直觉,主流使用RAGAS框架,从"检索"和"生成"两个维度进行自动化量化测试:

  • Context Recall(检索召回率):标准答案中的信息有多少比例能被检索到。
  • Context Precision(检索精确率):检索到的文档中有多少比例是真正相关的。
  • Faithfulness(忠实度/幻觉指标):生成的答案是否都有检索出的文档支撑。
  • Answer Relevance(答案相关性):生成的答案是否真正回答了用户的问题,避免答非所问。
http://www.jsqmd.com/news/658358/

相关文章:

  • 从零实现MDP:用Python代码拆解马尔可夫决策过程核心算法
  • AI编程全栈实战课:网站开发+多端封装+微信小程序+支付上线,零基础一站式学会落地
  • 基于STM32LXXX的无线收发芯片(CC2530F256RHAR)应用程序设计
  • 如何高效实现B站视频智能转文字:bili2text技术深度解析与实战指南
  • 7种RAG查询预处理方案详解:告别检索效果差,提升回复质量!
  • 腾讯AI 应用开发 面经,一次过
  • Unity游戏窗口自定义:实现标题栏与边框的动态控制
  • PyCharm里用pip装Seaborn总失败?试试这3种更稳的安装方式(含Anaconda对比)
  • 为什么会选择美国洛杉矶代理IP来做TikTok业务?
  • 超详细!Hermes Agent 一键部署全流程指南,轻松上手不踩坑
  • 接口返回blob,如何实现小程序下载
  • 告别Batch Size焦虑:用PyTorch手把手实现Group Normalization(附完整代码)
  • 如何获取并定制化订货系统源码以适应企业需求?
  • Java转大模型,8个月上岸
  • HPH构造一看就懂!核心部件和工作原理
  • 2026国产适合企业的Ai智能体平台选型推荐:架构师视角下的非侵入式集成与提效避坑指南
  • 一份就懂的PyOpenGL实战指南,从零到一构建3D小游戏!
  • ESP32编译固件内存信息解读
  • **剪枝模型实战:用Python实现轻量化神经网络优化,从理论到代码全解析**
  • OpenClaw为何疯狂“吃”Token?
  • 有赞对接金蝶云星空全链路技术解决方案
  • ceph的monitor集群和osd集群
  • Siemens 6DS1311-8AE 总线驱动
  • 鱼眼双目测距实战:从OpenCV标定到SGBM匹配的完整流程解析
  • Vue 3 技术演进全景
  • 你的游戏本性能被锁定了吗?解锁秘籍来了!
  • 地图开发避坑指南:手把手教你合法合规地使用第三方瓦片服务(高德/百度/腾讯)
  • 5款常用的漏洞扫描工具,网安人员不能错过!
  • 从理论到实践:基于MATLAB的TCPA与DCPA算法实现与避碰应用
  • 从RNN到Transformer:为什么相对位置编码对长文本任务(如翻译、摘要)更友好?