post cover

技术热点落地:Ollama + LiteLLM 混合路由实现本地与云端 LLM 统一调用(2026-05-24)


适用场景与目标

谁需要这个架构:

  • 成本敏感团队:每天大量 API 调用被云端 LLM 消耗大量预算,希望用本地模型承接简单任务。
  • 隐私敏感场景:用户数据不能上云,但又有复杂任务需要 Claude/GPT-4 级别能力。
  • 混合推理需求:既有低延迟简单问答,也有需要强推理的复杂任务,需要动态路由。
  • 开发效率优先:不想维护多套 SDK,希望用统一接口调用本地+云端模型。

核心目标: 部署一套「本地 Ollama 模型」+「云端 Claude」的统一网关,按任务复杂度、数据敏感度自动路由,降低 60%+ 云端 API 成本,同时保证复杂任务质量。

最小可行方案(MVP)

架构概览

客户端 → LiteLLM(统一网关) → Ollama(本地模型)
                          ↘ Anthropic Claude(云端)

Step 1:安装 Ollama

# macOS / Linux 一键安装
curl -fsSL https://ollama.com/install.sh | sh

# 拉取模型(推荐 7B 级,性价比最高)
ollama pull llama3.2:3b          # 简单问答、分类、摘要
ollama pull qwen2.5:7b          # 中文场景首选

# 验证运行
ollama run llama3.2:3b "你好,介绍一下自己"

Windows: 直接下载 ollama-windows-amd64.exe,双击运行。

Step 2:安装 LiteLLM

# 推荐用 venv 隔离
python3 -m venv litellm-env
source litellm-env/bin/activate  # Windows: litellm-env\Scripts\activate

pip install litellm[proxy]

Step 3:配置 LiteLLM 路由规则

创建 config.yaml

model_list:
  - model_name: llama-local
    litellm_params:
      model: ollama/llama3.2:3b
      api_base: http://localhost:11434
      suppress_debug_warning: true

  - model_name: qwen-local
    litellm_params:
      model: ollama/qwen2.5:7b
      api_base: http://localhost:11434

  - model_name: claude-cloud
    litellm_params:
      model: anthropic/claude-sonnet-4-20250514
      api_key: os.environ/ANTHROPIC_API_KEY

router_settings:
  redis_host: localhost
  redis_port: 6379
  priority: random  # 可选:least-cost(按成本优先)

Step 4:启动 LiteLLM 代理网关

litellm --config config.yaml --port 4000

Step 5:写一个智能路由客户端

import litellm
import os

# 设置 API Key
os.environ["ANTHROPIC_API_KEY"] = "sk-ant-xxxx"

def route_task(prompt: str, require_high_quality: bool = False, is_sensitive: bool = False):
    """
    路由策略:
    - 敏感数据 → 本地模型
    - 高质量需求 + 非敏感 → Claude 云端
    - 其他 → 本地模型(最低成本)
    """
    if is_sensitive:
        return litellm.completion(
            model="ollama/qwen-local",
            messages=[{"role": "user", "content": prompt}]
        )
    
    if require_high_quality and not is_sensitive:
        return litellm.completion(
            model="anthropic/claude-sonnet-4-20250514",
            messages=[{"role": "user", "content": prompt}]
        )
    
    # 默认本地模型,成本最低
    return litellm.completion(
        model="ollama/llama-local",
        messages=[{"role": "user", "content": prompt}]
    )

# 使用示例
result = route_task("帮我写一段 Python 快速排序", require_high_quality=True)
print(result["choices"][0]["message"]["content"])

关键实现细节

1. Ollama 模型选择建议(2026)

模型参数量适用场景内存要求
llama3.2:3b3B分类、摘要、简单问答~2GB
qwen2.5:7b7B中文对话、通用推理~6GB
phi-4-mini3.8B代码、指令遵循~4GB
mistral-nemo12B高质量通用(需 Mac M2+)~12GB

内存不够?ollama ps 查看当前加载的模型,不用的模型用 ollama stop <model> 卸载。

2. LiteLLM 的 cost routing 自动节省成本

