扫码
40.67M · 2026-04-17
GPT-6正式上线,Claude Opus 4.7跟着出来,DeepSeek V4这周也要发布了。
我在公司负责维护一套内部AI工具链,这两天基本没怎么睡——不是因为激动,是因为要做选型决策,然后顺手把接口层重写了一遍。
这篇记录一下踩过的坑,也给准备在这波模型潮里升级接入层的朋友留个参考。
GPT-6确实强,200万Token上下文、4.2小时自主执行任务,代码理解准确率97.3%,我测了一下确实不虚。
但有个问题:贵。
公司的AI任务分三类:
如果全走GPT-6,一个月账单估计要翻两到三倍。但全走便宜的,代码审查质量明显掉。
所以我决定搭一个自动路由层,根据任务类型选模型。
# 环境准备(推荐用虚拟环境)
python -m venv venv
source venv/bin/activate # Windows: venvScriptsactivate
pip install openai anthropic tiktoken pyyaml fastapi uvicorn
# API密钥配置(我这边统一走Ztopcloud.com的聚合接口,省得管三套账号)
export UNIFIED_API_KEY="your_ztopcloud_api_key"
export UNIFIED_BASE_URL="https://api.ztopcloud.com/v1"
# router.py
import os
import tiktoken
from openai import OpenAI
import anthropic
# 统一接口,通过base_url切换
client = OpenAI(
api_key=os.environ["UNIFIED_API_KEY"],
base_url=os.environ["UNIFIED_BASE_URL"]
)
# Claude走原生client但转发到聚合层
claude_client = anthropic.Anthropic(
api_key=os.environ["UNIFIED_API_KEY"],
base_url=os.environ.get("UNIFIED_BASE_URL", "https://api.anthropic.com")
)
def classify_task(prompt: str) -> str:
"""
简单规则分类,够用就行,别搞太复杂
"""
enc = tiktoken.encoding_for_model("gpt-4")
token_len = len(enc.encode(prompt))
# 长上下文或代码相关:GPT-6
if token_len > 30000:
return "gpt-6"
code_signals = ["代码", "函数", "class", "def ", "import", "bug", "review", "仓库"]
if any(s in prompt for s in code_signals):
return "gpt-6"
# 法律/医疗/金融深度推理:Claude
deep_signals = ["合同", "条款", "诊断", "法规", "合规", "风险评估", "判断是否"]
if any(s in prompt for s in deep_signals):
return "claude-opus-4-7"
# 默认:DeepSeek V4(最省钱)
return "deepseek-v4"
def call_model(prompt: str, system: str = "你是一个专业助手") -> dict:
model = classify_task(prompt)
if model == "gpt-6":
resp = client.chat.completions.create(
model="gpt-6",
messages=[
{"role": "system", "content": system},
{"role": "user", "content": prompt}
],
max_tokens=4096
)
return {"model": model, "content": resp.choices[0].message.content}
elif model == "claude-opus-4-7":
msg = claude_client.messages.create(
model="claude-opus-4-7-20260416",
max_tokens=8192,
system=system,
messages=[{"role": "user", "content": prompt}],
thinking={"type": "enabled", "budget_tokens": 8000}
)
# 取文字块(thinking块是独立的,见踩坑记录)
text = next(b.text for b in msg.content if b.type == "text")
return {"model": model, "content": text}
else:
# DeepSeek V4(API格式与OpenAI兼容)
resp = client.chat.completions.create(
model="deepseek-v4",
messages=[
{"role": "system", "content": system},
{"role": "user", "content": prompt}
],
max_tokens=4096
)
return {"model": model, "content": resp.choices[0].message.content}
# main.py
from fastapi import FastAPI
from pydantic import BaseModel
from router import call_model
app = FastAPI()
class ChatRequest(BaseModel):
prompt: str
system: str = "你是一个专业助手"
@app.post("/chat")
def chat(req: ChatRequest):
result = call_model(req.prompt, req.system)
return result
# uvicorn main:app --host 0.0.0.0 --port 8000 --reload
我以为 msg.content[0].text 就能拿到最终答案,结果第一个block是thinking类型,里面全是推理过程,拿出来直接返回给用户,对方一脸懵逼。
正确做法:
# 要遍历content列表,按type过滤
for block in msg.content:
if block.type == "thinking":
# 推理链,一般不直接展示给用户
print(f"[内部思考,共{len(block.thinking)}字]")
elif block.type == "text":
# 这才是最终答案
final_answer = block.text
找这个问题花了将近一小时,文档里写了但不够醒目。
处理一份30页合同时,我把 max_tokens 设了2048想省点钱,结果输出直接在句子中间断掉,没有任何总结性收尾。不是因为内容完了,是因为token用完了,模型直接停。
解决方式:长上下文任务至少设 max_tokens=8192,成本多不了太多,但输出完整性差异明显。
三款模型同期在场这事,对我来说其实是工作量增加了——选型复杂了,接入层要重写,文档要更新。但换个角度看,三家不同价位、不同强项的选择同时存在,比两年前只有一家可选的时代,其实更好。
路由层搭完之后,我们这边估算了一下,同等任务量下成本大概能降40%-60%,具体看任务分布。