检索增强生成(RAG)在问答系统中的算法实例,通常不是单一算法,而是由检索策略、融合方式与生成模型组合而成的具体技术方案。以下是几个有公开文献或代码记录的代表性实例。

实例一:基于混合检索与重排序的法律新闻问答

这是一个面向特定领域(法律与犯罪新闻)的 RAG 聊天机器人实例,其核心设计在于通过混合检索弥补单一检索方式的不足。

检索算法:采用混合检索(Hybrid Retrieval),同时使用 BM25(基于关键词的稀疏检索)和 FAISS(基于向量的稠密检索)。BM25 擅长匹配精确的术语和名称,而 FAISS 负责语义层面的相似度召回。两路检索结果随后经过一个重排序(Reranking) 步骤,以过滤噪声并筛选出最相关的段落。
生成模型:使用较小的语言模型 Gemma2:2B-instruct,而非超大模型,以降低计算成本。其设计前提是:只要检索到的上下文质量足够高,小模型也能生成合格答案。
效果数据:在该法律新闻数据集上,检索的上下文精确率(Context Precision)达到 0.98,上下文召回率(Context Recall)为 0.96;生成的答案正确性(Answer Correctness)为 0.75,ROUGE-1 得分为 0.82。
实例二:基于 LangChain + FAISS 的文档问答聊天机器人

这是一个较为经典的工程实现实例,适合作为理解 RAG 流程的参考。

技术栈:使用 Python 语言,以 LangChain 作为编排框架,向量检索使用 FAISS,生成端可调用 OpenAI、Google Generative AI 或 Hugging Face 的模型 API。
核心流程:系统支持上传 PDF、DOCX、CSV、TXT 等格式文档,自动进行分割和索引。用户提问时,先将问题通过嵌入模型转为向量,在 FAISS 中基于余弦相似度检索出最相关的文档片段,再将这些片段作为上下文送入大模型生成答案。
定位:该实例强调模块化设计,便于在企业或学术知识管理场景中扩展和维护。
实例三:带查询重写的混合检索与引用溯源系统

这是一个更贴近生产环境考虑的实例(以 Laravel + Vue 实现),在基础 RAG 上增加了多项工程优化。

混合检索与融合:同样使用稠密向量检索(pgvector 的 HNSW 索引)与全文检索结合,但融合方式采用 Reciprocal Rank Fusion(RRF,k=60)。RRF 只使用排名而非原始分数进行融合,避免了余弦相似度分数与关键词检索分数之间难以校准的问题。
查询重写:仅在对话存在历史时触发。例如,用户追问“那第二个呢?”时,该问题单独做嵌入效果很差,系统会先将其重写为独立完整的问题再进行检索。
引用与兜底:系统要求生成答案时标注来源编号 [n],并在检索结果为空时直接返回固定回复,不调用大模型,以避免模型仅凭参数知识编造答案。
实例四:基于 SQLite 的轻量级混合 RAG 管道

这是一个以“低依赖、可嵌入式”为特点的实现,展示了不依赖外部向量数据库的 RAG 方案。

存储与索引:在 SQLite 中同时建立向量索引(通过 vss0 扩展)和全文检索索引(通过 FTS5 扩展),实现稠密与稀疏检索的混合。
性能优化:通过一系列 SQLite PRAGMA 配置(如 WAL 模式、增大缓存、内存映射等),将写入吞吐量提升约 5.3 倍,读取吞吐量提升约 2.7 倍。该实例适合资源受限或需要嵌入式部署的问答场景。
LangChain + FAISS 基础检索生成

这是最基础的 RAG 流程,适合快速理解“检索→拼接上下文→生成”的核心逻辑。代码取自一个 PDF 问答机器人的核心片段。

python
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_core.prompts import ChatPromptTemplate

1. 加载已构建的 FAISS 向量索引

embeddings = OpenAIEmbeddings()
vectorstore = FAISS.load_local(
“faiss_index”,
embeddings,
allow_dangerous_deserialization=True
)

