一、RAG概述

RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合检索和生成的AI技术。

核心思想:

  • 从知识库检索相关信息
  • 将检索结果作为上下文
  • 结合用户问题生成回答

解决的问题:

  • 知识时效性:模型训练后无法获取新知识
  • 幻觉问题:模型可能生成虚假信息
  • 领域知识:模型缺乏特定领域知识
  • 数据隐私:敏感数据不能用于训练

二、RAG架构

基本流程

1
2
3
4
5
6
7
8
9
10
11
用户问题

问题理解

向量检索 → 知识库

上下文组装

LLM生成

回答

核心组件

文档处理:

  • 文档加载
  • 文本分割
  • 向量化

向量数据库:

  • 存储向量
  • 相似度检索

检索模块:

  • 问题向量化
  • 相似度计算
  • 结果排序

生成模块:

  • 提示组装
  • LLM调用
  • 结果生成

三、文档处理

文档加载

1
2
3
4
5
6
7
8
9
from langchain.document_loaders import TextLoader, PDFLoader

# 加载文本
loader = TextLoader("doc.txt")
documents = loader.load()

# 加载PDF
loader = PDFLoader("doc.pdf")
documents = loader.load()

文本分割

1
2
3
4
5
6
7
8
from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)

chunks = splitter.split_documents(documents)

分割策略:

  • 固定长度分割
  • 递归字符分割
  • 按段落分割
  • 按语义分割

向量化

1
2
3
4
from langchain.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()
vectors = embeddings.embed_documents([chunk.page_content for chunk in chunks])

常用嵌入模型:

  • OpenAI Embeddings
  • BERT Embeddings
  • Sentence Transformers

四、向量数据库

常用向量数据库

数据库 特点
Pinecone 托管服务,易用
Milvus 开源,高性能
Weaviate 开源,支持混合检索
Chroma 轻量级,本地部署
FAISS Facebook开源,高效

存储向量

1
2
3
4
5
6
7
from langchain.vectorstores import Chroma

vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)

相似度检索

1
2
3
4
5
# 相似度检索
results = vectorstore.similarity_search(query, k=3)

# 相似度检索带分数
results = vectorstore.similarity_search_with_score(query, k=3)

混合检索

结合关键词检索和向量检索:

1
2
3
4
5
6
7
8
9
10
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever

bm25_retriever = BM25Retriever.from_documents(chunks)
vector_retriever = vectorstore.as_retriever()

ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.4, 0.6]
)

五、检索优化

重排序

1
2
3
4
5
6
7
8
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank

compressor = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever()
)

查询改写

1
2
3
4
5
6
7
8
9
10
from langchain.chains import LLMChain

rewrite_prompt = """
将用户问题改写为更适合检索的形式:
原始问题:{query}
改写后:
"""

chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template(rewrite_prompt))
rewritten_query = chain.run(query)

多查询检索

1
2
3
4
5
6
from langchain.retrievers.multi_query import MultiQueryRetriever

retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)

六、生成回答

提示模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from langchain.prompts import PromptTemplate

template = """
根据以下上下文回答问题:

上下文:
{context}

问题:{question}

回答:
"""

prompt = PromptTemplate.from_template(template)

RAG链

1
2
3
4
5
6
7
8
9
10
11
from langchain.chains import RetrievalQA

qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(),
return_source_documents=True
)

result = qa_chain({"query": question})
print(result["result"])

引用来源

1
2
3
for doc in result["source_documents"]:
print(f"来源: {doc.metadata['source']}")
print(f"内容: {doc.page_content}")

七、评估指标

检索质量

  • 召回率:相关文档被检索出的比例
  • 精确率:检索结果中相关文档的比例
  • MRR:平均倒数排名

生成质量

  • 准确性:回答是否正确
  • 相关性:回答是否切题
  • 完整性:回答是否完整

评估方法

1
2
3
4
5
6
7
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy

result = evaluate(
dataset,
metrics=[faithfulness, answer_relevancy]
)

八、应用场景

企业知识库:

  • 产品文档问答
  • 内部知识检索
  • 流程指引

客服系统:

  • 智能问答
  • 问题诊断
  • 解决方案推荐

法律医疗:

  • 法规检索
  • 病历分析
  • 专业问答

九、最佳实践

文档处理

  • 合理设置chunk_size和overlap
  • 保留文档元数据
  • 定期更新知识库

检索优化

  • 使用混合检索
  • 实施重排序
  • 查询改写和扩展

生成优化

  • 设计清晰的提示模板
  • 控制上下文长度
  • 提供引用来源

十、总结

RAG核心要点:

  • 检索和生成结合
  • 解决知识时效性和幻觉问题
  • 文档处理、向量存储、检索、生成四个环节
  • 持续优化检索质量和生成效果

RAG是构建知识问答系统的核心技术,广泛应用于企业知识库、智能客服等场景。