1. 从传统RAG到GraphRAG的技术演进
在知识图谱与人工智能结合的领域,传统检索增强生成(RAG)系统存在几个关键痛点。首先是实体关系捕捉的局限性——当处理"红烧肉需要哪些食材?这些食材还能做什么菜?"这类多跳查询时,传统方法就像用渔网捞沙子,明明数据库里有完整的关系链,却只能抓取零散的片段。其次是上下文碎片化问题,特别是在处理菜谱这类结构化知识时,固定长度的文本分块经常把"腌制30分钟"和"大火收汁"割裂到不同区块,导致模型生成步骤顺序错乱。
GraphRAG的创新之处在于将知识图谱作为信息的骨架。想象一下传统RAG是在书架上随机抓取几页纸,而GraphRAG则是先查看书籍目录(知识图谱),精准定位相关章节后再提取内容。我们构建的菜谱系统采用Neo4j图数据库存储三种核心节点:菜谱(包含烹饪时长、难度等属性)、食材(含营养数据)、步骤(带时间参数),并通过"需要食材"、"包含步骤"等关系构建网络。实测表明,对于"适合糖尿病人的低糖粤菜"这类复杂查询,GraphRAG的答案准确率比传统方法提升47%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 双引擎系统架构解析
2.1 Neo4j图数据库建模实践
数据准备阶段,我们先将Markdown格式的原始菜谱通过LLM转换器处理。这里有个关键细节:转换脚本会特别处理"【食材】五花肉500g"这样的标记,将其拆解为食材节点(属性包含名称和用量)和"需要食材"关系。最终生成nodes.csv和relationships.csv两个文件,导入时需要特别注意:
python复制# CSV导入前必须执行的ID校验代码
node_ids = set(df_nodes['nodeId'])
rel_ids = set(df_rels['startNodeId']).union(set(df_rels['endNodeId']))
assert rel_ids.issubset(node_ids), "存在游离的关系节点!"
我们设计了多层次的Cypher查询模板。基础查询如MATCH (r:Recipe)-[:NEEDS]->(i:Ingredient) WHERE r.name="宫保鸡丁" RETURN i.name;多跳查询则使用WITH子句实现路径追踪,例如查找使用相同主料的菜谱。曾有个惨痛教训:某次导入时nod
