当一站式Agent平台配置已经无法满足我...Dify小白入门攻略!在线/本地部署+应用发布,一条龙弄清楚!知识库这回给你说明白

文摘   2024-09-04 00:12   浙江  


点击蓝字,关注更多AI资讯!


Dify.AI (Do it for you)

相信关注AI领域的小伙伴们,多少都听过Dify这个名字。Dify.AI是一款开源的大语言模型(LLM)应用开发平台,它融合了后端即服务(Backend as Service)和LLMOps的理念,帮助开发者快速搭建生产级的生成式AI应用,核心理念是通过可声明式的 YAML 文件定义 AI 应用的各个方面,包括 Prompt、上下文和插件等,2024年7月入选中国最具价值AGI创新机构TOP 50。

相比于清一色的一站式的Agent开发平台,Dify为开发者提供标准的可视化Agent配置流程与工具的同时,还支持开发者自己部署,也不局限模型。与LangChain 这类的开发库(Library)相比,Dify 提供了更接近生产需要的完整方案,好比是一套脚手架,并且经过了精良的工程设计和软件测试,关于LangChain和Dify的差别后面会专门出一篇文章来介绍!

Dify 提供了可视化的 Prompt 编排、运营、数据集管理等功能助力完成AI应用的开发,同时支持将业内流程LLM 或者企业内部模型快速集成到现有应用中。

最近也是在百炼、文心智能平台、coze等一站式Agent搭建平台上体验过,体感就是或许还是因为Agent发展在国内相对还处于摸索阶段,许多能力的灵活度上还是存在一定的限制,不够支持我的定制需求。于是乎Dify进入战斗准备区!接下来我们就来了解下Dify的能力,看看作为一个要求多的小白,Dify够不够支持我的需求!


主要功能


可视化编排Prompt:通过界面化编写prompt并调试,只需几分钟即可发布一个AI应用。

接入长上下文(数据集):全自动完成文本预处理,使用数据作为上下文,无需理解晦涩的概念和技术处理。

基于API开发:提供后端即服务,可以直接访问网页应用,也可以接入API集成到应用中,无需关注复杂的后端架构和部署过程。

数据标注与改进:可视化查阅AI日志并对数据进行改进标注,观测AI的推理过程,不断提高其性能。


特点


模型中立性:Dify强调模型中立性,支持多种大型语言模型,如GPT系列、Azure OpenAI Service、Claude、Hugging Face Hub等。

开源生态系统:Dify是开源的,由专业的全职团队和社区共同打造,允许用户基于任何模型自部署类似于assistant API和gpt的功能。

快速创建AI应用:Dify使得开发者能够在数天内完成AI应用的开发,或将LLM快速集成到现有应用中,并进行持续运营和改进。


应用类型


Dify上有4种不同应用类型的基本概念,分别是聊天助手、文本生成应用、Agent 和工作流。


主流工具对比



架构图



创建应用



从模板创建应用


Dify内置了一些垂直的场景高质量的应用模板。我们可以在应用列表内选择 「从模版创建」。

从应用模板创建一个新应用

我们也可以创建一个空白应用

创建应用的交互方式类似我们之前实践过的其他智能体Agent平台。

创建一个空白应用


通过 DSL文件、URL创建应用


Dify DSL 是由 Dify.AI 所定义的 AI 应用工程文件标准,文件格式为 YML。该标准涵盖应用在 Dify 内的基本描述、模型参数、编排配置等信息。

如果我们从社区或其它人那里获得了一个应用模版(DSL 文件),可以从工作室选择 「 导入DSL 文件 」。DSL 文件导入后将直接加载原应用的所有配置信息。

也可以通过 URL 导入 DSL 文件,参考的链接格式:

https://example.com/your_dsl.yml


知识库(敲重点)


在 Dify 主导航栏中点击知识库,在该页面你可以看到已有的知识库。你可以点击 创建知识库 进入创建向导:

如果已经准备好了文件,可以从上传文件开始;

如果还没有准备好文档,可以先创建一个空数据集;

如果在创建数据集时选择了使用外部数据源,该知识库的类型不可更改。

如果需要使用多个数据源,建议创建多个知识库。

文件上传

如图,支持本地、notion笔记,新鲜的是还支持直接配置Firecrawl的爬虫

上传文档的限制:

  • 单文档的上传大小限制为 15MB;

  • 单次批量上传文件个数上限为 20 个;

  • SaaS 版本的不同付费计划,可以解锁更多数据上的限制= =

