From a415606cf0411f3897c14e5603510f4a255801a0 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Mon, 21 Apr 2025 09:53:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0LLMHub=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CN/LLM-Hub/架构设计.md | 251 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 CN/LLM-Hub/架构设计.md diff --git a/CN/LLM-Hub/架构设计.md b/CN/LLM-Hub/架构设计.md new file mode 100644 index 0000000..29286ef --- /dev/null +++ b/CN/LLM-Hub/架构设计.md @@ -0,0 +1,251 @@ +# 架构设计 + +## 🧩 架构总览 + +```css +[Client] ──HTTP/gRPC──> [Core Service API Layer] + │ + ▼ + [SPI 接口(定义操作)] + │ + ┌────────────┴────────────┐ + ▼ ▼ + [LocalModelProviderImpl] [OpenAIProviderImpl] + (本地部署模型) (远程平台模型) +``` + +## 🧱 模块划分 + +### `core-service`(核心服务模块) + +- 定义统一的 AI 接口(API) +- 定义模型服务的 SPI(接口 + 工厂 + 可能的适配器) +- SPI 示例:`ModelProvider`、`ChatModelService`、`EmbeddingService` 等 +- 提供自动发现机制(如 Spring SPI 自动注入) + +### `local-model-impl`(本地模型实现模块) + +- 实现核心服务定义的 SPI +- 例如调用本地 llama.cpp、Transformers 或自己封装的模型服务 API + +### `openai-impl`(远程平台实现模块) + +- 通过 OpenAI、Azure OpenAI、通义千问等平台接口实现 SPI + +## 🧱 核心设计目标 + +| 功能 | 说明 | +| -------------- | ------------------------------------------------------------ | +| 单模型默认调用 | 默认只调用当前设定好的模型 | +| 指定模型调用 | 允许按名字、类型、模型id调用特定实现(需要有接口获取当前能使用的模型) | +| 多模型并行调用 | 调用所有或自定义多个模型实现(如 benchmark) | +| 策略调度 | 本地优先、平台优先、负载均衡、自定义权重等 | +| 插件式接入 | 支持新增模型实现模块无需修改主逻辑 | + +## 🎯 架构核心要素 + +### 1. `ModelProvider` SPI 接口 + +```kotlin +interface ModelProvider { + fun getName(): String // 模型名称 + fun getType(): String // 本地 远程 + fun getModelId(): String // 模型id 唯一 + fun getChatService(): ChatModelService // 对话服务 + fun getEmbeddingService(): EmbeddingService // 嵌入服务 + fun isAvailable(): Boolean // 是否可用 +} +``` + +### 2. `ModelProviderManager` 管理器 + +负责注册、发现、调度所有实现。 + +```kotlin +@Service +class ModelProviderManager( + providers: List +) { + private val providerMap = providers.filter { it.isAvailable() } + .associateBy { it.getModelId() } + + fun getProviderByModelId(modelId: String): ModelProvider? = providerMap[name] + + fun getByIds(modelIds: List): List = + ids.mapNotNull { idMap[it] } + + fun getProvidersByType(type: String): List = + providerMap.values.filter { it.getType() == type } + + fun getAll(): Collection = providerMap.values +} +``` + +### 3. `ModelFilterStrategy`(策略接口) + +允许通过策略实现来筛选出所需模型提供者 + +```kotlin +interface ModelFilterStrategy { + fun filter(providers: Collection): Collection +} +``` + +实现策略举例: + +```kotlin +@Component("localTop2") +class LocalTop2Strategy : ModelFilterStrategy { + override fun filter(providers: Collection): Collection { + return providers.filter { it.getType() == "local" }.take(2) + } +} +``` + +### 4. `ModelDispatcher` 分发器 + +```kotlin +@Service +class ModelDispatcher( + private val providerManager: ModelProviderManager, + private val strategies: Map +) { + + fun dispatchById(id: String): ModelProvider { + return providerManager.getById(id) + ?: throw IllegalArgumentException("Model not found: $id") + } + + fun dispatchByIds(ids: List): Collection { + return providerManager.getByIds(ids) + } + + fun dispatchByStrategy(strategy: String): Collection { + val strategyImpl = strategies[strategy] + ?: throw IllegalArgumentException("Unknown strategy: $strategy") + return strategyImpl.filter(providerManager.getAll()) + } + + fun dispatchAll(): Collection = providerManager.getAll() +} +``` + +💡 调用方式 + +| 使用方式 | 示例 | +| -------- | ----------------------------------------------------------- | +| 单模型 | `dispatcher.dispatchById("openai-gpt4")` | +| 多模型 | `dispatcher.dispatchByIds(["openai-gpt4", "local-llama3"])` | +| 策略模型 | `dispatcher.dispatchByStrategy("localTop2")` | +| 全部模型 | `dispatcher.dispatchAll()` | + +## 🧩 扩展方向 + +| 功能 | 建议 | +| ------------ | ------------------------------------------------------ | +| 模型标签 | 支持用标签分类筛选(如 `"tags": ["fast", "offline"]`) | +| 权重调度 | 给每个模型配置权重,实现加权随机策略 | +| 异步聚合调用 | 多模型调用支持并发执行后聚合 | +| 模型分组 | 通过配置将多个模型划入组(如 benchmark-group) | + +`api-core`(定义 SPI) + +`api-core-spring`(定义 Dispatcher、Manager、策略等) + +`impl-local`, `impl-openai`(示例实现) + +`starter-server`(Web 接口) + +## 🧱 单项目多模块结构设计 + +```perl +ai-core-platform/ +├── api-core/ # 💡 定义 SPI 接口(抽象接口层) +├── api-core-service/ # 💡 Dispatcher、Manager、策略实现(核心服务逻辑) +├── model-impl-openai/ # ✅ OpenAI 实现模块(实现 SPI) +├── model-impl-local/ # ✅ 本地模型实现模块 +├── model-impl-xxx/ # ✅ 其他模型实现模块 +├── sdk-client/ # 📦 封装 HTTP 客户端 SDK(可依赖 core-service) +├── ai-core-server/ # 🚪 Spring Boot 控制器层(暴露 HTTP 接口) +└── build.gradle.kts +``` + +## 🧱 微服务结构设计 + +### ✅ 核心目标 + +| 角色 | 职责 | +| -------------------------------------------- | ---------------------------------------------------- | +| 🎯 **核心服务(Core Service)** | 定义模型 SPI,负责模型选择策略、调度逻辑等 | +| ⚙️ **实现服务(Impl Service)** | 每个模型一个服务,实现核心服务 SPI 的调用接口 | +| 🧩 **门面服务(Gateway/Federation Service)** | 统一对外暴露接口,调用者只知道它,它向下调度和路由 | +| 📦 **调用端(SDK / 其他服务)** | 只调用门面服务,看不到内部实现细节 | +| 🚀 **横向扩展** | 核心服务和实现服务都可部署多个副本,服务注册自动发现 | + +### 🔁 系统调用流程示意图(简化版) + +```html + [前端/调用方] + ↓ + [🧩 门面服务 Gateway] + ↓ + ┌────────────────────────────┐ + │ Dispatcher │ + │ │ + │ 查找服务注册表 │ + └────────────────────────────┘ + ↓ ↓ +[Core Service A] [Core Service B] <- 可扩展集群 + ↓ ↓ + [Impl Service 1] [Impl Service 2] <- 每个模型一个服务(OpenAI、LLaMA等) + +``` + +#### 🧱 项目结构(服务拆分) + +```bash +ai-model-platform/ +├── model-api-core/ # SPI 接口定义(公共模块,所有服务依赖) +├── model-core-service/ # 核心服务(模型管理、策略、调度) +├── model-impl-openai-service/ # 实现服务(OpenAI GPT等) +├── model-impl-llama-service/ # 实现服务(本地模型) +├── model-gateway-service/ # 门面服务(统一入口,封装核心服务和路由) +├── model-sdk-client/ # HTTP SDK(封装对 gateway 的访问) +``` + +### 📌 各服务职责详解 + +#### `model-api-core`(接口层) + +- 定义 SPI 接口(如 `ModelProvider`、`ChatModelService`) +- 提供调用参数类、返回类(DTO) + +#### `model-core-service`(核心服务) + +- 维护模型注册信息(可注册远程实现) +- 定义策略组件(如:本地优先、负载均衡) +- 提供一个「统一调用的客户端」用于远程 HTTP 调用实现服务 + +#### `model-impl-*`(实现服务) + +- 每个服务注册为一个 Provider,提供模型实际调用能力 +- 实现 SPI 接口,通过 HTTP 接口暴露服务 + +#### `model-gateway-service`(门面服务) + +- 对外暴露统一 HTTP 接口 +- 请求转发至核心服务,核心服务根据策略调度到目标实现服务 +- 可添加身份鉴权、限流、缓存等网关能力 + +#### `model-sdk-client`(客户端) + +- 对接 `model-gateway-service` 的 SDK +- 提供统一调用封装(如 chat、embedding、tokenize) + +### 🎯 模型调用过程 + +1. 外部发起调用:POST `/api/chat` +2. 请求被 `model-gateway-service` 接收 +3. 门面服务通过核心服务获取候选模型(本地优先 / 多模型) +4. 核心服务选择合适实现服务,发起 HTTP 请求 +5. 实现服务完成调用,响应结果回传给前端 \ No newline at end of file