链载Ai

标题: 打造本地化模型工作流-AI助手全面升级 [打印本页]

作者: 链载Ai    时间: 5 小时前
标题: 打造本地化模型工作流-AI助手全面升级

一、上期回顾

首先回顾一下我们之前本地化模型部署与应用里完成的应用

我们基于Ollama完成了本地化模型的部署,并且通过MaxKB以及本地建立的知识库,完成了一个基于RAG的知识库问答系统。但正如我们上次实践的结尾所言。仅仅是接入一个本地化的知识库,还是无法解决一些依赖现有系统的问题。

以优惠券为例,我们可以根据知识库设定优惠券的基本规则。但是如果涉及到具体某个优惠券的信息而言,仅凭知识库无法完成对具体数据的判断。


二、Dify的介绍与安装

用他们自己的官网(https://dify.ai/)介绍来说他们是:The Innovation Engine for GenAl Applications——它是生成式AI应用的创新引擎

Dify是GitHub的开源的项目(https://github.com/langgenius/dify)

对比我们之前用到的MaxKB来说,Dify无疑是一个全面加强的生成式AI的创建引擎

他的能力不仅包含MaxKB的RAG引擎。也同时可以本地化部署,更可以建立业务场景更为复杂的Agent以及Workflow。当然这也只是Dify的主要特性。

随着我们进行安装部署后,在我们的一步步探索中,将逐步发现Dify的强大能力。

没错,这又是一个基于docker的项目,等待拉取对应组件并且安装后。Dify就算安装成功了

我们可以看到安装并且运行中的Dify包含nginx,redis,poestgresql等等多个部分。相比MaxKB的结构来说就已经复杂了好多。

这里我们可以看到,其中nginx组件把容器中的80端口映射到本机的80端口了。

没错,我们想体验本地化部署的Dify,访问http://localhost/apps这个地址就好了。

首次登录会进行进入初始化页面,会要求提供一个你的邮箱作为管理员账户。设置好后,就可以进入Dify的主页了

首先我们聚焦到右上角的设置区

在这里我们又看到了熟悉的配置模型的内容,以及我们的老朋友Ollama。当然几乎所有知名的AI提供商,都可以配置在Dify中。这里我们配置了本地的Ollama以及智谱-AI。

Ollama的配置主要是localhost:11434的端口配置,其他AI提供商的则是需要在对应网站获取API-EKY并且配置到Dify中。

我们再回到Dify主页,先可以简单设置一个聊天工具。

在创建完成后我们在这个应用的配置页面,发现了一些熟悉的东西,M阿西KB创建应用时候出现过的提示词、本地知识库Dify是全面支持的。另外右上角,我们可以随时随意的切换这个应用所使用的模型。同时也可以在这里进行简单的测试,没有问题后就可以把这个应用发布了

发布完成后,会在Dify的主页看到这个应用。

那么这个流程现在是可以通过Dify的工作流实现的了。

根据Dify的工作流的组件

工作流是由我们自行定义和组合的节点组成的顺序执行的流程

结合我们的业务流程图。发现所有我们所需的节点都有解决方案。

在业务流程中,问题分类,对应Dify的问题分类器节点。而 function call部分则对应着HTTP请求。

为了验证我们的流程,我们建立一个电商助手的工作流:

它能支持三类问题:1.优惠券问题 2.订单问题 3.其他问题

一、如果提问内容与优惠券问题相关联,则会1.调用优惠券信息接口 2.调用优惠券知识库 3.把以上内容作为上下文传入优惠券推理模型,由模型结合问题给出答案

二、如果提问内容与订单问题相关联,则会1.调用订单信息接口 2.将订单信息接口上下文传入优惠券推理模型,由模型结合问题给出答案

三、其他类的问题,则直接把用户问题接入通用处理大模型

根据以上基本应用需求。我们规划的工作流如下

为此我们也建立了两个模拟接口分别是优惠券信息与订单信息

这里仅以优惠券信息为例

@RequestMapping("/coupon")publicStringcoupon(){Map<String,String>coupon=newHashMap<>();coupon.put("valid_start_time","2018-06-1810:53:22");coupon.put("valid_end_time","2025-10-2010:53:25");coupon.put("name","新人礼包券");coupon.put("id","4dbaee58d68ef8ea");coupon.put("current_time",DateUtil.now());Map<String,String>coupon2=newHashMap<>();coupon2.put("valid_start_time","2018-06-1810:53:22");coupon2.put("valid_end_time","2023-10-2010:53:25");coupon2.put("name","回归礼包券");coupon2.put("id","51dee58d68ef8ea");coupon.put("current_time",DateUtil.now());List<Map<String,String>>couponList=newArrayList<>();couponList.add(coupon);couponList.add(coupon2);returnJSONUtil.toJsonStr(couponList);}

这里包括valid_end_time优惠券过期时间,以及当前时间current_time

同时我们也在Dify中设置了优惠券规则的知识库,规定了优惠券过期的判断依据

所有组件都准备完毕后,剩下的工作流配置就没有障碍了。

下面我们逐一介绍Dify流程中我们用到的几个节点以及配置内容

开始节点

开始节点是流程的开始,这里可以自定义整个工作流的入参,这里我们配置了两个参数chat,以及userid。chat是用户提出的问题,userid则是记录用户的id。在后续的场景中,可能会产生依据userid进行查询某个API的可能性。

问题分类器

本质上还是一个语言模型,他会根据前置节点的输入信息进行合理的推断,从而进行流程的路由分发工作

这里的分类尽量要贴合前置节点(本例中的开始节点中的chat内容)

HTTP请求

这里的配置与一般的http请求配置方式是一致的。这里不再赘述,这里特别提一点,参数值params里是可以指定之前节点中的各种参数值的,这里我加了一个参数userid,其值来源就是在开始节点中的入参userid。

知识检索

这里的配置特别提示的就是查询变量,这里也是需要指定一个查询变量的。依据这个变量进行RAG检索以及召回动作。

LLM模型

这个就是一个标准的语言模型的节点了。我们可以配置具体的模型,相关的提示词,另外这里特别强调一下,本地化的模型特别的“不听话”,所以提示词的建立还是需要一些技巧,慢慢引导模型懂你的意思的。这个过程可以单独建立一个语言模型应用不断尝试。最终打磨出适合的提示词。

结束

这里是工作流的重点,需要配置的内容是返回值。在这个例子中我们返回的是前一步优惠券推理模型的输出结果。以文字形式输出。

再补全其他两个分支的工作流,这时我们再完整的看下这个工作流

然后可以点运行并且在输入参数后进行流程测试

运行过程中,我们可以看到运行的流程节点间的线段会变成蓝色

运行完毕后,也看到了最终输出的结果






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5