清洗与分段

清洗: 为了保证文本召回的效果,通常需要在将数据传入模型之前对其进行清理。例如,如果输出中存在不需要的字符或者空行,可能会影响问题回复的质量。为了帮助用户解决这个问题, Dify 提供了多种清洗方法。

分段:大语言模型存在有限的上下文窗口,通常需要将整段文本进行分段处理后,将与用户问题关联度最高的几个段落召回,即分段 TopK 召回模式。此外,在用户问题与文本分段进行语义匹配时,合适的分段大小将有助于匹配关联性最高的文本内容,减少信息噪音。


分段与清洗支持两种配置策略

1. 自动模式(付费选择高质量= =)

2. 自定义模式


在自定义模式下,用户可以根据不同的文档格式和场景要求来配置文本的分段和清洗策略。

  

分段规则:

分段标识符,设置标识符如“\n”,系统将在文本中出现该标识符时分段;

分段最大长度,根据分段的文本字符数最大上限来进行分段,超出该长度时将强制分段;

分段重叠长度,设置分段间的重叠字符数,建议设置为分段长度的 10-25%,有助于保留分段之间的语义相关性,在多分段召回时提高召回效果。


预处理规则:

替换连续的空格、换行符和制表符;

删除所有 URL 和电子邮件地址;



ETL配置


在 RAG 的生产级应用中,为了获得更好的数据召回效果,需要对多源数据进行预处理和清洗,即 ETL (extract, transform, load)。为了增强非结构化/半结构化数据的预处理能力,数据结构化意味着它们存储在关系型数据库中,并且具有预定义的模式或格式。非结构化数据没有固定的格式,它们可以是文本文件、PDF文档、图片、视频、社交媒体帖子等。


ETL的关键步骤包括:

  1. 提取(Extract):从各种数据源中获取非结构化数据。这些数据源可能包括文件系统、云存储、社交媒体平台、网站等。

  2. 转换(Transform):将非结构化数据转换为可以分析和理解的格式。这可能涉及数据清洗、文本挖掘、图像识别、自然语言处理(NLP)等技术,以提取有用信息并将其转换为结构化格式。

  3. 加载(Load):将转换后的数据加载到数据仓库、数据湖或其他数据存储系统中,以便进行进一步的分析和处理。

效地提取并转换您的数据为干净的数据用于后

Dify 各版本的 ETL 方案选择:

  • SaaS 版不可选,默认使用 Unstructured ETL;

  • 社区版可选,默认使用 Dify ETL ,可通过环境变量开启 Unstructured ETL;

文件解析支持格式的差异:


索引方式


我们需要选择文本的索引方式来指定数据的匹配方式,索引策略往往与检索方式相关,需要根据场景需求来选择合适的索引方式。

1. 高质量模式: 将调用 OpenAI 的嵌入接口进行处理,以在用户查询时提供更高的准确度。

2. 经济模式: 会使用关键词索引方式,降低了准确度但无需花费 Token。

3. Q&A 模式(仅社区版支持): Q&A 分段模式功能,与上述普通的「Q to P」(问题匹配文本段落)匹配模式不同,它是采用「Q to Q」(问题匹配问题)匹配工作,在文档经过分段后,经过总结为每一个分段生成 Q&A 匹配对,当用户提问时,系统会找出与之最相似的问题,然后返回对应的分段作为答案。这种方式更加精确,因为它直接针对用户问题进行匹配,可以更准确地获取用户真正需要的信息。

在知识库上传文档时,系统将对文本进行分段,使得用户的提问(输入)能匹配到相关的文本段落(Q to P),最后输出结果。满足一些高频和高相似度问题的提问场景。

Q to P 与 Q to Q 的索引模式区别Q


Q&A 分段模式下被总结成多个 Q&A 对的文本


检索设置


在高质量索引模式下,Dify 提供了 3 种检索方案:

  • 向量检索,通过生成查询嵌入并查询与其向量表示最相似的文本分段。

  • 全文检索,索引文档中的所有词汇,从而允许用户查询任意词汇,并返回包含这些词汇的文本片段。

  • 混合检索,同时执行全文检索和向量检索,并附加重排序步骤,从两类查询结果中选择匹配用户问题的最佳结果,需配置 Rerank 模型 API。

三种检索方式的具体配置如下:

1. 向量检索