2. 检索:根据问题找出最相似的文档片段

query = “你的问题”
docs_and_scores = vectorstore.similarity_search_with_score(query, k=3)
context_docs = [doc for doc, score in docs_and_scores]

3. 拼接上下文并构建提示

context = “\n\n”.join([doc.page_content for doc in context_docs])
prompt = ChatPromptTemplate.from_messages([
(“system”, “你是一个 helpful assistant。请基于提供的上下文回答问题。如果上下文没有相关信息,请说’我不知道’。”),
(“user”, f"上下文:\n{context}\n\n问题:{query}\n\n答案:")
])

4. 调用大模型生成答案

llm = ChatOpenAI(model_name=“gpt-4”, temperature=0.1)
response = llm.invoke(prompt.format_messages())
print(response.content)
示例二:混合检索 + 重排序 + 查询重写(生产级思路)

这个示例展示了更完整的工程化 RAG 管道,包含混合检索(稠密+稀疏)、重排序和查询重写。以下代码来自一个开源项目的核心流程。

python

核心流程示意(基于 LiuRAG 与 Hybrid RAG Pipeline 项目)

项目地址:github.com/lekliu/LiuRAG / github.com/jasstt/rag_project

步骤 1:查询重写(仅在有对话历史时触发)

将“他是怎么死的?”重写为“张翠山是怎么死的?”

rewritten_query = rewrite_query(original_query, chat_history)

步骤 2:混合检索 —— 向量 + BM25,结果用 RRF 融合

candidates = hybrid_search(
query=rewritten_query,
vector_store=chroma_db, # FastEmbed 语义检索
bm25_index=bm25_index, # 关键词检索
top_k=15, # 过采样候选
fusion_method=“rrf” # Reciprocal Rank Fusion
)

步骤 3:重排序 —— BGE-Reranker 精排

from FlagEmbedding import FlagReranker
reranker = FlagReranker(‘BAAI/bge-reranker-v2-m3’, use_fp16=True)
scores = reranker.compute_score([[rewritten_query, c.text] for c in candidates])
top_chunks = [c for _, c in sorted(zip(scores, candidates), reverse=True)[:5]]

步骤 4:生成答案(附带页码引用)

answer = generate_with_citations(rewritten_query, top_chunks)

输出示例:“张翠山是自刎身亡的。[参考来源:第 412 页]”

示例三:SQLite 嵌入式混合检索(轻量级/边缘部署)

如果不想依赖外部向量数据库,可以用 SQLite 同时做向量检索和全文检索。softrag 库封装了这一模式:

python
from softrag import Rag
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

初始化:所有数据(文档、向量、缓存)存在一个 .db 文件里

rag = Rag(
embed_model=OpenAIEmbeddings(model=“text-embedding-3-small”),
chat_model=ChatOpenAI(model=“gpt-4o”)
)

导入文档

rag.add_file(“document.pdf”)

查询(内部自动完成混合检索:FTS5 关键词 + 向量语义)

answer = rag.query(“文档中提到的关键结论是什么?”)
print(answer)
更底层的实现中,混合检索的融合策略可以是加权求和(如 70% 向量 + 30% 全文),也可以使用 RRF 仅基于排名进行融合。

选择建议

场景 参考示例
快速验证想法、学习 RAG 基本流程 示例一
追求回答质量,需要处理复杂或模糊问题 示例二
资源受限、需要嵌入式或本地化部署 示例三
总结
总的来说,大模型知识问答的主流算法呈现出从“单次检索”向“多步推理”、从“纯文本”向“结构化知识融合”演进的趋势。纯粹的参数化模型已较少单独使用,RAG 是基础底座,而如何更智能地进行检索(如多阶段、迭代式)以及如何更深度地融入知识图谱的结构化信息(用于背景增强或推理引导),是当前算法创新的主要方向。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