打算私有部署 Mistral 之前,先回答一个更小的问题:它在你自己的中文任务上,输出到底能不能用。开源可商用只说明许可层面能走,不说明效果能接上你的线上要求。比较省事的做法是从线上日志里抽十条真实样本,写一段最小脚本跑一遍,人工判一遍,再拿结果和现在用的方案做同题对照。十条样本说明不了全部问题,但足以让你决定“继续验证”还是“先不折腾”。
适用场景:正在评估 Mistral 系列承接中文线上任务、并把私有部署列入选项的团队。操作动作:从线上日志抽十条有代表性的中文样本,脱敏后用最小脚本跑一遍,人工打三档标记,再与现有方案同题对照。验证方式:若三条以上落入不可用档,就先不推进私有部署,改为继续用接口或做局部替换。风险边界:十条样本只能给方向,不能替代灰度;是否部署还要结合数据出域要求、长期成本口径和模型卡上的许可证条款确认。
从线上日志里挑十条有代表性的中文样本
样本自己编的没有意义,要从最近一段时间的线上请求里抽,这样输入分布才贴近真实用户。抽的时候按三个维度拉开梯度,避免十条全是同一类短句。
- 长度:短问一句、中等段落、长文改写或长文档摘要各占几条,长文那类往往最容易暴露问题。
- 领域:按你业务里占比最高的两三个场景挑,比如客服问答、合同条款解释、技术文档改写,不要只挑自己熟悉的那个。
- 专有名词:至少两条包含产品名、内部缩写、人名地名或型号,中文任务上模型对专有名词的保留情况,比整体流畅度更值得先看。
脱敏在抽样之后立刻做,别拖到试跑前。手机号、身份证号、订单号、邮箱、真实姓名统一替换成占位符,例如把订单号换成 ORDER_001,保留原有长度和格式,因为长度本身会影响模型表现。替换建议用脚本批量做一遍,再人工复核一遍,确认没有漏网的真实信息。处理完把十条样本存成一份带编号的清单,后续打分和对照都按同一个编号走。
写一段最小调用脚本把十条样本跑一遍
脚本的目的只是拿到第一手输出,不要在这阶段做工程化。接口地址、密钥都从环境变量读,不写死在代码里,这样换服务不用改脚本,也不至于把地址提交进仓库。
import os, json, time, requests
ENDPOINT = os.environ["LLM_BASE_URL"] # 兼容接口的地址,自行替换
API_KEY = os.environ["LLM_API_KEY"]
MODEL = os.environ.get("LLM_MODEL", "your-model-name")
samples = [json.loads(l) for l in open("samples.jsonl", encoding="utf-8")]
results = []
for s in samples:
payload = {
"model": MODEL,
"messages": [
{"role": "system", "content": "你是中文助理,直接回答问题,不要输出多余解释。"},
{"role": "user", "content": s["text"]},
],
"temperature": 0.2,
"max_tokens": 1024,
"stream": False,
}
t0 = time.time()
r = requests.post(ENDPOINT + "/chat/completions",
headers={"Authorization": "Bearer " + API_KEY},
json=payload, timeout=120)
dt = round(time.time() - t0, 2)
data = r.json()
results.append({
"id": s["id"],
"input": s["text"],
"output": data["choices"][0]["message"]["content"],
"elapsed_s": dt,
"usage": data.get("usage"),
"raw_status": r.status_code,
})
json.dump(results, open("run1.json", "w", encoding="utf-8"),
ensure_ascii=False, indent=2)需要记录的参数项:模型名和版本标识、是否量化、temperature、max_tokens、system 提示词原文、是否流式。这五项之后复现结果要用到,缺一项都会让复跑对不上。原始输出按次保存成 JSON,把完整响应体和状态码都留下,不要只留截取后的文本,出错时能回看是超时、限流还是内容为空。
按人工可接受度给输出打三档标记
看输出时不要只判断“好不好”,要判断“能不能进你的流程”。统一成三档,不同人打出来的结果才有可比性。
- 可用:事实没有明显错误,格式符合你的下游要求,最多改几个词就能用。
- 需要配合:内容方向对,但格式不稳定、专有名词被改写、或偶有措辞偏差,必须加后处理或人工兜底才能上线。
- 不可用:答非所问、编造事实、中英混杂严重、关键信息丢失,靠提示词调整也难稳定。
| 样本编号 | 档位 | 主要问题 | 是否可修 |
|---|---|---|---|
| 001 | 可用 | — | — |
| 002 | 需要配合 | 格式不固定 | 加输出约束 |
| 003 | 不可用 | 专有名词被替换 | 暂无法稳定修 |
有争议的样本按固定规则处理:两个人独立打档,档位不一致的标记出来,隔天各看一次;仍然不一致的按较低档计入。这条规则看着麻烦,但能避免把“勉强能用”算成“可用”,最后拿去支撑部署决策。
把结果和现有方案做同题对照
对照组就用你现在线上在用的方案,同一条 prompt 模板、同一组参数、同一批十条样本跑一遍,输出也按上面的三档打一遍。只跑新模型不和现有方案比,看不出迁移值不值。
对照维度建议固定这六项:答案正确性、格式稳定程度、中文表达自然度、专有名词保留情况、单次响应耗时的量级、以及按你实际计费口径折算的单位调用成本。成本只做量级比较,不要在十条样本上算精细数字。
结论按三种写法收口:可直接替代,指大部分样本档位不低于现有方案且没有新的失败类型;需要配合,指效果接近但必须加后处理、提示词约束或人工兜底;不划算,指不可用档明显更多,或中文长文、专有名词这两类反复出问题。写成一句话带样本编号,比如“003、007 两类专有名词场景不可用”,比笼统说“中文效果一般”更能在后续决策里被引用。
根据结果决定要不要走私有部署
试跑结果只回答效果问题,是否私有部署还要看下面几个条件是否同时成立。
- 数据不出域:业务或合规上明确要求输入不能走外部接口,这是最硬的一条。
- 调用量:量级稳定且大到接口费用随量线性上涨得让人难受,私有部署的固定成本才可能摊薄。
- 长期成本核算口径:把 GPU 采购或租用、机架电力、推理服务运维人力、模型更新与版本回滚的人力都算进去,按年或按季度看总支出,而不是只比单次调用价格。
另外要提醒一句:先核对所用模型卡上的许可证条款,确认是否允许商用、有无署名或使用范围限制,别只看社区里“开源可商用”的说法就动手。
条件不满足时走替代路径更稳:继续用接口并按场景做路由,短问句走小模型、长文和专有名词场景留给现有方案;在调用前加规则或缓存挡掉重复请求;把格式要求写进输出约束而不是靠模型自觉。这些不是性能优化方案,只是在不部署的前提下先把效果和成本控制住。