Dify实战--基于菜谱的RAG系统

写在前面

在人工智能技术飞速发展的今天,如何快速构建一个实用的智能问答系统成为了许多开发者关注的重点。本文将介绍如何利用Dify和Neo4j图数据库,构建一个基于菜谱知识的RAG(Retrieval Augmented Generation)系统,帮助读者掌握从数据准备到系统实现的全流程。

一句话概括

使用Dify+Neo4j构建菜谱智能问答系统。

数据准备

我们从上海人工智能实验室下载菜谱数据集,使用openxlab工具进行数据获取。 opendatalab.com/OpenDataLab...

首先需要安装openxlab库:

bash 复制代码
pip install openxlab #安装

pip install -U openxlab #版本升级

openxlab login #进行登录,输入对应的AK/SK

openxlab dataset info --dataset-repo OpenDataLab/XiaChuFang_Recipe_Corpus #数据集信息及文件列表查看

openxlab dataset get --dataset-repo OpenDataLab/XiaChuFang_Recipe_Corpus #数据集下载

openxlab dataset download --dataset-repo OpenDataLab/XiaChuFang_Recipe_Corpus --source-path /README.md --target-path /path/to/local/folder #数据集文件下载

下载完成后,我们会获得一个名为recipe_corpus_full.json的JSON文件,其中包含了丰富的菜谱信息,包括菜名、食材、制作步骤等关键数据。

知识图谱构建

Neo4j环境搭建

我们使用Docker快速部署Neo4j图数据库:

ini 复制代码
docker run -itd \
  --name neo4j \
  -p 7474:7474 \
  -p 7687:7687 \
  -e NEO4J_dbms_memory_transaction_total_max=4G \
  -e NEO4JLABS_PLUGINS='["apoc"]' \
  -e NEO4J_apoc_import_file_enabled=true \
  -e NEO4J_AUTH=neo4j/neo4j123456 \
  neo4j:5.23.0

参数说明:

  • --name neo4j:为容器指定名称

  • -p 7474:7474:映射HTTP端口

  • -p 7687:7687:映射Bolt协议端口

  • -e NEO4J_dbms_memory_transaction_total_max=4G:限制事务内存最大为4GB

  • -e NEO4JLABS_PLUGINS='"apoc"':启用APOC插件

  • -e NEO4J_apoc_import_file_enabled=true:启用文件导入功能

  • -e NEO4J_AUTH=neo4j/neo4j123456:设置数据库用户名和密码

neo4j安装可参考:【深度探索】图数据库Neo4j:从Docker轻松安装到APOC数据导入的全栈指南

数据导入

将下载的菜谱数据复制到容器中:

bash 复制代码
docker cp recipe_corpus_full.json neo4j:/var/lib/neo4j/import/

执行以下Cypher查询创建知识图谱:

php 复制代码
// 加载JSON数据并创建Recipe节点及基础属性
CALL apoc.load.json("file:///recipe_corpus_full.json") YIELD value
UNWIND value AS recipe
CREATE (r:Recipe {
  name: recipe.name,
  dish: recipe.dish,
  description: recipe.description,
  author: recipe.author,
  instructions: recipe.recipeInstructions
})

// 创建Ingredient节点并建立关系
WITH recipe, r
UNWIND recipe.recipeIngredient AS ingredient
MERGE (i:Ingredient {name: ingredient})
CREATE (r)-[:CONTAINS]->(i)

// 创建Keyword节点并建立关系
WITH recipe, r
UNWIND recipe.keywords AS keyword
MERGE (k:Keyword {name: keyword})
CREATE (r)-[:BELONGS_TO]->(k)

数据验证

使用以下查询验证数据导入情况:

scss 复制代码
MATCH (n) RETURN labels(n) AS NodeLabels, COUNT(*) AS NodeCount

也可以通过API方式查询:

vbnet 复制代码
curl -X POST "http://localhost:7474/db/neo4j/tx/commit" \
  -H "Authorization: Basic bmVvNGo6bmVvNGoxMjM0NTY=" \
  -H "Content-Type: application/json" \
  -d '{
    "statements": [{
      "statement": "MATCH (n) RETURN n, labels(n) as labels",
      "parameters": {}
    }]
  }'

其中bmVvNGo6bmVvNGoxMjM0NTY=user_name/password的base64编码结果

Dify chatflow实现

我们在Dify中构建一个包含7个节点的chatflow:

  • 1.开始节点 接收用户输入的菜谱相关问题

  • 2.HTTP节点 查询Neo4j数据库中相关的实体:

swift 复制代码
curl -X POST "http://host.docker.internal:7474/db/neo4j/tx/commit" \
-H "Authorization:Basic bmVvNGo6bmVvNGoxMjM0NTY=" \
-H "Content-Type: application/json" \
-d "{\"statements\":[{\"statement\":\"MATCH(n) RETURN n, labels(n) as labels\",\"parameters\":{}}]}"
  • 3.过滤出包含用户输入的实体

  • 4.查询这些实体的关联关系和属性

  • 5.将相关信息拼接起来

  • 6.调用大模型节点 整合查询到的信息,输出自然语言回答:

makefile 复制代码
你是一个专业的厨师助手,请根据以下菜谱信息回答用户的问题。

菜谱信息:
{knowledge}

用户问题: {user_input}

请提供专业、详细的回答:
  • 7.直接回复节点 将大模型生成的回答返回给用户

总结

通过本文的介绍,我们完成了从数据准备、知识图谱构建到Dify chatflow实现的完整流程。这个基于菜谱的RAG系统不仅能够准确回答用户关于菜谱的各类问题,还展示了如何将图数据库与大语言模型有效结合。

这种架构可以轻松扩展到其他领域,只需更换数据源和调整Cypher查询即可

相关推荐
米小虾5 小时前
LLM评测的失效与依赖感知聚合
人工智能·llm
Crazy_MT8 小时前
Flutter 本地大模型实战:做一个自然语言记账工具
flutter·llm·ai编程
XLYcmy9 小时前
DeepMMSearch-R1: Empowering Multimodal LLMs in Multimodal Web Search论文分享
llm·sft·强化学习·多模态·苹果·rag·检索
Sophnet云平台9 小时前
2026:AI Agent应用元年,企业从试点到核心业务的跨越逻辑
网络·人工智能·llm·openai·agent
凌奕10 小时前
OpenCodeReview 架构拆解:AI Code Review 为什么不能只是 Git Diff + LLM?
llm·github·agent
GreatVicent10 小时前
腾讯AI产业大会解读:Agent进场,企业基础设施怎么搭
大数据·数据库·人工智能·llm·agent·企业信息化
掰头战士11 小时前
你说你折这玩意干什么-agent工作的核心,还真得好好考虑怎么折叠上下文
typescript·llm·agent
千桐科技11 小时前
qKnow 开源版 v2.4.3 更新解析:从知识数据接入到自定义解析与结果复用
开源·llm·agent·ai智能体·qknow·智能体构建
流浪92512 小时前
从 Vibe Coding 到 LangGraph:AI 时代编程范式的演进与重构
llm
掰头战士12 小时前
让散乱的工具调用成为正规军,今天咱们聊聊 Tool System管线的读写锁
typescript·llm·agent