Dify是一个开源的大型语言模型(LLM)应用开发平台,旨在简化AI应用的创建、部署和管理过程。它提供了一个直观的可视化界面,让开发者甚至非技术人员都能快速构建基于大语言模型的应用。包括可视化工作流、多模型支持、RAG引擎、API快速集成、可观测性与运维、开源与自托管等。
该篇博客从本地部署到Dify平台使用都有介绍,并且通过MCP Agent连接MySQL实现基于数据库真实数据进行问答。
一、相关部署
1.1 前期准备
Dify在github上给出了硬性要求需要满足条件
任务管理器 》性能 》虚拟化(开启)
控制面板 》程序 》启用或关闭程序:勾选:
Virtual Machine Platform
Windows虚拟机监控程序平台
适用于Linux 的 Windows子系统
命令行安装wsl
检查wsl版本
wsl --status没有安装过会显示
进行安装
wsl.exe --install置默认版本为wsl2
wsl --set-default-version 21.2 docker安装(windows版)
点击进入官网Docker官网https://www.docker.com/
选择AMD64进行下载
而后直接双击安装包下载即可,新版的docker无需勾选任何选项直接下载也无需下载Docker Compose
测试docker安装,最后运行出: Hello from Docker!表示运行成功
# docker版本 docker --version # docker compose版本 docker-compose --version # 测试运行 docker run hello-world安装好docker后需要进行登录(qq邮箱也行),然后进行一个配置,点击右上角的设置按钮
选择Docker Engine,在其中配置Docker的镜像
"registry-mirrors": [ "https://docker.m.daocloud.io", "https://hub-mirror.c.163.com" ]1.3 dify本地部署
在github上下载dify的文件
Dify Github源码https://github.com/langgenius/dify下载好后,在docker-main 》 docker 路径下,将.env.example的文件后缀名该文.env
修改好后在该路径下进行下载安装
docker-compose up -d配置好后在浏览器中输入以下网址即可进入本地部署的Dify(端口默认80)
localhost:80/install随后进行一个用户配置即可(注意:在使用Dify前确保Docker是在运行的)
1.4 Ollama本地部署
在Ollama官网下载windows版本,下载好后直接install即可
Ollama官网https://ollama.com/在安装包下载好后,在导航栏输入,即可进入,若显示running则表示安装成功(端口默认11434)
http://localhost:11434/现在开始在ollama中下载部署本地模型,在ollama官网点击 Models
进入模型搜索选择页面,选择自己所需模型即可,这里博主选择的是ChatGLM3-6B模型是 ChatGLM 系列最新一代的开源模型,保留了前两代模型对话流畅、部署门槛低等众多优秀特性
复制命令在命令行中回车下载即可
最终效果为
二、Dify使用
2.1 智能体
2.1.1 使用ollama本地部署模型
首先在docker文件夹的.env文件中添加,接受模型调用地址
# 启用自定义模型 CUSTOM_MODEL_ENABLED=true # 指定 Ollama 的API地址 OLLAMA_API_BASE_URL=host.docker.internal:11434在点击右上角个人头像框 》设置 》模型供应商 》安装Ollama
下载好ollama后选择 添加模型,模型名称处要与ollama下载时的名称一致,基础url即为Ollama指定的API地址
http://host.docker.internal:11434配置成功
2.1.2 调用API模型
下载通义插件,选择添加模型,点击进入阿里云百炼
选择密钥管理,创建API Key,并复制(记得开启:免费额度用完即停)
将复制好的API Key输入,模型选择qwen-max(自己选择即可)
对API 密钥进行授权配置,重复操作即可
2.1.3 Dify中创建agent
将模型配置好后(本地/API任选其一),我们开始在Dify中创建Agent智能体应用,回到Dify首页,点击Agent(如果直接在全部中创建不会显示agent和聊天助手选项),点击创建空白应用
这里我们选择Agent创建
此时,会自动匹配好调用模型,可以供用户自主选择
配置好之后就能使用了
2.2 知识库
返回首页,选择知识库 》创建知识库
选择导入已有文本,选择文件,然后点击下一步
对文本进行分段与清洗,选择自己所需参数,其中Top K标识对在排名前x名的数据进行引用,Score阈值则为当大于该阈值的才进入筛选进行排名引用,保存并处理
当状态显示为可以时,即成功
2.3 ChatFlow
在实际使用中更多的是需要一些流程判断以及MCP插件来支持业务逻辑的实现,所以选择直接通过ChatFlow工作流编排来实现业务效果,此处博主将直接使用毕设案例进行操作
直接进行创建ChatFlow工作流,成功后如图,而后直接删除LLM和直接问答,自主根据需求编排
现在博主要编排一个功能包括病虫害防治/生长预测和建议/用户问答功能的工作流,实现在用户输入处编写一些变量,name表示病虫害/作物名称,type表示当前类型(用于判断是防治还是生长),相关参数如下
变量参数设置好后,开始编排逻辑,选择逻辑:条件分支
通过type值来判断工作流走向何处,此处我们设定当type是1时为病虫害防治,type是2时为农作物生长预测与建议,都不满足时进入用户问答
2.3.1 智能问答
由于是用户直接进行问答对话,所以在后面直接添加LLM模型,直接回复即可
2.3.2 病虫害防治
从这里开始,我们需要用到MCP进行数据库内容的调用了,点击右上角 插件 》探索Marketplace 》搜索sql 》安装数据库查询
用于连接本地数据库,对所属数据进行查询
再下载一个Agent策略通过MCP对mysql进行调用
全部安装好后,回到ChatFlow工作流中,在type是1的后面添加Agent
在Agent中,选择AGENT策略 》Agent 》FunctionCalling
选择模型,在工具列表点击+号,添加工具 》插件 》数据库查询 》SQL查询
配置MySQL相关参数,填写指令(SQL查询时的指令)和查询(智能体的指令)
在Agent后添加 知识检索 节点,添加所需要的引用知识库
在 知识检索 后添加LLM,在上下文处,选择 知识检索的result
在LLM处,选择上下文后需要在SYSTEM中引用,在其中编写提示词,将Agent查询数据表的数据与Dify知识库的数据相结合
最后添加直接输出,在回复中点击 {x} ,选择LLM2的text即可
text为模型生成内容,reasoning_content为模型推理内容,usage为模型用量信息
2.3.3 农作物生长
在此部分重复上述操作即可,取决于是否需要查询本地数据库表内内容以及引用Dify知识库
最终得到(注意:在编排好后记得点击右上角发布,发布更新)
ChatFlow会根据用户输入的参数进行对应路径的流转,如图所示
三、后端调用API
3.1 智能体
在智能体中选择右上角 发布,选择 访问API
在目录中选择 发送对话消息,点击直接copy复制
这里博主使用Apifox进行演示操作,选择导入curl,将复制内容填入
导入后对相关参数进行修改,在Body处将user改为用户名,在Headers处将Authorization中{api_key}值替换为当前密钥
点击右上角 API密钥 》创建密钥 》复制
将相关参数修改后就能使用了,query为用户提问,效果如图
3.2 ChatFlow
同上,点击右上角 》访问API 》选择 发送对话消息 》复制粘贴于Apifox中
同样的,修改相关参数即可
3.3 知识库
可以参考官网内容
Dify数据库操作列表https://docs.dify.ai/api-reference/%E7%9F%A5%E8%AF%86%E5%BA%93/%E8%8E%B7%E5%8F%96%E7%9F%A5%E8%AF%86%E5%BA%93%E5%88%97%E8%A1%A8但是官网内容粘贴后无法直接使用,缺少必要参数,博主也是浏览了其他帖子才API请求成功,现在给出完整参数。
首先配置密钥,知识库的密钥不在具体数据库内,而在首页进行选择
3.3.1 新增知识库
修改网址、密钥、模型参数后即可使用
curl --location --request POST 'http://xxx/v1/datasets' \ --header 'Authorization: Bearer xxx' \ --header 'Content-Type: application/json' \ --data-raw '{ "name": " ", "description": " ", "indexing_technique": "high_quality", "permission": "all_team_members", "provider": "vendor", "external_knowledge_api_id": "", "external_knowledge_id": "", "embedding_model": "multimodal-embedding-v1", "embedding_model_provider": "tongyi", "retrieval_model": { "search_method": "hybrid_search", "reranking_enable": true, "reranking_mode": "reranking_model", "reranking_model": { "reranking_provider_name": "tongyi", "reranking_model_name": "gte-rerank-v2" }, "top_k": 3, "score_threshold_enabled": true, "score_threshold": 0.5, "weights": {"model_name": 0.5} } }'注意在新增后,记住新增知识库的id,因为在Dify平台是看不见知识库id的。也可以选择使用 查询知识库列表 来查看每个知识库的详细信息,其中就包含id
3.3.2 删除知识库
curl --location --request DELETE 'http://xxx/v1/datasets/知识库id' \ --header 'Authorization: Bearer xxx'3.3.3 更新知识库
curl --location --request PATCH 'http://xxx/v1/datasets/知识库id' \ --header 'Authorization: Bearer xxx' \ --header 'Content-Type: application/json' \ --data-raw '{ "name": " ", "description": " ", "indexing_technique": "high_quality", "permission": "all_team_members", "embedding_model_provider": "tongyi", "embedding_model": "multimodal-embedding-v1", "retrieval_model": { "search_method": "hybrid_search", "reranking_enable": true, "reranking_mode": "reranking_model", "reranking_model": { "reranking_provider_name": "tongyi", "reranking_model_name": "gte-rerank-v2" }, "top_k": 3, "score_threshold_enabled": true, "score_threshold": 0.5, "weights": {"model_name": 0.5} }, "partial_member_list": [ { "user_id": "Dify" } ] }'3.3.4 查询知识库列表
curl --location --request GET 'http://xxx/v1/datasets?page=1&limit=20' \ --header 'Authorization: Bearer xxx'3.3.5 新增文件
在对应数据库下新增文件
curl --location --request POST 'http://xxx/v1/datasets/知识库id/document/create-by-file' \ --header 'Authorization: Bearer dataset-hzKxz6vnM21UqRQtL0FLppiu' \ --form 'data="{ \"name\": \"测试文档\", \"indexing_technique\": \"high_quality\", \"doc_form\": \"hierarchical_model\", \"process_rule\": { \"mode\": \"hierarchical\", \"rules\": { \"pre_processing_rules\": [ { \"id\": \"remove_extra_spaces\", \"enabled\": true } ], \"segmentation\": { \"separator\": \"\\n\\n\", \"max_tokens\": 2000 }, \"parent_mode\": \"paragraph\", \"subchunk_segmentation\": { \"separator\": \"\\n\", \"max_tokens\": 200 } } }, \"retrieval_method\": { \"search_method\": \"hybrid_search\", \"hybrid_search\": { \"semantic_weight\": 0.7, \"full_text_weight\": 0.3 }, \"top_k\": 3 } }"' \ --form 'file=@""'注意将file的类型改为file
3.3.6 修改文件
curl --location --request POST 'https://xxx/v1/datasets/知识库id/documents/文件id/update-by-file' \ --header 'Authorization: Bearer xxx' \ --form 'data="{ \"doc_form\": \"hierarchical_model\", \"process_rule\": { \"mode\": \"hierarchical\", \"rules\": { \"pre_processing_rules\": [ { \"id\": \"remove_extra_spaces\", \"enabled\": true } ], \"segmentation\": { \"separator\": \"\\n\\n\", \"max_tokens\": 2000 }, \"parent_mode\": \"paragraph\", \"subchunk_segmentation\": { \"separator\": \"\\n\", \"max_tokens\": 200 } } } }"' \ --form 'file=@"D:\\Desktop\\附件5安全责任书(1).docx"'3.3.7 删除文件
同样需要知识库和文件的id
curl --location --request DELETE 'http://xxx/v1/datasets/知识库id/documents/文件id' \ --header 'Authorization: Bearer xxx'3.3.8 获取知识库的文档列表
curl --location --request GET 'http://xxx/v1/datasets/知识库id/documents?page=1&limit=20' \ --header 'Authorization: Bearer xxx'自此Dify的本地部署、工作流编排和API基础使用就已经介绍完毕,后续发现Dify的其余新用法后进行更新