
使用Scala Play框架構建REST API
本文用一杯咖啡的時間,帶你走完 選型 → 拉模型 → 跑服務 → 接入 IDE 的全流程,并給出 三套可直接復制的 Docker-Compose/Terraform 模板。
讀完你能:
場景 | 免費額度 | 付費高峰 | 企業專線 |
---|---|---|---|
并發 RPM | 20 | 1 000 | 5 000 |
每日 Tokens | 50 k | 1 M | 無限制 |
月費用 | \$0 | \$20 | \$3 k |
官方說辭:保障穩定性
圈內真相:GPU 供不應求,Anthropic 把資源優先傾斜給 Tier-3 企業客戶。
于是,本地部署 成了唯一“無限續杯”的方案。
模型 | 參數量 | 上下文 | HumanEval | 顯存需求 | 許可證 |
---|---|---|---|---|---|
Qwen3-Coder-32B | 32 B MoE | 256 K | 90.2 % | 24 GB | Apache 2.0 |
DeepSeek-R1-Distill-7B | 7 B | 32 K | 82.1 % | 6 GB | MIT |
Llama-4-Code-70B | 70 B | 128 K | 88.7 % | 48 GB | Llama-3.2 |
Codestral-22B | 22 B | 32 K | 86.5 % | 16 GB | Mistral AI |
StarCoder2-15B | 15 B | 16 K | 78.4 % | 12 GB | BigCode-OpenRAIL |
單卡 4090 24 GB 的極限是 Qwen3-Coder-32B 4-bit 量化,推理速度 92 tokens/s,足以頂替 Claude 3.5 Sonnet。
# docker-compose.yml
services:
ds7b:
image: vllm/vllm-openai:v0.5.3
ports:
- "8001:8000"
volumes:
- ./models/deepseek-r1-7b:/model
command: >
--model /model
--max-model-len 32768
--quantization awq
拉起后訪問 http://localhost:8001/v1/completions
即可。
services:
qwen32b:
image: vllm/vllm-openai:v0.5.3
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=0
ports:
- "8002:8000"
volumes:
- ./models/qwen3-coder-32b:/model
command: >
--model /model
--max-model-len 256000
--tensor-parallel-size 1
--gpu-memory-utilization 0.95
Terraform 一鍵拉起 AWS EC2 p4d.24xlarge:
resource "aws_instance" "llama4" {
ami = "ami-0e8c8e7f123456789"
instance_type = "p4d.24xlarge"
key_name = "gpu-key"
user_data = base64encode(templatefile("${path.module}/user_data.sh", {}))
}
user_data.sh
內自動安裝 vLLM 并加載 Llama-4-Code-70B。
litellm.yaml
model_list:
- model_name: claude-3-5-sonnet-20241022
litellm_params:
model: openai/qwen3-coder-32b
api_base: http://qwen32b:8000/v1
- model_name: claude-3-5-haiku-20241022
litellm_params:
model: openai/deepseek-r1-7b
api_base: http://ds7b:8000/v1
general_settings:
master_key: sk-123456
啟動:
docker run -d -p 4000:4000 \
-v $(pwd)/litellm.yaml:/app/config.yaml \
ghcr.io/berriai/litellm:main \
--config /app/config.yaml
然后把 IDE 的 Base URL 改成 http://localhost:4000
,Token 填 sk-123456
,Cursor 立刻復活。
# 讓官方 CLI 走代理
export ANTHROPIC_BASE_URL="http://localhost:4000"
export ANTHROPIC_AUTH_TOKEN="sk-123456"
claude -p "解釋這個倉庫"
實測首 token 延遲 380 ms,比官方 620 ms 還快 。
CCR(Claude Code Router)把“模型”當成 CDN 節點,根據 價格、延遲、質量 自動調度。
配置片段:
routes:
- name: cheap
models: [deepseek-r1-7b]
weight: 70
- name: quality
models: [qwen3-coder-32b]
weight: 30
- name: fallback
models: [claude-3-5-sonnet-official]
weight: 0
retry: true
命令行一鍵切換:
ccr route cheap # 日常開發
ccr route quality # Code Review
ccr route fallback # 緊急上線
模型 | 首 token | 吞吐 t/s | 單 GPU 顯存 | HumanEval |
---|---|---|---|---|
Claude 官方 | 620 ms | 120 | — | 87.1 % |
Qwen3-Coder-32B 4-bit | 380 ms | 92 | 22 GB | 90.2 % |
DeepSeek-R1-7B AWQ | 220 ms | 140 | 6 GB | 82.1 % |
一句話:本地 7B 量化模型在簡單補全場景已不輸 Claude 3.5 Sonnet。
方案 | 一次性硬件 | 月電費 | 三年總成本 | 等效官方費用 |
---|---|---|---|---|
RTX 4090 + Qwen3-32B | \$1 600 | \$30 | \$2 680 | \$3 600 |
8×A100 Llama-70B | \$120 000 | \$800 | \$148 800 | \$180 000 |
結論:個人/小團隊 4090 方案 18 個月回本;中大型企業 8×A100 14 個月回本。
癥狀 | 原因 | 一鍵修復 |
---|---|---|
顯存 OOM | 未量化 | --quantization gptq |
中文亂碼 | 模板不對 | 升級到最新 chat-template |
IDE 報 404 | 路由未生效 | curl http://localhost:4000/health |
當同事還在 Slack 上哀嚎 “Claude 又 429 了”,你已經把 qwen32b:8002
指給 Cursor,續寫傳奇。
記住:硬件是門票,開源是武器,自動化是魔法。
把這篇文章保存成書簽,下一次 Anthropic 抽風,你只需敲一行:
docker compose up -d