1. 中小团队私有化中文大模型选型:从显存账单到推理请求
很多团队第一次认真评估中文大语言模型,不是因为想追热点,而是因为一张账单。API 调用量涨到某个量级后,财务开始问「这个月为什么多了几千块」,同时业务方又提出数据不能出内网。这时候「开源 + 私有化部署」就成了绕不开的选项。但真正动手时你会发现,选型比部署更难:模型清单动辄上百个,参数从 1.8B 到 100B+,有的说单卡 3090 能跑,有的说必须 A800 集群,还有的训练成本写得含糊其辞。
这篇内容聚焦三条主线:规模(显存与并发)、部署门槛(能不能在一台机器上跑通)、训练成本(微调需要多少数据和卡时)。我会先给出一份可对照的中文开源模型清单,再给出私有化部署的配置片段,最后用 TaoToken 的统一 Key/API 通道把「本地推理」和「多模型调用」串起来,让你能快速比对并跑通第一个本地化推理请求。适合中小团队的技术负责人、算法工程师,以及需要在内网环境交付 AI 能力的后端同学。
需要先明确一个判断标准:不是参数越小越好,也不是越大越强。对中小团队来说,7B 到 14B 是甜点区,量化后单张 24G 显存卡能跑,微调用 LoRA 在单卡上几小时到一天能出结果。超过 34B 的模型,除非你有明确的复杂推理需求,否则推理成本和运维复杂度会陡增。下面这份清单就是按这个逻辑整理的。
1.1 小规模中文开源模型清单与显存对照
先看文本模型。ChatGLM 系列是中文对话场景里部署门槛最低的一档,ChatGLM3-6B 原生支持工具调用和代码执行,权重对学术研究开放,登记后可商用。它的显存占用在 FP16 下约 13G,INT4 量化后约 6G,一张 3090 或 4090 就能跑起来。Chinese-LLaMA-Alpaca 系列的优势是中文词表扩充和二次预训练,CPU 也能推理,适合没有 GPU 的边缘场景。Qwen 系列覆盖 1.8B 到 110B,其中 Qwen1.5-7B 和 14B 在中文通用任务上表现稳定,支持 8K 上下文,插件调用做了专门对齐。
Baichuan2 采用 2.6 万亿 Tokens 训练,7B 和 13B 都有 Base 和 Chat 版本,Chat 版提供 4bits 量化,13B 量化后约 10G 显存。InternLM2 有 7B 和 20B 两个规格,7B 适合轻量研究,20B 综合性能更强。Yi 系列开源了 6B 和 34B,最长支持 200K 上下文,能处理约 40 万汉字输入,适合长文档分析。XVERSE 系列提供 GGUF 和 GPTQ 量化版本,支持 llama.cpp 和 vLLM 在 MacOS/Linux/Windows 上推理,跨平台友好。
| 模型 | 参数规模 | FP16 显存参考 | INT4 显存参考 | 商用许可 | 适合场景 |
|---|---|---|---|---|---|
| ChatGLM3-6B | 6B | ~13G | ~6G | 登记后可商用 | 中文对话、工具调用 |
| Qwen1.5-7B | 7B | ~15G | ~7G | 允许商用 | 通用问答、插件调用 |
| Baichuan2-13B-Chat | 13B | ~26G | ~10G | 允许商用 | 中文理解、多轮对话 |
| InternLM2-7B | 7B | ~15G | ~7G | 允许商用 | 研究、轻量应用 |
| Yi-6B | 6B | ~13G | ~6G | 允许商用 | 长文本、文档理解 |
| XVERSE-13B | 13B | ~26G | ~10G | 允许商用 | 多语言、跨平台推理 |
多模态方向,VisualGLM-6B 基于 ChatGLM-6B,整体 78 亿参数,支持图像和中文对话。CogVLM-17B 有 100 亿视觉参数和 70 亿语言参数,在跨模态基准上表现突出。Qwen-VL 支持图像、文本、检测框输入,是首个开源的 448 分辨率 LVLM,细粒度文字识别更强。这些模型对显存要求更高,建议至少 24G 显存起步。
垂直领域微调模型也值得关注。医疗有 DoctorGLM、BenTsao、HuatuoGPT;法律有 LawGPT_zh、LaWGPT、LexiLaw;金融有 Cornucopia、XuanYuan、DISC-FinLLM;教育有 EduChat、桃李。这些模型大多基于 6B 到 13B 底座微调,部署门槛和底座一致,但领域效果提升明显。如果你的业务场景明确,直接选垂直模型能省掉大量微调工作。
1.2 训练成本与部署门槛的真实账
训练成本要拆成两块看:预训练和微调。预训练对中小团队基本不现实,动辄千卡集群和万亿 Tokens,不在讨论范围。真正可控的是微调。以 7B 模型为例,LoRA 微调在单张 3090 上,1 万条指令数据大约 3 到 5 小时,QLoRA 能进一步把显存压到 10G 以内。13B 模型 LoRA 微调需要 2 张 3090 或 1 张 A100,时间翻倍。34B 以上建议多卡,成本开始不划算。
部署门槛主要看推理框架。vLLM 吞吐量比 HuggingFace Transformers 高 14 到 24 倍,支持 Continuous batching 和 PagedAttention,适合大批量 Prompt 场景,但对 LoRA 适配器支持不友好。LMDeploy 支持有状态推理和对话缓存,4bit 量化模型推理性能达 FP16 的 2.4 倍以上。llama.cpp 适合 CPU 和边缘设备,GGUF 量化后 7B 模型在 16G 内存的笔记本上能跑。AirLLM 用分层推理技术,4GB 单卡能跑 70B 模型,代价是速度慢。
我的建议是:内网交付优先选 vLLM 或 LMDeploy,量化用 GPTQ 或 AWQ;边缘设备用 llama.cpp + GGUF;需要快速验证用 Ollama。训练框架选 LLaMA Efficient Tuning 或 ChatGLM Efficient Tuning,支持全参数、LoRA、QLoRA 和 RLHF,适配主流底座。
2. TaoToken 前置:统一 Key 与 API 通道的定位
私有化部署解决的是「数据不出内网」,但中小团队往往同时有内网和云端需求:内网跑敏感数据,云端调更强模型做复杂推理,或者用云端模型做蒸馏数据生成。如果每个模型都单独申请 Key、单独维护 SDK,工程成本会很高。TaoToken 在这里的角色是统一接入层,用一个 Key 和一套 OpenAI 兼容接口,把不同来源的模型调用收敛到同一个通道。
需要说清楚的是,TaoToken 不是替代本地部署,而是补充。本地模型负责数据敏感和高频调用,TaoToken 负责需要更强能力或快速切换模型的场景。它的 API 地址是 https://taotoken.net/api,兼容 OpenAI 的 /v1/chat/completions 格式,这意味着你现有的 LangChain、OpenAI SDK 代码几乎不用改,只换 Base URL 和 Key 就能跑。
对中小团队来说,这个统一通道的价值在三个地方。第一,多模型比对成本低。你可以在同一套代码里切换 Qwen、ChatGLM、Baichuan 等模型的云端版本,快速做效果对比,再决定哪个值得私有化。第二,Key 管理集中。一个 Key 管多个模型,不用在配置文件里塞一堆密钥。第三,接入文档和模型列表统一,新同学上手快。接入文档在 https://taotoken.net/doc,模型对话入口在 https://taotoken.net/chat。
如果你需要长期跑编码任务或 Agent,可以看 Coding Plan:https://taotoken.net/coding-plan。如果只是验证模型效果,直接用模型对话页面最省事。API Key 在 https://taotoken.net/api-keys 申请,控制台在 https://taotoken.net/console。Claude Code 相关接入参考 https://taotoken.net/ClaudeCodeAnthropic。
2.1 为什么私有化部署还需要统一 API 层
很多团队的做法是:本地部署一个 7B 模型,所有请求都走它。跑一段时间后发现两个问题。一是复杂任务效果不够,比如长文档摘要、多步推理,7B 模型容易漏信息。二是并发上来后,单卡推理排队严重,响应时间从 2 秒涨到 20 秒。这时候如果临时加一张卡,成本不低;如果切云端,又要改代码。
统一 API 层的思路是:本地模型处理高频、简单、敏感请求,云端模型处理低频、复杂、非敏感请求。路由逻辑可以写在业务代码里,也可以用一个简单的网关做分流。TaoToken 的 OpenAI 兼容接口让这个分流变得简单,因为本地 vLLM 也提供 OpenAI 兼容接口,两者格式一致,切换只改 Base URL。
具体做法是:在配置里定义两个 client,一个指向本地 http://localhost:8000/v1,一个指向 https://taotoken.net/api/v1。业务代码根据请求类型选择 client。这样既保住了数据安全,又拿到了云端模型的强能力。实测下来,这种混合架构比纯本地或纯云端都更稳。
2.2 接入前的环境准备
你需要准备三样东西:一个可用的 Python 环境(3.9 以上)、一个 TaoToken API Key、一个本地推理服务(可选,用于混合架构)。Python 依赖主要是 openai 和 requests,如果要做本地推理,再加 vllm 或 transformers。
python -m venv venv source venv/bin/activate pip install openai requests如果你要跑本地 vLLM,安装命令是:
pip install vllm注意 vLLM 对 CUDA 版本有要求,建议 CUDA 12.1 以上。如果显存不够,先用量化版本,比如 GPTQ 或 AWQ 权重。TaoToken 的 Key 在控制台申请后,建议放到环境变量里,不要硬编码到代码。
export TAOTOKEN_API_KEY="你的Key" export TAOTOKEN_BASE_URL="https://taotoken.net/api/v1"本地推理服务的 Base URL 通常是 http://localhost:8000/v1,Key 可以随便填一个非空字符串,因为本地服务一般不校验。
3. 可复制配置:settings.json 与 vLLM 启动片段
这一节给可直接复制的配置。先看 TaoToken 的客户端配置,用 JSON 格式,路径建议放在项目根目录的 config/taotoken.json。这个文件里包含 Base URL、Key 环境变量名和默认模型 ID。注意 Key 不要写死在文件里,用环境变量引用。
{ "base_url": "https://taotoken.net/api/v1", "api_key_env": "TAOTOKEN_API_KEY", "default_model": "qwen1.5-7b-chat", "timeout": 60, "max_retries": 3 }如果你用 Cline 或 CC Switch 这类工具,配置格式类似。Cline 的 MCP 配置里需要填 Base URL、API Key 和 Model ID 三件套。CC Switch 的 settings.json 也是同样结构。Codex 的 auth.json 里填 API Key,Base URL 在配置文件里指定。三件套缺一不可,少一个就会报 401 或 model not found。
{ "provider": "openai-compatible", "base_url": "https://taotoken.net/api/v1", "api_key": "${TAOTOKEN_API_KEY}", "model": "qwen1.5-7b-chat" }本地 vLLM 启动片段,以 Qwen1.5-7B-Chat 为例。假设模型权重已经下载到 /models/Qwen1.5-7B-Chat,启动命令如下。参数里 --dtype auto 让 vLLM 自动选精度,--max-model-len 设 8192 匹配模型上下文,--gpu-memory-utilization 0.9 控制显存占用。
python -m vllm.entrypoints.openai.api_server \ --model /models/Qwen1.5-7B-Chat \ --served-model-name qwen1.5-7b-chat \ --dtype auto \ --max-model-len 8192 \ --gpu-memory-utilization 0.9 \ --port 8000启动后,本地服务提供 OpenAI 兼容接口,地址是 http://localhost:8000/v1。你可以用 curl 测试:
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen1.5-7b-chat", "messages": [{"role": "user", "content": "你好"}] }'如果显存不够,换量化权重。GPTQ 权重的启动命令加 --quantization gptq:
python -m vllm.entrypoints.openai.api_server \ --model /models/Qwen1.5-7B-Chat-GPTQ \ --served-model-name qwen1.5-7b-chat \ --quantization gptq \ --max-model-len 8192 \ --port 80003.1 混合路由的 Python 配置
下面这段代码定义两个 client,根据请求类型路由。本地 client 指向 vLLM,云端 client 指向 TaoToken。路由规则可以按关键词、按请求长度、按任务类型。这里用请求长度做示例,超过 2000 字符走云端,否则走本地。
import os from openai import OpenAI local_client = OpenAI( base_url="http://localhost:8000/v1", api_key="local-no-key" ) cloud_client = OpenAI( base_url="https://taotoken.net/api/v1", api_key=os.environ["TAOTOKEN_API_KEY"] ) def route_chat(messages, model_local="qwen1.5-7b-chat", model_cloud="qwen1.5-7b-chat"): total_len = sum(len(m["content"]) for m in messages) if total_len > 2000: return cloud_client.chat.completions.create( model=model_cloud, messages=messages ) return local_client.chat.completions.create( model=model_local, messages=messages )这段代码的关键是本地和云端的接口格式完全一致,所以路由逻辑可以很薄。你不需要为每个模型写适配层,OpenAI 兼容格式已经统一了。
3.2 模型 ID 对照与选择
TaoToken 的模型 ID 和本地 vLLM 的 served-model-name 可以保持一致,这样路由时不用改 model 参数。比如本地启动时用 --served-model-name qwen1.5-7b-chat,云端也用同名 ID,代码里传同一个字符串即可。如果云端模型 ID 不同,在路由函数里做映射。
| 场景 | 本地模型 ID | 云端模型 ID | 路由策略 |
|---|---|---|---|
| 短问答 | qwen1.5-7b-chat | qwen1.5-7b-chat | 本地优先 |
| 长文档 | qwen1.5-7b-chat | qwen1.5-14b-chat | 长度 > 2000 走云端 |
| 代码生成 | deepseek-coder-6.7b | deepseek-coder-6.7b | 本地优先 |
| 复杂推理 | qwen1.5-7b-chat | qwen1.5-14b-chat | 关键词触发云端 |
模型 ID 的具体可用列表在接入文档里查,不同时间可能有更新。建议在代码里把模型 ID 做成配置项,不要写死。
4. 验证请求:从 curl 到 Python 的成功结果
配置写完后,先验证 TaoToken 通道。用 curl 发一个最简单的请求,确认 Key 和 Base URL 正确。注意 URL 是 https://taotoken.net/api/v1/chat/completions,不要漏掉 /v1。
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen1.5-7b-chat", "messages": [{"role": "user", "content": "用一句话解释什么是大语言模型"}], "temperature": 0.7 }'成功的话,返回 JSON 里会有 choices 数组,第一个元素的 message.content 就是模型回复。如果返回 401,检查 Key 是否正确、是否带了 Bearer 前缀。如果返回 model not found,检查模型 ID 是否在可用列表里。
Python 版本:
import os from openai import OpenAI client = OpenAI( base_url="https://taotoken.net/api/v1", api_key=os.environ["TAOTOKEN_API_KEY"] ) resp = client.chat.completions.create( model="qwen1.5-7b-chat", messages=[{"role": "user", "content": "用一句话解释什么是大语言模型"}], temperature=0.7 ) print(resp.choices[0].message.content)预期输出类似:「大语言模型是一种基于海量文本训练的人工智能模型,能够理解和生成自然语言,完成问答、翻译、写作等任务。」具体措辞因模型而异,但结构一致。
4.1 本地推理验证
本地 vLLM 启动后,用同样的 Python 代码,只改 base_url 和 api_key:
local_client = OpenAI( base_url="http://localhost:8000/v1", api_key="local-no-key" ) resp = local_client.chat.completions.create( model="qwen1.5-7b-chat", messages=[{"role": "user", "content": "你好,请自我介绍"}] ) print(resp.choices[0].message.content)如果本地服务正常,你会看到模型回复。第一次请求可能较慢,因为要加载权重和编译 CUDA kernel。后续请求会快很多。实测 7B 模型在 3090 上,首 token 延迟约 200 到 500 毫秒,生成速度约 30 到 50 token/秒。
4.2 混合路由验证
用第 3 节的 route_chat 函数,分别发短请求和长请求,观察走的是本地还是云端。可以在函数里加日志:
def route_chat(messages, model_local="qwen1.5-7b-chat", model_cloud="qwen1.5-7b-chat"): total_len = sum(len(m["content"]) for m in messages) if total_len > 2000: print("路由到云端") return cloud_client.chat.completions.create( model=model_cloud, messages=messages ) print("路由到本地") return local_client.chat.completions.create( model=model_local, messages=messages )短请求打印「路由到本地」,长请求打印「路由到云端」。如果云端请求失败,检查网络和 Key;如果本地请求失败,检查 vLLM 是否还在运行。
5. 本篇常见错排查:401、local proxy failed 与 reading choices
接入过程中最容易碰到四类报错。第一类是 401 Unauthorized,通常是 Key 问题。检查环境变量是否生效,用 echo $TAOTOKEN_API_KEY 确认。如果 Key 正确但仍报 401,检查请求头格式,必须是 Authorization: Bearer ,Bearer 后面有空格。另外注意 Key 是否过期或被禁用。
第二类是 local proxy failed。这个报错通常出现在本地推理服务没启动或端口不对。检查 vLLM 进程是否在运行,用 ps aux | grep vllm 查看。检查端口是否被占用,用 lsof -i:8000。如果本地服务正常,检查 base_url 是否写成了 https 而不是 http,本地服务一般是 http://localhost:8000/v1。
第三类是 reading choices 相关报错,比如 KeyError: 'choices' 或 TypeError: 'NoneType' object is not subscriptable。这通常是响应格式不符合预期。可能原因有三个:请求 URL 少了 /v1,导致返回的是 HTML 错误页;模型 ID 写错,返回错误 JSON;网络中断导致响应为空。排查方法是先打印原始响应,看返回的到底是什么。
import requests resp = requests.post( "https://taotoken.net/api/v1/chat/completions", headers={"Authorization": f"Bearer {os.environ['TAOTOKEN_API_KEY']}"}, json={"model": "qwen1.5-7b-chat", "messages": [{"role": "user", "content": "test"}]} ) print(resp.status_code) print(resp.text[:500])第四类是 OAuth 相关报错,比如 invalid_grant 或 token expired。这类报错一般出现在用 OAuth 方式接入的场景。检查 token 是否过期,重新生成。如果用的是 API Key 方式,一般不会碰到 OAuth 报错。CC Switch 或 Cline MCP 配置时,确认 Base URL、Key、Model ID 三件套都填了,少一个就会报错。
| 报错 | 可能原因 | 排查方法 |
|---|---|---|
| 401 Unauthorized | Key 错误或缺失 | 检查环境变量和请求头 |
| local proxy failed | 本地服务未启动或端口错 | 检查 vLLM 进程和端口 |
| reading choices | URL 少 /v1 或模型 ID 错 | 打印原始响应 |
| OAuth invalid_grant | Token 过期 | 重新生成 token |
| model not found | 模型 ID 不在列表 | 查接入文档确认 ID |
还有一个容易忽略的问题:超时。默认超时可能太短,长文本请求会超时。在 OpenAI client 里设置 timeout 参数,比如 timeout=60。如果请求特别长,设到 120 或更高。
5.1 显存不足与 OOM 排查
本地推理最常见的错误是 CUDA out of memory。7B 模型 FP16 需要约 15G 显存,如果卡是 16G,加上 KV cache 和中间激活,很容易 OOM。解决办法有三个:用量化权重,GPTQ 或 AWQ 能把显存降到 7G 左右;减小 --max-model-len,从 8192 降到 4096;降低 --gpu-memory-utilization,从 0.9 降到 0.8。
如果还是 OOM,检查是否有其他进程占用显存。用 nvidia-smi 查看。如果有残留进程,kill 掉再启动。另外注意 vLLM 默认会预分配显存,启动时就会占满,这是正常行为,不是泄漏。
5.2 模型加载慢与首次请求慢
首次加载模型可能需要几分钟,取决于磁盘速度和模型大小。7B 模型从 SSD 加载约 30 秒到 1 分钟。首次请求慢是因为要编译 CUDA kernel 和初始化 KV cache,后续请求会快。如果每次请求都慢,检查是否每次都在重新加载模型,这通常是服务配置问题。
6. 语义一致 CTA:从验证到长期编码
跑通第一个请求后,下一步是根据业务需求选择长期方案。如果只是验证模型效果、做多模型对比,用模型对话页面最直接:https://taotoken.net/chat。它不需要写代码,选模型、输问题就能看结果,适合快速判断哪个模型适合你的场景。
如果需要把模型接入到现有系统,用 API Key 和接入文档。API Key 在 https://taotoken.net/api-keys 申请,接入文档在 https://taotoken.net/doc。文档里有各语言的示例代码和模型列表,照着改 Base URL 和 Key 就能跑。控制台在 https://taotoken.net/console,可以看调用量和余额。
如果团队要长期跑编码任务或 Agent,看 Coding Plan:https://taotoken.net/coding-plan。它针对高频编码场景做了优化,适合把模型嵌入到 IDE 或 CI 流程里。Claude Code 相关接入参考 https://taotoken.net/ClaudeCodeAnthropic,里面有完整的配置步骤。
最后给一个实用建议:私有化部署和统一 API 层不是二选一,而是配合使用。本地模型保底,云端模型补强,路由逻辑写在业务层。这样既控制了成本,又保证了效果。选型时先用小模型验证流程,跑通后再换大模型或加微调。不要一上来就追求最强模型,先把链路跑通,再逐步优化。