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查询即可

相关推荐
玉鸯3 小时前
多 Agent 系统通信的实现原理与最佳实践
llm·agent·mcp
TunerT_TQ5 小时前
Valhalla 静态工程审阅 #009|Continue 源码证据驱动评测【大厂开源基础设施特辑】
vscode·测试工具·开源·llm·github·jetbrains·ai编程助手
weixin_471383036 小时前
01 LLM简介
llm
元Y亨H12 小时前
LangChain API 调用语言模型
langchain·llm
元Y亨H12 小时前
大模型技术 LangChain 概述
langchain·llm
元Y亨H12 小时前
大模型技术 提示词模板 概述
langchain·llm
元Y亨H18 小时前
大模型技术 模型调用结果解析 概述
google·langchain·llm
元Y亨H18 小时前
大模型技术 Ollama 概述
llm·ollama
chaors19 小时前
DeepResearchSystem 0x06:LLM as Judge
llm·agent·ai编程
武子康1 天前
GPT-5.6 Luna 降价 80%:Agent 真正该重算的是单次成功成本
人工智能·chatgpt·llm