RAG架构进阶:从基础检索到GraphRAG
RAG架构进阶:从基础检索到GraphRAG
检索增强生成(RAG)已成为大语言模型解决知识时效性和领域适配问题的标准方案。但基础RAG(向量检索+提示拼接)在面对复杂查询时暴露出明显短板:无法捕捉实体关系、缺乏全局推理能力。GraphRAG的出现标志着RAG架构从"语义匹配"向"结构理解"的范式升级。本文将系统梳理RAG的技术演进,并深入解析GraphRAG的实现原理。
一、基础RAG的架构与局限
1.1 标准RAG流水线
from langchain.vectorstores import Chroma from langchain.embeddings import OpenAIEmbeddings class BasicRAG: def __init__(self, documents): self.embeddings = OpenAIEmbeddings() self.vectorstore = Chroma.from_documents( documents, self.embeddings ) self.llm = ChatOpenAI() def query(self, question: str, k: int = 3) -> str: # 1. 向量检索Top-K相关文档 relevant_docs = self.vectorstore.similarity_search(question, k=k) # 2. 拼接上下文 context = "\n\n".join([doc.page_content for doc in relevant_docs]) # 3. LLM生成答案 prompt = f"基于以下上下文回答问题:\n\n{context}\n\n问题:{question}" return self.llm.predict(prompt)1.2 基础RAG的固有缺陷
| 问题类型 | 具体表现 | 根因 | |----------|----------|------| | 语义鸿沟 | 检索到表面相关但实质无关的文档 | 向量相似度≠语义相关性 | | 关系盲区 | 无法回答"A和B有什么关系" | 丢失实体间关联信息 | | 全局缺失 | 无法回答"总结全文档的主题分布" | 分段检索缺乏全局视图 | | 多跳推理 | 需要跨多个文档串联信息 | 单次检索无法覆盖推理链 |
二、RAG增强策略:从局部到全局
2.1 多路召回与重排序
class MultiWayRAG: def __init__(self): self.keyword_store = BM25Retriever() # 关键词检索 self.vector_store = Chroma() # 向量检索 self.reranker = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2') def retrieve(self, query, k=10): # 多路召回 keyword_results = self.keyword_store.retrieve(query, k=k*2) vector_results = self.vector_store.similarity_search(query, k=k*2) # 合并去重 candidates = self.deduplicate(keyword_results + vector_results) # 重排序 pairs = [(query, doc.page_content) for doc in candidates] scores = self.reranker.predict(pairs) # 返回Top-K return [candidates[i] for i in np.argsort(scores)[-k:]]2.2 查询重写与多步检索
class MultiStepRAG: def query(self, question): # 第一步:分解查询 sub_queries = self.decompose(question) # 第二步:逐个子查询检索 all_evidence = [] for sq in sub_queries: docs = self.retrieve(sq) all_evidence.extend(docs) # 第三步:基于证据链推理 answer = self.reason(question, all_evidence) return answer def decompose(self, question): prompt = f"将复杂问题分解为2-3个子问题:{question}\n输出JSON数组" return json.loads(self.llm.predict(prompt))三、GraphRAG:知识图谱驱动的RAG
GraphRAG由微软研究院提出,核心思想是在检索阶段引入知识图谱的拓扑结构,实现全局推理和关系感知。
3.1 GraphRAG索引构建流程
class GraphRAGIndexer: def __init__(self, llm): self.l