基础RAG的局限性
标准RAG系统在以下场景中表现不佳:需要跨文档推理的复杂问题、需要结构化过滤的查询、需要动态调整检索策略的场景。高级RAG技术正是为了解决这些问题而设计的。
多跳检索(Multi-hop Retrieval)
多跳检索将复杂问题分解为多个子问题,依次检索和推理,逐步逼近最终答案:
from langchain.chains import MultiRetrievalQAChain
# 定义多个检索器
retriever_docs = vectorstore_docs.as_retriever()
retriever_code = vectorstore_code.as_retriever()
# 多跳检索链
chain = MultiRetrievalQAChain.from_retrievers(
llm=llm,
retrievers=[retriever_docs, retriever_code],
retriever_descriptions=[
"文档知识库:包含产品文档和用户手册",
"代码仓库:包含源代码和API文档"
]
)多跳检索的关键在于:
- 查询分解:将用户问题拆解为可独立检索的子问题
- 中间结果利用:将前一步检索结果作为下一步的上下文
- 信息融合:将从多个来源获取的信息整合为连贯答案
自查询检索(Self-Querying)
自查询检索让LLM自动从用户问题中提取结构化查询条件,实现语义搜索与元数据过滤的结合:
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo
metadata_field_info = [
AttributeInfo(
name="source",
description="文档来源",
type="string"
),
AttributeInfo(
name="year",
description="文档年份",
type="integer"
),
AttributeInfo(
name="category",
description="文档分类",
type="string"
)
]
retriever = SelfQueryRetriever.from_llm(
llm=llm,
vectorstore=vectorstore,
document_contents="技术文档集合",
metadata_field_info=metadata_field_info
)
# 用户问"2024年关于RAG的深度学习论文"
# 自动构建查询:语义="RAG深度学习" + 过滤 year=2024, category="论文"
results = retriever.get_relevant_documents(
"2024年关于RAG的深度学习论文"
)上下文压缩
当检索到的文档过长时,上下文压缩技术可以提取与查询最相关的片段:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=base_retriever
)
# 只返回文档中与查询相关的关键内容
compressed_docs = compression_retriever.get_relevant_documents(query)高级RAG架构设计
生产级RAG系统通常采用分层架构:
- 路由层:根据查询类型路由到不同的检索策略
- 检索层:混合多种检索方式(关键词、语义、结构化)
- 重排序层:使用Cross-encoder对检索结果重排序
- 生成层:结合检索结果生成最终答案,支持引用溯源
- 评估层:持续监控RAG系统的质量和性能
总结
高级RAG技术让知识库问答从「能用」走向「好用」。建议从基础RAG开始,根据实际痛点逐步引入高级技术,而不是一开始就追求「完美架构」。