Dify:一站式 AI 应用平台 - 基本应用与知识库
Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。
在开始之前
此指引写作时使用 Dify v1.1.3,本篇为 Dify 系列指引的第二篇,主要介绍以下内容:
Dify 各种应用类型之前的区别
三种基础应用类型:聊天助手、Agent、文本生成应用
知识库的创建和使用
此外,下文中会出现 AI 和 LLM。AI 在本文中指代用 Dify 搭建的 AI 应用,LLM 则指代对话用大模型。
Dify 的应用类型
在 Dify 工作室页面点击“创建空白应用”,你就可以看到目前 Dify 支持的应用类型:
看起来有很多,实质上在目前的 Dify 中,主要分为两大类:
基础应用:由 Dify 按照选择的应用类型提供预制好的配置界面,包括 聊天助手、Agent、文本生成应用。此类应用的配置和使用较为简单,相互之间只有应用配置界面上存在区别,基本配置逻辑都是一致的。
工作流应用:Dify 只提供工作流编排页面,具体功能则完全取决于用户如何配置工作流。此类应用提供最大的自由度,你可以按照自己的任何想法对工作流进行配置,能实现的功能相对更多也更复杂。
具体到每一种来说:
聊天助手:最基础的 AI 应用类型,提供最基础的应用配置界面。
文本生成应用:聊天助手的变种,其应用配置界面为单轮大量文本生成应用进行优化。
Agent:聊天助手的升级版,应用配置界面与聊天助手基本一致,但是 Agent 支持工具调用。
ChatFlow:为对话优化的工作流编排应用,此工作流结束节点为回复用户问题的一段文本。
工作流:为自动化任务优化的工作流编排应用,此工作流结束节点为直接结束。
聊天助手应用
聊天助手应用是 Dify 所有应用类型中最为基础的应用,也是你学习之旅的起点。在 工作室 - 创建空白应用 - 聊天助手
可以创建一个聊天助手应用。
应用配置界面
所有基础类型的应用都会在创建完成之后自动进入应用配置界面,在此界面中主要分为左中右三个区域:
左侧:顶部为应用基础信息与 Web App、Web API 配置,下方有 API 调用监测与日志和标注功能
中间:应用编排区域,在此处设置 LLM 提示词、变量设置、知识库调用等,即决定 AI 应用最终效果的核心设置
右侧:顶部为 LLM 模型参数设定以及应用的发布管理,中间为应用调试区域,底部为 API 拓展和预设功能配置区域
应用基础信息配置
左侧顶部为应用基础信息配置,点击卡片可以打开:
这里细分为三段,分别控制应用在工作室中的显示、应用在 Web App 中的显示以及 Web API 功能的控制。
需要注意的是,点击顶部的“编辑信息”修改的内容只会影响应用在工作室页面中的显示,如果要修改 Web App 中的显示内容,你需要点击 Web App 的“设置”按钮。
Web App 设置中给出的链接是可以直接用于公开访问的应用链接,访问此 URL 会打开此应用的 Web App:
如果你对于此 Web App 不满意,或者你需要将此应用作为弹窗嵌入其他应用,你可以点击“定制化”和“嵌入”来尝试实现你自己的需求。如果你不需要 Web App,也可以通过点击此卡片右上角的开关来禁用 Web App。
Web API 的配置较为简单,与 Web App 一样的是都可以直接通过卡片右上角的开关来启用/禁用此功能,不同的是 Web API 即使在开关启动时,如果你没有通过下方的“API 密钥”按钮创建 API 密钥的话,此应用的 API 依然是无法被调用的。还有一点需要特别注意的是,此处的 Web API 是 Dify 专有格式,不是 OpenAI 兼容 API,不能被其他应用直接调用。但是,你可以通过插件系统安装特殊的插件实现 API 转换,比如官方的 OpenAI Compatible Dify App 插件。
应用编排
中间的应用编排区域相对简单,根据你选择的应用类型的不同,此处编排能够控制的功能也不同。最基础的如聊天助手 + 对话型 LLM 时,编排区域只会出现 提示词配置
、变量配置
、知识库配置
三项。
提示词可以决定 AI 应用的基本定位,销售还是产品介绍,又或者是角色扮演,都可以根据你给出的提示词进行变化,即 Prompt Engineer。当然 Prompt Engineer 的含义更为广泛,不仅仅包括初始提示词,还包括你应当如何更有效率的与 LLM 进行对话。但合适的提示词可以减少用户对话所需要的能力要求,说人话就是提示词越完善,AI 对用户对话的意图理解就越好。
变量即可以预设一些变量给用户选择或者填写,可以参照 Dify:一站式 AI 应用平台 - 部署与配置 文章末尾的翻译 App 的创建步骤。变量可以在提示词中使用,这样可以给用户一定的灵活性,你可以在设计提示词时预留部分可被用户修改的内容来提升交互效果。
知识库即对应 Dify 知识库功能,你可以将预先准备好的文档或者介绍文本通过 Dify 知识库将其向量化变为可被 LLM 调用的知识库,在此处选中后 LLM 在回应用户回答时会首先从知识库中提取并参考其中信息再进行回答。
模型配置/应用调试/功能配置
你可能已经注意到了,相比于我们刚开始介绍聊天助手的那张图,介绍应用编排时的配置区域少了一个“视觉”配置。这是因为“视觉”依赖于模型自身,你可以点击调试区域上方的模型按钮来打开模型配置页:
你可以在此处调整模型调用参数,具体可用参数受制于对应的模型,你可以通过鼠标悬浮到对应参数后面的 ?
图标上来查看说明信息。在此处点击顶部的模型下拉框还可以打开模型选择器:
在此处,你可以选择在此 AI 应用中要使用什么模型,鼠标悬浮到对应模型时会显示当前所指模型的基本信息,其中如果是支持视觉的模型此处就会显示一个 多模态能力 - VISION
,选择此模型编排区域就会出现视觉配置选项。
中间是应用调试区域,当你修改编排或者模型之后,点击右上角的刷新图标再进行对话,在某些情况下比如调整知识库分配时,Dify 不会主动提示你刷新调试区域,所以一定记得手动刷新下再对话。
底部是部分内置功能的配置区域:
对话开场白:预先设定一段对话开场白,此处是固定文本,可以引用编排区域设定的变量,还可以预设一些问题来方便用户开始对话。
下一步问题建议:让 LLM 在用户对话过后为用户生成下一步问题的建议。
文字转语音/语音转文字:顾名思义,此处若启用相关功能,需要你在“模型供应商”处为“系统模型设置”设置文字转语音与语音转文字模型。
引用和归属:如果你设置了知识库,打开此开关会在 Web App 中用户对话时显示当前引用的知识库内容。调试界面下无论此开关状态如何始终会显示当前引用的知识库内容。
内容审查:为 AI 应用的对话过程添加内容审查,你可以使用 API 拓展功能添加自己的内容审查,具体参照官方文档。
标注回复:将会话上下文自动转化为临时知识库,当用户提问出现重复问题时 LLM 会参考先前回答进行回复。
文本生成应用
文本生成应用主要用于文章创作、摘要生成、翻译服务、文案撰写等需要单次生成/处理大量文本的情况。
应用配置界面
界面与聊天助手基本一致,不同的是文本生成应用预置了 query
变量来让用户输入文本,同时右侧调试区域不再是多轮对话区域而是单次运行区域。
Agent 应用
应用配置界面
初入 Agent,你会发现这个界面跟聊天助手似乎完全没有区别,但是实际上底层会有一些差异。
先从最明显的说起,Agent 的编排区域多了一个“工具”项,你可以在此处为 AI 应用分配一些工具,当 AI 判断当前的用户问题可以使用工具来获取更多信息时,它会自动调用工具来完善自己的回答。比如上图中我分配了“获取当前时间”的工具,再问它“现在几点了?”它就能准确地说出当前时间了。
实际上根据当前使用的模型不同、工具组合方式不同、上下文语境,LLM 对于工具的调用效果各不相同,要达成不错的效果可能需要相当大的调试工作。
关于工具调用
下面稍微扯远点聊聊这个“工具调用”。
工具调用的本质行为是给定提示词,告诉 LLM 当你返回指定文本时会激活系统的工具系统进行调用,当系统完成工具调用时会连同历史对话一同返回给 AI 进行下一步决策。然而这种方式有两个问题,一是工具本身是多种多样的,对于不同工具的调用方式和返回数据也不尽相同;二是模型本身对于“工具调用”这个行为的理解也不一致,有时不能达到自己想要的效果。
为了解决以上两个问题, Anthropic (Claude) 主导提出了 Model Context Protocol (MCP),即模型上下文协议。MCP 提出了一种架构设计,统一了模型该如何调用工具,以及工具该如何返回数据给 LLM。这是个很有意思的东西,你可以在 MCP 官网 进行详细了解。
但是目前在工具调用上,Function Calling 依旧是目前使用最多的方式,在 Dify 中,默认支持 ReAct 和 Function Calling 两种工具调用方式,你可以点击位于模型选择器旁边的“Agent 设置”按钮来查看当前模型所使用的工具调用方式。同时,你还可以使用插件系统安装 MCP 插件来实现让 AI 调用 MCP 工具。
Dify 知识库
Dify 知识库相当于给 LLM 增加了外置存储,除了在模型训练时所接收到的数据以外,它还可以调用你分配给它的知识库中的数据进行回答。
创建知识库
在 Dify 中,知识库的创建相对简单,在知识库页面,点击“新建知识库”即可。
选择数据源
在打开的页面中,你有三种方式来给知识库填充数据,分别是直接导入本地文件、从 Notion 导入内容、从 Web 站点导入内容。
默认打开的是导入本地文件,你可以把本地处理好的文本数据或者是文档数据直接拖动进来,就可以进入下一步“文档分段与清洗”。
第二种是从 Notion 同步,你需要在 头像 - 设置 - 数据来源
中设置 Notion 集成,设置完成后这里会显示 Notion 内容,选择导入即可。
第三种是从 Web 站点爬取数据,有 Jina Reader 和 Firecrawl 两种数据爬取方式:
Jina Reader 截至写作时效果并不是太好,推荐使用 Firecrawl。但无论你使用哪种方式,均需要在 头像 - 设置 - 数据来源
中设置对应的集成后才能使用。Firecrawl 还可以使用本地部署的方式,参考 Firecrawl 快速部署指引 进行部署即可,不过本地部署效果远不如云服务好。
文本分段与清洗
下一步会进入文本分段与清洗,这里可以对该如何处理当前知识库进行设定。此处可以看到大致分为三个部分:分段设置、索引方式、检索设置。
分段设置
分段设置是指对于文档结构的管理模式,通用分段主要适用于那些文档结构较为扁平化,各个文档之间关联性不是非常紧密的场景。这种模式下,资源边界比较灵活,便于快速检索和召回信息。而父子分段则更适用于有明确层级和从属关系的文档结构,比如项目目录、仓库位置等。它通过建立父段与子段的关系,能够有效提升特定知识库检索的准确性和效率。
索引方式
索引方式是指当 LLM 检索知识库内容时,会使用怎样的检索方式。经济模式下只会使用系统碎片化拣取的关键词进行索引,由于不存在模型调用此方式的性能更高,代价是准确度较差。而高质量模式下会基于向量化技术对输入文本进行索引,将文本内容转换为高维空间中的向量,并利用这些向量进行相似性检索,可以有效地处理语义层面的查询。
对索引方式的简单概括是只要你有条件就使用高质量模式,会大大提升知识库的利用效率和查询准确度。
高质量模式下,会需要你指定一个 Embedding 模型,使用的 Embedding 模型不同,当 LLM 检索时能检索出的结果也不同。你可以在此处选择不同的个 Embedding 模型来找到最适合你当前知识库的模型。但是需要注意的是,高质量模式下,一旦点击底部的“保存并处理”进入下一步,或者在管理知识库时更改 Embedding 模型后点击“保存”,都会立刻删除当前索引的所有数据并重新开始知识库索引,如果你使用的是付费 Embedding 模型进行此操作可能会导致意外的费用消耗,还请注意一下。
检索设置
检索设置涉及到如何对存储的数据进行索引和查询,以提供快速、准确的信息检索。Dify支持向量检索、全文检索和混合检索三种方式,每种方式都有其对应的的优点和缺点。
向量检索:支持语义搜索,能够理解查询的意图以及发现内容上的相关性,检索效果取决于 Embedding 模型的效果。
全文检索:对当前知识库进行全文关键词检索,对于大规模数据集检索速度快,但是检索结果准确度差,无法捕获文档的深层含义。
混合检索:结合了向量检索和全文检索的优点,既可以进行快速的精确匹配,又可以处理语义层面的查询。混合检索下,检索的结果准确度取决于你的 Embedding 和 Reranker(如果指定了的话)模型质量。
简单概括下,优先使用混合检索,需要强语义理解能力时选择向量检索,如果知识库规模非常大 LLM 检索速度过慢时可以使用全文检索。在向量检索和全文检索模式下,也可以启用 Reranker 模型来提升检索效果。
关于模型调用
在知识库中会涉及两种类型的模型:Embedding 模型和 Reranker 模型。这两个模型都不是必需的,在经济模式下无需任何模型即可创建知识库,但是有这些模型辅助对于知识库的检索效率和结果准确度会提升很多。
其中,Embedding 模型会在你创建知识库/为知识库添加内容/修改知识库 Embedding 模型时被调用,而 Reranker 模型会在对话过程中当 LLM 检索知识库时被调用。
管理知识库
对于知识库的管理就没那么多步骤了,当你创建知识库后在知识库页面就会列出已有知识库,点击对应的卡片就会进入管理页面:
文档页面会显示当前知识库中所有索引的文档,以及它们的可用状态。如果你使用了高质量模式,在你刚创建知识库且文档数量较多时,此处会显示部分文档为“索引中”状态。你也可以通过控制右侧的开关来控制某一个文档在对话时能否被索引。点击具体的条目会进入单独的文档管理页面:
此处会显示出当前文档的所有分段,鼠标悬浮到某个分段上时可以控制当前分段在对话时能否被索引,或者是修改分段内容。也可以删除分段,但是即使删除分段,在重新索引知识库(比如更换 Embedding 模型)或重新索引文档时,删除的分段会被重新创建。
单独文档管理的右侧,可以标注当前文档的元数据信息,来帮助 LLM 更高效的检索文档内容。
点击侧边“召回测试”可以进行知识库测试:
你可以在这里搜索关键词,或者是一段话,来测试你当前知识库的检索结果准确性。
最下方是知识库设置,你可以在此处修改知识库当前的索引模型和检索设置:
知识库的名称和描述会参与检索过程,设置好描述和名称可以在多知识库调用时加快检索速度。
使用知识库
知识库的使用就非常简单了,在编排页面知识库设置那里直接添加对应的知识库即可。你可以添加多个知识库,LLM 会在对话时检索所有的知识库。