Skip to content

AI模型部署方案

本文档是 系统设计主文档 的子文档,详细描述Ollama和云端LLM的模型部署方案。


五、AI模型部署方案

5.1 模型选型

5.1.1 LLM (大语言模型)

设备类型推荐模型参数量内存需求性能
高性能PCLLaMA3-70B70B64GB RAM + 显卡接近GPT-3.5
普通PCQwen2-7B7B16GB RAM日常使用足够
低配PCPhi-3-mini3.8B8GB RAM轻量但实用
旗舰手机MiniCPM-2B2.4B6GB RAM移动端最优
中端手机Gemma-2B2B4GB RAM速度快
云端APIGPT-4/Claude-无需本地资源最强性能

5.1.2 Embedding模型 (向量化)

模型维度大小语言支持用途
bge-large-zh-v1.510241.3GB中英文PC端,高精度
bge-base-zh-v1.5768400MB中英文平衡性能和精度
bge-small-zh-v1.551295MB中英文移动端,轻量
text-embedding-ada-0021536API多语言云端,最强效果

5.1.3 向量数据库

数据库类型优点缺点适用设备
ChromaDB嵌入式简单,自带持久化性能一般PC和移动端
Qdrant独立服务高性能,功能丰富需要单独部署PC (Docker)
Milvus分布式企业级,可扩展复杂,资源占用大服务器
FAISS超高性能无持久化,需自己封装高级用户

5.2 PC端部署方案

5.2.1 Docker Compose配置

yaml
version: "3.8"

services:
  # Ollama - LLM推理引擎
  ollama:
    image: ollama/ollama:latest
    container_name: chainlesschain-llm
    ports:
      - "11434:11434"
    volumes:
      - ./ollama_data:/root/.ollama
    environment:
      - OLLAMA_HOST=0.0.0.0
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu] # 如果有NVIDIA显卡

  # Qdrant - 向量数据库
  qdrant:
    image: qdrant/qdrant:latest
    container_name: chainlesschain-vectordb
    ports:
      - "6333:6333"
      - "6334:6334"
    volumes:
      - ./qdrant_data:/qdrant/storage

  # AnythingLLM - RAG问答系统
  anythingllm:
    image: mintplexlabs/anythingllm:latest
    container_name: chainlesschain-rag
    ports:
      - "3001:3001"
    volumes:
      - ./anythingllm_data:/app/server/storage
    environment:
      - LLM_PROVIDER=ollama
      - OLLAMA_BASE_URL=http://ollama:11434
      - VECTOR_DB=qdrant
      - QDRANT_ENDPOINT=http://qdrant:6333
      - EMBEDDING_ENGINE=native # 使用内置Embedding

  # Git服务器 (可选,自托管)
  gitea:
    image: gitea/gitea:latest
    container_name: chainlesschain-git
    ports:
      - "3000:3000"
      - "2222:22"
    volumes:
      - ./gitea_data:/data
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=sqlite3

一键启动脚本:

bash
#!/bin/bash
# setup_pc.sh

echo "正在启动Chainlesschain AI系统..."

# 1. 启动Docker容器
docker-compose up -d

# 2. 等待服务就绪
echo "等待服务启动..."
sleep 10

# 3. 下载LLM模型
echo "下载语言模型 (首次运行需要几分钟)..."
docker exec chainlesschain-llm ollama pull qwen2:7b

# 4. 下载Embedding模型
docker exec chainlesschain-llm ollama pull nomic-embed-text

# 5. 创建向量数据库集合
curl -X PUT 'http://localhost:6333/collections/knowledge_base' \
  -H 'Content-Type: application/json' \
  -d '{
    "vectors": {
      "size": 768,
      "distance": "Cosine"
    }
  }'

echo "✅ 系统启动完成!"
echo "LLM API: http://localhost:11434"
echo "向量数据库: http://localhost:6333"
echo "RAG问答: http://localhost:3001"

5.3 移动端部署方案

5.3.1 Android集成

kotlin
// 使用MLC LLM在Android上运行本地模型
class LocalLLM(context: Context) {
    private val mlcEngine = MLCEngine(context)

    fun initialize() {
        // 下载并加载MiniCPM-2B模型
        val modelPath = downloadModel("MiniCPM-2B-Q4")  // 量化到4bit
        mlcEngine.loadModel(modelPath)
    }

    suspend fun chat(prompt: String, history: List<Message>): String {
        return mlcEngine.generate(prompt, maxTokens = 512)
    }
}

// Embedding模型
class LocalEmbedding(context: Context) {
    private val tfLite = Interpreter(loadModelFile("bge-small-zh-v1.5.tflite"))

    fun embed(text: String): FloatArray {
        // 分词
        val tokens = tokenizer.encode(text)
        // 推理
        val embedding = FloatArray(512)
        tfLite.run(tokens, embedding)
        return embedding
    }
}

5.3.2 iOS集成

swift
// 使用Core ML运行本地模型
class LocalLLM {
    private var model: MLModel?

    func initialize() {
        // 加载编译好的.mlpackage模型
        let modelURL = Bundle.main.url(forResource: "MiniCPM-2B", withExtension: "mlpackage")!
        model = try? MLModel(contentsOf: modelURL)
    }

    func generate(prompt: String) async -> String {
        // 使用Core ML推理
        let input = MLDictionary(["input_text": prompt])
        let output = try? model?.prediction(from: input)
        return output?["generated_text"] as? String ?? ""
    }
}

5.4 混合部署策略

智能路由:

python
class AIRouter:
    def __init__(self):
        self.pc_llm_available = check_pc_api("http://192.168.1.100:11434")
        self.mobile_llm_available = check_mobile_model()
        self.cloud_api_key = get_api_key("openai")

    def route_request(self, prompt: str, context_length: int,
                      quality_required: str) -> str:
        """
        智能选择使用哪个模型
        """
        # 1. 长上下文 -> 云端API
        if context_length > 8000:
            return self.call_cloud_api(prompt)

        # 2. 高质量要求 + 在家 -> PC端模型
        if quality_required == "high" and self.pc_llm_available:
            return self.call_pc_llm(prompt)

        # 3. 快速响应 + 移动场景 -> 本地模型
        if quality_required == "fast" and self.mobile_llm_available:
            return self.call_mobile_llm(prompt)

        # 4. 默认 -> 云端API (如果有密钥)
        if self.cloud_api_key:
            return self.call_cloud_api(prompt)

        # 5. 降级到任何可用的模型
        if self.mobile_llm_available:
            return self.call_mobile_llm(prompt)

        return "抱歉,当前没有可用的AI模型"

实现状态 (v0.20.0)

LLM支持:

  • Ollama - 本地部署(qwen2:7b等)
  • 14+云端API - Anthropic, OpenAI, Dashscope, Zhipuai, Volcengine, Qianfan等

Embedding:

  • ChromaDB 3.1.8 - 向量数据库
  • @chroma-core/default-embed 0.1.9 - 嵌入模型

完成度: 100% ✅ (本地+云端混合部署)

ChainlessChain 系统设计文档 — 面向开发者