应用调用大模型的全过程怎么做才可控:怎么选模型和换模型、要不要网关、提示词怎么管、结构化输出和工具调用怎么接、怎么评测、RAG 怎么做、成本怎么算、本地推理怎么部署、调用怎么观测。
业务代码通过配置里的逻辑名调用模型,不在代码里散落厂商模型 ID
怎么检查:CI 用正则或语法树规则扫描业务代码中的厂商模型 ID 字面量,只允许出现在模型配置文件里
为什么、来源
为什么:模型 ID 散在各处时,换模型、回滚、审计都要改一遍代码,容易漏。
- 逻辑名按用途起,例如「订单摘要」「工单分类」,配置里映射到厂商、模型和参数。
- 配置文件用 schema 校验,至少包含厂商、具体模型版本、采样参数、超时和适用的数据级别。
生产配置固定到厂商的具体模型快照版本,不使用会自动指向新模型的别名
怎么检查:配置 schema 拒绝 latest 一类的浮动别名和不带版本的模型名;CI 校验
为什么、来源
为什么:别名背后的模型被厂商替换后,输出、格式遵循、拒答行为都可能变,而你没有做过任何评测。
- 本地模型同理:权重按不可变的版本或哈希引用,不用会移动的标签。
- 开发和试验环境可以用别名,但评测报告里要记下实际解析到的版本。
选模型按自己任务的评测结果,同时比较质量、成本、时延、数据合规和可维护性;不按排行榜或品牌
怎么检查:选型记录(如 ADR)里附评测数据集版本、候选模型版本和各项结果
为什么、来源
为什么:公开榜单的任务分布、价格和可用地区和你的业务不同,在别人的题上排第一不代表在你的题上好用。
- 按任务档挑候选:分类、抽取已知字段先考虑规则或小型快速模型;长文综合、复杂推理选高能力推理模型;工具规划要选做过工具专项评测的模型;高风险判定用模型加确定性规则加人审,不让模型终审。
- 小模型不一定更省:质量差导致的返工、重试、人工复核也要算进总成本。
- 境内外模型走同一套评测集和数据合规检查。
更换模型、提示词、工具定义、检索索引或 embedding 模型,必须先在固定评测集上和当前线上版本配对比较,通过后才能上线
怎么检查:CI 在相关配置或文件变更时自动跑回归评测,结果作为合并或发布的必过检查;关键指标退化需负责人签字
为什么、来源
为什么:大模型的退化往往不报错,只是悄悄变差;不对比就发现不了。
- 比较双方都写清确切版本、采样参数、推理设置和网关版本,不拿「A 的最新版」比「B 的某个版本」。
- 不可退化项单独列:例如已知越权、数据外发用例必须全部拦住,不能用整体质量提升抵消。
- 通过后灰度上线,保留回滚到上一组版本的能力;灰度做法见 26。
对每个用到的厂商、模型和接口组合,实测它支持哪些能力,不假设「兼容某某接口」就全部兼容
怎么检查:维护一份能力清单(输入类型、上下文长度、工具调用、结构化输出、流式、可用区域),并用一组兼容性用例逐项验证
为什么、来源
为什么:兼容层可能静默丢弃字段、改写错误语义或不支持部分 schema,上线后才发现代价大。
每次模型调用必须设置超时、支持取消,并限制并发
怎么检查:所有调用经过统一封装,静态检查不允许绕过封装直接调用 SDK;故障注入测试验证超时和取消生效
为什么、来源
为什么:模型调用慢且不稳定,没有超时和并发上限会拖垮整个服务并持续计费。
重试只针对连接失败、限流和服务端暂时性错误,带指数退避和随机抖动、次数上限和总时限,并遵守 Retry-After
怎么检查:故障注入测试覆盖 401、403、429、5xx、连接中断;检查不可重试的错误没有被重试
为什么、来源
为什么:无限重试会放大故障、重复计费;鉴权失败、schema 非法、拒答这类错误重试也没用。
重试前检查剩余时限和预算。不可重试:401/403、请求不合法、模型拒答、业务语义错误。
流式输出已经发给用户、或工具已经执行之后,不得自动重放请求;要返回「执行状态未知」,走查询或补偿
怎么检查:集成测试模拟流中途断开和工具执行后超时,检查没有重复输出和重复副作用
为什么、来源
为什么:静默重放会让用户看到前后矛盾的内容,或让扣款、发信这类操作执行两次。
降级或切换到备用模型时,备用模型必须满足同一任务的能力要求和数据合规策略;模型拒答不得换更宽松的模型重试
怎么检查:降级策略写进配置,测试覆盖「备用模型不在批准的厂商或区域」时拒绝切换
为什么、来源
为什么:为了可用性把敏感数据送到没批准的境外模型,或用更宽松的模型绕过拒答,都是合规事故。
模型输出在写库或执行前,必须通过 schema 校验和业务约束校验,并显式处理拒答、截断和无效输出
怎么检查:单元测试覆盖合法、缺字段、越界、拒答、截断五类输出;静态检查禁止解析后不校验直接使用
为什么、来源
为什么:厂商的结构化输出只保证格式符合受支持的 schema 子集,不保证值是对的,也不保证模型不拒答。
- 推荐顺序:厂商原生结构化输出或本地引擎的受约束解码 → 本地严格校验(Pydantic、Zod、JSON Schema)→ 业务断言 → 有副作用时再走权限和审批。
- 只用「JSON 模式」不够,它只保证是合法 JSON。
- 校验失败可以有限次修复重试,保留原始失败记录;修复只修格式,不能当成纠正事实。
- 发给模型的 schema 要按厂商支持的子集来写,不要把任意 JSON Schema 直接塞过去。
- 需要结构化结果时用原生结构化输出或工具调用,不用正则从自由文本里抠字段。
工具在执行侧独立校验调用者身份、权限、目标资源和参数;工具定义和模型的话都不算授权
怎么检查:每个工具都有越权负例测试(换用户、换租户、换资源);评审检查授权逻辑不依赖模型输出
为什么、来源
为什么:模型可能被注入或误判;工具 schema 只是请求格式,挡不住越权。
有副作用的写操作工具(付款、删除、发布、发送、改权限)必须有人工审批或确定性规则放行,带幂等键,并留审计记录
怎么检查:工具注册时标注是否有副作用;测试检查未审批时不执行、重复调用只生效一次、审计记录齐全
为什么、来源
为什么:模型拥有超出需要的行动能力是公认的高风险(OWASP 称为过度代理),不可逆操作出错无法挽回。
- 并行的多个工具调用按厂商返回的调用编号聚合参数,参数完整并校验通过后再执行。
- 超时、取消、重复的工具调用按幂等键去重;幂等语义见 16。
每个任务只给模型完成它所需的最少工具和最小权限;只读和读写工具分开
怎么检查:评审时对照任务列出的工具清单,检查有没有用不到的工具或过大的权限
为什么、来源
为什么:暴露的工具越多,注入和误调用能造成的破坏面越大。
接入第三方 MCP 服务或工具前,审查来源、固定版本;把它的工具描述和返回内容当作不可信数据
怎么检查:接入时记录来源、版本和审查人;回归评测里放入夹带指令的工具描述和工具返回
为什么、来源
为什么:工具描述和工具返回会直接进模型上下文,恶意内容可以借此注入指令或诱导外发数据。
生产提示词放在版本库里,和代码一起评审;改动附评测结果
怎么检查:提示词文件路径写进 CODEOWNERS;CI 在提示词变更时要求有回归评测结果
为什么、来源
为什么:提示词就是代码,线上直接改模板无法评审、无法回滚,也不知道效果变好还是变坏。
- 用提示词管理平台的,平台上的草稿必须经审批后导出回版本库,或平台本身支持不可变修订、差异对比、审批和导出。
- 按用途分类(安全策略、业务任务、风格、检索、厂商参数适配),安全策略类收紧修改权限。
运行时按不可变的版本号或内容哈希加载提示词,调用记录里写明所用版本
怎么检查:加载器只接受带版本或哈希的引用;链路追踪契约测试检查提示词版本字段存在
为什么、来源
为什么:不知道线上跑的是哪一版提示词,出了问题就无法复现、归因和回滚。
用户输入、检索内容、工具返回通过模板变量放进提示词的独立区块,不拼接进系统指令
怎么检查:静态检查系统提示词构造处没有字符串拼接外部内容;注入样本回归测试
为什么、来源
为什么:外部内容拼进系统指令就和指令混在一起,最容易被注入覆盖;但这只是减轻,不是根治,授权仍靠 LLM-011。
每类模型任务都有一份版本化的离线评测集,覆盖正常、边界、对抗、应拒答、多轮、工具调用和真实线上分布
怎么检查:评测集放版本库并记录来源和标注人;CI 统计各类样本是否齐全
为什么、来源
为什么:只用顺手挑的几个好例子测,长尾失败和注入问题都测不出来。
- 线上样本要先脱敏再进评测集。
- 多语言产品按语种分别有样本。
- 评测数据用 JSONL、CSV 这类中性格式保存,不锁死在某个评测工具里。
能用确定性断言判定的项(格式、字段、引用编号、工具参数、拒答与否),用断言判定,不交给模型评审
怎么检查:评审评测配置,检查客观项是否用了断言
为什么、来源
为什么:断言可复现、零成本、不漂移;模型评审有偏差还要花钱。
用模型当评审前,先在人工标注的样本上校准一致性;没校准的不作为发布门禁;高风险变更和扩大模型权限不能只凭模型评审分数放行
怎么检查:评测报告里附评审模型与人工标注的一致性结果;评审时核对门禁里用到的每个模型评审项都有校准记录
为什么、来源
为什么:模型评审会偏向自家模型、长答案和靠前的答案,没校准的分数不能当真值;评审和被评模型可能共享盲点,自动放权等于让模型给自己批准。
- 固定评审模型版本、评分标准、评审提示词和采样参数。
- 成对比较时随机交换答案位置,检查位置偏差。
- 不用同一个模型既回答又评分又自动放行。
- 校准不一致的样本交人工仲裁,定期复核。
上线后按授权比例抽样线上调用做质量检查,结合用户纠错和分布漂移,发现的问题补回评测集
怎么检查:定期检查抽样记录和评测集的更新记录
为什么、来源
为什么:离线评测集会过时,线上分布会变,只有抽检才能发现新出现的失败模式。
先确认需要 RAG:能直接查库、调已有接口、或内容能直接放进提示词的,不做向量检索
怎么检查:方案评审时写明为什么不能用直接查询,并附对照实验结果
为什么、来源
为什么:把 SQL 查询包装成向量召回,更慢、更贵、更不准,也更难追溯。
RAG 在检索时就按当前用户和租户的权限过滤,不在拿到结果后再过滤
怎么检查:越权负例测试:用无权用户查询有权文档的独有内容,检查检索结果和回答里都没有
为什么、来源
为什么:先检索后过滤会通过片段、条数或模型的转述泄露无权内容;向量库本身不是权限边界。
源文档删除、权限变更或改版后,必须在约定时间内更新索引;更新前的旧片段不得返回
怎么检查:集成测试删除或收回一份文档后再查询,检查不再命中;监控索引与源数据的同步延迟
为什么、来源
为什么:索引里残留的已删除或已收权内容,会持续泄露给不该看的人。
切块按标题、段落、表格、代码块等结构边界切,每块保存来源编号、版本、位置、权限标签和 embedding 模型版本
怎么检查:索引 schema 校验必填元数据;切块参数通过离线实验确定并记录
为什么、来源
为什么:机械按长度切会切断表格和语义;没有元数据就做不了权限过滤、引用和重建索引。
切块长度没有通用最优值,按自己的文档类型做实验,不把某个数值当永久规则。文档解析见 20。
检索从关键词检索(如 BM25)基线开始,按评测结果再加向量、混合检索和重排
怎么检查:每加一层都和上一层做对照实验,记录召回和成本变化
为什么、来源
为什么:编号、条款、名称、错误码这类精确查询,关键词检索往往比向量更准;每层叠加都增加成本和延迟。
- 混合检索可用倒数排名融合(RRF)合并结果。
- 重排用专门的重排模型(交叉编码器类),或经过评测的模型重排。
- 不盲目叠加查询改写、多路检索、重排。
启用引用时,引用由服务端根据实际检索到的片段编号生成,并校验被引用片段确实支持该说法;不让模型自己写链接、页码或行号
怎么检查:引用完整性测试:每个引用都能反查到本次检索结果中的片段,且来源版本未过期
为什么、来源
为什么:模型会编出看起来可信的链接和页码,用户最容易被这种假引用误导。
RAG 分开评测检索和生成:检索看召回率、排序质量,生成看正确性、忠实度、引用准确率和该拒答时是否拒答
怎么检查:评测报告分别列出检索指标和生成指标,以及越权率和时延
为什么、来源
为什么:只看最终答案分不清是检索错了还是生成编了,就不知道该改哪一层。
数据发给外部模型前,按数据分级确定允许的厂商、部署区域和日志级别;更换厂商或区域须数据负责人批准
怎么检查:模型配置里每个逻辑名标明允许的数据级别;评审时核对变更有数据负责人的批准记录
为什么、来源
为什么:境外模型、日志留存、厂商训练条款都可能构成数据出境或违约,事后补救不了。
LLM-030硬约束检查:自动调用大模型的应用Web 前端移动端(跨平台)桌面应用 浏览器、移动端和桌面客户端不持有模型厂商的长期密钥;客户端经自己的后端或网关调用,用短期、限范围的令牌
怎么检查:对前端构建产物和客户端安装包跑密钥扫描
为什么、来源
为什么:客户端里的密钥一定会被提取,被盗刷的账单和数据风险由你承担。
模型成本按来源分开记:厂商账单、接口返回的用量、网关或内部估算、订阅额度和本地算力分摊,不混成一个数
怎么检查:成本记录带来源字段;定期用厂商账单对账,记录估算偏差
为什么、来源
为什么:缓存折扣、思考类 token、批处理、税费和汇率都会让估算和账单不一致;订阅产品的用量也不能按 API 单价折算。
- 单价按生效日期版本化记录,原币金额、汇率日期分开存。
- 金额计算和通用账本口径见 22。
声称有硬预算上限时,必须在调用前原子预留最大可能花费,完成后按实际用量结算;并对单次请求限制最大输出长度和最大工具轮数
怎么检查:并发竞争测试:同时发起超出预算的请求,检查不会透支
为什么、来源
为什么:先调用后统计在并发下必然超额;只靠网关的异步汇总做不了硬停。
硬停只能保证本系统不再发新请求,厂商账单可能有延迟;对外说明时写清这是本系统能保证的上界。
长提示词把稳定内容放在前面以利用厂商的提示缓存,并用实际账单核对缓存是否真的省钱
怎么检查:监控缓存读写 token 和命中率,和账单对账;提示词变更后检查缓存命中和预算变化
为什么、来源
为什么:缓存写入可能额外收费,前缀一变就不命中,「开了缓存就省钱」不一定成立。
上下文先删过时和重复的历史,再检索精确资料,最后才压缩;带来源的证据压缩时不能丢引用位置。
应用自己做的响应缓存,缓存键必须包含租户、权限范围、模型版本、提示词版本和输入;涉及个人或敏感数据的结果默认不缓存
怎么检查:安全测试用两个租户发送相同请求,检查不会命中对方的缓存
为什么、来源
为什么:缓存键缺了租户或权限,就会把一个人的回答返回给另一个人。
日志和链路追踪默认不记录原始提示词、模型输出、工具参数和检索片段;需要时经授权采样、脱敏并限定保留期
怎么检查:日志抽样扫描敏感字段和个人信息;检查观测平台的采集配置
为什么、来源
为什么:原文进了观测平台和备份,敏感数据就散落到访问控制更松的地方。
链路追踪覆盖请求、模型调用、工具调用和检索,记录模型版本、提示词版本、token 用量、首字耗时、重试和降级原因
怎么检查:契约测试检查各类调用都产生带这些字段的 span
为什么、来源
为什么:没有版本和用量,就分不清质量、延迟和成本的变化是哪一处改动引起的。
字段名参考 OpenTelemetry 的生成式 AI 语义约定;该约定仍在演进,固定所用版本并维护字段映射。OTel 部署见 26。
本地推理服务(Ollama、vLLM 等)不直接暴露在公网或不受控网络上;必须放在带认证的网关或内网之后
怎么检查:部署检查监听地址;外部端口扫描确认推理端口不可从不受控网络访问
为什么、来源
为什么:多数本地推理服务默认不带认证,暴露出去会被白嫖算力、拉取或删除模型。
本地推理选型和上线用自己的模型和真实负载实测,记录引擎版本、权重哈希、量化格式、硬件、驱动、上下文长度和并发
怎么检查:基准测试结果作为文件存档,包含上述字段和首字耗时、吞吐、显存峰值、错误率
为什么、来源
为什么:推理性能取决于模型、量化、硬件、驱动和引擎的组合,别人的基准数据不能代替自己的实测。
- 冷启动和热启动、长输入和短输入、固定批次和动态到达分开测。
- 显存估算:权重大小约等于参数量 × 每参数位数 ÷ 8,只是下限;还要加 KV 缓存、激活和框架开销。
- 国产芯片要按具体芯片、驱动和工具链验证,「CUDA 上能跑」不等于适配通过。
使用开源模型权重前,单独核查权重的许可条款;推理引擎的许可证不代表权重的许可
怎么检查:依赖清单里每个模型权重都有许可条款记录和核查人
为什么、来源
为什么:引擎是 Apache-2.0,权重可能限制商用、用户规模、地域或再分发。
声称支持离线或私有化的版本,必须在断网环境下完成冷启动、推理、评测和故障恢复验收
怎么检查:发版流程在断网的隔离环境里跑验收脚本,并检查没有对外连接
为什么、来源
为什么:镜像拉取、模型下载、依赖安装、价格表、遥测、版本检查都可能悄悄依赖外网。
模型权重和镜像按哈希或摘要固定,随版本一起交付;SBOM 和签名见 25。
先用官方 SDK 加校验库实现;有明确需要时再引入编排框架,不为一次结构化输出引入大型框架
怎么检查:引入框架的 PR 写明它解决了官方 SDK 解决不了的哪个问题
为什么、来源
为什么:框架带来更多依赖、更快的版本变化和更难排查的抽象层;「用了框架」也不等于有了生产治理。
没有符合条件的规则。
模型选择
按任务档选候选,用自己的评测集配对比较后定
备选:规则引擎或传统模型(分类、抽取已知字段等能确定求解的任务);小型快速模型(低风险的分类、短摘要、字段抽取,且评测达标);高能力推理模型(长文综合、复杂推理、代码分析、工具规划);多模态模型(需要理解图片或版面,且有字段级评测)
不推荐:按公开排行榜前几名直接选;按一次演示选「最强模型」;生产配置用浮动别名
模型调用接入
厂商官方 SDK + 校验库(Python 用 Pydantic,TypeScript 用 Zod) · Pydantic AI、LangChain、LlamaIndex 为 MIT;Vercel AI SDK 为 Apache-2.0(据原报告,未逐一复核)
备选:Pydantic AI(Python 项目要类型化的工具调用和多轮交互);Vercel AI SDK(TypeScript 前端要流式输出和对话界面;权限和业务流程仍在后端);LlamaIndex(要接入大量数据源、做复杂检索链);LangChain(需要它现成的集成和中间件)
不推荐:为一次 JSON 解析引入大型编排框架
模型网关
LiteLLM Proxy · LiteLLM 仓库中 enterprise/ 目录以外为 MIT,enterprise/ 目录另有商业许可,生产使用需付费订阅;超过 5 人的单点登录、基于角色的权限、审计日志等属于企业版功能。Portkey 开源网关为 MIT。
备选:Envoy AI Gateway 或 Higress(已有 Envoy 或 Kubernetes 网关体系);Portkey 开源网关(只要轻量的转发、重试和故障切换);官方 SDK + 薄封装 + 受控出口(单一厂商或小规模)
不推荐:每个团队自己写多厂商代理;把厂商托管版或企业版的功能当作开源版也有
评测工具
promptfoo · promptfoo 为 MIT;DeepEval 为 Apache-2.0,其托管平台 Confident AI 是另外的商业服务,不是必需的
备选:DeepEval(Python 团队想把评测写成 pytest 风格的测试代码,或需要它现成的 RAG 和 Agent 指标);Ragas(只需要 RAG 检索与生成的专项指标;选用前先查维护活跃度)
不推荐:只用模型当评审、没有确定性断言和人工标注;评测数据只存在某个工具或平台的私有格式里
提示词管理
版本库为准 + 运行时加载不可变版本
备选:Langfuse 提示词管理(需要非开发人员编辑和线上灰度;草稿须经审批并能导出回版本库)
不推荐:线上直接改模板
结构化输出
厂商原生结构化输出或受约束解码 + 本地严格校验
备选:有限次修复重试(模型或引擎不支持原生结构化输出)
不推荐:只用 JSON 模式;正则从自由文本抠字段
模型调用可观测
OpenTelemetry 采集 + 已有的追踪和日志后端 · Langfuse 的 ee/ 目录以外为 MIT,产品功能均在 MIT 部分;ee/ 目录下的企业治理功能(如 SCIM、审计日志、项目级权限、数据保留策略)为商业许可,需许可密钥才启用
备选:Langfuse(需要大模型专用的追踪界面,并和提示词管理、评测放在一起;可自托管);Arize Phoenix(偏实验和评测分析;许可证见待确认)
不推荐:默认把原始提示词和输出全量采集;只要链路追踪也强上专用平台
检索
关键词检索基线,按评测再加向量的混合检索和重排模型
备选:直接查库或调接口(问题能确定求解)
不推荐:一上来就搭向量库加多路改写加重排
本地推理(服务端 GPU、并发)
vLLM · vLLM、SGLang 为 Apache-2.0;权重许可另外核查(LLM-039)
备选:SGLang(和 vLLM 成对实测后在目标模型上更好;运行栈变化快,要锁定完整环境)
不推荐:用 Ollama 承担高并发生产服务;按公开基准榜单直接定方案
本地推理(开发机、单机、小规模)
Ollama · Ollama、llama.cpp 为 MIT
备选:llama.cpp(llama-server)(CPU、Apple 芯片或非 NVIDIA 硬件,用 GGUF 量化模型;或要更细的控制)
不推荐:把默认配置直接暴露到网络上
✕ 错误做法:任何 AI 功能都先上编排框架、RAG、向量库和 Agent 平台
✓ 应该:先用官方 SDK 加 schema 校验做最小端到端原型,有真实需要再加
✕ 错误做法:在每个服务里硬编码厂商域名、模型 ID 和密钥
✓ 应该:逻辑名加集中配置,密钥只放后端或网关
✕ 错误做法:认为「兼容 OpenAI 接口」就所有字段都兼容
✓ 应该:按厂商、模型、接口逐项做兼容性测试
✕ 错误做法:429、500 之后无限重试
✓ 应该:只重试暂时性错误,带退避、次数和总时限
✕ 错误做法:流式输出到一半断了,自动换模型重放且不告诉前端
✓ 应该:返回执行状态未知,需要时由用户显式重新发起
✕ 错误做法:把结构化输出当成业务数据校验
✓ 应该:schema 校验加业务约束加权限检查
✕ 错误做法:靠系统提示词里一句「不要执行危险操作」防护工具调用
✓ 应该:执行侧鉴权、审批和幂等
✕ 错误做法:让模型自己写引用链接和页码
✓ 应该:服务端按检索片段编号生成引用
✕ 错误做法:用同一个模型回答、打分并自动放行
✓ 应该:确定性断言打底,评审模型先和人工标注校准
✕ 错误做法:用「最大 token 数 × 单价」当正式账单
✓ 应该:账单、用量、估算分开记,定期对账
✕ 错误做法:每小时汇总一次用量就声称有硬预算
✓ 应该:调用前原子预留,完成后结算
✕ 错误做法:私有化部署只验证 Docker Compose 能启动
✓ 应该:断网环境冷启动、推理、恢复全流程验收
✕ 错误做法:引擎是 Apache-2.0 就以为权重也随便用
✓ 应该:引擎、企业模块、权重许可分别核查
✕ 错误做法:任何失败都自动切到境外厂商
✓ 应该:备用模型先通过数据区域和批准名单检查