AI Agent集成GraphRAG与Neo4j:从多跳检索到知识图谱落地全解析
发布时间:2026/10/31 4:53:43 锦皓数字建站

做AI Agent的项目十有八九最后会卡在“记忆”和“上下文”这两件事上。普通RAG把文档切成向量块查到了就给大模型塞进去这套路在问答场景里够用但一旦Agent需要跨多个文档做推理、需要理解实体之间的多层关系、需要回答“A公司的供应链里有哪些环节依赖B公司”这类问题扁平向量检索就明显吃力了。我去年把几个Agent项目从纯向量RAG迁移到GraphRAG图数据库选的是Neo4j整体效果提升非常明显复杂多跳问题的准确率上去了幻觉明显减少Agent在回答时还会主动引用实体关系路径而不是靠文本相似度硬猜。这篇文章就把这套“AI Agent GraphRAG Neo4j”的方案从头拆一遍从架构设计、环境搭建到核心代码和踩坑记录都写清楚给正在选型或者已经在折腾GraphRAG的朋友做个参考。GraphRAG这个概念本身不复杂核心就是把“检索增强生成”里的索引和检索环节从向量相似度扩展到图结构。说人话就是以前我们让AI去文档里找“长得像”的内容现在我们在文档之上建一张知识图谱让AI先去图上找“有关系”的内容。Neo4j在这里承担的是知识图谱的存储与查询引擎Cypher查询语句可以方便地表达多跳关系、路径枚举和子图匹配这些都是传统向量数据库做不到的。下面从头说。1. 为什么AI Agent需要GraphRAG以及这件事的本质是什么1.1 传统RAG的根本短板检索单元是“块”不是“实体”做RAG的人都知道文档切块是个令人头疼的环节。块太小语义不完整块太大向量检索的精确度又下降。即便你把块切得很完美向量检索本质上还是“语义相似度排序”它能告诉你哪些块内容和问题像但无法告诉你这些内容之间的因果、隶属、时间先后或依赖关系。比如用户问“李雷在加入现在的公司之前在哪家单位任职”如果两份经历分别写在不同文档的不同段落里普通RAG可能只检索到其中一份或者检索到一堆不相干的块答案自然就拼不出来。GraphRAG把这个问题转化成了图遍历问题。它先把文档中的实体抽取出来再把实体之间的关系显式建模例如“任职于”“发布于”“参与”“依赖”等。这样同一个问题在图上可以表达为找到“李雷”这个节点沿着历史任职关系往前走就能拿到完整的职业路径。这个过程中不需要语义相似度不需要向量打分只需要图结构上的确定性遍历。对于AI Agent来说这种确定性和可解释性非常关键——它意味着回答可以回溯到具体的关系路径而不是黑盒地猜。1.2 GraphRAG的核心思路从“找相似”升级到“走关系”GraphRAG整个流水线不出三步抽取、存储、检索。抽取阶段用大模型从文档里识别出实体和关系存储阶段把实体写成图节点把关系写成边同时保留每个实体的文本描述和向量嵌入检索阶段先从问题中识别出种子实体再由种子实体出发在图里做多跳遍历把经过的节点和路径整理成上下文喂给大模型。这个“遍历上下文”和普通RAG的“拼接检索块”相比最大的区别是上下文自带结构大模型看到的是一张局部子图而不是一堆语义相近但可能互不相关的段落。这样做的直接收益是多跳问题的上下文命中率大幅提升。我做过一个企业内部知识库的Agent在纯向量RAG下问“哪些售后工单和高可用相关组件关联最紧密”这类跨表问题回答基本靠猜换成GraphRAG之后Agent会先定位到高可用组件节点再沿关联关系遍历相关的工单节点回答时甚至能给出“这些工单都提到了同一套配置变更”这样有逻辑链的结论。1.3 为什么图数据库选Neo4j而不是自己用关系型数据库硬造有人会问实体关系用MySQL或者PostgreSQL也能建模为什么要引入Neo4j核心原因有两个遍历效率和表达力。多跳查询在关系型数据库里通常要自连接很多次SQL会写得非常笨重而且深层遍历性能随跳数非线性恶化。Neo4j采用的是原生图存储节点和关系在物理存储上能够高效地沿着关系链遍历Cypher语法里一条MATCH (a)-[*1..3]-(b)就能表示一到三跳路径这种表达力是SQL要写半天才能达到的。另外Neo4j的Cypher语法对“从某个实体出发、探索关联”这种场景极度友好。以Agent的应用模式来看我们需要频繁地做“找种子节点—扩展邻域—修剪无关分支”的操作这在Neo4j里是原生操作。而且Neo4j还自带全文索引和向量索引可以同时支撑实体名的模糊匹配和向量语义检索也就是说你可以在一套系统里完成“关键词找到实体”和“语义找到实体”两条路不需要再额外接一个Elasticsearch或者专门的向量库。1.4 适合用GraphRAG Neo4j的典型项目不是所有项目都值得上GraphRAG。如果你的场景是“单篇长文档问答”“知识点检索”“FAQ问答”纯向量RAG更轻量、成本更低。但如果你的Agent需要处理多份文档、需要回答实体间关系问题、需要在回答中给出推理链路或者你有比较复杂的业务实景图谱需求GraphRAG就是明显更优的选择。典型场景包括企业知识库智能问答、供应链风险分析助手、投研信息聚合Agent、医疗/法律领域的关联案例检索、以及任何需要“业务对象之间关系”的智能体应用。适合的人群也相对聚焦已经在做Agent开发、研究RAG优化、或者正在折腾知识图谱落地的工程师。2. 整体架构设计与数据流转2.1 Agent调用GraphRAG的完整链路我习惯把整个系统分成四层文档接入层、图谱构建层、检索层和Agent调度层。文档接入层负责解析PDF、Word、Markdown把非结构化文本清洗成段落和句子图谱构建层调用大模型抽取实体、关系和属性写入Neo4j检索层接收Agent的意图完成实体定位和图遍历Agent调度层负责把用户的自然语言问题转成检索请求把检索结果组装成上下文再交给大模型生成最终回答。这四层之间用异步任务队列解耦图谱构建不阻塞Agent的在线问答。这样一个链路的优势在于Agent本身不需要理解图结构。Agent只需要发出一条自然语言问题检索层通过函数调用或工具调用把问题解析成实体然后在图上执行查询最后把结果序列化成文本返回。Agent的主要任务是判断什么时候调用这个工具、怎么组织返回的多跳路径而不是自己去写Cypher。也就是说GraphRAG对Agent而言就是一个“高信息密度的检索工具”。2.2 图谱构建管道的四步法识别、关系抽取、属性抽取、去重合并图谱构建是GraphRAG里最费功夫的部分。我在实际项目中总结成四个阶段。第一步是实体识别让大模型从句子中找出有信息量的名词性实体比如人名、公司名、产品名、技术名词。第二步是关系抽取针对句子中同时出现的实体对判断它们之间构成什么关系例如“发布”“合作”“导致”“隶属于”等。第三步是属性抽取把每个实体的别名、摘要、数据类型、重要描述抽取出来存在节点属性里。第四步是去重合并这一条在真实数据里极其重要因为大模型抽取出来的实体不是稳定的同一个“Acme科技”可能被抽出为“Acme公司”“Acme科技公司”“Acme”三种写法需要靠实体对齐和归一化把它们合并成同一个节点。这里要说一个很容易踩的坑不要一开始就追求关系抽取的完美度。一个文档库里可能有上万条句子如果让大模型对每条句子都做一次完整抽取成本巨大而且抽取质量往往不稳定。更务实的做法是先用轻量模型或规则做初筛只抽置信度高的句子再交给大模型精细抽取。你也可以先做实体识别再做关系抽取分两步走这样每一步的输入输出都更可控。2.3 存储与索引方案Neo4j 向量索引 全文索引很多初学GraphRAG的人以为把图建好就行了其实检索性能很大程度上依赖索引。在Neo4j里我至少会建两类索引。第一类是实体名称的全文索引用于把问题里的关键词快速映射到图中的实体节点例如用户问“Acme最近发布了什么”全文索引可以直接定位到Acme节点。第二类是节点属性的向量索引用于做语义匹配当问题里的实体名称有歧义时可以通过实体的语义描述找到最接近的候选实体。在属性设计上我给每个实体节点都存了name、type、description、embedding这几个核心字段。description是实体的一到两句话摘要由大模型在抽取时生成embedding是描述文本的向量。关系上则根据类型建立边边上也可以带source字段记录这个关系来自哪篇文档和哪个句子方便追溯可信来源。把原始文档的来源信息挂在边上是提高Agent答案可信度的关键做法。2.4 检索策略与推理路径的取舍GraphRAG的检索策略直接决定回答质量这里没有标准答案我给出几种实测有效的模式。第一种是“实体直接定位”用户问题中的实体名在图谱里有唯一对应节点直接从该节点取相邻关系第二种是“候选实体子图遍历”问题里的实体名不唯一或可有多个候选节点先通过全文索引或向量检索取TopN候选再对每个候选分别做一到三跳遍历最后合并去重第三种是“关系路径约束”有些问题本身带有明确关系约束比如“谁参与了Acme的融资”检索时在Cypher里指定关系类型PARTICIPATED_IN缩小遍历范围。取舍的逻辑也很简单跳数越多召回上下文越丰富但噪声也越大大模型越容易跑偏。我实践的默认策略是一到二跳优先只有在用户问题明显需要跨多份文档关联时才放宽到三跳及以里。每一次遍历都要带上“关系方向”的约束。无方向的图遍历会把关联关系变成一张蜘蛛网上下文里塞入大量无关路径反而会让大模型犯糊涂。3. Neo4j环境准备与安装配置3.1 本地安装还是容器化部署Neo4j的部署方式主要有两种Neo4j Desktop桌面版和Docker容器。我个人在不同阶段用两种方式都踩过坑。Desktop版适合在本机快速做概念验证界面直观能方便地打开多个项目和管理不同图谱实例但它有一个隐藏问题——版本升级时会牵连本机环境而且服务常驻在用户会话里不方便做自动化。Docker版本的优点是无侵入、环境隔离、配置可视化特别适合多台机器部署和团队重现环境。生产环境我坚决用Docker Compose或Kubernetes因为需要方便地扩容、备份、迁移。如果你的机器上已经装了Docker那直接走容器化路线就行。如果只是一时想试试GraphRAG下载Neo4j Desktop版也完全没问题。需要提醒的是市面上还有大量旧的Neo3.5、4.x教程那些版本已经非常老了新项目直接上最新的Neo5.x稳定版不要在旧版本上浪费时间。3.2 Docker方式安装Neo4j 5.x的完整操作我以Neo4j 5.x在Docker环境下的部署为例操作非常简单。拉取镜像并启动容器时我一般会暴露两个端口7474用于浏览器管理界面7687是Bolt协议端口供Python等客户端连接。同时设置初始化密码和自动加载几个常用插件。命令参考如下docker run -d \ --name neo4j-graphrag \ -p 7474:7474 -p 7687:7687 \ -e NEO4J_AUTHneo4j/YourStrongPassw0rd \ -e NEO4J_PLUGINS[apoc, graph-data-science] \ -e NEO4J_server_memory_heap_initial__size1G \ -e NEO4J_server_memory_heap_max__size2G \ neo4j:5.20这里有几个细节要解释。NEO4J_PLUGINS这个环境变量会自动下载并启用APOC和GDS插件APOC提供大量图算法辅助函数GDS提供社区检测、PageRank等内置图算法对GraphRAG的实体对齐和关键节点识别很有用。内存参数一定要显式设置尤其是容器环境下默认堆内存可能过低构建大图时频繁GC会让整个实例卡死。如果不想自动下载插件可以用-v挂载本地插件目录手动把jar包放进去再重启这两种方式我都试过自动方式更省心。安装完成后浏览器打开http://localhost:7474用neo4j/YourStrongPassw0rd登录。第一次连接时建议先修改密码同时把社区版权限限制看清楚。Neo4j社区版和桌面版一样不支持某些企业级安全特性但对GraphRAG开发已经完全够用。3.3 配置认证与访问控制默认的neo4j用户是超级管理员为了让Agent应用访问数据库时更安全我习惯单独创建一个专用用户。在Neo4j浏览器里执行两行Cypher就能完成CREATE USER agent_app IF NOT EXISTS SET PASSWORD agent-pass-123 SET CHANGE REQUIRED false; GRANT ROLE editor TO agent_app;这里把agent_app赋了editor角色它能对图数据进行读写但不能修改数据库配置。如果你的Agent只需要读取图谱不参与图谱构建那更稳妥的做法是创建reader账号只给READ权限避免因为应用代码bug误删节点或关系。这一条在生产项目里非常重要。3.4 APOC与GDS插件图算法和图实用函数GraphRAG阶段APOC几乎属于必装。比如做实体别名归一化时我常用apoc.text.levenshteinDistance来计算两个名字的编辑距离做文本正则清洗时用到apoc.text.replace。GDS则是在图谱规模达到几十万节点以上时需要考虑的社区检测功能可以把网络中的聚合节点识别出来这在构建顶层上下文摘要时特别好用。安装GDS时注意版本匹配很重要。Neo4j 5.20下必须使用GDS 2.7.x或对应版本版本不对会直接启动失败。如果你用Docker的环境变量方式安装会自动匹配兼容版本问题不大。如果用离线jar方式必须去Neo4j官方下载页面对应版本别图省事随便下一个高版本jar我吃过这个亏启动日志报错时排查半天。4. 核心代码实现从文档到图谱再到检索4.1 实体抽取环节用LLM输出结构化JSON实体抽取我习惯用大模型配合Pydantic定义的结构化输出来做。比如从文档句子中抽出的实体必须返回name、type、description三个字段。下面是一段示意代码用LangChain的with_structured_output来保证输出格式from typing import List from pydantic import BaseModel, Field from langchain_openai import ChatOpenAI class Entity(BaseModel): name: str Field(description实体名称) type: str Field(description实体类型如 Person/Company/Product) description: str Field(description一句话摘要) class Relation(BaseModel): source: str Field(description起点实体名) target: str Field(description终点实体名) relation: str Field(description关系类型) evidence: str Field(description支持该关系的原句) llm ChatOpenAI(modelgpt-4o, temperature0) extractor llm.with_structured_output(Entity)这里的两个细节值得注意。第一temperature务必设置为0或接近0实体抽取不是创意任务输出稳定性优先。第二输出字段中一定要包含evidence即原始句子中的证据文本这样后续在图谱里挂上出处回答问题时能回拉到原文显著降低大模型编造理由的概率。4.2 关系抽取与写入Neo4j拿到实体和关系后写图时永远使用MERGE而不是CREATE这是最容易被忽略的一点。CREATE会无条件插入节点哪怕同名实体已经存在它也会再建一个重复节点MERGE则先匹配再插入能够尽量保证实体的唯一性。写入示意如下from neo4j import GraphDatabase driver GraphDatabase.driver(bolt://localhost:7687, auth(neo4j, YourStrongPassw0rd)) cypher MERGE (s:Entity {name: $source}) ON CREATE SET s.type $source_type MERGE (t:Entity {name: $target}) ON CREATE SET t.type $target_type MERGE (s)-[r:RELATED {type: $relation}]-(t) ON CREATE SET r.evidence $evidence with driver.session() as session: session.run(cypher, source..., target..., relation...)如果同一条关系被多篇文档重复提到MERGE会让这条关系只有一条边后面的说明需要区分场景。在关系不太多时我倾向于保留一条边同时在边上累加一个count属性用它来表示这条关系被多少篇文档支持。在回答问题时count越大可信度越高。如果每次证据都要完整保留可以给关系增加evidence_list列表而不是覆盖掉原值。4.3 文本向量化与图存储融合实体节点上的embedding属性是GraphRAG里语义检索的关键。我通常用OpenAI的text-embedding-3-small或者本地的bge-m3模型把实体的description字段转成向量存到节点属性里并在Neo4j里建立向量索引。Neo4j的向量索引语法如下CREATE VECTOR INDEX entity_embedding IF NOT EXISTS FOR (n:Entity) ON (n.embedding) OPTIONS { indexConfig: { vector.dimensions: 1024, vector.similarity_function: cosine }}这里务必注意维度必须和嵌入模型输出的维度一致。text-embedding-3-small输出1536维bge-m3输出1024维设错了这个索引根本用不了。向量索引建立完成后就可以在Cypher里直接做相似度查询MATCH (n:Entity) WHERE n.embedding IS NOT NULL WITH n, vector.similarity.cosine(n.embedding, $query_embedding) AS score ORDER BY score DESC LIMIT 5 RETURN n.name, n.type, score不过我在实际项目中很少直接拿全库的向量相似度来定位实体因为向量检索的召回质量在实体名称明确时反而不如全文索引。更常用的组合是全文索引查名称关键词向量索引用于名称不够精确或同义词场景下的补充召回。4.4 检索与生成环节Cypher多跳遍历 上下文拼装检索是Agent使用的入口。我设计的检索函数流程分三步先识别问题中的实体关键词再在Neo4j中定位种子实体然后从种子实体出发执行多跳遍历。以下是一个典型的二跳路径查询MATCH (seed:Entity {name: $seed_name}) MATCH (seed)-[r*1..2]-(neighbor) WHERE neighbor seed RETURN seed, r, neighbor LIMIT 50这个查询会拿到围绕种子实体的局部子图但我不会把整段子图直接甩给大模型。我更习惯在检索层把路径转成自然语言描述比如Acme科技 --发布-- 智能巡检系统 李雷 --任职于-- Acme科技 智能巡检系统 --依赖-- Neo4j图数据库把这个上下文按关系路径的格式拼接再和用户问题一起发送给大模型生成最终回答。相比直接把Cypher输出JSON塞给大模型这种“路径文本化”的方式能让大模型更容易理解图中的逻辑链。当然如果你的大模型能力足够强直接给JSON也让它可以接受但路径文本的体验是明显更好的。5. 常见问题与排查技巧实录5.1 同名实体重复MERGE之后还是出现多个节点在实际工程里最常出现的问题就是“实体重复”。即便用了MERGE因为实体名称里有细微差别比如前后空格、中英文标点、缩写形式不同图里依然会出现好几个本应合并的节点。这个问题不是靠MERGE能解决的关键要在抽取阶段就做标准化。我的经验是三层保险第一层在抽取时统一规则实体名去掉前后空格、统一为小写、中英文标点统一换算第二层在写入后定期跑对齐任务用编辑距离或向量相似度找出近似节点再合并第三层是在查询时用全文索引而不是严格的等值匹配。没有这三层图里的实体数会虚增不少整个图谱作为Agent记忆的质量也会随之下降。5.2 Cypher查询慢索引没有命中很多人图建好后查询全是全库扫描一旦节点数量上万查询就变得特别慢。排查思路很简单用EXPLAIN或PROFILE看查询计划如果里面有NodeByLabelScan而不是NodeIndexSeek说明索引没命中。最常见的解决路径是为实体名称建唯一约束同时为关系类型建索引。CREATE CONSTRAINT entity_name_unique IF NOT EXISTS FOR (n:Entity) REQUIRE n.name IS UNIQUE;实体名称做了唯一约束之后MATCH (n:Entity {name:$name})就能走索引查询性能会是数量级的提升。同时如果你的检索里高频使用某个关系类型比如RELATED可以考虑为关系也建索引。Neo4j对关系的索引支持晚一些但5.x已经完全可用。5.3 图谱构建成本过高每轮全量抽取导致钱包吃不消GraphRAG目前最大的痛点之一就是构建成本。一篇文档可能有几百句句句都调大模型做抽取费用和耗时都非常可观。我做过一个一万篇文档的构建任务基础模型用gpt-4o的话成本会高到你需要慎重考虑。务实的降本方案有几种第一种是只在候选句子上做抽取用关键词规则先筛掉明显没有实体关联的句子第二种是用便宜的模型做抽取用更强模型做最终回答因为抽取任务相对模板化低成本模型也能完成第三种是增量构建新文档只对新增内容做抽取而不是全量重跑。这个方案配合“按文档批次处理并记录状态”的机制能把长期成本降得非常明显。5.4 Agent并发调用时Neo4j连接池爆满Agent场景下的并发量很不规律几个用户同时在问问题检索层会同时对Neo4j发起大量的查询请求。如果每次查询都用GraphDatabase.driver()重新创建连接连接池不仅浪费资源还会在高峰期把Bolt端口打满。正确做法是全局只创建一个driver实例由它内部维护连接池。以Python为例把driver作为模块级单例在多个线程/任务中复用。同时根据并发量调整连接池参数比如在创建驱动时设置max_connection_lifetime和max_connection_pool_size。我遇到过一次因为连接池太小导致Agent工具调用全部超时的问题把池大小从默认的50调大、并开启查询超时之后问题就消失了。5.5 版本选择与Desktop下载的常见疑惑很多初学会困惑Neo4j Desktop版本从哪下载、要不要用旧版本。我的建议是直接去Neo4j官方下载页找最新版已经不需要回过头去找3.5这种老版本。旧教程里的大量Cypher语法和插件配置方式在4.x、5.x里已经变了照着老教程做反而会卡在版本兼容上。Neo4j Desktop版的下载包自带Java环境安装后能一键创建本地数据库适合先用来验证图谱结构和Cypher语法。需要特别提醒的是Desktop版创建的临时数据库可能带初始密码机制连接时密码是否正确会直接卡住后续操作。如果本地连不上Bolt端口先检查Desktop中的数据库是否已经启动再检查防火墙是否放开了7687端口。这些看似琐碎的问题在第一次搭建时能折腾掉不少时间。6. 结合AI Agent的落地经验6.1 把知识图谱当成Agent的长期记忆层纯Chat模型没有持久记忆一个连了向量库的Agent有了事实记忆但缺少关系记忆。知识图谱在这里的作用不是替代向量库而是作为Agent的一组“结构化记忆”。我的方案是让Agent同时持有两个检索工具一个是普通向量检索工具用于“找回原文段落”另一个是GraphRAG检索工具用于“找回实体关系路径”。Agent根据问题类型自行判断调用哪个工具。这种组合在不同类型问题上的表现都好于单独使用任何一个。从实践来看当问题里出现明显的人名、公司名、产品名、地名时GraphRAG检索的召回质量明显更高当问题是“总结某文档的核心观点”这类语义问题向量检索更合适。两个工具的调用判断也可以交给Agent的思考过程但初期建议用规则更简单等模型能力上来后再放开。6.2 上下文层级描述摘要、路径上下文、原文证据三层递进单个实体描述只占一两句话二跳路径最多几十个节点但把这些全部塞给大模型上下文可能还是太长。我把检索结果分成三层第一层是单实体的description摘要只用来让大模型快速了解当前节点的含义第二层是路径上下文用文本格式列出实体间关系第三层是原始证据片段只在回答需要引用原文时才调用。Agent可以先看前两层生成回答如果回答需要引证再取第三层拼接到最终输出中。这样做的好处是减少无效tokens同时保留可追溯能力。很多GraphRAG项目失败不是因为图建得不好而是把图检索结果和原文全部堆进上下文大模型被大量文本淹没了重点。分层递进的方式能让Agent回答既有逻辑链又有据可查。6.3 增量更新与动态维护最后说一下图谱的维护。如果每次新来一批文档就把图全量重建一次代价太大。我目前实践的增量策略是对每个文档构建时记录它的文档ID和构建版本节点和边都带上document_id属性。新文档进来只构建新增部分同时允许旧文档存在。当老文档被修改或删除时可以根据document_id先删除对应的节点和关系再重新构建。这个机制虽然繁琐一些但能保证Agent长期使用过程中图谱逐渐丰富而不是越用越陈旧。对于实时性要求不高的场景我建议用定时任务批量更新图谱不追求在线实时。因为实体抽取关系的构建本身是大模型计算需要时间。图谱更新完成后再让Agent检索时自动切换过来这样对在线问答的稳定性更友好。6.4 值得继续扩展的几个方向这个方案后续能扩展的空间其实很大。一是把社区检测算法叠加到图谱上自动发现某些强连通主题群组用于聚合问答的摘要生成这是目前GraphRAG研究里很流行的方向。二是引入时间属性让边带上时间戳Agent能按时间维度筛选关系路径回答“近年来的合作网络发生什么变化”这类问题。三是把Agent的每次问答痕迹也写入图谱形成系统自身的反思记忆让Agent在后续相似问题上有更一致的决策。这些方向都建立在有了一张稳定、干净的知识图谱的基础上。我自己在实际项目里体会最深的一句话是GraphRAG不是银弹但它是把AI Agent从“知道很多”提升到“理解关系”的有效路径。如果你已经受够了纯向量RAG在多跳问题上的胡言乱语找一个靠谱的图数据库从一个小型领域先建图、再检索、再调Agent会比较快地看到效果。Neo4j的生态整体上很成熟文档和维护成本也可控值得在这个方向上投入时间。最后再分享一个很实用的小技巧首次构建图谱时不要妄想一步到位先只建实体和一类关系跑通链路后再逐步把更多关系类型加进来。这个“先瘦后胖”的过程能让整个GraphRAG系统的故障边界清晰很多。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。