义:通过生成查询嵌入并查询与其向量表示最相似的文本分段。


TopK:用于筛选与用户问题相似度最高的文本片段。系统同时会根据选用模型上下文窗口大小动态调整片段数量。系统默认值为 3 。数值越高,预期被召回的文本分段数量越多。

Score 阈值:用于设置文本片段筛选的相似度阈值,即:只召回超过设置分数的文本片段。系统默认关闭该设置,即不会对召回的文本片段相似值过滤。打开后默认值为 0.5。数值越高,预期被召回的文本数量越少。

Rerank 模型:你可以在“模型供应商”页面配置 Rerank 模型的 API 秘钥之后,在检索设置中打开“Rerank 模型”,系统会在语义检索后对已召回的文档结果再一次进行语义重排序,优化排序结果。设置 Rerank 模型后,TopK 和 Score 阈值设置仅在 Rerank 步骤生效。

2. 全文检索


定义:索引文档中的所有词汇,从而允许用户查询任意词汇,并返回包含这些词汇的文本片段。

参数含义同上


混合检索

定义:同时执行全文检索和向量检索,并应用重排序步骤,从两类查询结果中选择匹配用户问题的最佳结果。在此模式下可以指定权重设置或选择 Rerank 模型进行检索。

权重设置:允许用户赋予语义优先和关键词优先自定义的权重。关键词检索指的是在知识库内进行全文检索(Full Text Search),语义检索指的是在知识库内进行向量检索(Vector Search)。

语义值为 1

仅启用语义检索模式。借助 Embedding 模型,即便知识库中没有出现查询中的确切词汇,也能通过计算向量距离的方式提高搜索的深度,返回正确内容。此外,当需要处理多语言内容时,语义检索能够捕捉不同语言之间的意义转换,提供更加准确的跨语言搜索结果。


关键词值为 1

仅启用关键词检索模式。通过用户输入的信息文本在知识库全文匹配,适用于用户知道确切的信息或术语的场景。该方法所消耗的计算资源较低,适合在大量文档的知识库内快速检索。


自定义关键词和语义权重

除了仅启用语义检索或关键词检索模式,我们还提供了灵活的自定义权重设置。你可以通过不断调试二者的权重,找到符合业务场景的最佳权重比例。


关联知识库并指定召回模式

在配置好知识库后,我们就可以开始进行应用的集成了。如果当前应用的上下文涉及多个知识库,需要设置召回模式以使得检索的内容更加精确。进入 上下文 -- 参数设置 -- 召回设置,选择知识库的召回模式。


N 选 1 召回(Legacy)

N 选 1 召回由 Function Call/ReAct 进行驱动,每一个关联的知识库作为工具函数,LLM 会自主选择与用户问题最匹配的 1 个知识库来进行查询,推理依据为用户问题与知识库描述的语义的匹配程度。


原理图如下:

举例:A 应用的上下文关联了 K1、K2、K3 三个知识库。使用 N 选 1 召回策略后,用户在应用内输入问题后,LLM 将检索这三个知识库的描述,匹配某个最适合的知识库并使用其中的内容进行检索。

虽然此方法无需配置 Rerank 模型,但该召回策略仅匹配单个知识库,且匹配的目标知识库严重依赖于 LLM 对于知识库描述的理解,检索匹配知识库时可能会存在不合理的判断,导致检索到的结果可能不全面、不准确,从而无法提供高质量的查询结果。

在 N 选 1 模式下,召回效果主要受三个因素影响:

1. 系统推理模型的能力 部分模型对于 Function Call/ReAct 的指令遵循程度不稳定

2. 知识库描述是否清晰 描述内容会影响 LLM 对用户问题与相关知识库的推理

3. 知识库的个数 知识库过多会影响 LLM 的推理精确性,同时可能会超出推理模型的上下文窗口长度。

提升 N 选 1 模式推荐效果的方法:


1. 选择效果更好的系统推理模型,关联尽量少的知识库,提供精确的知识库描述。

2. 在知识库内上传文档内容时,系统推理模型将自动为知识库生成一个摘要描述。为了在该模式下获得最佳的召回效果,你可以在 “知识库->设置->知识库描述” 中查看到系统默认创建的摘要描述,并检查该内容是否可以清晰的概括知识库的内容。

多路召回(推荐)


在多路召回模式下,检索器会在所有与应用关联的知识库中去检索与用户问题相关的文本内容,并将多路召回的相关文档结果合并,以下是多路召回模式的技术流程图:

