AI | 使用 dify & ollama 搭建 LLM 平台
🥌

AI | 使用 dify & ollama 搭建 LLM 平台

AI custom autofill
Tags
LLM
Published
April 3, 2025

一 环境配置

需要 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
 
  1. 下载对应的代码仓库,在 docker 文件夹中有编排部署的 docker-compose
  1. 复制 docker 中的 .env.example 文件作为 .env 的环境文件。
  1. 拉取镜像并启动
# 拉取镜像并启动 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()