一 环境配置
需要 docker 和 docker-compose
2.1 下载 docker
// 1. 更新系统包 sudo yum update -y // 2. 安装必要的系统工具: sudo yum install -y yum-utils device-mapper-persistent-data lvm2 // 3. 添加 docker 仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo // 国内: sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo // 4. 下载 docker sudo yum install -y docker-ce docker-ce-cli containerd.io
2.2 下载 docker-compose
// 下载 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose // 添加执行权限 sudo chmod +x /usr/local/bin/docker-compose
二 下载dify
官方文档: ‣
# 假设当前最新版本为 0.15.3 git clone https://github.com/langgenius/dify.git --branch 0.15.3
- 下载对应的代码仓库,在 docker 文件夹中有编排部署的 docker-compose
- 复制 docker 中的 .env.example 文件作为 .env 的环境文件。
- 拉取镜像并启动
# 拉取镜像并启动 docker-compose up -d
二 ollama
‣
// 下载 ollama curl -fsSL https://ollama.com/install.sh | sh // 下载对应模型 // ds 默认是 7b ollama run deepseek-r1 // 或者 1.5b ollama run deepseek-r1:1.5b
在 env 中添加配置
# 启动自定义模型 CUSTOM_MODEL_ENABLED=true OLLAMA_API_BASE_URL=host.docker.internal:11434
三 如何通过 traceloop 监控模型表现
已知 dify 通过插件系统来调用多个大模型。
3.1 插件系统
1 插件系统架构:
Dify 的插件系统主要包含以下几个部分:
- 插件管理器 (PluginModelManager):
class PluginModelManager(BasePluginManager): def fetch_model_providers(self, tenant_id: str) -> Sequence[PluginModelProviderEntity]: """ 获取所有可用的模型提供商 """ response = self._request_with_plugin_daemon_response( "GET", f"plugin/{tenant_id}/management/models", list[PluginModelProviderEntity], params={"page": 1, "page_size": 256}, ) return response
- 插件守护进程 (PluginDaemon):
负责加载和管理插件,处理插件的生命周期。
2 插件调用流程:
当 Dify 需要调用模型时,流程如下:
# 1. 获取模型实例 model_instance = ModelInstance( provider_model_bundle=application_generate_entity.model_conf.provider_model_bundle, model=application_generate_entity.model_conf.model, ) # 2. 调用模型 invoke_result = model_instance.invoke_llm( prompt_messages=prompt_messages, model_parameters=application_generate_entity.model_conf.parameters, stop=stop, stream=application_generate_entity.stream, user=application_generate_entity.user_id, ) # 3. 插件管理器处理调用 result = plugin_model_manager.invoke_llm( tenant_id=self.tenant_id, user_id=user or "unknown", plugin_id=self.plugin_id, provider=self.provider_name, model=model, credentials=credentials, model_parameters=model_parameters, prompt_messages=prompt_messages, tools=tools, stop=list(stop) if stop else None, stream=stream, )
3 插件类型:
Dify 支持多种类型的插件:
- 模型提供商插件:如 Ollama、OpenAI 等
- 工具插件:如 WebScraper、WikipediaSearch 等
- 监控插件:如我们想要添加的 Traceloop
4 插件配置:
每个插件都需要以下配置文件:
{ "name": "插件名称", "version": "版本号", "description": "插件描述", "main": "入口文件", "dependencies": { "依赖包": "版本号" }, "hooks": { "钩子函数": "处理函数" } }
5 插件钩子:
插件可以注册多个钩子函数:
hooks = { "before_invoke": "调用前处理", "after_invoke": "调用后处理", "on_error": "错误处理" }
6 插件通信:
插件与 Dify 主系统通过进程间通信(IPC)进行交互:
response = self._request_with_plugin_daemon_response_stream( method="POST", path=f"plugin/{tenant_id}/dispatch/llm/invoke", type=LLMResultChunk, data=jsonable_encoder({ "user_id": user_id, "data": { "provider": provider, "model_type": "llm", "model": model, "credentials": credentials, "prompt_messages": prompt_messages, "model_parameters": model_parameters, "tools": tools, "stop": stop, "stream": stream, } }) )
7 插件加载机制:
Dify 在启动时会:
- 扫描插件目录
- 加载插件配置
- 初始化插件守护进程
- 注册插件钩子
8 插件生命周期:
# 插件初始化 plugin = Plugin(plugin_dir) plugin.load() # 插件运行 plugin.run() # 插件关闭 plugin.close()