根据用户意图同时检索所有添加至 “上下文” 的知识库,在多个知识库内查询相关文本片段,选择所有和用户问题相匹配的内容,最后通过 Rerank 策略找到最适合的内容并回答用户。该方法的检索原理更为科学。

举例:A 应用的上下文关联了 K1、K2、K3 三个知识库,当用户输入问题后,将在三个知识库内检索并汇总多条内容。为确保能找到最匹配的内容,需要通过 Rerank 策略确定与用户问题最相关的内容,确保结果更加精准与可信。

实际问答场景中,每个知识库的内容来源和检索方式可能都有所差异。针对检索返回的多条混合内容,Rerank 策略是一个更加科学的内容排序机制。它可以帮助确认候选内容列表与用户问题的匹配度,改进多个知识间排序的结果以找到最匹配的内容,提高回答质量和用户体验。


考虑到 Rerank 的使用成本和业务需求,多路召回模式提供了以下两种 Rerank 设置:


权重设置

该设置无需配置外部 Rerank 模型,重排序内容无需额外花费。可以通过调整语义或关键词的权重比例条,选择最适合的内容匹配策略。

1. 语义值为 1

仅启用语义检索模式。借助 Embedding 模型,即便知识库中没有出现查询中的确切词汇,也能通过计算向量距离的方式提高搜索的深度,返回正确内容。此外,当需要处理多语言内容时,语义检索能够捕捉不同语言之间的意义转换,提供更加准确的跨语言搜索结果。

2. 关键词值为 1

仅启用关键词检索模式。通过用户输入的信息文本在知识库全文匹配,适用于用户知道确切的信息或术语的场景。该方法所消耗的计算资源较低,适合在大量文档的知识库内快速检索。

3. 自定义关键词和语义权重

除了仅启用语义检索或关键词检索模式,我们还提供了灵活的自定义权重设置。你可以通过不断调试二者的权重,找到符合业务场景的最佳权重比例。

Rerank 模型


Rerank 模型是一种外部评分系统,它会计算用户问题与给定的每个候选文档之间的相关性分数,从而改进语义排序的结果,并按相关性返回从高到低排序的文档列表。

虽然此方法会产生一定的额外花费,但是更加擅长处理知识库内容来源复杂的情况,例如混合了语义查询和关键词匹配的内容,或返回内容存在多语言的情况。解更多重排序机制。

Dify 目前支持多个 Rerank 模型,进入 “模型供应商” 页填入 Rerank 模型(例如 Cohere、Jina 等模型)的 API Key。


本地部署


Dify 社区版即开源版本,我们可以通过Docker Compose 的当时进行本地部署

克隆 Dify 源代码至本地。

git clone https://github.com/langgenius/dify.git

我们这里由于用的是 docker ,所以还需要提前准备好 docker 环境。进入 Dify 源代码的 docker 目录,执行一键启动命令:

cd dify/docker

cp .env.example .env

docker-compose up -d


这里可能等待得时间较长,看自己网速,国内最好也配置一下阿里云的镜像,不然就会和本人一样看到无数次这样的报错:

镜像添加的操作如下:

看到这个界面就证明 docker 镜像已经拉取完毕

然后执行:docker ps -a

打开我们的 docker desktop :

以上是 Dify 项目内部所需要的所有镜像,至此我们的项目环境已经搭建完毕。


构建应用


浏览器访问下面地址:(注意这里的端口需要与之前配置的一致,默认是 80 )

http://localhost:80/install

可以看到

登录成功后就可以看到和我们之前在官网云环境上看到的基本一致的配置页面了

我们可以按照上面讲过的流程来创建应用

     添加模型

如果选择了openAI,这里要添加一下自己的密钥


完成模型添加后,可以看到我们的模型:

还有很多可选的模型:

进入到我们创建好的模型:

编排界面的右上角可以编辑我们配置好的模型:


和上文说的步骤一样来添加知识库


接着是文档分段和清洗


配置好后,将知识存储到向量数据库:

接下来将创建好的知识库关联到我们的ChatBot,一键发布,我们就可以在本地与Agent进行对话啦。

扫码关注更多AI资讯

我们一起学AI!



同桌的AI小纸条
一个专注于将先进的AI人工智能技术融入日常生活的频道。关注让AI为我们所用,探索人工智能领域的无限可能,并征服他们,让AI赋能生活快乐每一天!
 最新文章