你可以通过3种方式在Dify的工作室内创建应用:
初次使用Dify时,你可能对于应用创建比较陌生。为了帮助新手用户快速了解在Dify上能够构建哪些类型的应用,Dify团队内的提示词工程师已经创建好了多场景、高质量的应用模板。
你可以从导航选择「工作室」,在应用列表内选择「从模版创建」。任意选择某个模板,并将其添加至工作区。
如果你需要在Dify上创建一个空白应用,你可以从导航选择「工作室」,在应用列表内选择「从空白创建」。
初次创建应用时,你可能需要先理解Dify上4种不同应用类型的,分别是聊天助手、文本生成应用、Agent和工作流。
文本生成与聊天助手的区别见下表:
如果你从社区或其它人那里获得了一个应用模版(DSL文件),可以从工作室选择「导入DSL文件」。DSL文件导入后将直接加载原应用的所有配置信息。
你也可以通过URL导入DSL文件,参考的链接格式:
示例:
为了更好的用户体验,可以加上对话开场白:。点击页面底部的“添加功能”按钮,打开“对话开场白”的功能:
编辑开场白时,还可以添加数个开场问题:
如果想要让AI的对话范围局限在知识库内,例如企业数据,可以在“上下文”内引用知识库。
如果回答结果不理想,可以调整提示词和底层模型。你也可以使用多个模型同步进行调试,搭配出合适的配置。
多个模型进行调试:
如果使用单一模型调试时感到效率低下,你也可以使用“多个模型进行调试”功能,批量检视模型的回答效果。最多支持同时添加4个大模型。
调试好应用后,点击右上角的“发布”按钮生成独立的AI应用。除了通过公开URL体验该应用,你也进行基于APIs的二次开发、嵌入至网站内等操作。
智能助手(AgentAssistant),利用大语言模型的推理能力,能够自主对复杂的人类任务进行目标规划、任务拆解、工具调用、过程迭代,并在没有人类干预的情况下完成任务。
#角色你是一个AI新闻助手#目标帮我搜索AI新闻,主题请询问我#要求1.请用中文帮我总结2.给我5篇新闻#工作流1.先通过搜索技能搜索新闻【调用工具:travily】2.检查返回的内容,甄别是最近的新闻3.总结内容,再输出给我#输出格式标题:摘要:链接:在“上下文”中,你可以添加智能助手可以用于查询的知识库工具,这将帮助它获取外部背景知识。
在“工具”中,你可以添加需要使用的工具。工具可以扩展LLM的能力,比如联网搜索、科学计算或绘制图片,赋予并增强了LLM连接外部世界的能力。Dify提供了两种工具类型:第一方工具和自定义工具。
TavilySearchAPIisasearchengineoptimizedforLLMsandRAG,aimedatefficient,quick,andpersistentsearchresults
工具使用户可以在Dify上创建更强大的AI应用,如你可以为智能助理型应用(Agent)编排合适的工具,它可以通过任务推理、步骤拆解、调用工具完成复杂任务。另外工具也可以方便将你的应用与其他系统或服务连接,与外部环境交互,如代码执行、对专属信息源的访问等。
在Dify上为智能助手提供了Functioncalling(函数调用)和ReAct两种推理模式。已支持FunctionCall的模型系列如gpt-3.5/gpt-4拥有效果更佳、更稳定的表现,尚未支持Functioncalling的模型系列,支持了ReAct推理框架实现类似的效果。
在Agent配置中,你可以修改助手的迭代次数限制。
可以为智能助手配置一套会话开场白和开场问题,配置的对话开场白将在每次用户初次对话中展示助手可以完成什么样的任务,以及可以提出的问题示例。
编排完智能助手之后,你可以在发布成应用之前进行调试与预览,查看助手的任务完成效果。
应用工具箱为Dify的应用提供了不同的附加功能:
开启功能后,当大语言模型回复问题时引用来自知识库的内容时,可以在回复内容下面查看到具体的引用段落信息,包括原始分段文本、分段序号、匹配度等。
开启功能后,当大语言模型回复问题时引用来自知识库的内容时,可以在回复内容下面查看到具体的引用段落信息,包括原始分段文本、分段序号、匹配度等。点击引用分段上方的跳转至知识库,可以快捷访问该分段所在的知识库分段列表,方便开发者进行调试编辑。
在与AI应用交互的过程中,往往在内容安全性,用户体验,法律法规等方面有较为苛刻的要求,此时我们需要“敏感内容审查”功能,来为终端用户创造一个更好的交互环境。
不同的企业内部往往有着不同的敏感词审查机制,企业在开发自己的AI应用如企业内部知识库ChatBot,需要对员工输入的查询内容作敏感词审查。为此,开发者可以根据自己企业内部的敏感词审查机制写一个API扩展,具体可参考敏感内容审查,从而在Dify上调用,实现敏感词审查的高度自定义和隐私保护。
比如本地服务中自定义敏感词审查规则:不能查询有关美国总统的名字的问题。当用户在query变量输入"Trump",则在对话时会返回"Yourcontentviolatesourusagepolicy."测试效果如下:
标注回复功能通过人工编辑标注为应用提供了可定制的高质量问答回复能力。
适用情景:
标注回复功能相当于提供了另一套检索增强系统,可以跳过LLM的生成环节,规避RAG的生成幻觉问题。
进入“应用构建->添加功能”开启标注回复开关:开启时需要先设置标注回复的参数,可设置参数包括:Score阈值和Embedding模型
点击保存并启用时,该设置会立即生效,系统将对所有已保存的标注利用Embedding模型生成嵌入保存。
可以在调试与预览页面直接在模型回复信息上添加或编辑标注。
编辑成你需要的高质量回复并保存。再次输入同样的用户问题,系统将使用已保存的标注直接回复用户问题。
进入“应用构建->日志与标注->标注”开启标注回复开关:
Score阈值:用于设置标注回复的匹配相似度阈值,只有高于阈值分数的标注会被召回。
Embedding模型:用于对标注文本进行向量化,切换模型时会重新生成嵌入。
节点是工作流的关键构成,通过连接不同功能的节点,执行工作流的一系列操作。
变量用于串联工作流内前后节点的输入与输出,实现流程中的复杂处理逻辑。
环境变量用于保护工作流内所涉及的敏感信息,例如运行工作流时所涉及的API密钥、数据库密码等。它们被存储在工作流程中,而不是代码中,以便在不同环境中共享。
支持以下三种数据类型:
环境变量拥有以下特性:
会话变量仅适用于Chatflow类型(聊天助手→工作流编排)应用。
会话变量允许应用开发者在同一个Chatflow会话内,指定需要被临时存储的特定信息,并确保在当前工作流内的多轮对话内都能够引用该信息,如上下文、上传至对话框的文件(即将上线)、用户在对话过程中所输入的偏好信息等。好比为LLM提供一个可以被随时查看的“备忘录”,避免因LLM记忆出错而导致的信息偏差。
例如你可以将用户在首轮对话时输入的语言偏好存储至会话变量中,LLM在回答时将参考会话变量中的信息,并在后续的对话中使用指定的语言回复用户。
会话变量支持以下六种数据类型:
会话变量具有以下特性:
应用场景
使用入口
可用节点差异
在开始节点中,您可以自定义启动工作流的输入变量。每个工作流都需要一个开始节点。
开始节点支持定义四种类型输入变量:
配置完成后,工作流在执行时将提示您提供开始节点中定义的变量值。
Tip:在Chatflow中,开始节点提供了内置系统变量:sys.query和sys.files。
sys.query用于对话应用中的用户输入问题。
sys.files用于对话中的文件上传,如上传图片,这需要与图片理解模型配合使用。
定义一个工作流程结束的最终输出内容。每一个工作流在完整执行后都需要至少一个结束节点,用于输出完整执行的最终结果。
结束节点为流程终止节点,后面无法再添加其他节点,工作流应用中只有运行到结束节点才会输出执行结果。若流程中出现条件分叉,则需要定义多个结束节点。
定义一个Chatflow流程中的回复内容。可以在文本编辑器中自由定义回复格式,包括自定义一段固定的文本内容、使用前置步骤中的输出变量作为回复内容、或者将自定义文本与变量组合后回复。
可随时加入节点将内容流式输出至对话回复,支持所见即所得配置模式并支持图文混排,如:
**示例1:**输出纯文本
**示例2:**输出图片+LLM回复
直接回复节点可以不作为最终的输出节点,作为流程过程节点时,可以在中间步骤流式输出结果。
场景:LLM是Chatflow/Workflow的核心节点,利用大语言模型的对话/生成/分类/处理等能力,根据给定的提示词处理广泛的任务类型,并能够在工作流的不同环节使用。
选择合适的模型,编写提示词,你可以在Chatflow/Workflow中构建出强大、可靠的解决方案。
如果在编写系统提示词(SYSTEM)时没有好的头绪,也可以使用提示生成器功能,借助AI能力快速生成适合实际业务场景的提示词。
在提示词编辑器中,你可以通过输入“/”或者“{”呼出变量插入菜单,将特殊变量块或者上游节点变量插入到提示词中作为上下文内容。
在常见的知识库问答应用中,知识库检索的下游节点一般为LLM节点,知识检索的输出变量result需要配置在LLM节点中的上下文变量内关联赋值。关联后在提示词的合适位置插入上下文变量,可以将外部检索到的知识插入到提示词中。
该变量除了可以作为LLM回复问题时的提示词上下文作为外部知识引入,由于其数据结构中包含了分段引用信息,同时可以支持应用端的引用与归属功能。
若上下文变量关联赋值的是上游节点的普通变量,例如开始节点的字符串类型变量,则上下文的变量同样可以作为外部知识引入,但引用与归属功能将会失效。
常见情景:构建基于外部数据/知识的AI问答系统(RAG)。
配置流程:
在常见的对话类应用中,知识库检索的下游节点一般为LLM节点,知识检索的输出变量result需要配置在LLM节点中的上下文变量内关联赋值。关联后你可以在提示词的合适位置插入上下文变量。
该变量除了可以作为LLM回复问题时的提示词上下文作为外部知识参考引用,另外由于其数据结构中包含了分段引用信息,同时可以支持应用端的引用与归属功能。
通过定义分类描述,问题分类器能够根据用户输入推理与之相匹配的分类并输出分类结果。
2场景
常见的使用情景包括对话意图分类、产品评价分类、邮件批量分类等。
在该场景中我们设置了3个分类标签/描述:
当用户输入不同的问题时,问题分类器会根据已设置的分类标签/描述自动完成分类:
即分类之后输出的分类名。你可以在下游节点需要时使用分类结果变量。
根据if/else/elif条件将workflow拆分成多个分支。条件分支节点有六个部分:
条件类型
以文本总结工作流作为示例说明各个条件:
多重条件判断
涉及复杂的条件判断时,可以设置多重条件判断,在条件之间设置AND或者OR,即在条件之间取交集或者并集。
代码节点支持运行Python/NodeJS代码以在工作流程中执行数据转换。它可以简化您的工作流程,适用于Arithmetic、JSONtransform、文本处理等情景。
该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的Python或Javascript脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并撰写相应的执行代码:
在工作流中,经常要面对非结构化的数据处理,如JSON字符串的解析、提取、转换等。最典型的例子就是HTTP节点的数据处理,在常见的API返回结构中,数据可能会被嵌套在多层JSON对象中,而我们需要提取其中的某些字段。代码节点可以帮助您完成这些操作,下面是一个简单的例子,它从HTTP节点返回的JSON字符串中提取了data.name字段:
复制
docker-compose-fdocker-compose.middleware.yamlup-d如果您的系统安装了DockerComposeV2而不是V1,请使用dockercompose而不是docker-compose。通过$dockercomposeversion检查这是否为情况。
无论是Python还是Javascript,它们的执行环境都被严格隔离(沙箱化),以确保安全性。这意味着开发者不能使用那些消耗大量系统资源或可能引发安全问题的功能,如直接访问文件系统、进行网络请求或执行操作系统级别的命令。这些限制保证了代码的安全执行,同时避免了对系统资源的过度消耗。
允许借助Jinja2的Python模板语言灵活地进行数据转换、文本处理等。
Jinja是一个快速、表达力强、可扩展的模板引擎。
模板节点允许你借助Jinja2这一强大的Python模板语言,在工作流内实现轻量、灵活的数据转换,适用于文本处理、JSON转换等情景。例如灵活地格式化并合并来自前面步骤的变量,创建出单一的文本输出。这非常适合于将多个数据源的信息汇总成一个特定格式,满足后续步骤的需求。
将多路分支的变量聚合为一个变量,以实现下游节点统一配置。变量聚合节点(原变量赋值节点)是工作流程中的一个关键节点,它负责整合不同分支的输出结果,确保无论哪个分支被执行,其结果都能通过一个统一的变量来引用和访问。这在多分支的情况下非常有用,可将不同分支下相同作用的变量映射为一个输出变量,避免下游节点重复定义。
通过变量聚合,可以将诸如问题分类或条件分支等多路输出聚合为单路,供流程下游的节点使用和操作,简化了数据流的管理。
问题分类后的多路聚合
变量聚合器支持聚合多种数据类型,包括字符串(String)、数字(Number)、对象(Object)以及数组(Array)。
变量聚合器只能聚合同一种数据类型的变量。若第一个添加至变量聚合节点内的变量数据格式为String,后续连线时会自动过滤可添加变量为String类型。
聚合分组
v0.6.10版本之后已支持聚合分组。开启聚合分组后,变量聚合器可以聚合多组变量,各组内聚合时要求同一种数据类型。
变量赋值节点用于向可写入变量进行变量赋值,已支持以下可写入变量:
用法:通过变量赋值节点,你可以将工作流内的变量赋值到会话变量中用于临时存储,并可以在后续对话中持续引用。
自动判断提取并存储对话中的信息,在会话内通过会话变量数组记录用户的重要信息,并在后续对话中使用这些历史信息来个性化回复。
图中的code节点代码如下:
importjsondefmain(arg1:str)->object:try:#ParsetheinputJSONstringinput_data=json.loads(arg1)#Extractthememoryobjectmemory=input_data.get("memory",{})#Constructthereturnobjectresult={"facts":memory.get("facts",[]),"preferences":memory.get("preferences",[]),"memories":memory.get("memories",[])}return{"mem":result}exceptjson.JSONDecodeError:return{"result":"Error:InvalidJSONstring"}exceptExceptionase:return{"result":f"Error:{str(e)}"}复制
示例:用户在对话开始前,在language输入框内指定了“中文”,该语言将会被写入会话变量,LLM在后续进行答复时会参考会话变量中的信息,在后续对话中持续使用“中文”进行回复。
设置会话变量:首先设置一个会话变量language,在会话流程开始时添加一个条件判断节点,用来判断language变量的值是否为空。
变量写入/赋值:首轮对话开始时,若language变量值为空,则使用LLM节点来提取用户输入的语言,再通过变量赋值节点将该语言类型写入到会话变量language中。
变量读取:在后续对话轮次中language变量已存储用户语言偏好。在后续对话中,LLM节点通过引用language变量,使用用户的偏好语言类型进行回复。
辅助Checklist检查,在会话内通过会话变量记录用户的输入项,更新Checklist中的内容,并在后续对话中检查遗漏项。
示例:开始对话后,LLM会要求用户在对话框内输入Checklist所涉及的事项,用户一旦提及了Checklist中的内容,将会更新并存储至会话变量内。LLM会在每轮对话后提醒用户继续补充遗漏项。
点击节点右侧+号,选择“变量赋值”节点,填写“赋值的变量”和“设置变量”。
设置变量:
赋值的变量:选择被赋值变量,即指定需要被赋值的目标会话变量。
设置变量:选择需要赋值的变量,即指定需要被转换的源变量。
以上图赋值逻辑为例:将上一个节点的文本输出项LanguageRecognition/text赋值到会话变量language内。
写入模式:
利用LLM从自然语言推理并提取结构化参数,用于后置的工具调用或HTTP请求。
Dify工作流内提供了丰富的[工具]选择,其中大多数工具的输入为结构化参数,参数提取器可以将用户的自然语言转换为工具可识别的参数,方便工具调用。
工作流内的部分节点有特定的数据格式传入要求,如[迭代]节点的输入要求为数组格式,参数提取器可以方便的实现[结构化参数的转换]。
在该示例中:Arxiv论文检索工具的输入参数要求为论文作者或论文编号,参数提取器从问题“这篇论文中讲了什么内容:2405.10739”中提取出论文编号2405.10739,并作为工具参数进行精确查询。
配置步骤
高级设置
推理模式
部分模型同时支持两种推理模式,通过函数/工具调用或是纯提示词的方式实现参数提取,在指令遵循能力上有所差别。例如某些模型在函数调用效果欠佳的情况下可以切换成提示词推理。
记忆
开启记忆后问题分类器的每次输入将包含对话中的聊天历史,以帮助LLM理解上文,提高对话交互中的问题理解能力。
输出变量
__is_successNumber提取是否成功成功时值为1,失败时值为0。
__reasonString提取错误原因
允许通过HTTP协议发送服务器请求,适用于获取外部数据、webhook、生成图片、下载文件等情景。它让你能够向指定的网络地址发送定制化的HTTP请求,实现与各种外部服务的互联互通。
该节点支持常见的HTTP请求方法:
你可以通过配置HTTP请求的包括URL、请求头、查询参数、请求体内容以及认证信息等。
HTTP请求的返回值包括响应体、状态码、响应头和文件。值得注意的是,如果响应中包含了文件(目前仅支持图片类型),这个节点能够自动将文件保存下来,供流程后续步骤使用。这样的设计不仅提高了处理效率,也使得处理带有文件的响应变得简单直接。
迭代步骤在列表中的每个条目(item)上执行相同的步骤。使用迭代的条件是确保输入值已经格式化为列表对象。迭代节点允许AI工作流处理更复杂的处理逻辑,迭代节点是循环节点的友好版本,它在自定义程度上做出了一些妥协,以便非技术用户能够快速入门。
长故事生成器
具体配置步骤
参数提取效果受模型推理能力和指令影响,使用推理能力更强的模型,在指令内增加示例可以提高参数提取的效果。
在LLM节点内配置输入变量GenerateOverallOutline/output和Iteration/item
迭代的内置变量:items[object]和index[number]
items[object]代表以每轮迭代的输入条目;
index[number]代表当前迭代的轮次;
列表是一种特定的数据类型,其中的元素用逗号分隔,以[开头,以]结尾。例如:
数字型:
字符串型:
["monday","Tuesday","Wednesday","Thursday"]JSON对象:
[{"name":"Alice","age":30,"email":"alice@example.com"},{"name":"Bob","age":25,"email":"bob@example.com"},{"name":"Charlie","age":35,"email":"charlie@example.com"}]使用CODE节点返回
使用参数提取节点返回
迭代节点的输出变量为数组格式,无法直接输出。你可以使用一个简单的步骤将数组转换回文本。
使用代码节点转换
代码节点转换
defmain(articleSections:list):data=articleSectionsreturn{"result":"\n".join(data)}使用模板节点转换
工作流内提供丰富的工具选择,工具分为三种类型:
若内置工具无法满足使用需求,你可以在Dify菜单导航--工具内先创建自定义工具。