Dify源码学习-工作流的角度

菜鸟小白学习分享,如有不对欢迎指正

下载安装

Dify 依赖以下工具和库:

注:需要严格按照官网文档环境信息

具体安装步骤可从github上复制粘贴,傻瓜式操作,but 首先你需要创建一个虚拟环境 https://github.com/langgenius/dify/blob/main/CONTRIBUTING_CN.md

 0.6.12版本后使用poetry管理包

ps:不要怪dify只支持上传图片,而且前端传参还是base64格式,因为模型接口就只支持处理image,编码还必须是base64 文件上传随后再写吧

后端

Dify 的后端使用 Python 编写,使用 Flask 框架。它使用 SQLAlchemy 作为 ORM,使用 Celery 作为任务队列。授权逻辑通过 Flask-login 进行处理。

by the way: celery 初步理解为消费者模型,发送消息后,worker起一个‘进程’处理消息,(个人猜想是进程)个人对异步消息这块不是很了解,不再赘述

poetry run python -m celery -A app.celery worker -P gevent -c 1 --loglevel INFO -Q dataset,generation,mail,ops_trace,app_deletion

数据库

普通工作流调用大模型时,仅使用到了postgres, 猜想weaviate向量数据库只有对应查询数据库的时候使用

工作流对应DB中workflows这张表,其中节点信息储存在graph字段中,以下为字段信息,是一段JSON

{"nodes": [{"id": "1725434172434", "type": "custom", "data": {"type": "start", "title": "\u5f00\u59cb", "desc": "", "variables": [], "selected": false}, "position": {"x": 80, "y": 282}, "targetPosition": "left", "sourcePosition": "right", "positionAbsolute": {"x": 80, "y": 282}, "width": 244, "height": 54}, {"id": "llm", "type": "custom", "data": {"type": "llm", "title": "LLM", "desc": "", "variables": [], "model": {"provider": "ollama", "name": "llava:13b", "mode": "chat", "completion_params": {"temperature": 0.7}}, "prompt_template": [{"role": "system", "text": "\u5c06\u56fe\u7247\u4e2d\u4fe1\u606f\u63d0\u53d6\u51fa\u6765", "id": "3253d6ae-8331-424f-9d85-7c9ebff6b5f4"}], "context": {"enabled": false, "variable_selector": []}, "vision": {"enabled": false}, "memory": {"window": {"enabled": false, "size": 10}, "role_prefix": {"user": "", "assistant": ""}}, "selected": true}, "position": {"x": 379.03416092544296, "y": 282}, "targetPosition": "left", "sourcePosition": "right", "positionAbsolute": {"x": 379.03416092544296, "y": 282}, "width": 244, "height": 98, "selected": true}, {"id": "answer", "type": "custom", "data": {"type": "answer", "title": "\u76f4\u63a5\u56de\u590d", "desc": "", "variables": [], "answer": "{{#llm.text#}}", "selected": false}, "position": {"x": 680, "y": 282}, "targetPosition": "left", "sourcePosition": "right", "positionAbsolute": {"x": 680, "y": 282}, "width": 244, "height": 107}], "edges": [{"id": "1725434172434-llm", "source": "1725434172434", "sourceHandle": "source", "target": "llm", "targetHandle": "target", "type": "custom", "data": {"sourceType": "start", "targetType": "llm"}}, {"id": "llm-answer", "source": "llm", "sourceHandle": "source", "target": "answer", "targetHandle": "target", "type": "custom", "data": {"sourceType": "llm", "targetType": "answer"}}], "viewport": {"x": 94.87333799526743, "y": -74.36439111513661, "zoom": 1.035369168987668}}

其中nodes表示当前工作流共有几个节点,edges中有相关节点的引用关系

消息更新

通过回掉函数及自定义queue,用redis实现消息的通知,比如标记节点的运行状态

接口调用

每一次调用工作流后,后端会先对参数处理,将一些系统基本信息,放入变量池中,这个变量池放到了context中,全局都可获取,之后单独起一个线程,验证输入信息格式,调用大模型

这块东西很多,但是不太好表述,欢迎随时交流

多模态支持图片格式的识别

不知道是前端设置我没打开,还是专门有这么个小坑,默认不支持图片识别,得将vision.enabled设置为True,直接全局搜索即可

文件上传

相信大家对网页基本知识有一定的了解,dify上传文件后,首先发送upload的请求,通过formdata传到本地api/storage/upload_files下,源码中默认使用本地储存,应该再flask中能更改配置项支持s3等其他储存,成功后返回 !!文件ID!!

之后进行对话发送时,将文件转为base64的格式,通过json的格式传到后端,但目前看来这是一个坑,后端初始化filevar变量时通过属性会重新根据 id 去数据库中获取具体的信息,所以前端对话时,重新发送一遍json,个人感觉是无用的(有人知道这是干什么用的,求求告诉孩子)

项目对比与选型深度建议功能特性QuivrMaxKBDifyFastGPTRagFlow核心定位大脑第二皮层,知识管理与 RAG 工具企业级知识库平台,稳定高效LLM 应用开发平台,平台化 RAG 引擎轻量级知识库问答平台,快速落地深度文档理解 RAG 引擎,复杂文档处理易用性用户友好界面,操作相对简单开箱即用,管理后台强大可视化界面,平台化操作简便极简设计,快速部署,低代码模块化架构,部署相对简单,配置灵活RAG 能力高度可定制 RAG 流程,多模态支持高效 RAG 引擎,Hybrid Search平台化 RAG 引擎,多 Agent 协同RAG 检索与重排序,可视化工作流深度文档解析,结构化信息提取,引用溯源企业级特性插件生态,知识管理工具丰富企业级架构,全面知识库功能,管理后台强大SSO、访问控制,可观测性,商业化支持插件化扩展,社区活跃可扩展架构,本地 LLM 优化,引用支持私有化 LLM 适配性需进一步评估,插件化机制可能支持需进一步评估,企业级架构或有考虑支持多种 LLM,包括开源模型,本地部署支持多种 LLM,轻量级易于适配本地 LLM 优化,与 Intel IPEX-LLM 集成适用场景个人知识管理、企业知识库、多模态知识应用企业级知识库、文档管理、内部知识共享多种 LLM 应用场景、AI 工作流、平台化 RAG 服务企业内部问答、客服机器人、快速原型验证复杂文档问答、金融研报分析、法律文档处理、深度信息挖掘深度与特色知识组织与探索,Prompt Chaining,多模态企业级稳定高效,Hybrid Search,管理后台平台化能力,多 Agent 协同,可观测性,商业支持极简易用,可视化工作流,快速部署,插件化深度文档理解,结构化信息提取,引用溯源,本
03-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_52918808

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值