【Dify+RAG实战】手把手教你用知识图谱打造智能问答系统!从0到1完整教程,附源码+项目演示!
By AGI教程
Summary
Topics Covered
- 厨房AI管家解锁个性化菜谱
- 大模型一键获取结构化数据集
- Docker一键部署Neo4j图数据库
- 菜谱知识图谱实体关系设计
- Defi集成图谱实现智能问答
Full Transcript
各位吃货请注意 你的厨房AI管家已经上线 今天我们不炒菜来炒知识图谱 保证比火锅还香比奶茶还上头 接下来的十几分钟 我将带你解锁一片 属于你自己的智能菜谱新大陆 好了言归正传 本期视频的核心目标 就是 手把手带你实现一个基于知识图谱的 智能菜谱问答系统
我之所以选择菜谱 作为我们这个项目的例子 是因为 美食是我们每个人生活中最接地气 也很容易遇到选择困难的领域 想想看你是不是经常遇到这种情况 打开冰箱 看着几样食材 却不知道能组合成什么新花样 你对花生或者是海鲜过敏 看到心动的菜谱却望而却步 想找一个安全的替代方法呢
又无从下手 还有你正在健身 想做一个低脂版的可乐鸡翅 却不知道该如何调整配料 和烹饪的方法 于是啊我就有了这样一个 构建一个智能菜谱知识图谱的想法 它绝不是一个冷冰冰的 只能做关键词匹配的数据库 而是一个 真正能够理解你深度个性化需求 并且提供精准的解决方案的
这样一个AI美食顾问 我们可以来看一下最终的实现效果 比如说当我直接问我有6只鸡腿 可以怎么处置 那系统就会立刻通过HTTP请求 向我们构建好的知识图谱里面去查询 并给我返回结构清晰 步骤完整的菜谱做法 这就意味着 只要你的知识图谱构建的足够丰富
不管你是要无糖版的甜品 还是想知道酱油是用生 抽还是老抽 他都能够给你最贴心的答案 那么我们整个视频 将围绕以下三个核心环节展开 首先是数据准备 包括了数据收集和清洗处理 这是所有AI项目的根基 第二部分是知识图谱的构建 这是我们系统的大脑
我们会使用高性能的图数据库Nielsen 作为核心的工具 把零散的数据 编织成一张相互关联的知识网络 最后就是把我们构建好的知识图谱 和Defi平台相结合 设计一个对话流程 最终打造出一个能够用 自然语言 和我们进行流畅对话的智能助手 OK我们正式开始 首先在构建任何的智能系统之前
高质量的数据是成功的根基 因此啊数据收集是第一个重要的步骤 我们传统的数据收集方法大家想一想 比如嗯写爬虫不仅耗时耗力 还需要应对各种的反爬策略 那么今天我们有一个更高效的方法 那就是利用大鱼模型联网搜索 一键获取现成的结构化的菜谱数据集
你只需要精心设计一段prompt模型 就能够帮你爬取到公开的菜谱库 省去了我们手动搜集的时间和精力嘛 当然我这个提示词比较简单啊 你可以在提示词里面 明确地约束返回格式 比如要求它返回JSON格式 并且要求必须包含什么菜名啊 原料列表啊 烹饪步骤 预计时长和标签等等关键字段
这能够大大提升 这能够大 大提升返回数据的质量和直接可用性 那么我们大模型就找到这样一个合 适的数据集链接如下 我们可以来看一下这整个数据集 一共是包含了上万条菜谱信息 好看到没有 那么当我们拿到数据之后 常规流程的下一步 就是进行数据的清洗 目的是从非结构化的文本中
提取结构化的信息 比如嗯去掉html标签 统一单位进行分词和命名 实体识别 来提取食材 厨具烹饪动作等等关键信息 但是很幸运的是 我们刚刚才看过数据集的内容 我们通过l m获取到的 已经是结构化的json格式的数据了 那么这个最繁琐的步骤呢 可以被大大简化
我们来看一下 每一条菜谱信息里面都包含了name name呢就是作者提供的标题 然后dish是菜谱名 下面还有描述 呃原料表菜谱步骤作者名以及关键词 对于这样一个已经高度结构化的数据 我们几乎就不需要进过多的处理了 我们可以直接进行下一步 那么数据集准备好了
现在我们就来到最核心的环节 知识图谱的构建 首先呢 要介绍一下我们要用到的工具 Docker和Nginx 包壳 你可以把它想象成一个软件集装箱 它是一种开源的容器化平台 能够把应用程序 比如说我们今天要用到的数据库 及其所有的依赖项 打包到一个独立轻量级的容器里面 这样做有什么好处呢
那就是不管你是用的Windows Mac还是Linux系统 都能够保证应用环境的一致性 避免了在我电脑上 明明能跑的这一个尴尬境地 Docker它启动速度快 资源消耗低可移植性强 是现代软件开发部署的必备神器 那这个MIOS j是什么呢 它又是干嘛的好
这是一款高性能的Nosql图数据库 和我们熟悉的表格型的数据库 MySQL不同 Neo 4J 天生就是为了存储和查询 高度互联的数据 而设计的 使用的是图模型来表示事件 其中节点代表实体 比如说一道可乐鸡翅一种食材鸡翅 还有一个关键词家常菜都属于是实体
边呢就代表实体之间的关系 比如可乐鸡翅包含了原料鸡翅 那这种结构 就非常适合处理复杂的网络关系 比如我们的社交网络金融风控 以及我们今天的知识图谱 Neos j它支持a C i d事物 保证了数据的一致性和可靠性 同时它提供了一种名为cifold
非常直观的声明式的查询语言 当你能够像画画一样 描述你想查询的数据模式 另外NEOS j 还配备了一个易于使用的外部页面 便于用户浏览和管理他们的数据集 那么在我们的项目里面 Dorok 就提供了一个稳定隔离的运行环境 让我们能够一键部署NEOS j 而NEWSJ则是作为知识图谱的心脏
负责存储和管理所有的菜谱知识 并提供强大的关联查询能力 所以要使用Docker部署Leo 4J 首先要确保 你的系统里面已经安装了Docker 如果还没有安装的话 可以访问Docker的官网 并且按照官方的指南来进行安装 安装完Docker之后 需要拉取Nginx的官方镜像 你可以在命令行输入以下命令
来拉取指定版本的Nginx镜像 我这里下载的是5.23.0版本 镜像下载完了 我们就可以使用Docker Images这个命令 来检查本地是否 已经存在了Nginx的镜像 我们打开命令行 粘贴一下 大家看确定存在了 就可以运行一下nilsj的容器了 我们可以使用官方提供的Docker run命令
来启动nilsj容器 上面这一行呢是默认的启动命令 下面这个命令就包含了一些配置选项 看起来有点长啊 我们来拆解一下 首先这个嗯杠杠name 是给我们的容器 指定一个好记的名称 然后杠P7474巴拉巴拉杠P77687
是把主机的端口映射到容器的端口 这个7474是h t t p端口 7687呢是board协议端口 还有杠一 是通过设置环境变量来调整64J的行为 例如设置这一个环境变量 可以限制 64J数据库事务内存的最大总量 为4GB如果你不设置的话容量非常有限 可能会报错
那下面呢是即用APOC插件 APOC是all the procedure on file的缩写 是一个功能极其强大的扩展库 提供了数百个使用的函数和过程 我们之后呢 导入我们的JSON数据就全靠它了 然后这是一个嗯APOC的安全设置 允许它从文件系统加载数据 我们导入本地json文件的时候
必须开启这一项 就是设置一下64J的初始用户 名和密码 那么容器启动之后 就可以通过浏览器访问64J了 我们访问local host 7474来打开64J的内部Web页面 然后 使用我们刚才设置的用户名和密码 进行登录 如果你没有指定密码的话 即没有设置 这个环境变量的话
那么默认的用户名和密码都是64J 首次登录时 会提醒你去更改一下你的密码 因为我们安装了导入Jason的APOC插件 我们可以来验证一下是否安装成功 执行一下这一条save语句 粘贴一下 然后回车 返回的是这个插件的详细信息 就说明安装成功了 我们的环境就已经准备就绪了
接下来呢就到了图谱库构建这一步 我们需要根据菜谱数据 设计出合理的节点和关系类型 好大家看一下recipe 这是主食体 包含了菜谱的基本信息 比如说我们前面这里的 菜品名描述以及作者 都是个实体里面的基本信息 然后第二个
ingredients代表菜谱中使用的所有食材 作者 在嗯提供的原料表里面的100克草莓 300克对虾 15克青椒一个鸡蛋 都是独立的实体 然后是我们的keyword关键词 用于分类或标签的关键词 如果要检索到 和这个菜品相关联的关键词 比如 当用户想要了解草莓虾仁的具体做法
的时候草莓虾仁怎么做 就是一个相关的搜索关键词 此外如果这道菜是健康养生的菜 那么健康和养生也可以作为关键词 好我们定义完实体之后 还需要描述实体之 间的关系 首先对于菜谱这个主实体 和原料的关系就是包含关系 contains表示特定的菜谱
包含了某些具体的原料 然后我把菜谱和关键词 定义成了属于关系 belongs to就表示 菜谱归属于某个关键词类别之下 这意味着 用户可以通过关键词 来查找符合特定条件的菜谱 比如通过健康这个关键词 找到所有被标记为健康的食谱 通过这种方式 我们不仅可以清晰的组织和关联数据
还能够支持更加灵活 且精准的数据查询和分析 这样的结构啊 就有助于提升用户的体验 使得信息检索更加直观和高效 完成了实体的定义之后呢 下一步就是把数据导入到Nielsen 的数据库中 我们来先看一下菜谱数据集的内容吧 这个原数据我说了有上万条数据啊 导入和检索的话呢都比较费时间
所以我演示的时候就从中截取了几条 来组成了一个新的小一点的数据集 recipe corpus点Jason 有高级的蛋炒饭 浓浓之香蛋炒饭蔬菜鸡蛋蛋炒饭等等 那看一下它们原料有哪些 大家可以看一下 然后我们需要把这个菜谱数据文件 放在next 容器能够访问的位置 我们是怎么做的呢
这里我们使用dog的 CP命令来完成这个操作 我的数据集它是在这一个路径下 在d盘 然后执行这个命令 把它复制到多个容器 挂载的import目录下 接下来呢 在Nginx中加载并且处理这些数据 我们通过Cypher语句来创建节点 以及它们之间的关系 我们可以进入到Nginx的Web页面
然后输入这一条cipher查询 来加载json文件 并且基于其中的数据构建一个图 结构 这段语句 做这几件事 使用APOC点load点 json函数读取并解析了json文件 然后是便利每个菜谱 并且创建相应的recipe节点 对菜谱中的每个原料呢 就是创建Ingredient节点 并且建立
recipe节点和Ingredient节点之间的 contents关系 同样的对于每个菜谱的关键词 创建keyword节点 并且建立recipe和keyword之间的be not to关系因为我已经导入过了 那么我先执行一个删除语句 把它给删除掉 大家看啊 这里已经有了 我把它删掉 OK就没了 然后我们重新导入一下
粘贴那一段语句 然后运行一下 好这就成功的导入了 大家可以很清晰的看到实体 以及实体之间的关系 这是一个很简单的知识图谱 是不是感受到了 数据之间相互连接的魅力啊 好我们也可以检查一下 数据入库之后的状态 并且统计图 数据库中每个标签对应的节点数量 就使用下面这一个查询语句
把它复制下来 看到没有 每个标签对应的节点数量都是有的 这样我们就完成了从数据准备到 导入的全过程 那我们 应该怎么去调用这个知识图谱呢 那最基本的方法是用HDP调用 后面我们用Defi实现的时候 也是通过HDP请求来和Nielsen 的API端口进行通信
而HTTP认证需要base 64加密 所以我们需要把用户名和密码 组合成username password这样的一个形式 然后使用下面的命令来进行base 64编码 在Windows电脑 就是打开Powershell命令行窗口 在这搜索好 然后我们就得到这样子的一个 嗯字符串
这就是你的base 64加灭后的凭证 然后就可以发送post请求到灭时 间数据库了 在CMD里面去使用CURL命令 如果你电脑上没有这个CUL命令的话 呢需要提前下载 并且安装适用于操作系统的版本 然后这是拉取所有实体的语句 我们给它粘贴过来 OK可以看到
已经拉取到我们所有的实体了 所以通过HTTP请求 我们就可以成功访问到Nginx 上的数据了 那么有了知识图谱这个大脑 我们还需要一个什么 还需要一个嘴巴和眼睛 来让他和用户对话 对吧这时候就轮到我们的Defi出场了 Defi作为一个LM应用开发平台 可以非常方便的集成外部工具
和知识库 我们可以来看一下这个 嗯系统是怎么实现的 整体的交互流程涵盖了这几个部分 接下来我就直接演示 来介绍各个节点的作用和细节 比如我输入的query是我有一碗米饭 可以做哪些菜 因为我们提供的数据里面 有3道菜涉及到了一碗米饭 其他的菜品原料里面都没有一碗米饭
那看他能不能成功解锁到这3个 蛋炒饭 hot OK可以看到 他已经检索到了 我们想要的这三个蛋炒饭 并且输出了原料和制作步骤 接下来我们就通过追踪整个chat flow 来看一下整个流程是怎么实现的 首先开始节点是用户的输入 也就是query 然后就是通过HTTP请求节点去调用nginx
访问nginx所有实体 然后呢我们需要对结果进行解析对吧 那怎么去解析呢 就是这个代码执行节点 这段代码 它的作用就是对得到的结果进行解析 并且把它提取出来 看这里面有一个判断语句 是判断我们的这些图谱的实体名 是否在我们的query里面 如果query里面有实体名的话呢
就相当于它们是相关的 就要把它们拿出来 并且拼接到一起合并为纯文本 我们可以看一下这个代码执行节点 一它的结果是什么 好它的输出就是一碗米饭和饭 那么拿到这些信息以后 我们再添加一个HTTP请求节点 调用news这只图谱 去查询和这些实体相关的详细信息
具体就是通过这一段长 长的请求去实现的 然后啊再加 然后再加一个代码执行节点 再写一个代码把它详细信息检索出来 检索出它的菜名 原料名以及制作的步骤 接着呢要添加一个大模型节点 让大模型 根据上下文去回答我们的query
我用的是关系流动场上的Deepsix V3模型 最后就是通过一个直接回复的节点 进行最终的输出 那输出的结果就是我们刚才看 到的 他根据我们的菜谱信息和现有的食材 告诉我们可以制作哪些食材 好了我们来总结一下这期视频 我以菜谱为例 使用Defi 搭建了一套基于知识图谱的RIG系统
我们不仅解决了从数据收集清洗 到利用利用4G构建知识图谱 再到最后 在Defi 上实现智能问答的完整技术链路 更重要的是 我们展现了一种 用AI技术解决实际生活问题的思路 不管你是想复刻这个菜谱助手 还是想把这项技术应用到你的行业 比如医疗问答法律咨询 企业知识库等等
希望这套方法论都能给你带来启发 欢迎大家动手实践 打造属于你自己的 独一无二的智能应用 当然视频里用到的代码资料 还有Defi工作流 如果大家有需要可以在评论区留言 我都可以分享给大家 希望对大家学习大模型技术 会有很大的帮助
Loading video analysis...