Dify 是一个开源的 LLM 应用开发平台。
其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,可以快速从原型到生产。
Dify——「大模型应用」开发平台 | ||||||||
大模型(LLM) | + | 工作流 (Workflow) | + | 工具 (Tools) | + | 知识库 (Knowledge) | = | 智能体应用 (Agent) |
LLM是基座 Workflow是流程 工具是能力 知识库是数据 Agent是应用 | ||||||||
API+DSL,标准化对接 |
1.1 Dify 中提供了四种应用类型
-
聊天助手:基于 LLM 构建对话式交互的助手
-
文本生成:构建面向文本生成类任务的助手,例如撰写故事、文本分类、翻译等
-
Agent:能够分解任务、推理思考、调用工具的对话式智能助手
-
工作流:基于流程编排的方式定义更加灵活的 LLM 工作流
-
RAG:学习新知识 & 保留记忆
RAG即检索增强生成(Retrieval-Augmented Generation),是一种结合了信息检索和文本生成的技术。RAG技术的核心思想是在生成答案之前,先从一个知识库或数据源中检索相关信息,然后将这些信息作为上下文,辅助语言模型生成更加准确和详细的回答。
-
基础技术:什么是RAG?
RAG通常包括以下三个步骤:
检索(Retrieve):根据用户的查询,从预先构建的知识库中检索出相关的文档或信息片段。
增强(Augment):将检索到的信息与用户的原始查询结合起来,形成一个新的增强查询。
生成(Generate):使用大型语言模型,基于增强查询生成答案。
-
RAG解决了什么问题?
引入RAG技术的主要原因是为了解决大型语言模型(LLM)在特定领域知识更新、专业性问题以及生成内容时效性方面的局限性。以下是引入RAG技术的几个关键原因:
暂时无法在飞书文档外展示此内容
-
减少模型幻觉:大型语言模型(LLM)在生成文本时可能会产生与训练数据不符或无意义的内容,这种现象被称为“模型幻觉”。RAG通过引入外部信息源,帮助模型生成更准确和有意义的回答。
-
提升专业性:LLM在通用领域训练时可能缺乏特定领域的专业知识。RAG技术通过检索特定领域的最新信息,提高了模型在该领域的专业性。
-
增强时效性:LLM的知识库通常只包含训练数据中已有的信息,对于新出现的知识可能无法准确反映。RAG允许模型访问最新的数据,从而生成时效性更强的内容。
-
支持复杂查询:RAG技术可以处理更复杂的查询,特别是那些需要引用多个来源或文档才能准确回答的查询。
-
RAG的工程方案
现在大量的大模型应用都是基于RAG技术,因此针对不同场景的各种RAG优化方案非常多。
-
创建知识库
3.1 创建知识库的步骤:
在 Dify 主导航栏中点击知识库,在该页面你可以看到团队内的知识库,点击“创建知识库” 进入创建向导。
-
在Dify团队内创建知识库,从本地选择你需要上传的文档;
-
选择分段与清洗模式,预览效果;
-
配置索引方式和检索设置;
-
等待分段嵌入;
-
完成上传,在应用内关联并使用 🎉
-
分段
大语言模型存在有限的上下文窗口,无法将知识库中的所有内容发送至 LLM。因此可以将整段长文本分段处理,再基于用户问题,召回与关联度最高的段落内容,即采用分段 TopK 召回模式。此外,将用户问题与文本分段进行语义匹配时,合适的分段大小有助于找到知识库内关联性最高的文本内容,减少信息噪音。
-
清洗
为了保证文本召回的效果,通常需要在将数据录入知识库之前便对其进行清理。例如,如果文本内容中存在无意义的字符或者空行,可能会影响问题回复的质量。
上传文档存在以下限制:
-
单文档的上传大小限制为 15MB;
3.2 选择分段与清洗策略
将内容上传至知识库后,需要先对内容进行分段与数据清洗,该阶段可以被理解为是对内容预处理与结构化。
-
案例演示
1.构建优化测试用例的工作流
-
创建工作流
-
单击右键添加节点,工作流包括start-->LLM-->条件分支-->1.结束(满足条件)2.LLM询问-->结束
-
各个节点的配置
(1)开始节点
(3)条件分支
(2)LLM
上一个节点的输出添加进入上下文后,可以选择上下文当作本节点的输入,也可以/选择参数当作本次节点的输入。
(4)结束
-
运行
输入:编写“Messenger应用中气泡通知动画验证”的测试用例
实际运行的流程为下面的分支
运行结果
输出结果满足提示词要求,并且满足条件分支判断要求和手机性能测试相关。
-
输出api接口
curl -X POST 'https://mify-be.pt.xiaomi.com/api/v1/workflows/run' \ --header 'Authorization: Bearer {api_key}' \ --header 'Content-Type: application/json' \ --data-raw '{ "inputs": {}, "response_mode": "streaming", "user": "abc-123" }'
其中api_key 是工作流中api密钥,inputs是以key/value的形式来输入参数,本案例
"inputs" : {"prompt": "Messenger用户中气泡通知图限证"}