以下是 LangChain 中主流的 RAG 实现方式及其核心原理、应用场景和代码示例,综合多篇技术文档的实践经验整理而成:
一、基础流程实现
1. 全自动索引构建(VectorstoreIndexCreator)
原理:封装文档加载→分块→向量化→存储→检索全流程,适合快速原型开发。通过指定向量
存储类型(如 FAISS)和嵌入模型,自动完成索引构建。
特点:自动处理文本分块和向量索引,但灵活性较低
代码示例:
from langchain.indexes import VectorstoreIndexCreator
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
index_creator = VectorstoreIndexCreator(
vectorstore_cls=FAISS,
embedding=OpenAIEmbeddings() # 需提前配置
)
loader = WebBaseLoader("https://example.com")
index = index_creator.from_loaders([loader]) # 自动完成分块+索引
result = index.query("文章主题是什么?", llm=ChatOpenAI()) # 需显式传入LLM
2. 标准问答链(RetrievalQA)
原理:基于内置模板实现检索增强生成,支持stuff
(文档拼接)、map_reduce
(分块处理)等链类型。
优化点:通过search_kwargs
控制检索数量和质量(如过滤低分文档)。
代码示例:
内置默认模板:
LangChain 的 RetrievalQA
默认使用以下隐式模板(未显式声明时自动应用):
template = """Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
{context}
Question: {question}
Helpful Answer:"""
特点:
- 仅包含
{context}
和{question}
两个占位符 - 无语言或格式约束,依赖 LLM 的通用生成能力
- 未明确处理文档来源或回答规范(易产生幻觉)
示例(修改prompt):
from langchain_core.prompts import PromptTemplate
# 修改默认template
template = """你是一个专业的知识库助手。根据以下检索到的文档内容回答问题:
{context}
问题:{question}
回答要求:
1. 用中文简洁回答,引用来源编号(如[来源1])
2. 若文档不相关,回答“知识库中无相关信息”
3. 禁止编造未提及的内容"""
QA_PROMPT = PromptTemplate(
template=template,
input_variables=["context", "question"]
)
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# 初始化组件
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.load_local("db", embeddings)
llm = ChatOpenAI(model="gpt-4", temperature=0.2)
# 构建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(
search_kwargs={
"k": 3, "score_threshold": 0.7} #注意score_threshold的设置可能会过滤所有文档,应该进行测试以确定是否用该参数。
),
chain_type_kwargs={
"prompt": QA_PROMPT}, # 注入自定义模板
return_source_documents=True