1.前言
通过 dify可以基于开源大模型的能力,并结合业务知识库、工具API和自定义代码等构建特定场景、行业的专属大模型应用。本文通过 dify工作室的聊天助手-工作流编排构建了一个基于历史工作日志回答问题的助手,相比原始的大模型答复,通过工作流构建的应用将提供更精准的答案。实现效果如下:
环境信息:dify-0.8.3
2.添加开源LLM
LLM,即 Large Language Model,大语言模型。dify依赖 llm的能力来构建大模型应用,故需要提前准备好 llm。
这里以千问为例,演示如何添加 LLM。在设置里面找到模型供应商,点击 OpenAI-API-compatible
添加模型连接信息,如下:
填写完模型名称、地址和认证key等信息后点击保存,dify会尝试连接 llm,成功连上才能保存成功,否则会报错。
3.知识库上传文档
大模型回答通用的知识是没有问题的,但是如果具体到某些业务场景的问题,就得提供一个知识库给大模型,由大模型去进行理解并输出回答。
这里我准备了之前排查 hive问题时记录的一个文档,大致内容如下:
处理数据查询hive数据库无法获取表问题 ——hive不稳定导致的
后台报错如下:
Caused by: java.util.ServiceConfigurationError: org.slf4j.spi.SLF4JServiceProvider: Provider org.slf4j.simple.SimpleServiceProvider not a subtype at java.util.ServiceLoader.fail(ServiceLoader.java:239) ... at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:380) at com.xx.dsx.DataSourceConnection.<clinit>(DataSourceConnection.java:22) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.xx.jdbc.Driver.wrapperConnection(Driver.java:63) at com.xx.jdbc.Driver.connect(Driver.java:169) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:270) at com.xx.dataaccess.DataAccessService.getConnection(DataAccessService.java:368)
解决:
需要把 bigdata/plugins/hive/3.x/ 下的 slf4j-api-1.7.36.jar 移除
在 dify知识库里面选择创建知识库,索引方式选择经济,如下:
4.工作室创建应用
dify工作室支持聊天助手、文本生成应用、Agent和工作流四种应用,这里选择常见的聊天助手》工作流编排。
如下图:
5.应用流程编排
在日常开发、应用部署和服务运维等工作中会碰到很多特定问题,而且同一个问题大概率会二次出现,所以记录问题现象和解决方案是很有必要的,能够有效节约时间,按时下班。
故出于实际需求,这里创建一个基于历史工作日志回答问题的工作流程,打造一个私有FQA问题助手,整体流程如下:
如上图,简单五个步骤就搞定了一个基于大模型的私人助手。下面简要介绍下各个步骤:
-
开始
应用的入口,必选项。
-
问题分类器
这里调用 llm对用户的问题进行分类,以判断走哪一条业务分支。比如 询问功能开发、运维问题、闲聊等。
如果询问某个问题如何解决,这里就会走到本次的流程。
-
工作日志检索
这里就要用到第 3步知识库上传的文档了,会从提供的知识库中选取和问题相关的内容传递给后面的 llm。
-
LLM-组织回答
这个步骤就比较关键了,需要调用 llm理解用户的问题和知识库中的相关知识,并组织回答。提示词如下;
# 角色
你是一个专业的大数据工程师,回答问题,对于常识类问题可直接作答,若遇到难以回答的问题示不知道。
使用以下内容作为你所学习的知识,放在 XML标签内。
## 技能
### 技能 1: 回答常识问题
1.若问题超出常识范围或难以确定,回复"不知道"
2 回答内容必须根据上下文知识库的内容进行回答。
## 限制
仅针对问题进行回答,不进行额外讨论
下面是完整配置:
这里需要注意两种提示词都要有,最后要跟 user把用户问题带过去。
-
问题答复
输出 llm的回复。
6.总结
本文描述的专属FQA应用基于 dify的工作室、工作流编排、问题分类、知识库和 llm模块等功能,并以千问为例描述了如何添加开源的 llm到 dify中。同时,在工作流编排中重点介绍了如何调用 llm,对应的 system prompt和 user prompt如何编写。