最近在用传统RAG系统做知识库问答的时候,突然遇到了一个尴尬的问题。
我问系统:“根据我们的研究数据,全球气温变暖的主要原因是什么?”
系统给出的答案支离破碎,虽然提到了几个因素,但完全没有把整个因果链条串起来。我意识到,问题不在大模型本身,而在于它能获取到的信息都是散落的碎片。
后来才明白,这正是传统RAG的痛点——它只能在文本块之间检索,却看不到整个知识图谱的全貌。
一、传统RAG的天花板
如果你用过RAG系统,可能也遇过类似的问题:
- 跨文档的信息无法连贯
- 检索文档越多,回答质量反而下降
- 融合多个数据源的知识特别困难
想象一下,用传统搜索方式在食谱书里找"炒鸡蛋"和"西红柿鸡蛋面"的做法,速度快得很。但如果你想知道为什么西红柿和鸡蛋搭配得这么完美,关键词搜索就显得无力了。
这正是传统语义检索方式的局限——它很擅长精确匹配,但不擅长理解隐藏在信息后面的深层逻辑。
二、GraphRAG出现了
微软推出了一套新方案来解决这个问题:GraphRAG(图检索增强生成)。核心思路很简单——与其把知识存成散乱的文本块,不如把它组织成一张知识图谱,其中实体是节点,实体之间的关系是边。
这样做有什么好处呢?
当大模型需要回答一个复杂问题时,它不再是盲目地找相似的文本段落,而是能够:
- 看到实体之间的关系
- 理解信息之间的逻辑连接
- 跨多个社区综合回答
简单说,GraphRAG让大模型从"查字典"升级到了"读书"。
三、它是怎么工作的
GraphRAG的工作流程分为两个阶段:索引阶段和查询阶段。
1、索引阶段:构建知识的骨架
首先,系统会把源文档分成可管理的文本单元。然后大模型出手了,它会自动:
- 识别实体和关系——从文本中提取出人、地点、公司等实体,以及它们之间的联系
- 构建知识图——用节点代表实体,用边代表关系
- 检测社区——使用Leiden算法找出紧密相关的实体集群
- 生成摘要——为不同级别的社区生成分层摘要
这个过程中,有两个关键步骤特别值得关注:
图抽取的目标是从原始数据中识别有意义的信息,把它们组织成图的形式。图摘要则是把复杂的图结构简化,去掉冗余信息,突出关键内容。就像整理一个杂乱的书架,既要保留重要的书,又要删除过期的杂志。
2、查询阶段:精准找到答案
当用户提问时,系统会:
- 判断问题的复杂程度,选择合适的社区级别
- 在选定的社区中检索相关信息
- 从多个相关社区综合生成答案
- 最后整合成一个完整的回复
这比传统RAG的做法要聪明得多。传统方式是匹配用户查询和文本块的相似度,而GraphRAG是在理解的基础上进行推理。
四、怎样实现它
理论讲到这儿,你可能想知道——这东西怎么落地?
市面上有现成的工具可用。微软有官方的GraphRAG实现,但也有更灵活的方案。比如用Neo4j + LangChain的组合,就特别受欢迎。
Neo4j是一个图数据库,专门用来存储和查询图结构的数据。LangChain是一个大模型框架,能把各种工具串联起来。把它们组合使用,就能搭建一个强大的GraphRAG系统。
五、代码实战:一步步搭建你的GraphRAG
我把整个实现过程整理成了可运行的代码。假设我们要构建一个关于科技公司的知识图。
第一步:准备环境和数据
# 安装必要的库 # pip install langchain neo4j langchain-openai langchain-experimental from langchain_core.documents import Document # 准备你的数据(可以是公司信息文档) content = """ 小米科技有限责任公司是一家专注于研发和推出创新技术的公司。 小米推出了智能家居产品和5G技术。 华为技术有限公司与清华大学建立了深度合作。 华为参与了5G标准的制定。 小米与美团合作开发物流解决方案。 """ # 转化为Document对象 documents = [Document(page_content=content)] print(f"加载了{len(documents)}份文档")第二步:连接Neo4j并创建知识图
from langchain_community.graphs import Neo4jGraph from langchain_experimental.graph_transformers import LLMGraphTransformer from langchain_openai import ChatOpenAI # 连接到Neo4j数据库(使用免费的Neo4j Aura) graph = Neo4jGraph( url="neo4j+s://your-db-uri", # 替换为你的Neo4j URI username="neo4j", password="your-password", # 替换为你的密码 database="neo4j" ) # 初始化LLM graph_llm = ChatOpenAI(temperature=0, model_name="gpt-4o-mini") # 创建图转换器,定义你要提取的实体和关系类型 graph_transformer = LLMGraphTransformer( llm=graph_llm, allowed_nodes=["公司", "产品", "技术", "教育机构", "合作伙伴"], allowed_relationships=["推出", "参与", "合作", "位于", "开发"], ) # 执行转换:从文档中提取实体和关系 graph_documents = graph_transformer.convert_to_graph_documents(documents) # 将图数据导入Neo4j graph.add_graph_documents(graph_documents) print(f"成功导入{len(graph_documents)}个图文档") print(f"提取的实体: {[node.id for node in graph_documents[0].nodes]}") print(f"提取的关系: {[(rel.source.id, rel.type, rel.target.id) for rel in graph_documents[0].relationships]}")第三步:用GraphRAG查询知识图
from langchain.chains import GraphCypherQAChain llm = ChatOpenAI(model="gpt-4o-mini", temperature=0) # 创建Cypher查询链 cypher_chain = GraphCypherQAChain.from_llm( graph=graph, cypher_llm=llm, qa_llm=llm, validate_cypher=True, verbose=True, # 设置为True可以看到生成的Cypher查询过程 allow_dangerous_requests=True ) # 测试几个问题 queries = [ "小米科技有限责任公司推出了哪些创新技术?", "华为技术有限公司与哪些教育机构建立了合作?", "都有哪些公司在我的数据库中?" ] for query in queries: print(f"\n问题: {query}") response = cypher_chain.invoke(query) print(f"答案: {response['result']}") print("-" * 50)六、更进一步:混合知识库系统
如果你想同时使用GraphRAG和传统RAG,我也准备了代码。这样可以兼得两种方法的优势。
第四步:建立向量数据库(传统RAG)
from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_openai import OpenAIEmbeddings from langchain_milvus import Milvus # 分割文本 text_splitter = RecursiveCharacterTextSplitter( chunk_size=250, chunk_overlap=30 ) splits = text_splitter.split_documents(documents) # 创建向量嵌入 embeddings = OpenAIEmbeddings(model="text-embedding-3-large") # 连接到Milvus向量数据库(使用免费的Zilliz云服务) vectorstore = Milvus.from_documents( documents=splits, collection_name="company_rag_milvus", embedding=embeddings, connection_args={ "uri": "https://your-milvus-uri", # 替换为你的Milvus URI "user": "your-username", "password": "your-password", } ) print(f"向量数据库已创建,包含{len(splits)}个文本块")第五步:构建传统RAG代理
from langchain.prompts import PromptTemplate from langchain_core.output_parsers import StrOutputParser # 定义RAG提示词 prompt = PromptTemplate( template="""你是一个问答助手。 使用以下检索到的上下文来回答问题。如果你不知道答案,就说你不知道。 最多使用三句话,保持简洁: 问题: {question} 上下文: {context} 答案:""", input_variables=["question", "context"], ) # 构建RAG链 rag_chain = prompt | graph_llm | StrOutputParser() # 执行查询 question = "我的知识库中都有哪些公司信息?" retriever = vectorstore.as_retriever(search_kwargs={"k": 2}) # 检索相关文档 docs = retriever.invoke(question) # 生成回答 generation = rag_chain.invoke({ "context": "\n\n".join([doc.page_content for doc in docs]), "question": question }) print(f"RAG系统的回答: {generation}")第六步:多代理系统——让两种方法协同工作
from langgraph.graph import StateGraph, MessagesState, START, END from langchain_core.messages import HumanMessage from typing import Literal from typing_extensions import TypedDict class AgentState(MessagesState): next: str class Router(TypedDict): """路由到不同的子代理""" next: Literal["graph_kg", "vec_kg", "FINISH"] # 图数据库代理 def graph_kg_agent(state: AgentState): messages = state["messages"][-1] response = cypher_chain.invoke(messages.content) return { "messages": [HumanMessage(content=response["result"], name="graph_kg")] } # 向量数据库代理 def vec_kg_agent(state: AgentState): messages = state["messages"][-1] retriever = vectorstore.as_retriever(search_kwargs={"k": 2}) docs = retriever.invoke(messages.content) generation = rag_chain.invoke({ "context": "\n\n".join([doc.page_content for doc in docs]), "question": messages.content }) return { "messages": [HumanMessage(content=generation, name="vec_kg")] } # 主管代理:判断用何种方式回答 def supervisor(state: AgentState): system_prompt = """你是一个任务主管,管理两个工作者: - graph_kg: 基于知识图,擅长回答全局、综合性问题 - vec_kg: 基于向量检索,擅长回答细节问题 根据用户问题,判断应该使用哪个工作者。""" messages = [{"role": "system", "content": system_prompt}] + state["messages"] response = graph_llm.with_structured_output(Router).invoke(messages) next_worker = response["next"] if next_worker == "FINISH": next_worker = END return {"next": next_worker} # 构建图 builder = StateGraph(AgentState) builder.add_node("supervisor", supervisor) builder.add_node("graph_kg", graph_kg_agent) builder.add_node("vec_kg", vec_kg_agent) # 设置工作流 builder.add_edge(START, "supervisor") for worker in ["graph_kg", "vec_kg"]: builder.add_edge(worker, "supervisor") builder.add_conditional_edges("supervisor", lambda state: state["next"]) # 编译并运行 multi_agent_graph = builder.compile() # 测试多代理系统 test_queries = [ "都有哪些公司在我的数据库中?", # 应该用graph_kg "小米推出了什么技术?" # 应该用graph_kg ] for query in test_queries: print(f"\n用户问题: {query}") for output in multi_agent_graph.stream( {"messages": query}, stream_mode="values" ): last_message = output["messages"][-1] print(f"{last_message.name}: {last_message.content}") print("-" * 50)七、快速上手的步骤
第一步:准备Neo4j实例。可以用免费的Neo4j Aura云服务,注册即用,不需要本地部署。
第二步:用LLM把文档转换成图。这里可以自定义节点类型和关系类型,比如:
- 节点:公司、产品、技术、市场
- 关系:推出、合作、开发、位于
系统会自动提取文档中对应的实体和关系,构建知识图。
第三步:可视化和验证。登录Neo4j平台,就能看到生成的完整知识图。确保数据准确后,就可以用来回答问题了。
八、更进一步:混合知识库
这是我最近在做的一个有意思的尝试——同时使用GraphRAG和传统RAG。
想法是这样的:GraphRAG擅长回答宏观、全面的问题,比如"这个公司有哪些合作伙伴"。而传统RAG擅长处理细节问题,比如"某个产品的具体参数是什么"。
所以我搭建了一个多代理系统,用supervisor来判断用户问题的类型,然后路由到不同的知识库:
- graph_kg:基于知识图的代理,处理全局性问题
- vec_kg:基于向量的代理,处理细节问题
向量数据库我选择了云端的Milvus,这样避免了本地部署的麻烦。两个代理各司其职,大模型在它们之间充当主管,协调分工。
实际测试效果还不错。问"数据库里有哪些公司"时,graph_kg会遍历整个知识图给出完整列表。问"某个公司推出了哪些创新技术"时,它会基于实体之间的关系进行推理。
九、总结
从传统RAG到GraphRAG,这不仅是技术的升级,更是思维方式的转变。
我们不再只是被动地检索信息片段,而是主动构建知识的结构。大模型也不再只是做语言匹配,而是真正在理解和推理。
虽然GraphRAG还不是完美的(毕竟也依赖于大模型的抽取质量),但方向是清楚的——让AI系统更像人类思考一样,理解信息之间的关系,看到知识的全貌。
如果你的业务涉及复杂的知识库问答,值得尝试一下。而且现在有免费的云服务可以用,技术上的壁垒已经不那么高了。
把上面的代码复制下来,替换成你自己的API密钥和数据库URI,就可以跑起来了。
想入门 AI 大模型却找不到清晰方向?备考大厂 AI 岗还在四处搜集零散资料?别再浪费时间啦!2025 年AI 大模型全套学习资料已整理完毕,从学习路线到面试真题,从工具教程到行业报告,一站式覆盖你的所有需求,现在全部免费分享!
👇👇扫码免费领取全部内容👇👇
一、学习必备:100+本大模型电子书+26 份行业报告 + 600+ 套技术PPT,帮你看透 AI 趋势
想了解大模型的行业动态、商业落地案例?大模型电子书?这份资料帮你站在 “行业高度” 学 AI:
1. 100+本大模型方向电子书
2. 26 份行业研究报告:覆盖多领域实践与趋势
报告包含阿里、DeepSeek 等权威机构发布的核心内容,涵盖:
- 职业趋势:《AI + 职业趋势报告》《中国 AI 人才粮仓模型解析》;
- 商业落地:《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》;
- 领域细分:《AGI 在金融领域的应用报告》《AI GC 实践案例集》;
- 行业监测:《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。
3. 600+套技术大会 PPT:听行业大咖讲实战
PPT 整理自 2024-2025 年热门技术大会,包含百度、腾讯、字节等企业的一线实践:
- 安全方向:《端侧大模型的安全建设》《大模型驱动安全升级(腾讯代码安全实践)》;
- 产品与创新:《大模型产品如何创新与创收》《AI 时代的新范式:构建 AI 产品》;
- 多模态与 Agent:《Step-Video 开源模型(视频生成进展)》《Agentic RAG 的现在与未来》;
- 工程落地:《从原型到生产:AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。
二、求职必看:大厂 AI 岗面试 “弹药库”,300 + 真题 + 107 道面经直接抱走
想冲字节、腾讯、阿里、蔚来等大厂 AI 岗?这份面试资料帮你提前 “押题”,拒绝临场慌!
1. 107 道大厂面经:覆盖 Prompt、RAG、大模型应用工程师等热门岗位
面经整理自 2021-2025 年真实面试场景,包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题,每道题都附带思路解析:
2. 102 道 AI 大模型真题:直击大模型核心考点
针对大模型专属考题,从概念到实践全面覆盖,帮你理清底层逻辑:
3. 97 道 LLMs 真题:聚焦大型语言模型高频问题
专门拆解 LLMs 的核心痛点与解决方案,比如让很多人头疼的 “复读机问题”:
![]()
三、路线必明: AI 大模型学习路线图,1 张图理清核心内容
刚接触 AI 大模型,不知道该从哪学起?这份「AI大模型 学习路线图」直接帮你划重点,不用再盲目摸索!
路线图涵盖 5 大核心板块,从基础到进阶层层递进:一步步带你从入门到进阶,从理论到实战。
L1阶段:启航篇丨极速破界AI新时代
L1阶段:了解大模型的基础知识,以及大模型在各个行业的应用和分析,学习理解大模型的核心原理、关键技术以及大模型应用场景。
L2阶段:攻坚篇丨RAG开发实战工坊
L2阶段:AI大模型RAG应用开发工程,主要学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。
L3阶段:跃迁篇丨Agent智能体架构设计
L3阶段:大模型Agent应用架构进阶实现,主要学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造Agent智能体。
L4阶段:精进篇丨模型微调与私有化部署
L4阶段:大模型的微调和私有化部署,更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调,并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。
L5阶段:专题集丨特训篇 【录播课】
![]()
四、资料领取:全套内容免费抱走,学 AI 不用再找第二份
不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:
👇👇扫码免费领取全部内容👇👇
2025 年想抓住 AI 大模型的风口?别犹豫,这份免费资料就是你的 “起跑线”!