Litellm 内置 least-cost 路由策略,可以自动选择最便宜的模型:

# 启用自动 cost 路由
response = litellm.acompletion(
    model="gpt-4o, claude-sonnet-4, llama-local",
    messages=[{"role": "user", "content": "解释什么是闭包"}],
    routing_strategy="least-cost"
)

LiteLLM 会按配置的模型成本自动选最便宜的,本地模型成本几乎为零。

3. 同模型双写(写入本地 + 云端)

import asyncio

async def dual_write(prompt: str):
    tasks = [
        litellm.acompletion(model="ollama/qwen-local", messages=[{"role": "user", "content": prompt}]),
        litellm.acompletion(model="anthropic/claude-sonnet-4-20250514", messages=[{"role": "user", "content": prompt}])
    ]
    results = await asyncio.gather(*tasks, return_exceptions=True)
    
    # 成功的结果
    for r in results:
        if not isinstance(r, Exception):
            return r

常见坑与规避清单

坑 1:Ollama 模型下载极慢

原因: 默认从 registry.chain位置.com 下载,CDN 覆盖差。

解决:

# 换国内镜像(如果有),或者用 modelscope 加速
# 或者先手动下载 GGUF 文件,然后用 ollama create 导入
ollama create qwen2.5 -f /path/to/model.gguf

坑 2:Ollama 内存不足(OOM)

原因: 同时加载多个大模型。

解决:OLLAMA_NUM_PARALLEL=1 限制并发数,只保留一个模型在内存。

export OLLAMA_NUM_PARALLEL=1
export OLLAMA_KEEP_ALIVE=5m  # 5分钟无请求自动卸载模型
ollama serve

坑 3:LiteLLM 路由到 Ollama 超时

原因: Ollama 处理速度慢,LiteLLM 默认超时 60s。

解决:

response = litellm.completion(
    model="ollama/llama-local",
    messages=[...],
    timeout=180  # 增加到 180 秒
)

坑 4:Claude 云端 API 费用暴涨

原因: 所有请求无脑走 Claude。

解决: 加严路由规则,简单的分类/抽取任务全部强制走本地:

def classify(prompt: str):
    # 分类任务 100% 本地,节省 API 费用
    return litellm.completion(model="ollama/llama-local", messages=[{"role": "user", "content": prompt}])

坑 5:本地模型输出质量差

原因: 3B 模型对复杂推理确实不够用。

解决: 复杂任务设置 require_high_quality=True 走云端;或者换 7B 以上模型。

成本/性能/维护权衡

维度纯云端Ollama 本地混合路由(本方案)
API 成本$0.01-0.1/千token~$0降低 60-80%
推理延迟1-3s0.2-1s(本地)根据路由波动
部署复杂度
数据隐私差(上传云)(全本地)(敏感数据本地)
复杂推理质量最高中等(7B+ 可接受)按需使用 Claude

维护成本: Ollama 更新模型只需 ollama pull;LiteLLM 升级 pip install litellm -U。整体维护难度低于自建模型服务。

一周内可执行行动清单

  1. Day 1-2: 在个人机器上安装 Ollama,拉取 llama3.2:3bqwen2.5:7b,跑通第一个本地对话。
  2. Day 3: 安装 LiteLLM,配置本地模型为 provider,理解 completion() 调用接口。
  3. Day 4: 配置 Claude 云端 key,打通双路路由,跑通同一个 prompt 在本地和云端同时返回。
  4. Day 5: 实现智能路由函数,按敏感度/复杂度自动选择模型,统计成本节省。
  5. Day 6: 添加 Redis(可选)启用 least-cost 策略,性能要求高的场景加并发控制。
  6. Day 7: 整理这套架构到团队 wiki,准备下周一推广到项目原型。

总结: Ollama 让本地 LLM 部署从「极客玩具」变成「工程选项」,LiteLLM 把本地+云端封装成统一接口,配上智能路由规则,就成了一套成本可控、隐私安全、质量有保障的 AI 工程架构。2026 年这个组合已经是中小团队 AI 工程化的标配路径,值得一周内动手验证。