先把问题定义对,再谈模型大小
13.1 · 行业与科学模型的边界
行业与科学大模型并不是给通用模型贴上新的行业标签,而是把领域数据、专业约束、工具流程、责任边界和评估证据一起设计成一个可交付系统。本节从“模型到底负责什么”开始,建立后面所有章节都会复用的任务合同。
13.1.1 行业模型不是把通用模型换个名字
“行业大模型”这个词很容易制造一种错觉:只要把通用模型继续训练一遍,再换一个更专业的名称,就能自动获得医生、律师或科研人员的判断力。实际情况恰恰相反。行业能力通常来自四个相互制约的部分:领域语料让模型熟悉术语,任务数据让模型学会工作格式,外部工具让它能够查证或计算,组织流程则决定谁可以采纳结果。模型只是其中一个概率组件,不能独立承担全部责任。
通用模型擅长从大量跨领域文本中学习语言规律和常识,但行业问题往往有更窄的语境、更高的错误成本和更强的时效要求。例如“这份合同有没有风险”不是一个只需生成流畅文字的问题,它还涉及适用法域、合同版本、条款之间的引用关系以及审阅人的判断标准。如果没有任务合同和证据链,模型回答得越完整,用户反而越难发现其中的假设。
科学模型的“专业”又有另一层含义。蛋白质结构、流体场或分子性质不是自然语言中的概念拼接,而是带有几何、守恒、尺度和测量误差的对象。科学模型可以使用 Transformer,也可以使用图网络、扩散模型或神经算子,但它必须在输入表示、输出单位和实验验证上接受领域规律的约束。语言流畅并不等于预测满足物理定律。
因此,我们在本章把行业与科学模型定义为“面向稳定领域任务、拥有明确数据与证据接口、能够在规定风险边界内运行的模型系统”。这个定义有意把“模型系统”放在中心,而不是把参数数量放在中心。一个几十亿参数、配有可靠检索和人工复核的系统,可能比一个更大的裸模型更适合医院或实验室。
判断一个系统是否真的完成了领域适配,可以问五个问题:它面对的任务是否能写成输入和输出;输出是否有可追溯证据;错误是否有分级和兜底;数据和模型版本是否可复现;领域专家能否用自己的标准验收。只要其中两三个问题回答不清楚,继续堆参数通常不能解决根因。
模型能力还要分清“知识记忆”和“工作执行”。知识记忆是模型能否说出一个术语的解释,工作执行是能否在限定资料、权限和格式下完成一次操作。行业系统更看重后者,因为真实工作有表单、权限、审计和时限。把二者混为一谈,会导致训练集看似漂亮,线上流程却无法落地。
在产品规划阶段,应先列出不由模型决定的部分。例如金额计算交给确定性程序,药物剂量交给经过批准的规则或临床工具,法律引用交给带版本的法规库,实验参数交给仿真或实验记录。模型负责理解问题、组织信息和提出候选方案;最终写入系统的值必须能被程序或人复核。
本小节的关键结论是:行业模型的核心差异不在“说得更专业”,而在“知道何时必须查证、何时必须拒答、何时必须交给人”。接下来所有数据、微调和评估选择,都要回到这个边界上。
| 比较维度 | 通用模型 | 行业或科学模型系统 | 设计提醒 |
|---|---|---|---|
| 主要目标 | 覆盖尽可能多的语言任务 | 在明确领域任务上稳定交付 | 先写任务合同再选模型 |
| 知识来源 | 混合互联网或通用语料 | 领域数据、结构化知识和实时工具 | 记录来源、版本和许可 |
| 正确标准 | 语言质量、偏好和通用基准 | 事实、证据、规则、单位或实验结果 | 必须定义可判定的验收条件 |
| 错误后果 | 回答不佳或需要重试 | 财务、医疗、法律或科研决策受损 | 按风险决定人工复核 |
| 更新方式 | 周期性预训练或指令微调 | 检索更新、适配器、规则和模型共同更新 | 区分知识更新与权重更新 |
从下到上并不是简单叠加:治理层会反过来规定模型能使用哪些数据和工具,任务层则决定其余四层是否有必要。
from dataclasses import dataclass
from typing import Literal
Risk = Literal["low", "medium", "high"]
@dataclass(frozen=True)
class DomainTask:
name: str
input_schema: str
output_schema: str
risk: Risk
evidence_required: bool
human_review: bool
def can_auto_publish(task: DomainTask) -> bool:
return task.risk == "low" and not task.evidence_required and not task.human_review
task = DomainTask(
name="内部资料摘要",
input_schema="document[]",
output_schema="summary + source_ids",
risk="low",
evidence_required=True,
human_review=False,
)
print(can_auto_publish(task)) # False:有证据要求,不能无条件自动发布)13.1.2 任务合同、风险分级与责任人
任务合同是把自然语言需求变成可验收接口的最小文件。它至少要写清任务名称、允许的输入、必须返回的字段、证据要求、时效范围、失败处理和责任人。比如“生成一份病历摘要”过于宽泛;“从指定住院记录中提取诊断、用药、检查异常和原文证据编号,缺失项返回 unknown,不给出新诊断”才是可以测试的合同。
风险分级不等于给模型贴上好或坏的标签,而是描述错误可能造成的影响和处置成本。低风险任务通常可以人工抽查后自动发布;中风险任务需要证据、置信提示和固定审批;高风险任务只能作为辅助材料,必须由有资质的人作出最终决定。分级还应考虑用户身份、数据敏感度、可逆性和影响范围。
一个实用的合同可以分成五个字段组。第一组是范围:允许处理的资料、时间和法域。第二组是输出:格式、必填字段和禁止生成的内容。第三组是证据:引用粒度、来源优先级和无法找到证据时的行为。第四组是安全:敏感信息、权限、拒答和升级路径。第五组是验收:离线指标、专家标准、上线阈值和回滚条件。
责任人必须具体到角色,而不是写“团队负责”。数据负责人确认来源、许可和脱敏;领域专家确认术语、规则和金标准;工程负责人确认服务稳定性、权限和日志;业务负责人确认是否真的解决流程问题;最终使用者负责在规定位置复核输出。职责写清后,出现错误时才能判断是数据、模型、工具还是流程的问题。
证据要求要和任务类型匹配。摘要任务可以引用段落编号,法规问答需要条文、版本和生效日期,科研预测需要数据集划分、单位和不确定性区间,金融分析需要价格时间戳和计算公式。只显示一个“可信度百分比”并不能替代证据,因为概率值本身也可能没有校准。
风险合同还要写“拒答不是失败”。当输入超出法域、资料缺失、工具不可用或请求要求模型做禁止的决定时,系统应返回缺口和下一步,而不是编造一个看似完整的答案。拒答模板可以包含:检测到的限制、已完成的安全部分、需要补充的材料、应联系的责任人。
验收阈值不要只写平均分。一个模型在大多数简单问题上表现很好,仍可能在少量高风险切片上失效。因此合同应同时规定总体指标、关键切片、最坏案例、人工复核通过率和连续失败次数。上线后还要保留版本号,确保一次回答可以回到当时的提示词、检索结果和模型。
把合同公开给使用者能降低“能力幻觉”。用户知道系统只处理某个法域、某段时间或某类样本,就会更愿意提供完整输入,也更容易理解拒答。对于学习者而言,写任务合同本身就是一次重要练习:它迫使我们把“模型很聪明”改写成“这个接口在什么条件下可靠”。
| 等级 | 典型任务 | 系统必须提供 | 最终责任 |
|---|---|---|---|
| 低 | 内部摘要、标签建议 | 来源链接、格式校验、抽样监控 | 业务使用者 |
| 中 | 合同条款比对、财务解释 | 版本、证据、异常提示、审批节点 | 领域专家或审核员 |
| 高 | 诊断建议、法律结论、实验关键参数 | 强制人工复核、完整审计、拒答与升级 | 有资质的责任人 |
| 不可自动化 | 替人做最终决定或绕过权限 | 明确拒绝并给出合规替代路径 | 组织治理者 |
任务合同的最小模板
任务:一句话描述允许完成的工作;输入:字段、来源、范围、单位与缺失值策略;输出:字段、格式、语言和证据粒度;限制:不允许推断什么、不允许调用哪些工具;验收:指标、关键切片、人工签字人和回滚阈值。
写完后做一次反向测试:让不了解项目的人仅凭合同构造三个正常输入、两个边界输入和一个恶意输入。如果大家对预期输出仍有不同理解,说明合同还不够具体。
from dataclasses import dataclass
from enum import Enum
class Risk(str, Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
@dataclass
class Result:
status: str
next_step: str
def route(risk: Risk, evidence_ok: bool, expert_available: bool) -> Result:
if not evidence_ok:
return Result("blocked", "补齐来源或明确无法回答")
if risk is Risk.HIGH and not expert_available:
return Result("blocked", "等待有资质的复核人")
if risk is Risk.HIGH:
return Result("review", "生成辅助材料并交由专家复核")
if risk is Risk.MEDIUM:
return Result("review", "抽样检查证据与格式")
return Result("ready", "按低风险流程发布")
print(route(Risk.HIGH, True, False))13.1.3 模型、数据、工具与人如何分工
一个可维护的领域系统通常包含四种角色。模型负责把自然语言或结构化输入转换成候选计划、解释和答案;数据层负责提供有来源、可版本化的事实;工具层负责检索、计算、调用业务接口或运行模拟;人负责设置边界、处理例外和承担最终责任。四者不是平行堆叠,而是通过明确的输入输出协议连接。
让模型直接写入数据库或直接下达控制指令,往往是最危险的捷径。更稳妥的方式是让模型先输出结构化意图,再由程序校验字段、权限、范围和幂等性,最后才执行工具。工具返回的结果再交给模型组织成可读说明,同时把原始结果和调用参数保存到审计日志中。
数据层的职责也不能被“模型记住了”替代。法规会修订,金融价格会变化,实验记录会追加,患者资料会撤回。把实时或高频变化的事实写进权重,会让更新、撤销和追责都变得困难。检索层应返回来源 ID、版本、时间和片段,模型只在这些证据范围内作答。
工具调用需要考虑失败。网络超时、权限不足、返回空结果、单位不一致和第三方接口变化都可能出现。每次调用都要有超时、重试上限、错误类型和人工升级路径;对于有副作用的写操作,还应使用预览、确认和幂等键。模型可以解释失败,但不能把失败伪装成成功。
人机协作不是最后加一个“请注意”的提示框。它要出现在任务路由、界面设计和日志结构中。高风险任务应把证据和不确定性放在答案附近,要求审核人确认关键字段;低风险任务可以采用抽样复核,但也要设定连续错误触发的暂停条件。人的注意力是稀缺资源,流程要把它用在最需要的地方。
成本与延迟也会影响分工。简单分类可以使用小模型,复杂推理再升级到更大模型;常见资料先从缓存或结构化数据库读取,只有无法匹配时才调用生成模型。把所有请求都路由到最大模型既浪费预算,也增加了不可预测的错误面。路由规则应由离线评估和线上监控共同维护。
在科学场景中,模型还可以成为实验规划助手,但实验仪器、数值求解器和统计检验仍然是不同角色。模型提出候选实验,工具检查约束和成本,专家决定是否执行,结果回流后再更新数据集。这样的闭环比让模型一次性“发现规律”更容易复现,也更符合科学方法。
理解分工后,系统设计就从“选择一个最强模型”转向“为每个环节选择可验证的组件”。这是本章的基础能力:任何一个模型输出都要回答三个问题——它依据了什么、由谁确认、出错后如何撤回。
箭头表示数据流,复核结果会回写日志和评估集;真正的自动化发生在边界清楚之后。
| 组件 | 擅长什么 | 不能独自保证 | 失败时 |
|---|---|---|---|
| 模型 | 理解、生成、排序候选方案 | 事实真实、权限正确、结果可执行 | 返回不确定性与证据缺口 |
| 数据层 | 保存事实、版本和来源 | 事实一定适合当前任务 | 标记过期、冲突和缺失 |
| 工具 | 查询、计算、写入或模拟 | 调用意图一定合法 | 超时、回滚、升级 |
| 领域专家 | 判断边界、解释例外 | 持续关注所有请求 | 只接收高风险或异常切片 |
| 治理系统 | 记录、审计、监控和发布 | 替代专业判断 | 暂停版本并保留现场 |
从一个问题画出系统边界
先画输入和输出,再把中间动作拆成“检索事实”“执行计算”“生成说明”“人工决定”。每个动作写出失败结果,禁止用一句“模型会处理”跳过边界。
如果一个动作会改变外部世界,就增加预览和确认;如果一个动作会影响高风险决定,就增加证据和复核;如果一个动作包含个人或机密资料,就增加权限、脱敏和删除策略。
from dataclasses import dataclass
from typing import Any
@dataclass(frozen=True)
class ToolCall:
name: str
arguments: dict[str, Any]
request_id: str
ALLOWED = {
"search_policy": {"role": "reader"},
"calculate_ratio": {"role": "reader"},
}
def validate(call: ToolCall, role: str) -> None:
rule = ALLOWED.get(call.name)
if rule is None or rule["role"] != role:
raise PermissionError("工具未授权")
if not call.request_id:
raise ValueError("缺少幂等请求编号")
def preview(call: ToolCall, role: str) -> str:
validate(call, role)
return f"即将调用 {call.name},参数字段:{sorted(call.arguments)}"
call = ToolCall("calculate_ratio", {"numerator": 8, "denominator": 10}, "req-001")
print(preview(call, "reader"))本节完成验收
完成本节后,你应能把一个模糊的行业需求写成任务合同,标出风险等级、证据要求和责任人,并画出模型、数据、工具、人之间的边界。验收时随机拿一个需求,让同伴仅凭合同构造正常、边界和越权输入;如果输入路由、拒答和最终责任都能说清,本节才算完成。
把“让模型帮我审合同”改写成一个中风险任务合同,至少写出法域、版本、证据和人工审批条件。
参考结论:输出字段可判定;无法找到条文时不会补写结论;责任人不是“系统”。
完整实现路径:先写任务、法域/领域、证据、风险等级和人工接管,再选择模型。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
def route_task(task):
required = {"domain", "jurisdiction", "risk", "evidence_available"}
missing = required - task.keys()
if missing: return {"status": "invalid", "missing": sorted(missing)}
if task["risk"] == "high": return {"status": "human_review"}
if not task["evidence_available"]: return {"status": "abstain"}
return {"status": "model_assist"}
assert route_task({"domain":"legal","jurisdiction":"CN",
"risk":"high","evidence_available":True})["status"] == "human_review"验收标准:模型、工具、专家和治理层责任不重叠,越权输入会被拒绝。
若结果不对:先判断任务是否在合同内,再查知识版本,最后查模型。
为一个科研实验助手画五层结构图,分别标出模型、数据、工具、专家和治理层。
参考结论:每一层都有输入、输出和失败路径;实验执行前存在人工确认。
完整实现路径:先写任务、法域/领域、证据、风险等级和人工接管,再选择模型。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
def route_task(task):
required = {"domain", "jurisdiction", "risk", "evidence_available"}
missing = required - task.keys()
if missing: return {"status": "invalid", "missing": sorted(missing)}
if task["risk"] == "high": return {"status": "human_review"}
if not task["evidence_available"]: return {"status": "abstain"}
return {"status": "model_assist"}
assert route_task({"domain":"legal","jurisdiction":"CN",
"risk":"high","evidence_available":True})["status"] == "human_review"验收标准:模型、工具、专家和治理层责任不重叠,越权输入会被拒绝。
若结果不对:先判断任务是否在合同内,再查知识版本,最后查模型。
设计一个只读工具网关,允许检索和计算,不允许写入业务系统。
参考结论:有白名单、角色校验、请求编号、超时策略和日志字段。
完整实现路径:先写任务、法域/领域、证据、风险等级和人工接管,再选择模型。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
def route_task(task):
required = {"domain", "jurisdiction", "risk", "evidence_available"}
missing = required - task.keys()
if missing: return {"status": "invalid", "missing": sorted(missing)}
if task["risk"] == "high": return {"status": "human_review"}
if not task["evidence_available"]: return {"status": "abstain"}
return {"status": "model_assist"}
assert route_task({"domain":"legal","jurisdiction":"CN",
"risk":"high","evidence_available":True})["status"] == "human_review"验收标准:模型、工具、专家和治理层责任不重叠,越权输入会被拒绝。
若结果不对:先判断任务是否在合同内,再查知识版本,最后查模型。
边界推演与系统设计
在领域系统的任务边界中,第 1 个观察点是:行业能力来自数据、模型、工具、流程和责任的组合,而不是把通用模型换一个名称。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“行业能力来自数据、模型、工具、流程和责任的组合,而不是把通用模型换一个名称”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 2 个观察点是:任务必须写出允许处理的资料范围、截止时间、输出字段和禁止推断的内容。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“任务必须写出允许处理的资料范围、截止时间、输出字段和禁止推断的内容”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 3 个观察点是:读操作、可逆草稿、外部写操作和最终决定应拥有不同自动化等级。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“读操作、可逆草稿、外部写操作和最终决定应拥有不同自动化等级”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 4 个观察点是:风险等级要同时考虑错误影响、用户身份、资料敏感度、可逆性和影响范围。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“风险等级要同时考虑错误影响、用户身份、资料敏感度、可逆性和影响范围”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 5 个观察点是:证据要求必须落到来源 ID、版本、时间和引用粒度,而不是一个模糊可信度。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“证据要求必须落到来源 ID、版本、时间和引用粒度,而不是一个模糊可信度”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 6 个观察点是:工具网关要独立校验权限、参数、限额、幂等性和副作用,不能相信模型生成的控制字段。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“工具网关要独立校验权限、参数、限额、幂等性和副作用,不能相信模型生成的控制字段”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 7 个观察点是:责任矩阵要和审计日志相连,回放请求时可以找到执行人、批准人和通知对象。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“责任矩阵要和审计日志相连,回放请求时可以找到执行人、批准人和通知对象”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 8 个观察点是:拒答要说明资料缺口、已经完成的安全部分、下一步材料和应联系的角色。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“拒答要说明资料缺口、已经完成的安全部分、下一步材料和应联系的角色”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 9 个观察点是:低风险自动化也要保留抽样复核、连续失败阈值和暂停入口。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“低风险自动化也要保留抽样复核、连续失败阈值和暂停入口”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域系统的任务边界中,第 10 个观察点是:模型升级必须与基线比较质量、成本、延迟、人工修改和回退能力。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“模型升级必须与基线比较质量、成本、延迟、人工修改和回退能力”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 证据链 | 删除一个来源版本 | 仍输出确定结论 | 拒答并升级 |
| 3 | 责任 | 回放高风险请求 | 找不到签字角色 | 补齐审计字段 |
| 4 | 回退 | 让工具超时 | 没有安全状态 | 切换基线 |
本页反向检查
拿一个模糊需求连续追问资料过期、权限不足、来源冲突和工具空结果,每个问题都要落到状态、提示和责任人。
对外承诺必须和评估范围一致;只在小样本或单一语言资料上测试,就把适用范围写小。
系统图要区分数据流与控制流,权限、风险和发布状态不能由用户输入直接控制。
验收者在没有口头补充的情况下,应能判断系统解决什么、拒绝什么、谁负责以及出错如何撤回。
任务合同复盘案例
在行业模型边界的复查中,第 1 个问题是“用户角色不同是否应返回不同字段”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“用户角色不同是否应返回不同字段”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在行业模型边界的复查中,第 2 个问题是“资料截止时间变化后答案和引用是否同步”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“资料截止时间变化后答案和引用是否同步”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在行业模型边界的复查中,第 3 个问题是“模型工具调用的副作用由谁批准”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“模型工具调用的副作用由谁批准”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在行业模型边界的复查中,第 4 个问题是“来源冲突时是否显示冲突而非替用户选择”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“来源冲突时是否显示冲突而非替用户选择”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在行业模型边界的复查中,第 5 个问题是“无证据时拒答是否给出补充材料”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“无证据时拒答是否给出补充材料”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在行业模型边界的复查中,第 6 个问题是“人工修改能否回流为带原因的回归样本”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“人工修改能否回流为带原因的回归样本”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在行业模型边界的复查中,第 7 个问题是“模型升级后旧合同和旧日志能否回放”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“模型升级后旧合同和旧日志能否回放”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 任务边界 | 构造越权输入 | 模型直接执行 | 收紧工具网关 |
| 证据链 | 删除来源版本 | 仍输出确定结论 | 拒答并升级 |
| 责任 | 回放高风险请求 | 找不到签字角色 | 补齐审计字段 |
| 回退 | 让工具超时 | 没有安全状态 | 切换基线 |
本页反向检查
拿一个模糊需求连续追问资料过期、权限不足、来源冲突和工具空结果,每个问题都要落到状态、提示和责任人。
对外承诺必须和评估范围一致;只在小样本或单一语言资料上测试,就把适用范围写小。
系统图要区分数据流与控制流,权限、风险和发布状态不能由用户输入直接控制。
验收者无口头补充也能判断系统解决什么、拒绝什么、谁负责以及出错如何撤回。
模型能力从数据的边界开始
13.2 · 领域数据与知识工程
领域模型的训练效果很大程度上取决于数据是否可理解、可追溯、可撤回。本节把来源、术语、标注、元数据、质量和隐私放在同一条数据管线上,说明为什么“多放一些资料”不等于“拥有领域知识”。
13.2.1 来源、术语表与领域本体
领域数据的第一步不是下载,而是盘点来源。来源可以是公开法规、内部制度、临床记录、传感器、论文、实验表格或人工访谈。每类来源的可信度、更新频率、授权方式和可引用粒度不同。把它们混成一个目录后再交给模型,会让检索和评估都失去依据。
术语表解决的是“同一个词到底指什么”。医疗里的缩写可能在不同科室含义不同,金融里的“收益率”需要明确时间窗口,法律中的“当事人”要绑定法域和文件角色,科学变量还必须带单位。术语表不是一张静态词典,它应记录首选名称、别名、定义、类型、单位、来源和生效时间。
本体或知识图谱进一步描述实体之间的关系,例如药物属于某类、条款引用某条法规、蛋白质包含某个结构域、实验样本来自某个批次。它不一定要一开始就做成复杂图数据库,但关系应以稳定的 ID 表达。模型看到“同名不同物”时,ID 和上下文可以减少混淆。
切分文档时要保留结构。标题、章节、表格行、脚注、版本和页码都是检索线索。简单按固定字符数截断,容易把定义和例外拆开;按语义单元切分又需要处理跨页表格和引用。一个可复用的记录应同时保存原文、清洗文本、结构路径和邻接关系,便于出现问题时回看。
领域知识工程还要记录“不知道”。术语可以有 unknown 状态,关系可以标记待确认,来源可以标记冲突。强行把不确定资料转成确定事实,会让模型在回答时掩盖争议。数据层明确表示缺失和冲突,模型才有机会把它们作为答案的一部分。
版本是领域数据的时间轴。每次修订都保留版本号、生效时间、失效时间和变更摘要;不可变的原始文件与可搜索的派生文本分开保存。检索结果应携带版本信息,回答引用也应显示版本。这样用户才能判断一个结论是否适用于当前日期。
数据来源的排序要与任务合同一致。内部已批准制度可能优先于公开博客,现行法规优先于旧版本,实验原始记录优先于二次解读,经过校准的传感器优先于人工估算。优先级不能只写在提示词里,还要体现在检索过滤器、冲突处理器和评估样例中。
本小节的重点不是“把所有知识结构化”,而是先让重要知识有身份、有边界、有时间和有证据。结构化程度可以逐步增加,但来源和版本从第一天就不能缺失。
| 字段 | 用途 | 例子 | 缺失时的风险 |
|---|---|---|---|
| source_id | 定位原始来源 | policy-2026-04-17 | 无法追责或回查 |
| entity_id | 区分同名实体 | drug:1234 | 实体混淆 |
| definition | 统一术语含义 | 年化收益率定义 | 回答口径漂移 |
| valid_from/to | 表达时效 | 2026-01-01 至今 | 引用过期规则 |
| provenance | 记录生产过程 | 人工审核、版本、工具 | 无法解释差异 |
| privacy_class | 控制访问与脱敏 | internal / sensitive | 越权泄露 |
每一步都保留前一步的引用关系;索引不是新的事实来源,删除或撤回时必须能沿链路找到原始记录。
from dataclasses import dataclass
from datetime import date
from typing import Optional
@dataclass(frozen=True)
class KnowledgeRecord:
source_id: str
title: str
text: str
valid_from: date
valid_to: Optional[date]
privacy_class: str
reviewed_by: Optional[str]
def is_current(record: KnowledgeRecord, at: date) -> bool:
return record.valid_from <= at and (
record.valid_to is None or at <= record.valid_to
)
record = KnowledgeRecord(
source_id="policy-2026-04",
title="数据访问制度",
text="仅允许经过授权的读取操作。",
valid_from=date(2026, 4, 1),
valid_to=None,
privacy_class="internal",
reviewed_by="expert-01",
)
print(is_current(record, date(2026, 8, 30)))13.2.2 标注、元数据与数据质量
标注的价值不在于给每条资料增加一个漂亮标签,而在于把任务需要的判断显式化。问答数据可以标注问题类型、证据跨度和不可回答原因;分类数据要标明标签定义、边界例子和多标签关系;科学数据要保存测量方法、单位、仪器和误差。没有标注规范,模型学到的可能只是标注人的习惯。
一份标注指南应先列正例,再列反例和难例。只写“有风险就标为风险”不够,必须说明什么证据算风险、相似条款如何区分、资料缺失时返回什么。指南还要规定两名标注者意见不一致时如何讨论、谁有最终裁决权以及规范多久复审一次。
元数据是数据的上下文。它描述作者、时间、地点、业务流程、单位、设备、权限、语言、质量等级和处理步骤。训练前可以把元数据转成过滤条件或特殊字段,评估时可以按元数据切片。很多看似随机的错误,实际上集中发生在某个来源、时间段或设备上。
质量检查既要看内容,也要看结构。内容检查包括空值、乱码、重复、敏感信息和事实冲突;结构检查包括字段类型、主键、单位、时间格式、嵌套层级和引用完整性。先做便宜的规则检查,再做抽样人工检查和模型辅助检查,能避免把明显垃圾送进昂贵的训练流程。
重复数据会造成虚高的评估分数。相同文档的不同切片可能同时出现在训练集和测试集,模板化问答也可能让模型记住答案。划分数据时要以文档、患者、实验批次或时间窗口为单位去重,而不是只比较字符串。对科学数据尤其要防止同一实验的相邻帧跨集合泄漏。
质量不是一次性的“清洗完成”。新增数据、供应商变更、解析器升级和脱敏规则调整都会改变分布。应为每个数据集保存质量报告:记录数、缺失率、重复率、语言分布、标签分布、敏感字段计数、版本差异和抽样结论。报告本身也进入版本控制,方便比较变化。
标注预算有限时,优先标注最能区分方案的样本。高不确定样本、边界样本、失败日志和少数群体样本通常比再增加大量简单正例更有价值。主动学习可以帮助挑选样本,但最终标签仍需由合适的领域人员确认,不能把模型自己的猜测当作金标准。
本小节完成的标志是:任何一条训练或评估记录都能回答“它来自哪里、谁在什么时候怎样标注、质量如何、能否撤回”。做到这一点,模型训练才有可解释的输入。
| 层级 | 检查项目 | 常用方法 | 失败处理 |
|---|---|---|---|
| 语法 | 字段、编码、日期、单位 | Schema、正则、解析器 | 隔离并生成错误报告 |
| 完整 | 空值、引用、主键 | 规则统计、外键检查 | 补齐、标记 unknown 或退回 |
| 一致 | 术语、标签、版本 | 词表、冲突检测、抽样 | 进入专家复核队列 |
| 代表 | 时间、来源、群体、批次 | 切片统计、分布比较 | 补采样或限制适用范围 |
| 隐私 | 个人信息、机密字段 | 模式识别、人工抽检 | 脱敏、最小权限、删除 |
标注分歧如何变成训练资产
不要只保留最终标签。保存候选标签、分歧原因、裁决文本和规范版本,未来可以把高分歧样本作为回归集。若规范修改,重新运行旧样本,才能知道模型改进来自数据还是来自口径变化。
对于“无法判断”的样本,设置明确标签并保留原因比强行二选一更诚实。模型学习到合适的拒答边界后,线上系统反而更安全。
from collections import Counter
from dataclasses import dataclass
@dataclass
class QualityReport:
total: int
missing_text: int
duplicate_ids: int
label_counts: Counter
def inspect(rows: list[dict]) -> QualityReport:
ids = [row.get("id") for row in rows]
texts = [row.get("text", "").strip() for row in rows]
labels = Counter(row.get("label", "unknown") for row in rows)
return QualityReport(
total=len(rows),
missing_text=sum(not text for text in texts),
duplicate_ids=len(ids) - len(set(ids)),
label_counts=labels,
)
rows = [
{"id": "a", "text": "有证据", "label": "supported"},
{"id": "b", "text": "", "label": "unknown"},
{"id": "b", "text": "重复编号", "label": "supported"},
]
print(inspect(rows))13.2.3 许可、隐私与可撤回的数据生命周期
行业数据经常同时包含版权、合同保密和个人信息。能够访问不代表可以用于训练,能够训练也不代表可以展示给所有用户。数据台账需要把许可、用途限制、保存期限、地域要求、脱敏方式和删除联系人写出来。对于论文和公开网页,也要尊重原始许可和引用要求。
隐私保护要贯穿采集、处理、训练、检索、日志和删除。脱敏不是简单替换姓名;日期、地点、罕见疾病、设备编号和文本组合仍可能重新识别个体。应按任务需要最小化字段,分别控制原始数据、脱敏数据、向量索引和运行日志的访问,定期验证删除请求是否真正传播到派生副本。
训练数据进入权重后,撤回会比删除文件困难得多。高敏感或高撤回概率资料应优先采用检索、受控适配器或临时上下文,而不是直接混入基础模型。即使使用 RAG,也要记录索引版本、缓存和日志,避免被撤回的片段继续出现在系统输出中。
科学数据也有伦理和合规边界。患者样本、基因组序列、地理敏感数据、实验室内部结果和未发表成果可能不能公开。发布模型时应考虑模型是否记忆训练样本、是否能反推出敏感属性、是否会泄露实验条件。模型卡和数据说明书应如实写出已知限制,而不是只展示最佳指标。
许可判断应由懂业务和法律的人参与。工程师可以自动收集域名、许可证和文件哈希,但不能把一个许可证自动解释成所有用途都允许。数据供应商的合同也可能限制再分发、衍生模型和跨区域处理。无法确认时应先隔离,写清待核验问题和临时替代数据。
删除与更正必须可验证。建立数据血缘图,记录原始文件到清洗记录、切片、向量、训练快照和缓存的关系;执行删除后重新跑检查,确认搜索不到、日志不再暴露、发布包没有包含受限内容。对已经训练的权重,设计补训、适配器撤载或停止使用的策略,并在合同中说明无法完全撤回的边界。
隐私和许可不是上线前的文档工作,而是影响架构选择的约束。它们可能决定数据放在哪里、谁能调用模型、是否需要本地部署、是否保留会话以及能否使用第三方 API。提前做数据影响评估,通常比上线后补救更省成本。
本小节的迁移点是:数据质量回答“能不能学好”,许可和隐私回答“能不能这样学”。领域模型的可靠性必须同时满足这两个问题。
| 阶段 | 必须记录 | 典型控制 | 验收问题 |
|---|---|---|---|
| 采集 | 来源、许可、时间、负责人 | 白名单、合同、哈希 | 允许此用途吗? |
| 处理 | 脚本版本、字段变化 | 脱敏、最小化、血缘 | 删掉原始值了吗? |
| 训练/索引 | 快照、参数、数据范围 | 隔离、访问控制、抽样审计 | 能定位影响哪些模型吗? |
| 运行 | 请求、检索、输出版本 | 最小日志、加密、留存期限 | 撤回后还会返回吗? |
| 退出 | 删除工单、验证结果 | 级联删除、停用权重或适配器 | 有可复现的证明吗? |
隐私审查的三个反例
把身份证号替换成同一个“匿名用户”会保留可关联性;把罕见地点和日期保留在文本中仍可能识别;只删除训练集而保留向量索引和缓存也不能算完成删除。
反例的作用不是吓退项目,而是帮助确定最小必要数据。若任务只需要年龄段、月份和地区层级,就不要把精确生日、时间和地址传给模型。
from dataclasses import dataclass, field
@dataclass
class Lineage:
children: dict[str, set[str]] = field(default_factory=dict)
def add(self, parent: str, child: str) -> None:
self.children.setdefault(parent, set()).add(child)
def descendants(self, source: str) -> set[str]:
seen = set()
todo = [source]
while todo:
node = todo.pop()
for child in self.children.get(node, set()):
if child not in seen:
seen.add(child)
todo.append(child)
return seen
lineage = Lineage()
lineage.add("raw-01", "clean-01")
lineage.add("clean-01", "chunk-01")
lineage.add("chunk-01", "index-01")
print(sorted(lineage.descendants("raw-01")))本节完成验收
完成本节后,应能为一批领域资料建立来源、术语、版本、质量、许可和隐私字段,并说明撤回如何沿数据血缘传播。验收时抽取一条记录,要求读者在不打开原始文件的情况下回答它的来源、当前有效期、标注规范和删除影响范围。
为一个法规库设计六个元数据字段,并给出一条过期法规和一条冲突法规。
参考结论:可区分来源、版本、生效期;检索不会把过期条款当作当前规则。
完整实现路径:为每条领域数据保存来源、许可、有效期、单位、实体 ID 和血缘;质量报告必须可重跑。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
from collections import Counter
def data_quality(rows):
ids = [r["id"] for r in rows]
return {
"rows": len(rows),
"duplicate_ids": len(ids) - len(set(ids)),
"missing_source": sum(not r.get("source_id") for r in rows),
"missing_unit": sum(r.get("value") is not None and not r.get("unit") for r in rows),
"labels": dict(Counter(r.get("label") for r in rows)),
}
report = data_quality(rows)
assert report["duplicate_ids"] == report["missing_source"] == 0验收标准:重复、缺失、分布、冲突和删除请求都有审计证据。
若结果不对:从原始快照沿血缘逐层对账,禁止直接修最终表。
写一个质量报告,统计空文本、重复 ID、标签分布和敏感字段命中数。
参考结论:异常记录隔离;报告可保存并在下一版本比较。
完整实现路径:为每条领域数据保存来源、许可、有效期、单位、实体 ID 和血缘;质量报告必须可重跑。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
from collections import Counter
def data_quality(rows):
ids = [r["id"] for r in rows]
return {
"rows": len(rows),
"duplicate_ids": len(ids) - len(set(ids)),
"missing_source": sum(not r.get("source_id") for r in rows),
"missing_unit": sum(r.get("value") is not None and not r.get("unit") for r in rows),
"labels": dict(Counter(r.get("label") for r in rows)),
}
report = data_quality(rows)
assert report["duplicate_ids"] == report["missing_source"] == 0验收标准:重复、缺失、分布、冲突和删除请求都有审计证据。
若结果不对:从原始快照沿血缘逐层对账,禁止直接修最终表。
画出一条从原始 CSV 到向量索引的血缘链,并设计删除验证。
参考结论:清洗文件、切片、索引和缓存都在删除范围内。
完整实现路径:为每条领域数据保存来源、许可、有效期、单位、实体 ID 和血缘;质量报告必须可重跑。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
from collections import Counter
def data_quality(rows):
ids = [r["id"] for r in rows]
return {
"rows": len(rows),
"duplicate_ids": len(ids) - len(set(ids)),
"missing_source": sum(not r.get("source_id") for r in rows),
"missing_unit": sum(r.get("value") is not None and not r.get("unit") for r in rows),
"labels": dict(Counter(r.get("label") for r in rows)),
}
report = data_quality(rows)
assert report["duplicate_ids"] == report["missing_source"] == 0验收标准:重复、缺失、分布、冲突和删除请求都有审计证据。
若结果不对:从原始快照沿血缘逐层对账,禁止直接修最终表。
知识工程推演与排错
在领域知识工程中,第 1 个观察点是:术语表既要供人阅读,也要供机器使用,因此需要定义、别名、稳定 ID、类型、来源和有效期。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“术语表既要供人阅读,也要供机器使用,因此需要定义、别名、稳定 ID、类型、来源和有效期”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 2 个观察点是:本体从任务必需的关系开始,先描述条款、定义、例外或样本、批次、仪器等最小结构。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“本体从任务必需的关系开始,先描述条款、定义、例外或样本、批次、仪器等最小结构”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 3 个观察点是:PDF、扫描件、表格和脚注的解析不确定性必须保留,清洗文本只能作为可追溯的派生结果。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“PDF、扫描件、表格和脚注的解析不确定性必须保留,清洗文本只能作为可追溯的派生结果”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 4 个观察点是:来源优先级应变成过滤规则,检索前先判断权威级别、法域、版本和允许引用粒度。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“来源优先级应变成过滤规则,检索前先判断权威级别、法域、版本和允许引用粒度”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 5 个观察点是:同名术语可能是真实的上下文差异,应记录角色和来源,而不是强行合并成一个释义。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“同名术语可能是真实的上下文差异,应记录角色和来源,而不是强行合并成一个释义”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 6 个观察点是:科学数值必须绑定单位、条件、误差和有效范围,孤立的数字无法支撑模型判断。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“科学数值必须绑定单位、条件、误差和有效范围,孤立的数字无法支撑模型判断”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 7 个观察点是:质量报告要同时给统计和样例,缺失率、重复率和乱码类型需要能回到具体记录。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“质量报告要同时给统计和样例,缺失率、重复率和乱码类型需要能回到具体记录”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 8 个观察点是:标注规范要包含正例、反例、难例、分歧处理和裁决人,不能只写一句模糊定义。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“标注规范要包含正例、反例、难例、分歧处理和裁决人,不能只写一句模糊定义”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 9 个观察点是:数据版本要比较记录 ID、字段差异、脚本版本和索引版本,避免把处理变化误判成知识变化。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“数据版本要比较记录 ID、字段差异、脚本版本和索引版本,避免把处理变化误判成知识变化”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域知识工程中,第 10 个观察点是:删除请求要沿原始文件、切片、向量、缓存和日志的血缘传播,并能用测试证明已经撤回。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“删除请求要沿原始文件、切片、向量、缓存和日志的血缘传播,并能用测试证明已经撤回”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 术语 | 输入同名实体 | 回答混淆 | 要求实体 ID |
| 3 | 质量 | 注入重复和空值 | 统计不变 | 隔离记录 |
| 4 | 隐私 | 执行删除工单 | 派生索引仍命中 | 级联删除 |
本页反向检查
任何一条训练或检索记录都应能回答来自哪里、谁处理、质量如何以及能否撤回;只知道文件名不算完成。
新旧版本比较要保存哈希、记录 ID、字段差异和处理脚本;向量索引还要保存切片与嵌入版本。
许可和隐私可以作为构建质量门:未确认许可不入训练快照,未脱敏记录不入共享索引。
完成验收看的是别人能否从一条记录回到原始来源,并解释它为何在当前任务中可用。
知识工程复盘案例
在领域知识管线的复查中,第 1 个问题是“同名实体能否通过 ID 和上下文区分”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“同名实体能否通过 ID 和上下文区分”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域知识管线的复查中,第 2 个问题是“文档表格和脚注解析后是否仍能回到页码”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“文档表格和脚注解析后是否仍能回到页码”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域知识管线的复查中,第 3 个问题是“术语定义变化后旧版本是否仍可检索”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“术语定义变化后旧版本是否仍可检索”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域知识管线的复查中,第 4 个问题是“标注者分歧能否回到规范和裁决记录”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“标注者分歧能否回到规范和裁决记录”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域知识管线的复查中,第 5 个问题是“重复切片是否被识别并阻止跨集合泄漏”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“重复切片是否被识别并阻止跨集合泄漏”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域知识管线的复查中,第 6 个问题是“删除原始资料后向量和缓存是否不再命中”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“删除原始资料后向量和缓存是否不再命中”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域知识管线的复查中,第 7 个问题是“数字字段是否带单位、误差和有效范围”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“数字字段是否带单位、误差和有效范围”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 来源 | 替换文件版本 | 索引仍混用 | 重建并回归 |
| 术语 | 输入同名实体 | 回答混淆 | 要求实体 ID |
| 质量 | 注入重复和空值 | 统计不变 | 隔离记录 |
| 隐私 | 执行删除工单 | 派生索引仍命中 | 级联删除 |
本页反向检查
任何训练或检索记录都要能回答来自哪里、谁处理、质量如何以及能否撤回;只知道文件名不算完成。
新旧版本比较保存哈希、记录 ID、字段差异和处理脚本;向量索引还要保存切片与嵌入版本。
许可和隐私作为构建质量门:未确认许可不入训练快照,未脱敏记录不入共享索引。
完成验收看别人能否从记录回到原始来源,并解释它为何在当前任务中可用。
选择改变权重还是改变上下文
13.3 · 领域适配:继续预训练、微调与检索
领域适配没有唯一答案。继续预训练适合吸收稳定的语言分布,监督微调适合学习任务格式,参数高效微调控制成本,检索增强则适合需要频繁更新和逐条引用的知识。本节比较这些路径,并建立可复现的选择方法。
13.3.1 领域继续预训练:让模型熟悉领域语言
继续预训练(domain-adaptive pretraining)是在通用模型上使用领域无标注语料继续训练,让模型适应术语、句式、文档结构和知识分布。它不是把一本手册完整背进模型,而是调整参数,使模型更容易预测领域文本。研究工作显示,合理的领域和任务继续预训练可以提升下游表现,但收益依赖数据质量、任务距离和训练配方。
适合继续预训练的语料通常具有稳定、广覆盖和高复用的特征,例如大量医学论文、法规文本、设备手册或科研记录。若资料只有少量、变化很快或必须逐条引用,把它们写进权重往往不划算。预训练会混合来源,难以回答某句话来自哪个版本,也难以迅速撤回一条记录。
训练前要处理重复、泄漏、过期、隐私和文档结构。按文档或主体划分训练、验证和测试,避免同一合同、患者或实验批次跨集合。保留原始 token 统计、序列长度分布和来源切片,才能判断模型是否只是记住了少数长文档。训练曲线下降并不等于领域能力可靠。
灾难性遗忘是继续预训练的核心风险。模型可能更会说专业术语,却退化通用语言、指令遵循或安全拒答。可以混入一部分通用语料、设置较小学习率、控制训练步数,并在通用回归集上持续评估。领域性能和通用性能之间没有固定比例,需要依据产品任务做选择。
数据量不足时,继续预训练可能让模型过拟合风格。它会复制某个机构的固定措辞,却没有真正学到跨来源的概念。此时应先做检索基线和小规模适配器实验,用真实任务比较,而不是凭主观感觉决定训练更久。
科学领域还要注意符号和单位。文本预训练可以学会变量共现,却不一定学会方程的可行域、边界条件或量纲一致性。若任务需要物理约束,应把结构化字段、公式、网格或轨迹以合适表示加入模型,或者把计算交给可验证的数值工具。
成本评估包括 GPU 时间、数据管线、检查点存储、评估和后续重新训练。一次大训练如果不能稳定复现,可能比维护检索索引更贵。建立小规模试验,记录随机种子、基础模型哈希、数据快照和超参数,先回答“是否值得继续”再扩大规模。
本小节的原则是:继续预训练改变模型的先验分布,最适合稳定、广泛、允许进入权重的知识;它不是所有领域知识问题的默认解。
| 问题 | 倾向继续预训练 | 倾向检索或适配器 |
|---|---|---|
| 资料是否稳定 | 多年积累、变化缓慢 | 每天更新、需要撤回 |
| 资料规模 | 足够覆盖多种表达 | 数量少、任务很窄 |
| 是否需要引用 | 主要学习语言风格 | 每个事实都要有来源 |
| 隐私与许可 | 可明确用于训练 | 敏感、用途受限 |
| 收益证据 | 小试验显示跨来源提升 | 只在少数模板上变好 |
从便宜、可回滚的方案开始;只有当基线不能满足稳定任务且数据许可明确时,才进入更重的权重训练。
from dataclasses import dataclass
from hashlib import sha256
@dataclass(frozen=True)
class TrainingManifest:
base_model: str
data_snapshot: str
seed: int
max_steps: int
domain_ratio: float
def fingerprint(self) -> str:
text = "|".join([
self.base_model, self.data_snapshot, str(self.seed),
str(self.max_steps), str(self.domain_ratio),
])
return sha256(text.encode("utf-8")).hexdigest()[:12]
manifest = TrainingManifest("base-7b", "domain-2026-08-30", 7, 1200, 0.35)
print(manifest.fingerprint())13.3.2 SFT、LoRA 与适配器:学习任务而非死记资料
监督微调(SFT)用带输入、指令、输出或偏好信号的数据调整模型,使它遵守领域格式、语气、工具协议和拒答边界。它更像教模型“怎样完成任务”,而不是向模型灌入所有事实。一个合格样本应包含任务背景、允许依据的资料、期望字段、证据形式和错误时的行为。
参数高效微调(PEFT)只训练一小部分新增参数。LoRA 在冻结基础权重的情况下学习低秩更新,能够降低显存和存储成本,也便于为不同部门或任务保存多个适配器。低成本不意味着低风险:适配器同样可能学到错误规范、泄露训练文本或与基础模型的许可证不兼容。
SFT 数据应覆盖正常、边界、拒答和纠错样本。只训练“回答得很完整”的例子,会让模型在资料不足时继续编造。可以加入“证据不足”“法域不符”“单位缺失”“权限不足”等输入,并把理想输出写成可检查的结构化结果,而不是一句泛泛的“请谨慎”。
多适配器并存时,要明确路由条件和冲突策略。医疗助手、客服助手和科研助手可能共享基础模型,但不能让一个适配器未经检查处理另一个领域的输入。路由器应根据任务合同、用户权限和数据来源选择适配器,并在日志中记录版本。
微调前后都要做通用能力回归。领域样本很窄,模型可能变得更愿意使用专业术语,却忘记基本指令、语言切换或安全限制。评估应包括格式准确率、证据完整率、拒答正确率、工具调用成功率和通用回归,不要只看训练损失。
偏好优化或人工反馈可以改善答案风格,但偏好分数不等于事实正确。专家更喜欢一段流畅解释,并不代表其中的引用和计算没有问题。高风险任务应把事实、规则和工具结果作为独立指标,必要时使用程序校验,而不是把所有标准压成一个奖励。
适配器的生命周期要像软件包一样管理:记录基础模型、训练数据、超参数、评估集、兼容版本和撤载方式。上线时可以灰度到一小部分任务,发现特定切片退化就快速关闭适配器,而不用回滚整个基础服务。
本小节的关键判断是:微调改变的是模型完成任务的习惯。把事实更新、证据和权限问题留给检索与工具,把稳定的格式和领域行为交给适配器,系统才容易维护。
| 方案 | 学习对象 | 优点 | 常见风险 | 适用场景 |
|---|---|---|---|---|
| 全参数 SFT | 全部权重的任务行为 | 上限高、能力统一 | 成本高、难回滚、易遗忘 | 数据充分且任务核心 |
| LoRA/Adapter | 小规模低秩更新 | 便宜、可切换、可并存 | 路由冲突、领域过拟合 | 部门、任务或版本隔离 |
| 提示模板 | 上下文中的格式要求 | 立即可试、无需训练 | 长上下文、遵循不稳定 | 基线与快速迭代 |
| RAG | 运行时提供事实 | 可引用、易更新 | 检索错、上下文噪声 | 时效知识与受控资料 |
一条训练样本应能被审阅
输入写清用户角色、任务和资料范围;输出不仅有答案,还要有字段、证据 ID 和无法判断时的状态。审阅者应能指出每个结论对应哪段资料,不能只凭“看起来合理”打分。
为每个任务保留最少一个反例:资料明确反驳用户前提、同名实体冲突、权限不足或要求越权操作。反例是边界的训练信号,不是噪声。
from dataclasses import dataclass
@dataclass(frozen=True)
class Request:
domain: str
task: str
user_role: str
ADAPTERS = {
("medical", "summary"): "med-summary-v3",
("science", "experiment"): "science-plan-v2",
}
def choose_adapter(request: Request) -> str:
key = (request.domain, request.task)
adapter = ADAPTERS.get(key)
if adapter is None:
return "base-safe"
if request.user_role not in {"expert", "reviewer"}:
return "base-safe"
return adapter
print(choose_adapter(Request("medical", "summary", "reviewer")))13.3.3 RAG、混合策略与通用能力保持
检索增强生成(RAG)把事实放在运行时上下文中。它的优势是资料可更新、来源可展示、权限可控制;代价是检索可能找错、上下文可能过长、模型可能忽略证据。RAG 不是“向量数据库加一个提示词”,而是一条包含查询改写、过滤、召回、重排、拼接、生成和引用校验的管线。
混合检索通常比单一相似度更稳。关键词检索能找到精确条款、编号和变量名,向量检索能找到语义相近的表达,元数据过滤能保证时间、法域和权限,重排器则把最有用的片段放到前面。不同任务的组合权重应通过离线样本校准,而不是凭感觉固定。
检索质量要拆成召回和使用两部分。召回率问“正确证据有没有被找回来”,使用率问“模型有没有依据它回答”。即使 top-k 包含正确条款,模型也可能被相似但不适用的片段干扰。评估时应保存检索候选、最终引用和未使用证据,分别定位问题。
混合策略通常从 RAG 基线开始,随后用适配器学习查询改写、结构化输出和拒答格式;继续预训练只承担稳定语言分布。这样的分工可解释、可回滚。对于高时效法规或内部制度,宁可增加检索与版本控制,也不要为了减少提示词长度而把全部知识固化在权重里。
保持通用能力需要设置回归集。它不应该只是通用问答,还要覆盖语言、数学、代码、拒答、工具协议和安全边界。领域适配后出现的“专业化”有时是模型不再理解普通用户的表达,或者把领域术语滥用于非领域问题,这些都应在回归集里暴露。
线上路由可以根据置信信号和任务风险选择策略。低风险且资料稳定的格式化任务走适配器;需要最新事实的任务走 RAG;高风险任务同时要求检索、程序校验和专家确认。策略选择也要进入日志,否则出现错误时无法知道是模型、检索还是路由导致。
迁移学习的成功标准不是某个单一 benchmark 的提升,而是单位成本下真实任务的改善。记录请求延迟、token、检索命中、人工修改率和错误类型,才能判断更复杂的管线是否真正减少工作量。模型升级时要重放同一批请求,保证比较公平。
本小节完成后,你应该能解释“为什么这条知识放检索而不是权重”,并能为一个领域任务做出有证据的适配决策。
| 放置位置 | 更新速度 | 可引用性 | 可撤回性 | 主要风险 |
|---|---|---|---|---|
| 提示词 | 快 | 高 | 高 | 长度和遵循不稳定 |
| RAG 索引 | 快 | 高 | 高 | 检索错、权限漏 |
| 适配器 | 中 | 低 | 中高 | 格式过拟合、路由错 |
| 基础权重 | 慢 | 低 | 低 | 记忆难追踪、通用能力退化 |
| 确定性工具 | 按接口 | 高 | 高 | 接口和参数校验不足 |
把每一站的输入输出保存为可重放记录,才能区分“没有召回”与“召回后没有使用”。
from dataclasses import dataclass
@dataclass(frozen=True)
class Chunk:
id: str
text: str
keyword_score: float
vector_score: float
valid: bool
def rank(chunks: list[Chunk], alpha: float = 0.55) -> list[Chunk]:
usable = [chunk for chunk in chunks if chunk.valid]
return sorted(
usable,
key=lambda chunk: alpha * chunk.keyword_score
+ (1 - alpha) * chunk.vector_score,
reverse=True,
)
chunks = [
Chunk("policy-1", "当前制度", 0.9, 0.62, True),
Chunk("policy-old", "旧制度", 0.95, 0.60, False),
Chunk("policy-2", "相关条款", 0.5, 0.88, True),
]
print([chunk.id for chunk in rank(chunks)])本节完成验收
完成本节后,应能针对一个领域任务比较提示词、RAG、适配器和继续预训练,写出数据快照、模型版本、评估集和回滚条件。验收时要求解释一次失败到底发生在召回、重排、生成还是策略路由,并给出最小修复而不是直接换更大模型。
为“现行制度问答”设计 RAG 基线,规定版本过滤、引用格式和证据不足时的输出。
参考结论:过期资料不会进入候选;答案能回链到片段;无证据时拒答。
完整实现路径:用任务稳定性决定 RAG、继续预训练或 SFT;任何路线都要冻结回归集和版本化提示/适配器。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
from datetime import date
def eligible_documents(docs, query_date, jurisdiction):
chosen = []
for doc in docs:
if doc["jurisdiction"] != jurisdiction: continue
if date.fromisoformat(doc["effective_at"]) > query_date: continue
if doc.get("expires_at") and date.fromisoformat(doc["expires_at"]) < query_date: continue
chosen.append(doc)
return chosen
result = eligible_documents(docs, date(2026, 8, 31), "CN")
assert all(d["jurisdiction"] == "CN" for d in result)验收标准:通用能力、领域能力、引用正确和拒答边界一起评估。
若结果不对:先排查检索和知识时效,再判断是否真需要改权重。
制作 20 条 SFT 样本,其中至少 5 条是边界或拒答样本。
参考结论:输出字段稳定;每条结论都有依据;样本不把事实和格式要求混在一起。
完整实现路径:用任务稳定性决定 RAG、继续预训练或 SFT;任何路线都要冻结回归集和版本化提示/适配器。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
from datetime import date
def eligible_documents(docs, query_date, jurisdiction):
chosen = []
for doc in docs:
if doc["jurisdiction"] != jurisdiction: continue
if date.fromisoformat(doc["effective_at"]) > query_date: continue
if doc.get("expires_at") and date.fromisoformat(doc["expires_at"]) < query_date: continue
chosen.append(doc)
return chosen
result = eligible_documents(docs, date(2026, 8, 31), "CN")
assert all(d["jurisdiction"] == "CN" for d in result)验收标准:通用能力、领域能力、引用正确和拒答边界一起评估。
若结果不对:先排查检索和知识时效,再判断是否真需要改权重。
做一个适配前后回归表,包含领域指标和通用能力指标。
参考结论:记录基础模型、数据快照、随机种子;退化时有停止或回滚条件。
完整实现路径:用任务稳定性决定 RAG、继续预训练或 SFT;任何路线都要冻结回归集和版本化提示/适配器。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
from datetime import date
def eligible_documents(docs, query_date, jurisdiction):
chosen = []
for doc in docs:
if doc["jurisdiction"] != jurisdiction: continue
if date.fromisoformat(doc["effective_at"]) > query_date: continue
if doc.get("expires_at") and date.fromisoformat(doc["expires_at"]) < query_date: continue
chosen.append(doc)
return chosen
result = eligible_documents(docs, date(2026, 8, 31), "CN")
assert all(d["jurisdiction"] == "CN" for d in result)验收标准:通用能力、领域能力、引用正确和拒答边界一起评估。
若结果不对:先排查检索和知识时效,再判断是否真需要改权重。
适配实验推演与排错
在领域适配实验中,第 1 个观察点是:任何训练前先冻结通用模型、提示词、检索和评估集,形成可以重跑的基线。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“任何训练前先冻结通用模型、提示词、检索和评估集,形成可以重跑的基线”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 2 个观察点是:继续预训练适合稳定、广覆盖、许可清楚的领域语言,不适合频繁变化且必须逐条引用的事实。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“继续预训练适合稳定、广覆盖、许可清楚的领域语言,不适合频繁变化且必须逐条引用的事实”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 3 个观察点是:领域语料与通用语料的比例会影响遗忘,训练中要同时观察领域指标、安全行为和通用回归。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“领域语料与通用语料的比例会影响遗忘,训练中要同时观察领域指标、安全行为和通用回归”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 4 个观察点是:SFT 样本要把资料、输出字段、证据格式、拒答状态和工具协议分层表达。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“SFT 样本要把资料、输出字段、证据格式、拒答状态和工具协议分层表达”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 5 个观察点是:LoRA 等适配器便于隔离任务,但路由器仍要校验领域、用户角色、兼容版本和加载条件。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“LoRA 等适配器便于隔离任务,但路由器仍要校验领域、用户角色、兼容版本和加载条件”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 6 个观察点是:RAG 需要分别评估召回、重排、生成和引用使用,不能用一个总体分数掩盖中间环节。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“RAG 需要分别评估召回、重排、生成和引用使用,不能用一个总体分数掩盖中间环节”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 7 个观察点是:上下文片段太多会制造冲突,top-k、版本过滤和重排权重要靠离线样本校准。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“上下文片段太多会制造冲突,top-k、版本过滤和重排权重要靠离线样本校准”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 8 个观察点是:回归集要包含领域外数学、代码、语言切换和安全拒答,避免专业化变成通用能力退化。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“回归集要包含领域外数学、代码、语言切换和安全拒答,避免专业化变成通用能力退化”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 9 个观察点是:训练日志应记录数据快照、去重规则、序列长度、学习率、随机种子、硬件和代码版本。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“训练日志应记录数据快照、去重规则、序列长度、学习率、随机种子、硬件和代码版本”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域适配实验中,第 10 个观察点是:适配没有收益时先查样本代表性、标签一致性、数据泄漏和任务合同,不要盲目增加训练步数。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“适配没有收益时先查样本代表性、标签一致性、数据泄漏和任务合同,不要盲目增加训练步数”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 适配 | 加入拒答样本 | 仍在编造 | 补边界样本 |
| 3 | 回归 | 运行通用题 | 领域外退化 | 调整配比 |
| 4 | 成本 | 记录 token 与审核 | 收益不抵成本 | 缩小模型/路由 |
本页反向检查
微调数据要防止把专家个人风格误当领域标准,共同规则与部门差异应分层,必要时用不同适配器隔离。
候选包含正确证据但答案错误时,问题在证据使用;候选没有正确证据时,先查切分、版本和召回。
每次实验只改变少量变量并保留失败结果;失败样本往往最能说明模型何时应拒答。
验收要求写出一张选择矩阵,并用真实任务证明事实放检索、格式放适配器、稳定语言分布才考虑继续预训练。
适配实验复盘案例
在领域适配路线的复查中,第 1 个问题是“不训练基线能否在相同数据上重跑”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“不训练基线能否在相同数据上重跑”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域适配路线的复查中,第 2 个问题是“继续预训练是否造成通用能力和安全拒答退化”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“继续预训练是否造成通用能力和安全拒答退化”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域适配路线的复查中,第 3 个问题是“SFT 输出是否稳定包含字段、证据和状态”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“SFT 输出是否稳定包含字段、证据和状态”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域适配路线的复查中,第 4 个问题是“适配器路由是否检查用户角色和兼容版本”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“适配器路由是否检查用户角色和兼容版本”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域适配路线的复查中,第 5 个问题是“RAG 候选正确但答案错误时能否定位使用环节”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“RAG 候选正确但答案错误时能否定位使用环节”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域适配路线的复查中,第 6 个问题是“上下文长度变化是否同时影响引用和延迟”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“上下文长度变化是否同时影响引用和延迟”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域适配路线的复查中,第 7 个问题是“失败样本能否进入下一轮回归而不是被删除”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“失败样本能否进入下一轮回归而不是被删除”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 基线 | 固定提示与索引 | 无法重跑 | 冻结清单 |
| 适配 | 加入拒答样本 | 仍在编造 | 补边界样本 |
| 回归 | 运行通用题 | 领域外退化 | 调整配比 |
| 成本 | 记录 token 与审核 | 收益不抵成本 | 缩小模型/路由 |
本页反向检查
微调数据防止把专家个人风格误当领域标准,共同规则与部门差异应分层,必要时用适配器隔离。
候选包含正确证据但答案错误时问题在证据使用;候选没有正确证据时先查切分、版本和召回。
每次实验只改变少量变量并保留失败结果;失败样本往往最能说明模型何时应拒答。
验收要求写出选择矩阵,并用真实任务证明事实放检索、格式放适配器、稳定分布才考虑继续预训练。
专业建议必须留在证据和责任链里
13.4 · 医疗大模型:从临床问题到安全辅助
医疗场景能清楚展示领域模型的高收益与高风险:资料形式复杂、术语密集、错误代价高、隐私要求严格。本节不把模型当作医生,而是从临床任务分解、证据引用、隐私、评估和人工复核出发,设计可控的医疗辅助系统。
13.4.1 临床任务分解:摘要、检索与决策支持
医疗问题首先要按任务拆开。病历摘要、检查报告结构化、患者教育、指南检索、用药核对和诊断决策支持的输入、输出和风险完全不同。摘要主要要求覆盖和忠实,检索要求最新版本和引用,用药核对要求药品、剂量、时间和禁忌的精确匹配,诊断支持则不能绕过有资质人员。
病历是多源、长时间、强上下文的数据。一个患者可能有门诊记录、检验、影像报告、手术记录和患者自述,时间线还可能包含重复或更正。系统应先做结构化时间线和来源标记,再生成摘要;直接把所有文本拼进提示词,会让模型忽略时间顺序和否定词。
医疗语言中的否定、条件和不确定性非常关键。“未见异常”“考虑感染”“排除某病”不能被压缩成同一个肯定标签。抽取任务要保留断言状态、主体、时间、证据和说话者。输出摘要时,模型也应区分已确认、待排查、患者报告和医生计划。
患者教育与临床决策支持要分开。患者教育可以用通俗语言解释已经确认的信息、提醒何时就医并鼓励咨询医生;决策支持可以整理指南、计算风险或列出需要核对的项目,但不直接替医生做最终诊断和处方决定。界面上也要让用户看出这是哪一种功能。
输入边界要明确。系统是否处理急诊?是否接受图片?是否允许患者自行上传?是否覆盖儿童、孕妇或罕见病?超出范围时,最安全的输出不是泛化建议,而是明确说明限制并提供人工或急救入口。范围越窄,评估和培训越能对齐。
临床流程中的时间和责任同样重要。住院交班摘要要标出生成时间和资料截止时间,门诊助手要显示新资料是否已纳入,药品核对要记录谁确认了差异。一个内容准确但时间戳错误的摘要,仍可能造成严重后果。
医疗系统还要考虑患者语言、识字水平和辅助功能。通俗解释不应删掉关键风险;翻译结果要标明可能的术语差异;语音或视觉辅助要有可追溯的原文。可访问性是临床安全的一部分,不是视觉润色。
本小节的学习成果是:能把“医疗问答”拆成具体任务,并为每个任务写出资料范围、输出格式、禁区和责任人。
| 任务 | 输入 | 输出 | 禁止自动完成 |
|---|---|---|---|
| 病历摘要 | 带时间和来源的记录 | 事实、时间线、证据 ID | 新增诊断或篡改原记录 |
| 指南检索 | 问题、法域、日期 | 条款、版本、适用条件 | 把检索结果当医嘱 |
| 用药核对 | 药品、剂量、频次、过敏史 | 差异清单与待确认项 | 直接修改处方 |
| 患者教育 | 已确认诊断与计划 | 通俗解释、警示和问题清单 | 替代面对面诊疗 |
| 影像辅助 | 经授权的影像和报告 | 候选区域与不确定性 | 独立作出最终诊断 |
每个摘要句子都应能回到原始记录;无法回链的推断必须标记为待确认,而不是写成既定事实。
from dataclasses import dataclass
from datetime import datetime
@dataclass(frozen=True)
class Event:
at: datetime
kind: str
text: str
source_id: str
certainty: str
def timeline(events: list[Event]) -> list[dict]:
ordered = sorted(events, key=lambda event: event.at)
return [
{
"at": event.at.isoformat(),
"kind": event.kind,
"text": event.text,
"source_id": event.source_id,
"certainty": event.certainty,
}
for event in ordered
]
events = [
Event(datetime(2026, 8, 1, 9), "lab", "血糖升高", "lab-01", "confirmed"),
Event(datetime(2026, 8, 1, 8), "note", "考虑感染", "note-02", "suspected"),
]
print(timeline(events))13.4.2 证据、隐私与临床责任
医疗回答的证据粒度应该接近临床使用方式。一个总的网页链接不够,审核人需要看到原始记录、指南条款或报告段落。引用应包含来源 ID、时间、版本和适用条件;模型如果综合多条资料,应分别标出哪些是事实、哪些是解释、哪些需要确认。
隐私保护要以最小必要为原则。患者姓名、身份证号、精确住址和与任务无关的社会信息不应进入模型上下文。脱敏后仍要防止同一患者的多条稀有信息被重新识别。权限控制要覆盖查询、提示词、缓存、向量索引、日志和导出,而不是只保护前端页面。
临床责任不能通过“仅供参考”一句话转移。系统设计必须规定谁有权查看、谁必须复核、哪些结果不能自动写回电子病历、出现紧急信号如何升级。警示信息要靠流程和界面实现,不能指望用户阅读一段通用免责声明后自行承担全部风险。
模型可能表现出令人信服的错误。它会把相似药名混淆、忽略否定、把旧指南当现行版本、把患者自述当确诊事实。防护包括结构化字段校验、药品和单位词典、时间过滤、证据覆盖率、异常词检测和专家抽样,而不是只调高温度或增加提示词。
人工复核界面应减少审阅负担。把原文、模型提取、差异和证据并排显示;允许一键接受、修改或退回;记录修改原因和审核者。这样复核数据可以回流为回归集,同时也能知道模型在哪些字段最常犯错。
高风险场景需要考虑公平性和代表性。训练数据可能偏向某年龄、性别、语言或医院,模型在少数群体上错误更高。评估应按人群、科室、设备、语言和病种切片,报告置信区间和样本量;没有足够数据时,应限制适用范围而不是宣称普遍有效。
医疗法规和机构政策会变化,系统需要版本化。模型版本、知识库版本、提示词、工具和界面规则共同构成一次发布。发生安全事件时,团队应能冻结新请求、查找受影响记录、通知责任人并回滚到上一版。
医疗场景最重要的专业性不是让模型给出更多建议,而是让每一个建议都有出处、有边界、有复核和有撤回路径。
临床回答的四层显示
第一层是简短结论,只说输入资料明确支持的内容;第二层是证据,显示记录编号、日期和片段;第三层是不确定性,列出缺失、冲突和适用条件;第四层是下一步,说明需要由谁确认或补充什么资料。
如果用户只看到第一层,就容易把候选解释当成诊断。界面应把证据和限制放在同一视觉区域,并对高风险结果默认展开人工复核。
| 检查 | 示例 | 通过条件 |
|---|---|---|
| 时间 | 资料截止到何时 | 界面明确显示并可筛选 |
| 否定 | 未见、排除、无过敏 | 状态被保留而非丢失 |
| 单位 | mg、mL、次/日 | 字段和范围校验通过 |
| 引用 | 记录或指南条款 | 每个关键结论可回链 |
| 权限 | 患者/医护/管理员 | 最小权限且有审计 |
| 升级 | 急症或高风险 | 自动提示人工或急救流程 |
from dataclasses import dataclass
@dataclass(frozen=True)
class Evidence:
source_id: str
quote: str
date: str
def answer(facts: list[Evidence], question: str) -> dict:
if not facts:
return {
"status": "insufficient_evidence",
"answer": "当前资料不足,不能给出确定结论。",
"next_step": "请补充记录并联系医护人员。",
}
return {
"status": "supported",
"answer": f"围绕“{question}”整理了 {len(facts)} 条资料。",
"evidence": [fact.source_id for fact in facts],
}
print(answer([], "是否需要调整用药"))13.4.3 评估:专家标准、患者安全与上线门槛
医疗模型的离线指标应服务于临床任务,而不是反过来决定任务。摘要可以评估事实覆盖、时间顺序、否定保真和人工修改率;检索可以评估关键条款召回、引用正确率和版本适用性;抽取可以评估字段级精确率、召回率和拒答准确率。ROUGE 或相似度只能作为辅助,不能证明临床安全。
专家评审要有结构化量表。评审者分别判断事实正确、证据充分、表达清楚、遗漏严重性、潜在危害和是否可接受,而不是只给一个总体分数。至少两名评审者独立打分,记录分歧和裁决规则。评审样本要包含常见、难例、异常和高风险切片。
患者安全事件应独立于质量指标追踪。一次严重遗漏可能只占很小比例,却足以阻止上线。建立事件等级、发现渠道、响应时限和复盘模板;把错误输出、输入资料、模型版本、检索片段和人工操作保存到受控环境,避免为了调查而扩大隐私暴露。
上线门槛应包含“必须达到”和“不得超过”两类条件。必须达到的包括关键字段覆盖、引用正确和审核通过率;不得超过的包括严重错误率、越权访问、无证据断言和连续失败。平均指标达标但关键切片超限时,发布应被阻止。
灰度发布可以让系统先处理低风险、低影响的任务,比较人工耗时和修改率,再逐步扩大范围。灰度期间保留人工基线,确保看到的改进不是因为任务变简单。监控包括输入分布、资料新鲜度、检索命中、拒答比例、用户修改和升级次数。
模型更新必须重放历史案例,并加入新发现的安全事件。任何指标变化都要追溯到数据、提示词、模型、工具或界面版本。对于无法解释的退化,宁可暂停发布,也不要用少量正向样本掩盖风险。
医疗评估最终要回答一个流程问题:在规定的人工和技术约束下,系统是否让专业人员更快、更准确、更容易发现风险?如果只是让文字更漂亮,却增加了审核负担或隐藏了不确定性,就不应算作成功。
本小节的验收不是拿到一个数字,而是形成一套可以复跑、可分层、可追责的临床评估流程。
| 指标类别 | 指标 | 阈值表达 | 触发动作 |
|---|---|---|---|
| 事实 | 关键字段覆盖率 | 总体 ≥ 98%,高风险切片 ≥ 99% | 低于阈值停止灰度 |
| 证据 | 关键结论引用正确率 | ≥ 99%,不得有无来源结论 | 退回并调查 |
| 安全 | 严重遗漏率 | 0 容忍或由机构定义上限 | 立即下线/通知 |
| 效率 | 人工修改时间 | 相对基线减少且不增加错误 | 继续观察 |
| 治理 | 审计记录完整率 | 100% 可回放 | 禁止发布 |
任何一扇闸门不通过,都不能用其他指标的高分抵消;发布是一个有条件的工程决策。
from collections import defaultdict
def slice_rates(rows: list[dict]) -> dict[str, float]:
buckets = defaultdict(list)
for row in rows:
buckets[row["group"]].append(row)
result = {}
for group, items in buckets.items():
passed = sum(item["passed"] for item in items)
result[group] = passed / len(items) if items else 0.0
return result
rows = [
{"group": "adult", "passed": True},
{"group": "adult", "passed": True},
{"group": "pediatric", "passed": False},
]
print(slice_rates(rows))本节完成验收
完成本节后,应能把一个医疗辅助任务限定在资料、时间、权限和人工责任范围内,并设计字段级、证据级、切片级和事件级评估。验收时让领域专家盲评一组正常与边界样本,系统必须能展示原文证据、拒答原因和升级路径。
设计一个病历摘要输出 JSON,包含时间线、否定状态、来源 ID 和待确认项。
参考结论:不生成新诊断;缺失字段有状态;每个关键事实可回链。
完整实现路径:医疗输出拆为事实、来源、待确认项和风险等级,诊断或处置建议必须进入人工流程。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
def validate_clinical_summary(summary):
required = {"patient_id", "timeline", "facts", "sources",
"pending_confirmation", "risk_level"}
missing = required - summary.keys()
if missing: raise ValueError(f"missing fields: {sorted(missing)}")
source_ids = {s["source_id"] for s in summary["sources"]}
for fact in summary["facts"]:
if fact["source_id"] not in source_ids:
raise ValueError(f"untraceable fact: {fact['text']}")
if summary["risk_level"] == "high": summary["requires_review"] = True
return summary验收标准:高风险召回、否定词、时间线和亚群切片达到门槛。
若结果不对:先核对患者/文档 ID 与时间线,再查术语和证据,最后查生成。
制作一个医疗评估切片表,按科室、年龄段、资料新鲜度分组。
参考结论:记录样本量和置信区间;关键切片不能被总体平均掩盖。
完整实现路径:医疗输出拆为事实、来源、待确认项和风险等级,诊断或处置建议必须进入人工流程。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
def validate_clinical_summary(summary):
required = {"patient_id", "timeline", "facts", "sources",
"pending_confirmation", "risk_level"}
missing = required - summary.keys()
if missing: raise ValueError(f"missing fields: {sorted(missing)}")
source_ids = {s["source_id"] for s in summary["sources"]}
for fact in summary["facts"]:
if fact["source_id"] not in source_ids:
raise ValueError(f"untraceable fact: {fact['text']}")
if summary["risk_level"] == "high": summary["requires_review"] = True
return summary验收标准:高风险召回、否定词、时间线和亚群切片达到门槛。
若结果不对:先核对患者/文档 ID 与时间线,再查术语和证据,最后查生成。
写一份上线前安全审查清单。
参考结论:覆盖隐私、权限、急症升级、日志回放和回滚。
完整实现路径:医疗输出拆为事实、来源、待确认项和风险等级,诊断或处置建议必须进入人工流程。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
def validate_clinical_summary(summary):
required = {"patient_id", "timeline", "facts", "sources",
"pending_confirmation", "risk_level"}
missing = required - summary.keys()
if missing: raise ValueError(f"missing fields: {sorted(missing)}")
source_ids = {s["source_id"] for s in summary["sources"]}
for fact in summary["facts"]:
if fact["source_id"] not in source_ids:
raise ValueError(f"untraceable fact: {fact['text']}")
if summary["risk_level"] == "high": summary["requires_review"] = True
return summary验收标准:高风险召回、否定词、时间线和亚群切片达到门槛。
若结果不对:先核对患者/文档 ID 与时间线,再查术语和证据,最后查生成。
临床安全推演与排错
在医疗辅助系统中,第 1 个观察点是:病程记录、检验值、患者自述和机器转录的可靠性不同,输入必须保留作者、类型、时间和原始状态。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“病程记录、检验值、患者自述和机器转录的可靠性不同,输入必须保留作者、类型、时间和原始状态”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 2 个观察点是:否定、疑似、历史和计划等断言不能被压缩成一个肯定标签,应保存 assertion 和 experiencer。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“否定、疑似、历史和计划等断言不能被压缩成一个肯定标签,应保存 assertion 和 experiencer”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 3 个观察点是:病历摘要先做结构化时间线,再生成文字;直接拼接长文本容易丢失时间和否定关系。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“病历摘要先做结构化时间线,再生成文字;直接拼接长文本容易丢失时间和否定关系”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 4 个观察点是:药物核对优先做差异检测,模型可以解释差异,但不能自行决定停药、加量或替换处方。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“药物核对优先做差异检测,模型可以解释差异,但不能自行决定停药、加量或替换处方”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 5 个观察点是:患者教育要检验可理解性和可行动性,通俗化不能删除警示、就医条件和咨询问题。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“患者教育要检验可理解性和可行动性,通俗化不能删除警示、就医条件和咨询问题”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 6 个观察点是:资料截止时间应在界面显著显示,新检查到达后旧摘要要标记需要刷新。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“资料截止时间应在界面显著显示,新检查到达后旧摘要要标记需要刷新”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 7 个观察点是:罕见病和少数群体要单独切片,样本不足时限制适用范围而不是把低分解释成不重要。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“罕见病和少数群体要单独切片,样本不足时限制适用范围而不是把低分解释成不重要”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 8 个观察点是:复核界面应让审核者从摘要事实点击回原文,并记录接受、修改、缺失和不确定的原因。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“复核界面应让审核者从摘要事实点击回原文,并记录接受、修改、缺失和不确定的原因”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 9 个观察点是:日志、缓存、向量索引和导出都属于隐私边界,单一路径脱敏通过不代表系统安全。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“日志、缓存、向量索引和导出都属于隐私边界,单一路径脱敏通过不代表系统安全”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在医疗辅助系统中,第 10 个观察点是:事件复盘要同时检查资料缺失、版本、权限、界面警示和审核负担,不能只追问模型为何说错。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“事件复盘要同时检查资料缺失、版本、权限、界面警示和审核负担,不能只追问模型为何说错”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 隐私 | 检查日志与缓存 | 敏感值外泄 | 最小化权限 |
| 3 | 专家 | 盲评难例 | 分歧无裁决 | 更新量表 |
| 4 | 事件 | 注入旧指南 | 引用过期 | 版本过滤 |
本页反向检查
医疗输出固定为事实、证据、限制、下一步四层,缺资料时返回状态而非补写诊断。
指标冲突时并排展示覆盖率、修改率、拒答、严重错误和人工耗时,由专家解释取舍。
上线可以先做只读辅助,限制在授权资料、非急症流程和专家用户,再根据证据扩大。
验收时提供过期指南、否定记录和缺失资料请求,系统应分别过滤、保留状态和拒答。
临床安全复盘案例
在医疗辅助流程的复查中,第 1 个问题是“病历事实的作者、时间和断言状态是否都保留”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“病历事实的作者、时间和断言状态是否都保留”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在医疗辅助流程的复查中,第 2 个问题是“否定词和疑似词是否不会被摘要翻转”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“否定词和疑似词是否不会被摘要翻转”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在医疗辅助流程的复查中,第 3 个问题是“药物差异是否由规则发现并交给专业人员”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“药物差异是否由规则发现并交给专业人员”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在医疗辅助流程的复查中,第 4 个问题是“患者教育是否保留就医警示和咨询入口”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“患者教育是否保留就医警示和咨询入口”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在医疗辅助流程的复查中,第 5 个问题是“最新检查到达后旧摘要是否显式过期”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“最新检查到达后旧摘要是否显式过期”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在医疗辅助流程的复查中,第 6 个问题是“少数群体切片是否有足够样本和不确定性说明”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“少数群体切片是否有足够样本和不确定性说明”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在医疗辅助流程的复查中,第 7 个问题是“日志和缓存是否经过最小化、权限和删除验证”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“日志和缓存是否经过最小化、权限和删除验证”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 临床事实 | 检查否定词 | 状态翻转 | 结构化断言 |
| 隐私 | 检查日志与缓存 | 敏感值外泄 | 最小化权限 |
| 专家 | 盲评难例 | 分歧无裁决 | 更新量表 |
| 事件 | 注入旧指南 | 引用过期 | 版本过滤 |
本页反向检查
医疗输出固定为事实、证据、限制、下一步四层,缺资料时返回状态而非补写诊断。
指标冲突时并排展示覆盖率、修改率、拒答、严重错误和人工耗时,由专家解释取舍。
上线可以先做只读辅助,限制在授权资料、非急症流程和专家用户,再根据证据扩大。
验收提供过期指南、否定记录和缺失资料请求,系统应分别过滤、保留状态和拒答。
能解释并不等于能替人下结论
13.5 · 金融与法律模型:规则、时效与责任
金融和法律都强调时间、法域、来源和责任,但数据形态与工作流程各有不同。本节把财务计算、法规检索、合同比对和专业写作拆开,说明为什么模型需要确定性工具、版本控制和人工签字。
13.5.1 金融数据:时间序列、指标与可复算计算
金融场景首先要区分事实、计算和观点。价格、财报字段和公告是事实;收益率、波动率、估值比率是依据公式计算的结果;买入或卖出建议则是带有目标、风险和时间假设的判断。模型可以解释这三者之间的关系,但不能把观点包装成已经证实的事实。
时间戳是金融答案的核心字段。价格有交易所、时区、收盘定义和复权方式,财报有报告期、公告日和修订版本,宏观指标有发布日和后修订。只写“截至最近”不够,系统要显示数据截止时间、来源、币种、单位和是否经过复权。
确定性计算应交给程序。收益率、同比、现金流折现、风险指标和单位换算都应该有可测试的函数,模型只负责把用户问题映射到参数,并解释结果。程序返回公式、输入值和异常状态,回答才有机会被复算。
金融文本中有大量近义但不等价的概念。例如收入、营收、经营现金流、自由现金流不能随意互换;毛利率和净利率的分母不同;“增长”需要明确期间和基期。术语表和字段字典应和数据接口绑定,避免模型凭语言相似度选择字段。
预测任务还要区分历史回测和未来保证。模型可以总结历史模式或生成情景分析,但历史数据存在幸存者偏差、前视偏差和数据窥探。评估必须按时间切分,严格限制未来信息进入特征,并报告不同市场阶段的表现。
风险说明不能只写一段免责声明。输出应列出使用的数据、假设、敏感变量和不适用场景,例如流动性不足、极端行情、数据延迟或政策突变。高风险建议要交给合规和投资专业人员复核,系统应保留人工修改和批准记录。
金融系统通常需要权限分层。普通用户可以查询公开数据,研究员可以运行分析,交易或写入操作则需要更强认证和二次确认。模型生成的工具调用必须经过参数、限额、账户和幂等性检查,不能因为一句自然语言就产生不可逆操作。
本小节的结论是:金融模型的专业性来自时间、单位、公式、权限和证据链。语言模型越流畅,越要把计算和交易边界交给可验证组件。
| 内容 | 例子 | 适合由谁完成 | 必须附带 |
|---|---|---|---|
| 事实 | 某日收盘价、财报字段 | 数据服务 | 来源、时间、单位、版本 |
| 计算 | 收益率、比率、情景值 | 确定性程序 | 公式、输入、舍入规则 |
| 解释 | 指标含义、风险因素 | 模型 + 专家 | 适用条件和证据 |
| 建议 | 配置或交易方案 | 合规流程与人 | 目标、限制、批准记录 |
模型不直接猜数字;每个数字都应来自带时间戳的来源或可运行的计算器。
from dataclasses import dataclass
@dataclass(frozen=True)
class Quote:
symbol: str
price: float
currency: str
as_of: str
def simple_return(start: float, end: float) -> float:
if start <= 0:
raise ValueError("起始价格必须为正")
return (end - start) / start
quote = Quote("DEMO", 108.0, "CNY", "2026-08-30")
print(quote)
print(round(simple_return(100.0, quote.price), 4))13.5.2 法律文本:法域、版本与条款引用
法律问答的第一步是确认法域和问题类型。不同国家、地区、行业和合同约定可能适用不同规则;同一法域内,法律、行政法规、部门规章、地方规定、司法解释和内部政策的效力层级也不同。用户只说“是否合法”时,系统应先追问范围,或明确输出只能作为资料整理。
法律文本的结构本身就是证据。条、款、项、定义、例外、附则和生效日期共同构成规则。切分时保留层级和交叉引用,检索时同时拿到主条款与必要的定义和例外。只返回包含关键词的一段,容易把一般规则与例外分开,导致方向相反的解释。
版本控制是法律系统的生命线。法规会修订、废止、延迟生效,合同也会有签署、补充和续签版本。回答必须说明所用版本和时间点,发现多个版本冲突时列出差异并要求确认。模型不能为了给出单一结论而悄悄选择最新或最常见版本。
合同比对要区分文本差异、义务差异和风险判断。程序可以定位新增、删除和修改的词句,模型可以把差异按主题归类并提出需要关注的问题,律师或法务再判断是否构成实质风险。这样既保留了原文,也避免模型直接替代法律意见。
法律引用需要可验证。引用条款时显示文号、发布日期、条款号和链接或内部来源 ID;对于判例或裁判文书,记录法院、案号、日期和相关段落。模型生成的“根据相关规定”如果没有具体来源,应被视为未完成输出。
法律文本中存在模糊与争议。系统可以整理不同观点和依据,但要标出争议点、事实前提和未决问题。把存在争议的解释写成确定结论,会误导用户。合适的输出往往是风险清单和需要补充的事实,而不是一个二元的“合法/违法”。
法律资料通常包含商业秘密和个人信息。权限要按案件、客户和角色隔离;日志要避免记录完整敏感文本;导出和分享要经过审批。外部 API 的数据留存和训练用途也要核验,不能默认第三方服务符合案件要求。
本小节的要点是:法律模型不是自动裁判器,而是带版本、法域和引用的研究助手。它的可靠性取决于是否把问题的事实前提展示给专业人员。
| 上下文 | 要回答的问题 | 缺失时的行为 |
|---|---|---|
| 法域 | 哪个国家/地区/行业? | 追问或限定结论 |
| 时间 | 哪个生效版本? | 列出版本差异 |
| 层级 | 法规、规章还是政策? | 显示效力层级 |
| 事实 | 合同角色、行为和金额? | 标记事实缺口 |
| 例外 | 是否有豁免或特殊条款? | 不作确定判断 |
| 引用 | 哪一条、哪一款? | 视为未完成 |
法律问答的安全句式
把“结论”改成“在已提供的事实和某版本规则下,资料支持的解释是……;仍需确认……”。这不是故意含糊,而是把事实、规则和推断分层。
若用户要求起草正式法律意见,系统应说明自身角色,提供检索结果、差异表和问题清单,并把签发权留给有资质人员。
from dataclasses import dataclass
from difflib import ndiff
@dataclass(frozen=True)
class Clause:
clause_id: str
text: str
version: str
def changed_lines(old: Clause, new: Clause) -> list[str]:
return [
line for line in ndiff(old.text.splitlines(), new.text.splitlines())
if line.startswith(("+ ", "- "))
]
old = Clause("3.2", "付款应在三十日内完成。", "v1")
new = Clause("3.2", "付款应在十五日内完成。", "v2")
print(changed_lines(old, new))13.5.3 上线治理:合规、解释与人类签字
金融和法律系统上线前要有模型卡、数据说明书和使用边界。模型卡描述用途、限制、已知偏差和评估结果;数据说明书描述来源、采样、处理、许可和缺失。文档不是宣传材料,而是让采购、合规、开发和使用者拥有同一份事实。
解释性要分成可理解和可验证两种。模型写出的理由可以帮助用户阅读,但不一定是模型真正产生答案的因果路径。需要解释数字时,应引用输入、公式和规则;需要解释分类时,应显示触发字段、相似案例或适用条款。不要把一段事后生成的文字当成充分审计证据。
上线流程可以分为沙盒、内部试用、受控灰度和正式发布。每一阶段都设置用户范围、任务范围、日志留存、人工抽检和退出条件。高风险功能先以只读方式运行,确认数据和证据稳定后再考虑写入或自动化。
人类签字要有实质内容。审核人应看到输入摘要、关键证据、模型版本、异常提示和修改记录,而不是在一个“我同意”按钮上承担所有责任。签字结果、时间和身份进入审计日志,必要时可回放模型当时看到的上下文。
事件响应包括发现、分级、隔离、通知、修复和复盘。发现一次错误不代表立即删除所有数据;先保留受控现场,判断影响范围和是否需要暂停。修复后要把事件加入回归集,验证新版本不会重复同一类错误。
模型供应商更新、法规变化、数据源下线和工具接口修改都可能触发重新评估。建立变更影响表,列出哪些任务、指标、权限和文档需要更新。版本号要可读且稳定,不能只依赖一个不可解释的构建时间。
合规不应该阻止所有创新,而是帮助团队选择合适的自动化边界。能够复算、可撤回、低影响的任务可以提高自动化;不可解释、不可回滚或会替人下最终结论的任务,应保留人工环节。
本节让我们看到,金融和法律的“准确”必须放在责任链里理解。一个答案只有在来源、规则、计算、审批和日志都齐全时,才有交付价值。
| 文档 | 回答什么 | 更新触发 | 负责人 |
|---|---|---|---|
| 模型卡 | 模型能做什么、不能做什么 | 模型/适配器变化 | 模型负责人 |
| 数据说明书 | 数据从哪来、如何处理 | 来源、许可或清洗变化 | 数据负责人 |
| 任务合同 | 谁能用、输出什么、何时拒答 | 流程或风险变化 | 业务负责人 |
| 评估报告 | 指标、切片和最坏案例 | 版本或数据变化 | 评估负责人 |
| 事件复盘 | 哪里出错、如何避免 | 安全事件或投诉 | 治理负责人 |
门与门之间要有证据,不是按日历自动晋级;任何安全事件都可以把系统退回上一道门。
from dataclasses import dataclass
@dataclass(frozen=True)
class Gate:
name: str
min_accuracy: float
max_severe_error: int
audit_complete: bool
def can_release(gate: Gate, accuracy: float, severe_errors: int) -> bool:
return (
accuracy >= gate.min_accuracy
and severe_errors <= gate.max_severe_error
and gate.audit_complete
)
gate = Gate("controlled-rollout", 0.98, 0, True)
print(can_release(gate, 0.985, 0))本节完成验收
完成本节后,应能分别为金融和法律任务写出时间/法域、版本、证据、计算和签字字段,并说明哪些动作必须由确定性工具或专业人员完成。验收时让读者处理一条过期法规和一个缺少时间戳的金融问题,系统应追问或拒答,而不是给出伪确定答案。
设计一个金融比率计算器,输入带日期、币种和来源,输出公式与结果。
参考结论:不能用模型猜数字;起始值、单位和除零错误有明确处理。
完整实现路径:金融和法律答案必须绑定基准日期、币种/法域、来源和版本差异;数值交给确定性程序。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
from decimal import Decimal
def legal_finance_result(amount, currency, as_of, jurisdiction, source):
if not all((currency, as_of, jurisdiction, source)):
raise ValueError("currency/date/jurisdiction/source are required")
return {"amount": str(Decimal(str(amount))), "currency": currency,
"as_of": as_of, "jurisdiction": jurisdiction,
"source": source, "status": "requires_review"}
result = legal_finance_result("1000.00", "CNY", "2026-08-31", "CN", "rule-v2")
assert result["currency"] == "CNY"验收标准:换基准日或法域时结果按规则变化,旧版本可回放。
若结果不对:先核对日期、币种、法域和规则版本,再查计算和语言表述。
为合同版本 v1/v2 生成条款差异表,并列出需要法务确认的事实。
参考结论:保留条款号和版本;文本差异不直接等于法律结论。
完整实现路径:金融和法律答案必须绑定基准日期、币种/法域、来源和版本差异;数值交给确定性程序。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
from decimal import Decimal
def legal_finance_result(amount, currency, as_of, jurisdiction, source):
if not all((currency, as_of, jurisdiction, source)):
raise ValueError("currency/date/jurisdiction/source are required")
return {"amount": str(Decimal(str(amount))), "currency": currency,
"as_of": as_of, "jurisdiction": jurisdiction,
"source": source, "status": "requires_review"}
result = legal_finance_result("1000.00", "CNY", "2026-08-31", "CN", "rule-v2")
assert result["currency"] == "CNY"验收标准:换基准日或法域时结果按规则变化,旧版本可回放。
若结果不对:先核对日期、币种、法域和规则版本,再查计算和语言表述。
画出一个法律检索助手的灰度发布流程。
参考结论:只读开始;高风险任务有签字;事件可以回滚并进入回归集。
完整实现路径:金融和法律答案必须绑定基准日期、币种/法域、来源和版本差异;数值交给确定性程序。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
from decimal import Decimal
def legal_finance_result(amount, currency, as_of, jurisdiction, source):
if not all((currency, as_of, jurisdiction, source)):
raise ValueError("currency/date/jurisdiction/source are required")
return {"amount": str(Decimal(str(amount))), "currency": currency,
"as_of": as_of, "jurisdiction": jurisdiction,
"source": source, "status": "requires_review"}
result = legal_finance_result("1000.00", "CNY", "2026-08-31", "CN", "rule-v2")
assert result["currency"] == "CNY"验收标准:换基准日或法域时结果按规则变化,旧版本可回放。
若结果不对:先核对日期、币种、法域和规则版本,再查计算和语言表述。
时效规则推演与排错
在金融与法律领域系统中,第 1 个观察点是:交易日、自然日、报告期、公告日和结算日不能混用,数据接口必须带时间类型和时区。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“交易日、自然日、报告期、公告日和结算日不能混用,数据接口必须带时间类型和时区”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 2 个观察点是:金融指标绑定公式、字段、单位和舍入规则,模型选择指标,确定性程序负责计算。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“金融指标绑定公式、字段、单位和舍入规则,模型选择指标,确定性程序负责计算”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 3 个观察点是:时间切分和数据延迟要防止前视偏差,不能用修订后财报评价公告日前的预测。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“时间切分和数据延迟要防止前视偏差,不能用修订后财报评价公告日前的预测”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 4 个观察点是:法律检索除了日期还要保留法域、效力层级、生效状态和交叉引用。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“法律检索除了日期还要保留法域、效力层级、生效状态和交叉引用”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 5 个观察点是:合同审阅把文本差异、义务差异和风险判断分开,模型不能把词句变化直接宣称为法律结论。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“合同审阅把文本差异、义务差异和风险判断分开,模型不能把词句变化直接宣称为法律结论”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 6 个观察点是:金融和法律回答都要列出事实前提,缺少资产、币种、法域或合同角色时优先追问。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“金融和法律回答都要列出事实前提,缺少资产、币种、法域或合同角色时优先追问”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 7 个观察点是:权限要细分到数据与动作,研究、审阅、交易和导出不应共享同一工具角色。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“权限要细分到数据与动作,研究、审阅、交易和导出不应共享同一工具角色”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 8 个观察点是:写操作必须先预览目标、参数、影响和撤销方式,确认后才由网关执行。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“写操作必须先预览目标、参数、影响和撤销方式,确认后才由网关执行”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 9 个观察点是:法规、会计准则和供应商字段会变化,更新要触发影响清单、回归和文档修订。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“法规、会计准则和供应商字段会变化,更新要触发影响清单、回归和文档修订”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在金融与法律领域系统中,第 10 个观察点是:质量、证据、严重错误、审核时间、延迟和成本一起衡量,不能只看语言是否流畅。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“质量、证据、严重错误、审核时间、延迟和成本一起衡量,不能只看语言是否流畅”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 计算 | 输入零或缺币种 | 结果仍返回 | 校验/拒答 |
| 3 | 法域 | 替换适用地区 | 结论不变 | 追问范围 |
| 4 | 动作 | 模拟写操作 | 无确认执行 | 只读/预览 |
本页反向检查
专家评审逐项检查来源、时间、法域、公式、事实前提、例外和下一步,保留独立评分与裁决。
法律回答使用“在已提供事实和某版本规则下,资料支持的解释是……”来区分规则与推断。
金融计算器和法规检索应有可运行的程序基线;模型负责理解和组织,工具负责数字与条款。
验收提供过期版本和缺少时间戳的问题,系统若仍给无条件结论则不通过。
时效规则复盘案例
在金融与法律时效规则的复查中,第 1 个问题是“价格或财报字段是否带公告时间、报告期和币种”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“价格或财报字段是否带公告时间、报告期和币种”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在金融与法律时效规则的复查中,第 2 个问题是“计算器遇到零值、缺失单位和不兼容期间是否拒绝”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“计算器遇到零值、缺失单位和不兼容期间是否拒绝”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在金融与法律时效规则的复查中,第 3 个问题是“回测是否严格限制未来信息和修订数据”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“回测是否严格限制未来信息和修订数据”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在金融与法律时效规则的复查中,第 4 个问题是“法规检索是否区分法域、效力层级和生效日期”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“法规检索是否区分法域、效力层级和生效日期”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在金融与法律时效规则的复查中,第 5 个问题是“合同差异是否与风险判断分开并保留原文”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“合同差异是否与风险判断分开并保留原文”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在金融与法律时效规则的复查中,第 6 个问题是“写操作是否先预览并由有权限角色确认”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“写操作是否先预览并由有权限角色确认”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在金融与法律时效规则的复查中,第 7 个问题是“规则或供应商变更后是否触发影响清单和回归”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“规则或供应商变更后是否触发影响清单和回归”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 时间 | 改变数据截止日 | 未来信息泄漏 | 按时间切分 |
| 计算 | 输入零或缺币种 | 结果仍返回 | 校验/拒答 |
| 法域 | 替换适用地区 | 结论不变 | 追问范围 |
| 动作 | 模拟写操作 | 无确认执行 | 只读/预览 |
本页反向检查
专家评审逐项检查来源、时间、法域、公式、事实前提、例外和下一步,保留独立评分与裁决。
法律回答用“在已提供事实和某版本规则下,资料支持的解释是……”区分规则与推断。
金融计算器和法规检索应有程序基线;模型负责理解和组织,工具负责数字与条款。
验收提供过期版本和缺少时间戳的问题,系统若仍给无条件结论则不通过。
金融法律页的最后验收
拿一条没有日期的金融数据请求,系统应先提示缺少时间上下文;拿一条有明确时间但币种不明的请求,计算器应暂停而不是猜测。
拿一个同时包含现行与废止条款的法律问题,检索结果应显示版本和生效状态,模型不能把两个版本拼成一个新规则。
模拟一次写操作,先检查预览、角色和限额,再执行;把确认人、参数和执行结果写入日志,失败时回到只读模式。
评估报告并排放质量、证据、严重错误、人工时间和成本;任何单项指标都不能替代完整责任链。
当供应商字段或法规发生变化时,记录影响的任务、基准、模型卡和界面提示,完成回归后再恢复灰度。
本页达到交付标准的标志,是专业人员可以复算数字、定位条款、理解前提并知道最终结论由谁签发。
表示对象,也表示约束与实验
13.6 · 科学大模型 I:蛋白质、分子与结构
蛋白质和分子模型展示了科学大模型与语言模型的相似之处:都能从大量序列或结构中学习表示;也展示了它们的不同:科学预测必须尊重三维几何、物理化学性质和实验验证。本节从表示、结构预测、生成和实验闭环入手。
13.6.1 序列、结构与分子表示
蛋白质可以用氨基酸序列表示,但序列不是结构本身。相同的局部片段可能在不同环境中折叠成不同构象,远距离残基之间的相互作用也会影响功能。模型需要从序列、进化信息、结构坐标或接触关系中学习表示,输出还要明确是残基级、链级还是复合物级。
分子表示有 SMILES、分子图、三维坐标、距离矩阵和表面等多种形式。SMILES 便于序列化和生成,但不同写法可能描述同一个分子;图表示显式保留原子和键;三维表示还要处理旋转、平移和构象。选择表示时要看任务是否依赖几何、对称性和物理量。
科学数据的单位、构型和实验条件不可省略。溶剂、温度、pH、晶体环境、测量仪器和分辨率都会影响标签。把不同条件下的结构或活性值混在一起,模型可能学习到实验室差异而不是分子规律。元数据要进入样本和切分策略。
预处理要检查化学合法性、序列字符、缺失坐标、原子价态、链断裂和重复结构。对于生成任务,还要过滤训练与测试之间的近重复,避免模型看到了同一骨架的变体。异常样本不一定删除,也可以单独作为低质量或难例切片。
结构数据常常存在对称和坐标等价。模型预测的坐标即使与参考坐标旋转不同,也可能是同一个结构,因此评估不能直接逐坐标相减。需要使用对齐后的 RMSD、接触图、键长角度和置信度等指标,并说明对齐方法。
蛋白质语言模型可以把氨基酸序列转为上下文表示,帮助做功能分类、突变效应预测或结构相关任务。它学习的是统计规律,不会自动保证生物机制正确。把序列嵌入交给下游分类器时,要按蛋白质家族或时间划分,不能让同源序列泄漏。
分子生成还需要可合成性、毒性、稳定性和目标亲和力约束。一个在模型分数上漂亮的分子,可能无法合成、在实验中不稳定或违反安全要求。生成器应与性质预测器、规则过滤器和实验排程连接,输出候选清单而不是直接声称发现了药物。
本小节的核心是:科学表示必须保留对象的结构和实验条件;把分子当普通文本处理,会丢失决定结果的几何和物理信息。
| 表示 | 保留的信息 | 适合任务 | 主要陷阱 |
|---|---|---|---|
| 序列/SMILES | 顺序、符号和局部模式 | 语言建模、检索、初筛 | 同义写法、缺少几何 |
| 分子图 | 原子、键、邻接 | 性质预测、图消息传递 | 构象与立体化学 |
| 三维坐标 | 几何、距离、构象 | 结构预测、对接 | 旋转平移、缺失原子 |
| 接触/距离矩阵 | 相对关系 | 折叠和结构评估 | 无法独立恢复完整结构 |
| 实验元数据 | 条件、仪器、误差 | 跨实验泛化 | 字段不全导致伪规律 |
生成结果只是一组待验证候选;实验反馈和失败原因同样是科学数据,应进入下一轮评估。
from dataclasses import dataclass
from typing import Optional
@dataclass(frozen=True)
class Molecule:
molecule_id: str
smiles: str
assay: Optional[str]
temperature_c: Optional[float]
source_id: str
def eligible(molecule: Molecule) -> bool:
return bool(molecule.smiles and molecule.source_id and molecule.assay)
items = [
Molecule("m-01", "CCO", "solubility", 25.0, "lab-1"),
Molecule("m-02", "C1", None, None, "lab-2"),
]
print([item.molecule_id for item in items if eligible(item)])13.6.2 结构预测、生成模型与不确定性
结构预测模型的输出不应只是一张漂亮的三维图。使用者需要知道每个残基或原子的置信度、可能的多构象、输入覆盖率和训练数据范围。低置信区域可能对应无序区、配体结合变化或数据不足,不能被渲染效果掩盖。
AlphaFold 等工作证明,深度学习可以在大规模生物序列与结构数据上取得突破,但它的结果仍然是预测,不是实验事实。结构预测适合提出假设、帮助设计实验或缩小搜索空间;关键结论需要晶体学、冷冻电镜、核磁或其他实验验证。
生成模型常用自回归、变分、扩散或能量引导方式生成新序列和构象。生成分布不等于目标分布:模型可能复制训练集偏好,也可能产生训练数据之外的不稳定结构。采样温度、去重、约束和候选排名都要记录,才能复现实验。
不确定性可以来自数据、模型和任务。数据噪声反映测量误差,模型不确定性反映训练覆盖不足,任务不确定性反映多个结构或机制都可能成立。只给一个分数不够,报告区间、置信度校准和离群检测更有帮助。
结构预测的评估要避免近似泄漏。按序列相似度、蛋白质家族、结构域或时间划分测试集,才能判断对新对象的泛化。若测试集与训练集高度相似,指标很高也可能只是记忆。分层报告短序列、长序列、低同源和复杂复合物。
分子生成需要多目标优化。活性、选择性、溶解度、毒性、合成难度和新颖性之间经常冲突。把所有指标简单相加会隐藏权重和约束,较好的做法是先过滤硬约束,再用可解释的 Pareto 前沿或分层排序展示候选。
模型输出还要与实验资源匹配。候选数量、合成成本、检测周期和失败概率都应进入规划。一个能在计算上生成十万分子的系统,如果实验室一次只能测试二十个,就需要把信息增益和多样性纳入选择。
本小节的重点是:结构模型的价值在于减少探索成本和提出可检验假设;任何预测都要带置信度、适用范围和实验下一步。
| 字段 | 含义 | 为什么要保留 |
|---|---|---|
| prediction | 预测结构/性质 | 供下游分析 |
| confidence | 局部或整体置信度 | 区分可靠和待验证区域 |
| assumptions | 输入条件与模型假设 | 解释适用范围 |
| data_cutoff | 训练/参考数据截止 | 避免把未来信息当历史 |
| uncertainty | 区间、分布或离群信号 | 指导实验优先级 |
| provenance | 模型、参数、随机种子 | 复现和审计 |
不要把低置信度藏起来
在结构可视化中可以用纹理、标签或局部列表同时显示置信度,不能只用一种颜色,因为色盲或黑白打印会丢失信息。文本摘要应明确指出低置信区域和可能原因。
当模型没有见过相似对象时,最有价值的输出可能是“需要实验或更适合的模型”,而不是一个看似精确的数字。拒绝过度外推也是科学能力。
from dataclasses import dataclass
@dataclass(frozen=True)
class Candidate:
name: str
activity: float
toxicity: float
synthesis_cost: float
confidence: float
def safe_candidates(items: list[Candidate]) -> list[Candidate]:
usable = [
item for item in items
if item.toxicity <= 0.2 and item.confidence >= 0.7
]
return sorted(
usable,
key=lambda item: (item.activity, -item.synthesis_cost),
reverse=True,
)
items = [
Candidate("A", 0.91, 0.10, 3.0, 0.84),
Candidate("B", 0.95, 0.40, 1.0, 0.92),
]
print([item.name for item in safe_candidates(items)])13.6.3 实验闭环:从计算候选到可复现结果
科学模型只有进入实验闭环,才知道预测是否有用。闭环不是把实验结果简单追加到训练集,而是记录假设、候选生成条件、筛选规则、实验设计、失败原因和结果不确定性。没有失败记录,模型会在下一轮继续选择看似漂亮但不可行的候选。
实验计划应先写可证伪的假设。例如“在指定温度和缓冲液下,候选 A 的活性高于基线”比“候选 A 很有潜力”更容易设计对照。对照样本、重复次数、随机化、盲法和测量误差决定了结果是否能支持结论。
实验数据的主键应连接样本、批次、仪器、操作员和分析脚本。不同实验室的协议和设备可能造成系统差异,模型需要学习或校正这些因素。把实验室 ID 当作普通字符串删除,可能失去解释跨实验泛化的重要线索。
主动学习可以根据模型不确定性、候选多样性和预期信息增益选择下一批实验。它不是盲目选择最高预测值,而是在“验证当前最佳”和“探索未知区域”之间平衡。策略必须考虑安全、成本、可合成性和伦理限制。
实验结果回流前要经过质量门。异常峰、污染、仪器故障或协议偏离不能直接当作负样本;但也不能悄悄删除,否则模型无法学到失败条件。为每个结果标记有效、需复测、无效和未完成,保留原始信号和处理过程。
科学协作需要共享可复现包。它可以包含数据快照、代码、环境、模型权重、参数、随机种子、图表生成脚本和 README。别人不必拥有同样的仪器才能复现全部结果,但至少应能重跑计算部分并知道实验部分的限制。
发布候选或模型时,要考虑双重用途和安全边界。涉及病原体、毒性或敏感实验条件的系统应限制访问、记录用途并经过机构审查。科学开放和安全治理并不冲突,关键是分层披露和明确责任。
本小节把模型学习连接到科学方法:提出假设、设计对照、记录不确定性、复现结果、根据失败更新假设。模型是加速器,不是实验的替代品。
| 阶段 | 记录字段 | 验收 |
|---|---|---|
| 假设 | 问题、机制、可证伪预测 | 可设计对照 |
| 候选 | 模型版本、约束、采样种子 | 可重生成 |
| 实验 | 批次、条件、仪器、操作员 | 原始信号可回查 |
| 分析 | 脚本、阈值、异常处理 | 结果可复算 |
| 回流 | 标签、置信度、失败原因 | 不会把无效样本当真值 |
闭环的终点不是一次高分,而是下一轮更清楚地知道哪里有效、哪里不确定。
from dataclasses import dataclass
from pathlib import Path
import json
@dataclass(frozen=True)
class Run:
run_id: str
candidate_id: str
status: str
value: float | None
failure_reason: str | None
def save_runs(runs: list[Run], path: Path) -> None:
payload = [run.__dict__ for run in runs]
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8")
runs = [
Run("run-1", "A", "valid", 0.83, None),
Run("run-2", "B", "invalid", None, "仪器校准失败"),
]
save_runs(runs, Path("runs.json"))
print("已保存", len(runs), "条实验记录")本节完成验收
完成本节后,应能为蛋白质或分子任务选择合适表示,解释预测置信度和评估切分,并把候选生成、实验设计、失败原因和回流数据连接成可复现闭环。验收时不能只展示最高分候选,必须同时展示约束、置信度和实验下一步。
为一个分子性质预测任务设计数据卡,写出单位、实验条件、重复和切分规则。
参考结论:同一分子或实验批次不会泄漏到测试集;异常测量有状态。
完整实现路径:科学候选先满足单位、价态、几何或实验边界等硬约束,再按模型分数排序。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
def rank_candidates(candidates):
valid = []
for item in candidates:
if item.get("unit") != "kcal/mol": continue
if not item.get("structure_valid"): continue
if item["uncertainty"] > 0.20: continue
score = item["predicted_value"] - 2 * item["uncertainty"]
valid.append((score, item["id"]))
return sorted(valid, reverse=True)
ranked = rank_candidates(candidates)
assert all(isinstance(score, float) for score, _ in ranked)验收标准:数据去同源、置信度校准,候选能进入实验闭环。
若结果不对:先查单位与数据库版本,再查结构合法性,最后分析模型不确定性。
设计一个候选排序器,先过滤硬约束,再按活性、成本和置信度排序。
参考结论:硬约束优先;排序结果可解释;保存模型和随机种子。
完整实现路径:科学候选先满足单位、价态、几何或实验边界等硬约束,再按模型分数排序。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
def rank_candidates(candidates):
valid = []
for item in candidates:
if item.get("unit") != "kcal/mol": continue
if not item.get("structure_valid"): continue
if item["uncertainty"] > 0.20: continue
score = item["predicted_value"] - 2 * item["uncertainty"]
valid.append((score, item["id"]))
return sorted(valid, reverse=True)
ranked = rank_candidates(candidates)
assert all(isinstance(score, float) for score, _ in ranked)验收标准:数据去同源、置信度校准,候选能进入实验闭环。
若结果不对:先查单位与数据库版本,再查结构合法性,最后分析模型不确定性。
写一份实验闭环 README 目录。
参考结论:包含假设、候选、对照、原始数据、分析脚本和失败复盘。
完整实现路径:科学候选先满足单位、价态、几何或实验边界等硬约束,再按模型分数排序。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
def rank_candidates(candidates):
valid = []
for item in candidates:
if item.get("unit") != "kcal/mol": continue
if not item.get("structure_valid"): continue
if item["uncertainty"] > 0.20: continue
score = item["predicted_value"] - 2 * item["uncertainty"]
valid.append((score, item["id"]))
return sorted(valid, reverse=True)
ranked = rank_candidates(candidates)
assert all(isinstance(score, float) for score, _ in ranked)验收标准:数据去同源、置信度校准,候选能进入实验闭环。
若结果不对:先查单位与数据库版本,再查结构合法性,最后分析模型不确定性。
结构与实验推演
在蛋白质与分子科学模型中,第 1 个观察点是:序列和分子对象要使用稳定 ID,区分物种、剪接体、盐型、立体异构体和质子化状态。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“序列和分子对象要使用稳定 ID,区分物种、剪接体、盐型、立体异构体和质子化状态”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 2 个观察点是:SMILES、分子图、三维坐标和距离矩阵保留的信息不同,表示必须服从任务所需的几何和对称性。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“SMILES、分子图、三维坐标和距离矩阵保留的信息不同,表示必须服从任务所需的几何和对称性”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 3 个观察点是:实验条件包括温度、pH、溶剂、仪器、分辨率和批次,性质数字离开条件无法比较。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“实验条件包括温度、pH、溶剂、仪器、分辨率和批次,性质数字离开条件无法比较”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 4 个观察点是:三维结构评估要处理旋转、平移和对称等价,同时报告 RMSD、接触、键角和局部置信度。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“三维结构评估要处理旋转、平移和对称等价,同时报告 RMSD、接触、键角和局部置信度”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 5 个观察点是:生成候选先过滤毒性、合法性、可合成性等硬约束,再按活性、成本和多样性排序。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“生成候选先过滤毒性、合法性、可合成性等硬约束,再按活性、成本和多样性排序”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 6 个观察点是:低置信度候选可以用于探索,高置信度候选用于验证当前最佳,预算应在两者之间分配。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“低置信度候选可以用于探索,高置信度候选用于验证当前最佳,预算应在两者之间分配”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 7 个观察点是:公开数据库偏向热门和已发表结果,失败实验和负结果少,模型容易高估成功率。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“公开数据库偏向热门和已发表结果,失败实验和负结果少,模型容易高估成功率”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 8 个观察点是:候选去重不仅比较字符串,还要考虑规范化表示、分子指纹和序列相似度。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“候选去重不仅比较字符串,还要考虑规范化表示、分子指纹和序列相似度”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 9 个观察点是:实验失败要区分候选不成立、操作不可靠和模型超出适用域,三者不能都标成预测错误。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“实验失败要区分候选不成立、操作不可靠和模型超出适用域,三者不能都标成预测错误”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在蛋白质与分子科学模型中,第 10 个观察点是:涉及病原体、毒性或敏感实验条件的能力需要机构审查、访问限制和双重用途说明。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“涉及病原体、毒性或敏感实验条件的能力需要机构审查、访问限制和双重用途说明”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 条件 | 改变温度单位 | 性质不变 | 条件入模 |
| 3 | 候选 | 注入高毒性分子 | 仍排名第一 | 硬约束过滤 |
| 4 | 实验 | 标记仪器故障 | 当成负样本 | 保留状态 |
本页反向检查
跨实验室泛化要按实验室、项目或时间分组测试,随机切分会让条件泄漏到测试集。
候选结果包含模型、约束、采样种子、置信度、成本和实验下一步,不能只展示最高分。
实验数据回流前经过质量门;异常峰、污染和协议偏离不能直接成为负样本。
验收时让读者从一条候选回到对象身份、条件、模型版本和筛选规则。
结构科学复盘案例
在蛋白质与分子科学模型的复查中,第 1 个问题是“对象身份是否区分物种、构象、盐型和立体异构体”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“对象身份是否区分物种、构象、盐型和立体异构体”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在蛋白质与分子科学模型的复查中,第 2 个问题是“评估坐标前是否处理旋转、平移和对称等价”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“评估坐标前是否处理旋转、平移和对称等价”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在蛋白质与分子科学模型的复查中,第 3 个问题是“性质标签是否绑定温度、pH、溶剂和测量方法”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“性质标签是否绑定温度、pH、溶剂和测量方法”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在蛋白质与分子科学模型的复查中,第 4 个问题是“候选是否先经过毒性、合法性和可合成性硬过滤”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“候选是否先经过毒性、合法性和可合成性硬过滤”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在蛋白质与分子科学模型的复查中,第 5 个问题是“置信度是否能指导验证与探索两种实验预算”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“置信度是否能指导验证与探索两种实验预算”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在蛋白质与分子科学模型的复查中,第 6 个问题是“失败实验是否区分样本、操作和模型适用域”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“失败实验是否区分样本、操作和模型适用域”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在蛋白质与分子科学模型的复查中,第 7 个问题是“敏感双重用途能力是否有访问、审查和披露边界”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“敏感双重用途能力是否有访问、审查和披露边界”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 表示 | 旋转结构坐标 | 误判结构错误 | 先对齐 |
| 条件 | 改变温度单位 | 性质不变 | 条件入模 |
| 候选 | 注入高毒性分子 | 仍排名第一 | 硬约束过滤 |
| 实验 | 标记仪器故障 | 当成负样本 | 保留状态 |
本页反向检查
跨实验室泛化按实验室、项目或时间分组测试,随机切分会让条件泄漏到测试集。
候选结果包含模型、约束、采样种子、置信度、成本和实验下一步,不能只展示最高分。
实验数据回流前经过质量门;异常峰、污染和协议偏离不能直接成为负样本。
验收时让读者从一条候选回到对象身份、条件、模型版本和筛选规则。
预测速度不能牺牲守恒和不确定性
13.7 · 科学大模型 II:物理、气象与数值模拟
物理、气象和工程模拟常被称为科学基础模型,因为它们处理场、方程、网格和时间演化。本节说明神经网络如何作为求解器或代理模型,同时强调边界条件、守恒定律、外推风险和不确定性不能被语言生成的流畅度掩盖。
13.7.1 数据、偏微分方程与神经算子
物理系统的输入通常不是一段自然语言,而是初始场、边界条件、材料参数、几何、外力和时间。输出可能是未来时刻的温度、速度、压力或概率分布。数据管线要明确网格、坐标系、单位、采样频率和边界类型,否则模型可能在不同设置之间混淆。
数值模拟用离散网格近似连续方程,误差来自离散化、求解器、边界、初值和测量。神经网络可以学习从参数到场的映射,成为快速代理;也可以学习算子,跨不同网格或初始条件预测演化。它不能自动修复训练数据本身的数值误差。
几何和对称性影响模型架构。平移等变、旋转等变或网格无关的表示,能减少模型学习重复坐标变换的负担。对于不规则网格,可以使用图网络或点云;对于规则网格,可以使用卷积、频域或多尺度结构。选择架构应由对象和方程决定。
边界条件要作为一等输入。训练时如果只看到固定边界,部署到新边界会产生严重外推。可以把边界类型编码进输入,使用掩码或专门的边界损失,并在评估中按边界、尺度和雷诺数等条件切片。
物理约束可以通过损失、架构、后处理或混合求解器加入。损失惩罚守恒残差简单直观,但权重难调;硬约束架构更安全但实现复杂;混合方法让网络预测难部分、数值方法负责约束部分。没有一种方法适合所有方程。
科学数据的采样并不均匀。极端天气、湍流转捩和材料失效等事件少而重要,平均误差容易忽略它们。训练和评估应增加稀有事件、峰值、梯度和长期稳定性指标,必要时使用分层采样或代价敏感损失。
尺度问题同样关键。模型在低分辨率上表现好,不代表能保留小尺度结构;短时间预测稳定,不代表长时间滚动不会发散。报告空间、时间和参数范围,分开测量一步误差、滚动误差和守恒误差。
本小节的要点是:科学代理模型要把网格、方程、边界、尺度和单位写进数据契约;否则更快的预测可能只是更快地产生错误。
| 字段 | 示例 | 为什么重要 |
|---|---|---|
| 坐标/网格 | x、y、z、分辨率 | 决定空间关系 |
| 时间 | dt、时间戳、预测窗 | 区分一步与长期误差 |
| 边界 | 周期、固定、开放 | 决定可行解 |
| 单位 | Pa、K、m/s | 避免量纲混用 |
| 方程/参数 | 扩散系数、外力 | 描述机制 |
| 误差 | 测量和数值误差 | 判断可置信范围 |
网络负责快速近似,物理和数值模块负责把结果拉回可行域;两者的误差都要记录。
from dataclasses import dataclass
from typing import Literal
Boundary = Literal["periodic", "fixed", "open"]
@dataclass(frozen=True)
class Field:
values: list[list[float]]
unit: str
dx: float
dt: float
boundary: Boundary
def mean(field: Field) -> float:
flat = [value for row in field.values for value in row]
if not flat:
raise ValueError("场不能为空")
return sum(flat) / len(flat)
field = Field([[1.0, 2.0], [3.0, 4.0]], "m/s", 0.1, 0.01, "fixed")
print(mean(field))13.7.2 代理预测、滚动误差与不确定性
代理模型的吸引力在于把昂贵的数值模拟压缩成快速推理,使参数搜索、优化和实时预报成为可能。但代理模型常见的失效不是单步误差很大,而是滚动预测中的微小偏差逐步放大。评估要模拟真实使用方式,不能只在独立时间点上计算平均误差。
一步预测、短期滚动和长期滚动分别回答不同问题。一步预测看局部拟合,短期滚动看控制或预报的实用性,长期滚动看统计量、守恒和稳定性。每种设置都应报告误差曲线、峰值偏差、频谱或守恒残差,不能用一个 MAE 概括全部行为。
不确定性可以通过集成、随机采样、分位数回归或后验近似估计。集成模型能反映参数和初始化差异,分位数输出能表达条件分布,但校准需要单独验证。置信区间过窄会带来过度自信,过宽则失去决策价值。
极端事件需要专门测试。气象预报的强降水、台风路径、热浪,工程模拟的裂纹、失稳和冲击都可能是低频高影响。把极端样本混在总体平均里,模型可以“多数时候没问题”却在最需要它的时候失败。
外推检测应成为运行时的一部分。比较输入参数与训练范围,检查场的统计量、边界类型和分辨率,发现离群后降低自动化等级。系统可以返回“超出训练覆盖,需要数值求解或专家确认”,而不是强行给出精确图像。
代理模型与传统求解器可以互相校正。低成本网络先筛选大量方案,高精度求解器复核少量关键候选;差异最大的区域进入主动学习。这样的多保真策略比让网络独自覆盖全部空间更可控。
可视化也会误导。色阶截断、平滑插值和动画帧率可能隐藏局部峰值或不守恒区域。图表要显示单位、范围、色阶、参考解、误差和不确定性,必要时提供原始网格下载。
本小节完成后,你应该能为科学代理模型定义滚动评估、极端切片、外推检测和不确定性报告。
| 维度 | 指标示例 | 失败信号 |
|---|---|---|
| 局部 | 一步 MAE、相关系数 | 单步就偏离 |
| 滚动 | t 步误差、发散时间 | 误差随步数爆炸 |
| 物理 | 守恒残差、边界残差 | 违反方程或边界 |
| 极端 | 峰值误差、事件召回 | 漏掉高影响事件 |
| 不确定性 | 覆盖率、校准误差 | 区间过窄或过宽 |
| 外推 | 距离训练范围、OOD 分数 | 输入超出覆盖 |
把置信区间变成行动
区间窄且覆盖训练范围时,可以自动进入下一步;区间宽或输入离群时,转向高精度求解器;区间与参考观测严重不一致时,触发数据和传感器检查。阈值应写入任务合同。
不确定性不是越小越好。它要能区分容易和困难样本,并在真实频率下覆盖正确值。评估时同时报告平均宽度和覆盖率,防止模型用无限宽的区间“作弊”。
from dataclasses import dataclass
@dataclass(frozen=True)
class Step:
truth: float
prediction: float
def rolling_errors(steps: list[Step]) -> list[float]:
return [abs(step.truth - step.prediction) for step in steps]
def first_over_limit(errors: list[float], limit: float) -> int | None:
for index, error in enumerate(errors, start=1):
if error > limit:
return index
return None
steps = [Step(1.0, 1.1), Step(1.2, 1.4), Step(1.5, 1.9)]
errors = rolling_errors(steps)
print(errors, first_over_limit(errors, 0.3))13.7.3 守恒、实验设计与可信模拟
可信模拟要明确哪些规律必须严格满足,哪些可以近似。质量守恒、能量范围、边界条件和几何约束可能是硬门槛;某些经验参数和观测噪声则允许不确定。把所有约束都放进一个损失函数,会让工程团队难以判断哪个约束被违反。
守恒检查可以在训练、验证和运行时进行。训练阶段帮助模型学习可行解,验证阶段报告不同场景的残差,运行时则拦截明显错误并切换到修正器。修正器不应只是把结果裁剪到范围内,因为简单裁剪可能破坏整体守恒;要记录修正量和触发原因。
边界和初始条件的实验设计决定泛化。若所有训练案例都采用相同边界,模型无法知道边界变化的影响;若参数采样集中在容易区域,极端条件会成为未知外推。设计覆盖空间时要与实际应用和安全边界共同决定,而不是只追求样本数量。
科学模拟的基线不能只有“上一时刻不变”。还应包括传统数值求解器、线性近似、统计模型和简单的插值方法。代理模型必须在精度、速度、稳定性和资源消耗之间比较;如果只比一个很弱的基线,提升没有实际意义。
结果的可信度需要跨学科审阅。数学和计算专家关注稳定性、收敛和复杂度,领域专家关注量纲、边界和实验意义,工程人员关注延迟、监控和故障切换。一个指标表无法替代这三种视角的交叉检查。
发布科学模型时,公开或内部共享的内容应包括适用域、训练分布、已知失效、输入输出格式、单位、示例、评估脚本和引用。若模型用于安全关键系统,还要提供验证数据和独立测试,而不是只提供一张性能图。
长期运行会遇到传感器漂移、网格变化和环境分布变化。监控输入统计、物理残差、与观测的差异和切换频率;发现漂移时暂停自动化、重新校准或追加数据。模型服务应该能够回到传统求解器,保证系统在模型失效时仍有安全路径。
本小节的终点是建立“预测—校验—修正—回退”的闭环,让速度成为可信模拟的补充,而不是对物理约束的替代。
| 检查层 | 例子 | 动作 |
|---|---|---|
| 单位 | 长度、时间、速度 | 转换或拒绝混合单位 |
| 范围 | 温度、压力、浓度 | 标记离群并降低自动等级 |
| 边界 | 固定/周期/开放 | 校验边界残差 |
| 守恒 | 质量、能量、通量 | 记录残差并修正/回退 |
| 稳定 | 长时滚动、发散 | 切换高精度求解器 |
| 观测 | 传感器/实验对照 | 校准模型或暂停发布 |
任何自动修正都要保留原始结果、修正量和原因,方便判断模型是否正在超出适用域。
from dataclasses import dataclass
@dataclass(frozen=True)
class Prediction:
values: list[float]
residual: float
max_value: float
def guard(prediction: Prediction, residual_limit: float, max_limit: float) -> str:
if prediction.residual > residual_limit:
return "fallback_solver"
if prediction.max_value > max_limit:
return "expert_review"
return "accept"
prediction = Prediction([1.0, 1.2, 1.1], 0.03, 1.2)
print(guard(prediction, 0.05, 2.0))本节完成验收
完成本节后,应能写出科学场数据契约,分别评估一步、滚动、极端和守恒误差,并设置外推检测、物理校验和回退求解器。验收时给出一个边界变化和一个离群输入,系统必须降低自动化等级或回退,而不能只返回漂亮的预测图。
为一个二维温度场写出坐标、单位、边界和时间字段。
参考结论:能区分网格分辨率与时间步长;边界变化在评估切片中出现。
完整实现路径:物理场样本保存坐标、单位、边界和时间;滚动预测同时监测守恒残差与误差累积。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
import numpy as np
def field_checks(field, dx, dt, boundary):
if field.ndim != 3: raise ValueError("expected (time, x, y)")
if dx <= 0 or dt <= 0: raise ValueError("dx/dt must be positive")
if not np.isfinite(field).all(): raise FloatingPointError("non-finite field")
mass = field.sum(axis=(1, 2)) * dx * dx
drift = float(np.max(np.abs(mass - mass[0])))
return {"boundary": boundary, "mass_drift": drift,
"fallback": drift > 1e-3}
report = field_checks(field, dx=.1, dt=.01, boundary="periodic")验收标准:超阈值时回退传统求解器,且能定位首次漂移时间步。
若结果不对:先验输入网格和边界,再算残差,最后比较数值基线。
实现滚动误差和首次超阈值检测。
参考结论:空列表、阈值相等和长序列都有明确行为。
完整实现路径:物理场样本保存坐标、单位、边界和时间;滚动预测同时监测守恒残差与误差累积。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
import numpy as np
def field_checks(field, dx, dt, boundary):
if field.ndim != 3: raise ValueError("expected (time, x, y)")
if dx <= 0 or dt <= 0: raise ValueError("dx/dt must be positive")
if not np.isfinite(field).all(): raise FloatingPointError("non-finite field")
mass = field.sum(axis=(1, 2)) * dx * dx
drift = float(np.max(np.abs(mass - mass[0])))
return {"boundary": boundary, "mass_drift": drift,
"fallback": drift > 1e-3}
report = field_checks(field, dx=.1, dt=.01, boundary="periodic")验收标准:超阈值时回退传统求解器,且能定位首次漂移时间步。
若结果不对:先验输入网格和边界,再算残差,最后比较数值基线。
设计代理模型与传统求解器的回退规则。
参考结论:依据残差、输入离群和极端事件;保留原始输出与切换原因。
完整实现路径:物理场样本保存坐标、单位、边界和时间;滚动预测同时监测守恒残差与误差累积。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
import numpy as np
def field_checks(field, dx, dt, boundary):
if field.ndim != 3: raise ValueError("expected (time, x, y)")
if dx <= 0 or dt <= 0: raise ValueError("dx/dt must be positive")
if not np.isfinite(field).all(): raise FloatingPointError("non-finite field")
mass = field.sum(axis=(1, 2)) * dx * dx
drift = float(np.max(np.abs(mass - mass[0])))
return {"boundary": boundary, "mass_drift": drift,
"fallback": drift > 1e-3}
report = field_checks(field, dx=.1, dt=.01, boundary="periodic")验收标准:超阈值时回退传统求解器,且能定位首次漂移时间步。
若结果不对:先验输入网格和边界,再算残差,最后比较数值基线。
数值模拟推演与排错
在物理与气象数值模拟中,第 1 个观察点是:场数据 schema 至少保存坐标、网格、时间步长、单位、边界、初始条件和参数。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“场数据 schema 至少保存坐标、网格、时间步长、单位、边界、初始条件和参数”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 2 个观察点是:神经算子或图网络跨网格泛化要明确分辨率、几何和边界的训练范围。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“神经算子或图网络跨网格泛化要明确分辨率、几何和边界的训练范围”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 3 个观察点是:物理损失权重需要观察守恒残差、观测拟合和优化稳定性,不能只追求一个总损失。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“物理损失权重需要观察守恒残差、观测拟合和优化稳定性,不能只追求一个总损失”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 4 个观察点是:相邻网格、同一风暴或同一实验轨迹存在空间相关,切分应按事件、区域、时间或批次。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“相邻网格、同一风暴或同一实验轨迹存在空间相关,切分应按事件、区域、时间或批次”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 5 个观察点是:开放边界、复杂几何和不同材料若未被训练覆盖,推理前应触发外推检测。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“开放边界、复杂几何和不同材料若未被训练覆盖,推理前应触发外推检测”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 6 个观察点是:代理模型的速度收益要包含预处理、数据搬运、后处理、校验和回退的端到端时间。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“代理模型的速度收益要包含预处理、数据搬运、后处理、校验和回退的端到端时间”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 7 个观察点是:长期滚动要同时监控一步误差、发散时间、守恒、频谱和统计量漂移。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“长期滚动要同时监控一步误差、发散时间、守恒、频谱和统计量漂移”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 8 个观察点是:极端天气、湍流转捩和材料失效是低频高影响切片,不能被总体平均掩盖。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“极端天气、湍流转捩和材料失效是低频高影响切片,不能被总体平均掩盖”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 9 个观察点是:可视化要显示参考解、预测、误差、色阶、单位和置信区间,不能用平滑动画隐藏异常。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“可视化要显示参考解、预测、误差、色阶、单位和置信区间,不能用平滑动画隐藏异常”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在物理与气象数值模拟中,第 10 个观察点是:回退策略要演练超阈值残差、传感器异常和输入离群,保留原始结果与切换原因。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“回退策略要演练超阈值残差、传感器异常和输入离群,保留原始结果与切换原因”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 边界 | 换成开放边界 | 仍高置信 | 外推检测 |
| 3 | 滚动 | 增加预测步数 | 发散不报警 | 设回退阈值 |
| 4 | 守恒 | 注入残差 | 继续自动发布 | 物理闸门 |
本页反向检查
代理模型可能只是在逼近有偏的传统求解器,应使用多种基线和观测数据交叉验证。
端到端延迟比前向毫秒更重要,检索、搬运、物理校验和回退都应计入一次任务。
数学、领域和工程三种视角要交叉审阅:稳定性、量纲和运行故障缺一不可。
验收时提供边界变化和离群输入,系统必须降低自动化等级或回退并留下记录。
数值模拟复盘案例
在物理与气象场预测的复查中,第 1 个问题是“网格、坐标、单位和时间步长是否随数组一起传递”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“网格、坐标、单位和时间步长是否随数组一起传递”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在物理与气象场预测的复查中,第 2 个问题是“边界变化和分辨率变化是否出现在测试切片”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“边界变化和分辨率变化是否出现在测试切片”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在物理与气象场预测的复查中,第 3 个问题是“一步误差、滚动误差和守恒残差是否分别报告”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“一步误差、滚动误差和守恒残差是否分别报告”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在物理与气象场预测的复查中,第 4 个问题是“极端事件是否有独立指标而不是被平均掩盖”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“极端事件是否有独立指标而不是被平均掩盖”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在物理与气象场预测的复查中,第 5 个问题是“不确定性区间是否经过覆盖率和宽度校准”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“不确定性区间是否经过覆盖率和宽度校准”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在物理与气象场预测的复查中,第 6 个问题是“输入离群时是否降低自动化等级或切换求解器”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“输入离群时是否降低自动化等级或切换求解器”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在物理与气象场预测的复查中,第 7 个问题是“回退时是否保存原始预测、修正量和通知记录”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“回退时是否保存原始预测、修正量和通知记录”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 网格 | 改变分辨率 | 误差不变 | 分辨率切片 |
| 边界 | 换成开放边界 | 仍高置信 | 外推检测 |
| 滚动 | 增加预测步数 | 发散不报警 | 设回退阈值 |
| 守恒 | 注入残差 | 继续自动发布 | 物理闸门 |
本页反向检查
代理模型可能只是在逼近有偏的传统求解器,应使用多种基线和观测数据交叉验证。
端到端延迟比前向毫秒更重要,检索、搬运、物理校验和回退都应计入一次任务。
数学、领域和工程三种视角要交叉审阅:稳定性、量纲和运行故障缺一不可。
验收提供边界变化和离群输入,系统必须降低自动化等级或回退并留下记录。
科学模拟页的最后验收
给模型一个训练范围外的边界和分辨率,输入检查应标记外推并降低自动化等级;不能因为网络返回了数值就认为预测有效。
分别运行一步、短期滚动和长期滚动,观察误差、守恒残差和统计量;如果长期发散,系统必须触发回退而不是继续绘图。
把一个传感器故障样本注入管线,数据质量状态应与真实场预测分开;无效观测不能直接变成模型负样本。
比较代理模型、传统求解器和简单基线的端到端时间与精度,报告预处理、校验和回退成本,避免只比较前向毫秒。
图示同时显示参考解、预测、误差、单位和置信区间,读者能从颜色之外的文字和数值发现异常。
本页完成后,你应能解释模型在哪些条件下加速模拟、在哪些条件下必须让位给物理或数值方法。
把“看起来不错”变成可审计证据
13.8 · 领域评估、合规与上线治理
领域模型的评估不能只复制通用榜单。可靠性要在任务、数据切片、专家标准、风险事件、成本和上线监控中被反复验证。本节建立一套从基准集到发布、监控、回滚和模型卡的治理流程。
13.8.1 基准、切片与专家评审
先写评估问题,再选指标。问答任务关心证据和拒答,抽取任务关心字段和边界,生成任务关心忠实与格式,科学预测关心单位、守恒和外推。指标不是越多越好,但必须覆盖任务合同里的关键承诺。
基准集应由正常、难例、边界、反事实、越权和真实失败组成。只从成功日志抽样,会高估模型;只用合成题,又可能遗漏真实数据的脏格式和流程约束。评估集要冻结版本,新增安全事件进入回归集而不是悄悄替换旧题。
切片是发现不平等和外推风险的工具。按来源、时间、语言、用户角色、设备、法域、科室、群体或实验条件切片,报告样本量和置信区间。小样本切片不能给出虚假的精确结论,应标记证据不足并限制解释。
专家评审必须有培训和一致性检查。评审者先用示例理解尺度,再独立打分,分歧较大时讨论并更新规范。记录评审时间、领域资格、版本和理由,避免把不同人的标准混在一个总分里。
自动指标适合快速回归,专家指标适合判断危害和语境。两者冲突时,要追问原因:模型可能为了词面相似而遗漏关键事实,也可能使用不同但同样正确的表达。不要简单平均后宣布“综合分数”。
错误分类比一个准确率更有指导力。把错误标为来源错误、检索错误、事实幻觉、单位错误、否定丢失、格式错误、越权、工具失败或界面误导,才能为下一轮数据、模型或流程改进指路。
评估结果要包含基线和成本。比较通用模型、RAG、适配器、确定性工具和人工流程的质量、延迟、token、GPU、审核时间和失败后果。一个略低但成本和风险更可控的方案,可能更适合上线。
本小节的目标是让评估成为决策证据,而不是发布前的一张漂亮表格。
| 层级 | 问题 | 输出 |
|---|---|---|
| 自动回归 | 格式和基本事实是否稳定? | 字段指标、错误日志 |
| 检索评估 | 证据是否召回并被引用? | Recall、引用覆盖、版本命中 |
| 专家评审 | 在语境和风险上可接受吗? | 量表、分歧、危害等级 |
| 切片分析 | 谁或什么条件下退化? | 分组指标、样本量、区间 |
| 线上监控 | 真实分布和成本改变了吗? | 漂移、修改率、事件 |
每一步都留下原始输入、模型输出和判断理由;没有可回放样本的分数不能作为发布依据。
from dataclasses import dataclass
@dataclass(frozen=True)
class Case:
case_id: str
slice_name: str
expected: str
actual: str
evidence_ok: bool
def exact_match(case: Case) -> bool:
return case.expected.strip() == case.actual.strip()
cases = [
Case("c1", "fresh", "supported", "supported", True),
Case("c2", "missing", "refuse", "supported", False),
]
for case in cases:
print(case.case_id, exact_match(case), case.evidence_ok)13.8.2 模型卡、数据说明书与审计记录
模型卡应让读者知道模型为什么存在、适合谁使用、输入输出是什么、在哪些数据上评估过以及已知限制。对于行业模型,还要写任务合同、风险等级、工具依赖、人工复核、版本更新和撤回方式。只写参数规模和最高分,无法支持采购和治理决策。
数据说明书描述数据集的动机、组成、来源、采样、处理、标签、缺失、许可、隐私和适用范围。它应说明哪些群体或时间段没有覆盖,哪些字段由人工推断,哪些样本被删除。数据限制会直接影响模型限制,不能把两份文档割裂。
审计记录要能回答一次请求发生了什么。至少保存请求 ID、用户角色、任务合同版本、模型和适配器版本、提示词模板版本、检索候选 ID、工具调用、输出、人工修改和发布状态。敏感内容按权限保存,但不能为了隐私而失去事件调查能力。
审计不是无限保存所有文本。根据任务和法规设置最小留存、加密、访问审批和删除机制;对评估和安全事件可以保留脱敏样本与哈希。文档要说明谁能调阅日志、多久删除、删除后如何验证。
数据和模型的版本号要互相引用。模型 v3 使用数据快照 d7 和适配器 a2,检索索引 i9 采用法规版本 r2026。这样升级索引不会被误认为升级模型,出现问题时也能单独回滚某一层。
审计记录还应该包含“没有发生什么”。例如系统拒绝了一个越权工具调用、过滤掉一条过期法规、因不确定性切换到人工。记录这些安全分支,才能评估拒答是否有效,避免只统计成功请求。
文档要由真正的负责人签字,而不是自动生成后无人阅读。上线前让数据、模型、领域、工程和合规人员分别确认自己负责的部分;发生变更时重新审查对应章节。文档和代码、配置一起进入版本控制。
本小节的结论是:可解释和可审计不是给模型增加一段说明,而是给整个系统留下足够的证据。
| 字段 | 示例 | 用途 |
|---|---|---|
| request_id | req-20260830-001 | 串联所有事件 |
| contract_version | medical-summary-v2 | 确认任务边界 |
| model/adapter | base-7b / med-v3 | 复现权重 |
| retrieval_ids | doc-4#p7 | 回链证据 |
| tool_calls | drug_check:ok | 检查外部动作 |
| human_action | approved/edited | 责任与学习 |
| release_state | gray-10% | 定位线上阶段 |
文档互相引用的规则
模型卡写“适用任务”和“已知限制”,任务合同写“何时拒答”和“谁复核”,数据说明书写“资料边界”,评估报告写“证据”。四者都引用版本号,任何一份变更都能找到受影响的另外几份。
当一项限制无法通过模型改进消除,就把它转成产品限制,例如只读、只处理某个日期范围、只面向专家或必须人工批准。诚实的限制比模糊的承诺更有用。
from dataclasses import dataclass, asdict
from datetime import datetime
import json
@dataclass(frozen=True)
class AuditEvent:
request_id: str
contract_version: str
model_version: str
action: str
at: str
outcome: str
def serialize(event: AuditEvent) -> str:
return json.dumps(asdict(event), ensure_ascii=False, sort_keys=True)
event = AuditEvent(
"req-1", "contract-v2", "model-v3",
"tool_search", datetime.now().isoformat(timespec="seconds"), "blocked",
)
print(serialize(event))13.8.3 监控、发布、回滚与持续改进
线上监控要同时看质量、分布、成本和安全。质量包括用户修改率、证据覆盖、人工退回和关键错误;分布包括输入长度、来源、语言、任务类型和检索新鲜度;成本包括延迟、token、GPU 和工具调用;安全包括越权、敏感信息、拒答和事件。
没有人工反馈的系统很难知道“答案是否真的帮上忙”。反馈按钮只能作为入口,最好让用户标记具体字段、证据或原因,并区分“不准确”“不适用”“太慢”“无法使用”。反馈要采样审查,避免把用户偏好直接当成事实标签。
数据漂移不一定意味着模型坏了。新法规、业务季节性、设备升级或用户群变化都会改变输入分布。监控要比较基线和当前窗口,结合任务成功率和切片指标判断是否需要重新索引、调整路由、补数据或重新训练。
回滚要做到层次化。可以先关闭一个适配器、切换旧索引、禁用某个工具或把自动发布改成人工复核;必要时再回滚基础模型。每层都要有版本、健康检查和切换演练,不能等事故发生时才寻找旧包。
发布策略要控制变化范围。灰度、A/B 和影子流量各有用途,但高风险任务不能把用户当作未经同意的实验对象。影子模式可以只运行模型而不影响决策,评估通过后再扩大实际使用。
持续改进需要错误地图。每周或每个版本把错误按根因、严重性、切片和修复动作汇总,选择少量高价值问题形成数据、提示词、检索、工具或界面改动。改动后重放历史错误和关键基准,确认修复没有制造新的退化。
治理流程要允许暂停。安全团队、领域专家或用户都应有明确的“停止自动化”入口;暂停不是失败,而是在证据不足时保护用户。恢复前要有新的评估、复核和沟通记录。
本小节的最终成果是一张可执行的上线运行图:谁看什么指标,什么条件触发什么动作,如何回滚,如何把事件变成下一版的测试。
| 信号 | 可能原因 | 先做什么 |
|---|---|---|
| 引用覆盖下降 | 索引过期、解析失败 | 检查版本和召回日志 |
| 人工修改上升 | 分布漂移、提示变化 | 按切片回放案例 |
| 延迟升高 | 上下文变长、工具慢 | 限长、缓存或切换模型 |
| 拒答异常下降 | 路由或安全规则退化 | 暂停高风险任务 |
| 敏感命中 | 脱敏或权限失效 | 隔离请求、审查日志 |
| 守恒残差上升 | 外推或传感器漂移 | 回退求解器并校准 |
闭环的最小单位是一类可描述的错误,而不是一次盲目的大版本升级。
from dataclasses import dataclass
@dataclass
class Deployment:
model: str
index: str
adapter: str
mode: str
def safe_rollback(current: Deployment, previous: Deployment) -> Deployment:
return Deployment(
model=previous.model,
index=previous.index,
adapter=previous.adapter,
mode="human_review",
)
current = Deployment("model-v3", "index-v9", "adapter-v4", "auto")
previous = Deployment("model-v2", "index-v8", "adapter-v3", "gray")
print(safe_rollback(current, previous))本节完成验收
完成本节后,应能建立基准、切片、专家评审、模型卡、数据说明书、审计日志和线上回滚之间的关联。验收时给出一个引用下降和一个越权调用事件,要求写出发现、隔离、调查、修复、回归和发布步骤。
为一个行业助手设计 10 条基准题,其中至少包含 3 个不可回答或越权样本。
参考结论:题目带合同版本、期望状态和证据要求;新增事件能加入回归集。
完整实现路径:基准按来源、时间、难度和风险分层;模型卡说明限制,发布采用灰度、监控和可逆回滚。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
def evaluate_slices(rows, threshold=.85):
report = {}
for row in rows:
key = (row["source"], row["risk"], row["time_bucket"])
report.setdefault(key, []).append(row["correct"])
scores = {str(k): sum(v)/len(v) for k, v in report.items()}
failed = {k:v for k,v in scores.items() if v < threshold}
return {"scores": scores, "failed": failed, "pass": not failed}
result = evaluate_slices(rows)
if not result["pass"]: raise RuntimeError(result["failed"])验收标准:关键切片、专家评审和合规门都通过,审计链完整。
若结果不对:先冻结事故样本,再按数据/知识/工具/模型/流程五层归因。
写出模型卡和数据说明书的目录。
参考结论:分别覆盖能力、限制、来源、许可、隐私、切片和适用范围。
完整实现路径:基准按来源、时间、难度和风险分层;模型卡说明限制,发布采用灰度、监控和可逆回滚。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
def evaluate_slices(rows, threshold=.85):
report = {}
for row in rows:
key = (row["source"], row["risk"], row["time_bucket"])
report.setdefault(key, []).append(row["correct"])
scores = {str(k): sum(v)/len(v) for k, v in report.items()}
failed = {k:v for k,v in scores.items() if v < threshold}
return {"scores": scores, "failed": failed, "pass": not failed}
result = evaluate_slices(rows)
if not result["pass"]: raise RuntimeError(result["failed"])验收标准:关键切片、专家评审和合规门都通过,审计链完整。
若结果不对:先冻结事故样本,再按数据/知识/工具/模型/流程五层归因。
设计分层回滚演练,先关闭适配器,再切换索引,最后回滚基础模型。
参考结论:每一步都有健康检查、审计记录和恢复条件。
完整实现路径:基准按来源、时间、难度和风险分层;模型卡说明限制,发布采用灰度、监控和可逆回滚。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
def evaluate_slices(rows, threshold=.85):
report = {}
for row in rows:
key = (row["source"], row["risk"], row["time_bucket"])
report.setdefault(key, []).append(row["correct"])
scores = {str(k): sum(v)/len(v) for k, v in report.items()}
failed = {k:v for k,v in scores.items() if v < threshold}
return {"scores": scores, "failed": failed, "pass": not failed}
result = evaluate_slices(rows)
if not result["pass"]: raise RuntimeError(result["failed"])验收标准:关键切片、专家评审和合规门都通过,审计链完整。
若结果不对:先冻结事故样本,再按数据/知识/工具/模型/流程五层归因。
评估治理推演与排错
在领域评估与治理中,第 1 个观察点是:指标从任务动作出发,摘要、检索、抽取、预测和工具任务不能共用一个文本相似度。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“指标从任务动作出发,摘要、检索、抽取、预测和工具任务不能共用一个文本相似度”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 2 个观察点是:基准集包含正常、难例、边界、反事实、越权和真实失败,版本冻结后不能悄悄替换。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“基准集包含正常、难例、边界、反事实、越权和真实失败,版本冻结后不能悄悄替换”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 3 个观察点是:切片按来源、时间、语言、角色、设备、法域、科室、群体或实验条件划分并报告样本量。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“切片按来源、时间、语言、角色、设备、法域、科室、群体或实验条件划分并报告样本量”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 4 个观察点是:专家量表拆分事实、证据、完整、危害和可读性,评审者需要先校准标准。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“专家量表拆分事实、证据、完整、危害和可读性,评审者需要先校准标准”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 5 个观察点是:自动指标用于快速回归,专家指标用于语境和危害判断,两者冲突时要调查根因。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“自动指标用于快速回归,专家指标用于语境和危害判断,两者冲突时要调查根因”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 6 个观察点是:错误地图把来源、检索、幻觉、单位、否定、格式、越权和工具错误关联到修复动作。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“错误地图把来源、检索、幻觉、单位、否定、格式、越权和工具错误关联到修复动作”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 7 个观察点是:模型卡、数据说明书、任务合同和评估报告要互相引用版本,不能各写各的。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“模型卡、数据说明书、任务合同和评估报告要互相引用版本,不能各写各的”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 8 个观察点是:审计事件至少保存请求、合同、模型、适配器、检索、工具、输出和人工动作。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“审计事件至少保存请求、合同、模型、适配器、检索、工具、输出和人工动作”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 9 个观察点是:线上监控同时看质量、分布、成本和安全,用户沉默不能被当成满意。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“线上监控同时看质量、分布、成本和安全,用户沉默不能被当成满意”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域评估与治理中,第 10 个观察点是:严重错误、越权、敏感泄露和审计缺失应作为发布红线,不能被平均分抵消。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“严重错误、越权、敏感泄露和审计缺失应作为发布红线,不能被平均分抵消”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 切片 | 查看小群体 | 总体分掩盖退化 | 报告样本量 |
| 3 | 审计 | 回放请求 | 缺模型/索引版本 | 补日志 |
| 4 | 发布 | 触发红线 | 仍自动上线 | 阻止发布 |
本页反向检查
评估集本身也要保护隐私和版权,使用脱敏、访问控制和受控运行,保留哈希引用。
回滚不仅是换旧模型,索引、提示词、适配器、工具和界面都可能造成问题。
模型卡要写已知失效、低覆盖群体、时间范围和不支持工具,不只展示成功案例。
最终验收做一次完整回放,从请求、检索、工具、输出到人工动作都能还原。
评估治理复盘案例
在领域评估与治理的复查中,第 1 个问题是“基准集是否冻结并保存输入、期望状态和来源”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“基准集是否冻结并保存输入、期望状态和来源”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域评估与治理的复查中,第 2 个问题是“小切片是否报告样本量、置信区间和适用限制”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“小切片是否报告样本量、置信区间和适用限制”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域评估与治理的复查中,第 3 个问题是“专家评审是否有校准样例、分歧和裁决记录”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“专家评审是否有校准样例、分歧和裁决记录”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域评估与治理的复查中,第 4 个问题是“错误地图能否把根因连接到修复和回归用例”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“错误地图能否把根因连接到修复和回归用例”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域评估与治理的复查中,第 5 个问题是“模型卡、数据卡和任务合同是否互相引用同一版本”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“模型卡、数据卡和任务合同是否互相引用同一版本”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域评估与治理的复查中,第 6 个问题是“审计日志能否还原检索、工具和人工动作”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“审计日志能否还原检索、工具和人工动作”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域评估与治理的复查中,第 7 个问题是“红线触发时发布系统是否真的阻止上线”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“红线触发时发布系统是否真的阻止上线”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 基准 | 冻结评估集 | 版本不可比 | 锁定快照 |
| 切片 | 查看小群体 | 总体分掩盖退化 | 报告样本量 |
| 审计 | 回放请求 | 缺模型/索引版本 | 补日志 |
| 发布 | 触发红线 | 仍自动上线 | 阻止发布 |
本页反向检查
评估集也要保护隐私和版权,使用脱敏、访问控制和受控运行,保留哈希引用。
回滚不仅是换旧模型,索引、提示词、适配器、工具和界面都可能造成问题。
模型卡要写已知失效、低覆盖群体、时间范围和不支持工具,不只展示成功案例。
最终验收做一次完整回放,从请求、检索、工具、输出到人工动作都能还原。
评估治理页的最后验收
固定一份带来源和期望状态的评估集,重新运行不同模型版本,检查结果是否可比较并能定位差异。
对小切片显示样本量和区间,禁止用两个样本的满分宣称普遍有效;样本不足时把限制写进模型卡。
回放一条线上请求,确认合同、模型、适配器、索引、工具和人工动作都能找到版本;缺一项就不能通过发布门。
人为触发严重错误或敏感信息红线,发布系统应阻止上线并生成事件记录,不能被平均分抵消。
演练只关闭适配器、只切换索引和全量回滚三种路径,确认每一步都有健康检查、通知和恢复条件。
本页的最终目标是让“发布”成为有证据的决定,让“暂停”成为可执行的安全动作。
可复现报错:知识版本晚于问题基准日
行业系统最危险的“正确代码”之一,是检索到一份在当时尚未生效的规则。下面的验证要放在排序和生成之前。
from datetime import date
query_at = date(2025, 1, 1)
document = {"source_id":"rule-v3", "effective_at":"2026-01-01"}
effective_at = date.fromisoformat(document["effective_at"])
if effective_at > query_at:
raise ValueError(
f"future knowledge: {document['source_id']} "
f"effective {effective_at}, query {query_at}"
)排错流程
- 先确认任务合同中的基准日期、法域、单位和风险级别。
- 沿 citation 找到原始文档,核对 effective/expiry 与数据库 revision。
- 复算确定性数值,区分检索错误、计算错误和生成表述错误。
- 高风险结果停止自动交付,保留审计 ID 并进入人工复核。
把模型、数据、工具和治理合成一个可交付物
13.9 · 综合项目:交付一个领域助手
最后一节把前面的原则落到一个完整项目。你可以选择“现行制度问答”“科研实验候选整理”“金融指标解释”或“临床资料摘要”中的一个低风险版本,完成任务合同、数据管线、检索/工具、评估、文档和回滚。重点不是做出最大模型,而是交付一条可复现的闭环。
13.9.1 选题、范围与任务合同
综合项目从选题边界开始。选择一个资料来源清楚、输入输出可定义、风险可控制的任务,例如对公开技术文档做带引用的问答,或对实验记录做字段整理。不要一开始就选择“自动诊断”“自动交易”或“替律师签发意见”,因为这些任务需要额外资质、监管和组织流程,无法用个人练习替代。
把目标用户写成具体角色。研究助理、数据工程师、法务审核员和普通访客需要的界面、证据和权限不同。目标用户还决定术语解释深度、默认输出格式和人工复核位置。没有用户角色的项目,评估往往只剩下作者自己的主观感觉。
任务合同要包含一个主路径和至少三个边界路径。主路径展示正常输入如何得到结果;边界路径覆盖资料缺失、版本不符、权限不足或工具失败;越权路径验证系统会拒绝不允许的动作。每条路径都写期望状态、证据和下一步,而不是只写一段提示词。
选择技术路线时先做基线。用通用模型加简单检索,测量人工修改、引用覆盖和延迟,再决定是否需要重排、适配器或继续预训练。基线能帮助你知道复杂组件带来了什么收益,也能防止把所有问题归因于模型规模。
输出格式应优先结构化。JSON 或表格字段可以被程序校验,说明文本则作为面向人的视图。字段中保留 source_ids、version、status、uncertainty 和 next_step,缺失时使用明确状态。结构化输出不代表内容一定正确,但能让错误更早暴露。
项目还要定义不做什么。不接收敏感数据、不执行写操作、不跨法域、不处理未授权来源、不替人下最终结论,这些限制应写进 README、界面和代码,而不是只存在作者记忆中。限制越清楚,演示越可信。
资源规划包括数据规模、运行环境、成本和时间。一个本地可运行的小系统比无法复现的云端演示更适合作为学习成果。记录依赖、环境变量、模型来源、API 额度和离线替代方案,避免别人拿到代码却无法启动。
完成本小节后,项目应有一页任务合同和一张系统边界图,任何评审者都能判断它解决什么、拒绝什么以及谁负责。
| 项目项 | 要写清楚 | 示例 |
|---|---|---|
| 用户 | 角色、权限、成功动作 | 研究助理查找公开方法 |
| 输入 | 格式、来源、时间、敏感性 | Markdown,公开,版本化 |
| 输出 | 字段、引用、状态、语言 | 答案 + source_ids + 缺口 |
| 边界 | 拒答、升级和禁止操作 | 资料缺失则转人工 |
| 指标 | 质量、成本、风险 | 引用覆盖、延迟、严重错误 |
| 交付 | 代码、数据卡、模型卡、演示 | README 可冷启动 |
项目验收看的是五块面板是否相互引用,而不是某一块是否堆了最多代码。
from dataclasses import dataclass
from typing import Literal
Status = Literal["ready", "needs_review", "blocked"]
@dataclass(frozen=True)
class ProjectContract:
name: str
user_role: str
allowed_sources: tuple[str, ...]
output_fields: tuple[str, ...]
risk: str
auto_publish: bool
def initial_status(self) -> Status:
if not self.allowed_sources or not self.output_fields:
return "blocked"
if self.risk == "high" or not self.auto_publish:
return "needs_review"
return "ready"
contract = ProjectContract(
"公开方法问答", "research_assistant",
("docs-v1",), ("answer", "source_ids", "status"),
"low", False,
)
print(contract.initial_status())13.9.2 数据、实验与错误地图
项目数据管线应从原始资料开始,而不是从已经整理好的示例开始。保存原始文件、清洗脚本、切片规则、索引构建和版本清单。每一步都输出统计:记录数、字符数、缺失、重复、来源分布和敏感字段。统计变化时,先检查数据管线,再检查模型。
准备三类数据集:开发集用于快速迭代,冻结评估集用于公平比较,回归集保存历史错误和安全事件。开发集可以频繁变化,评估集要经过审批,回归集不能因为新版本表现不好而删除。切分粒度按文档、项目、主体或时间选择,避免泄漏。
实验记录要包含问题、假设、改动、环境、模型、提示词、检索参数、结果和结论。一次实验只改变少量变量,才能知道收益来自哪里。把多个改动一起上线,再根据总体分数猜原因,会让项目难以复现。
错误地图是项目的导航。每条错误记录输入类型、严重性、根因、发现方式、修复动作、是否回归通过和负责人。根因可以是数据缺失、切分错误、召回失败、版本过滤漏掉、模型误读、工具异常或界面误导。错误地图应定期排序,优先处理高影响且可修复的问题。
实验不仅记录成功。一次低分或失败的检索实验能说明索引切分不合适,一次越权测试能说明路由器有效,一次人工修改能揭示输出字段缺失。失败样本是评估资产,只有把它们保存下来,项目才会越做越稳。
成本记录也属于实验。统计每次请求 token、检索数量、工具耗时和人工审阅时间,比较不同方案的总成本。对个人学习项目,可以使用小模型、本地缓存或固定样本,但要写出替换真实服务时会发生什么。
数据和实验要能被别人复现。README 提供下载或生成步骤,配置文件集中管理参数,随机性固定,运行结果写入带时间和版本的目录。涉及隐私或许可证的数据不应提交仓库,提供脱敏样例和生成脚本。
本小节完成的标志是:从空目录开始,别人可以按照 README 生成同样的评估输入、运行一次管线并找到一次历史错误。
| 类别 | 字段 | 示例 |
|---|---|---|
| 假设 | question、expected_change | 增加版本过滤会减少旧条款引用 |
| 环境 | python、依赖、硬件 | Python 3.11、本地 CPU |
| 输入 | snapshot、split、seed | docs-v4、frozen、7 |
| 系统 | model、prompt、retrieval | base-safe、p3、top_k=6 |
| 结果 | metrics、cost、errors | coverage=.94、latency=1.2s |
| 结论 | keep、revert、next | 保留过滤,补充难例 |
错误地图的写法
不要写“模型不聪明”。写成“旧版本条款被召回,过滤器只按发布日期没有检查生效日,导致第 3 个引用错误;修复:加入 valid_to 过滤;回归:case-17 通过”。这样的记录才能转成代码或测试。
每条错误都记录严重性和可发现性。高严重、低可发现的错误优先加硬校验或人工门;低严重、易发现的格式错误可以放到后续迭代。
from dataclasses import asdict, dataclass
from pathlib import Path
import json
@dataclass(frozen=True)
class Experiment:
id: str
hypothesis: str
model: str
metric: float
decision: str
def append_log(path: Path, experiment: Experiment) -> None:
rows = []
if path.exists():
rows = json.loads(path.read_text(encoding="utf-8"))
rows.append(asdict(experiment))
path.write_text(
json.dumps(rows, ensure_ascii=False, indent=2),
encoding="utf-8",
)
experiment = Experiment("exp-01", "版本过滤减少错误", "base-safe", 0.94, "keep")
append_log(Path("experiments.json"), experiment)
print("实验记录已追加")13.9.3 README、验收与迁移到下一章
一个项目是否完成,先看别人能否冷启动。README 应说明目标、非目标、环境、数据来源、安装、配置、运行、示例输入输出、评估、限制、隐私、许可证和故障排查。命令应从干净目录开始测试,不能依赖作者本机残留文件或隐藏环境变量。
演示要展示完整链路,而不是只展示最好的一次答案。准备一个正常样例、一个缺资料样例、一个越权样例和一个工具失败样例,说明系统如何输出状态、证据和下一步。把模型输出与人工基线并排,观众才能判断它减少了什么工作。
验收指标要与合同对应。若合同要求引用,测试引用覆盖和版本;若要求结构化输出,测试字段和类型;若要求拒答,测试越权和证据不足;若要求低延迟,记录 p50/p95 而不是一次最快时间。指标达不到时,写出当前适用范围,不要偷偷放宽标准。
迁移到下一章前整理三张表:知识表记录已经理解的概念,错误表记录仍会犯的错误,决策表记录每次技术选择和依据。这样下一章学习训练、部署和评估时,不会重新从“模型很大”开始,而是带着真实问题继续。
项目交付物最好分层。源码和配置用于运行,数据卡和模型卡用于理解,评估报告用于判断,README 用于复现,演示页面用于沟通,错误地图用于迭代。把所有内容放进一个超长文档,反而不利于维护和审阅。
安全交付还要写清删除和停用。如何删除本地索引、撤销 API 密钥、停用适配器、清理日志和恢复到上一版本,都应有命令或步骤。项目结束不意味着数据可以无限留在电脑上。
复盘时问三个问题:哪个假设被证实,哪个被推翻;哪个错误最值得投入;哪个环节仍依赖专家直觉。答案会决定下一次是补数据、改检索、换模型、加工具还是缩小范围,而不是自动选择“更大模型”。
完成本章意味着你能以领域任务为中心组织模型系统。下一章学习训练、部署与评估时,重点会从“领域问题是什么”转向“如何把一个可靠系统运行得更快、更稳、更可观测”。
| 交付物 | 内容 | 检查人 |
|---|---|---|
| README | 安装、运行、示例、排障 | 同伴冷启动 |
| 数据卡 | 来源、质量、许可、隐私 | 数据负责人 |
| 模型卡 | 能力、限制、评估、版本 | 模型/领域负责人 |
| 评估报告 | 基准、切片、专家、成本 | 评估负责人 |
| 错误地图 | 根因、严重性、回归状态 | 全体复盘 |
| 回滚说明 | 停用、切换、删除、通知 | 工程/治理负责人 |
第 13 章的交付边界是一个可验证的领域系统;下一章将在这个边界内研究工程化运行,而不是重新定义任务。
from dataclasses import dataclass
@dataclass(frozen=True)
class Acceptance:
chars_ok: bool
evidence_ok: bool
exercises_ok: bool
rollback_ok: bool
def passed(item: Acceptance) -> bool:
return all([
item.chars_ok,
item.evidence_ok,
item.exercises_ok,
item.rollback_ok,
])
item = Acceptance(True, True, True, True)
print("PASS" if passed(item) else "NEEDS_WORK")本节完成验收
完成本节后,应能从空目录冷启动一个低风险领域助手,提交任务合同、数据卡、模型卡、评估报告、错误地图、README 和回滚说明。最终验收要求同伴在没有口头补充的情况下运行示例、找到引用、触发拒答、查看日志并完成一次回滚演练。
从四个题目中选择一个低风险项目,并写一页任务合同。
参考结论:有用户、输入、输出、证据、边界、指标和责任人。
完整实现路径:交付任务合同、版本环境、数据卡、模型卡、测试、错误地图、runbook 和迁移说明。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 1:先复制运行,再替换为自己的数据
from pathlib import Path
import json
required = {"task_contract", "environment", "data_card", "model_card",
"tests", "error_map", "runbook", "migration"}
release = json.loads(Path("release.json").read_text(encoding="utf-8"))
missing = required - release.keys()
if missing: raise ValueError(f"incomplete delivery: {sorted(missing)}")
for artifact in release["tests"]:
if not Path(artifact).exists(): raise FileNotFoundError(artifact)
print("domain assistant delivery complete")验收标准:独立复核者可从 README 重跑并指出系统边界。
若结果不对:所有失败都应落到可执行命令、日志位置和责任人。
按 README 结构整理项目目录,写出从安装到评估的命令。
参考结论:干净环境可运行;样例、失败路径和数据许可说明齐全。
完整实现路径:交付任务合同、版本环境、数据卡、模型卡、测试、错误地图、runbook 和迁移说明。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 2:先复制运行,再替换为自己的数据
from pathlib import Path
import json
required = {"task_contract", "environment", "data_card", "model_card",
"tests", "error_map", "runbook", "migration"}
release = json.loads(Path("release.json").read_text(encoding="utf-8"))
missing = required - release.keys()
if missing: raise ValueError(f"incomplete delivery: {sorted(missing)}")
for artifact in release["tests"]:
if not Path(artifact).exists(): raise FileNotFoundError(artifact)
print("domain assistant delivery complete")验收标准:独立复核者可从 README 重跑并指出系统边界。
若结果不对:所有失败都应落到可执行命令、日志位置和责任人。
举行一次交付复盘,记录三条错误和一条下一章迁移问题。
参考结论:错误有根因和回归测试;迁移问题与训练、部署或监控相关。
完整实现路径:交付任务合同、版本环境、数据卡、模型卡、测试、错误地图、runbook 和迁移说明。 本题不要只交一段说明:应同时提交输入样例、可运行实现、输出或断言,以及失败时的明确状态。
# 对应本节练习 3:先复制运行,再替换为自己的数据
from pathlib import Path
import json
required = {"task_contract", "environment", "data_card", "model_card",
"tests", "error_map", "runbook", "migration"}
release = json.loads(Path("release.json").read_text(encoding="utf-8"))
missing = required - release.keys()
if missing: raise ValueError(f"incomplete delivery: {sorted(missing)}")
for artifact in release["tests"]:
if not Path(artifact).exists(): raise FileNotFoundError(artifact)
print("domain assistant delivery complete")验收标准:独立复核者可从 README 重跑并指出系统边界。
若结果不对:所有失败都应落到可执行命令、日志位置和责任人。
综合交付推演与排错
在领域助手综合交付中,第 1 个观察点是:选题小到可以完整复现,大到能体现领域约束,公开制度问答、论文方法整理和实验记录结构化适合第一版。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“选题小到可以完整复现,大到能体现领域约束,公开制度问答、论文方法整理和实验记录结构化适合第一版”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 2 个观察点是:从用户成功动作开始设计,用户要找到条款、复算指标、筛选候选或减少录入,而不是单纯看到回答。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“从用户成功动作开始设计,用户要找到条款、复算指标、筛选候选或减少录入,而不是单纯看到回答”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 3 个观察点是:原始资料、处理脚本、索引、模型、评估和缓存按责任分层,README 说明哪些文件可提交。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“原始资料、处理脚本、索引、模型、评估和缓存按责任分层,README 说明哪些文件可提交”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 4 个观察点是:每个云端或远程依赖都有替代方案,本地快照和小模型可以验证接口、边界和治理。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“每个云端或远程依赖都有替代方案,本地快照和小模型可以验证接口、边界和治理”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 5 个观察点是:主动制造删除来源、过期版本、空字段、撤销权限和工具超时等失败,观察状态、日志和回滚。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“主动制造删除来源、过期版本、空字段、撤销权限和工具超时等失败,观察状态、日志和回滚”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 6 个观察点是:读取、验证、检索、提示、解析、引用校验、审计和报告分别成函数或模块。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“读取、验证、检索、提示、解析、引用校验、审计和报告分别成函数或模块”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 7 个观察点是:演示区分模型、规则和工具结果,冲突时显示冲突并进入复核而不是只保留顺眼文字。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“演示区分模型、规则和工具结果,冲突时显示冲突并进入复核而不是只保留顺眼文字”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 8 个观察点是:冷启动由未参与开发的人执行,口头补充的步骤不算文档的一部分。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“冷启动由未参与开发的人执行,口头补充的步骤不算文档的一部分”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 9 个观察点是:项目报告并排展示基线、当前版本和人工流程,差异关联数据、模型、提示词、检索或界面。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“项目报告并排展示基线、当前版本和人工流程,差异关联数据、模型、提示词、检索或界面”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
在领域助手综合交付中,第 10 个观察点是:迁移下一章前写出训练、部署、监控、成本和回滚方面的真实瓶颈。先把这个观察点写进任务合同或数据契约,再决定模型是否参与;如果它不能被写成输入、输出和失败状态,说明问题仍然太模糊。
落到工程实现时,要为“迁移下一章前写出训练、部署、监控、成本和回滚方面的真实瓶颈”保留版本、证据和责任字段,并准备一个正常样本、一个边界样本和一个失败样本。上线后比较这三类样本的变化,才能知道改动解决的是根因,还是只让表面文字更顺。
| 观察点 | 验证动作 | 失败信号 | 下一步 | |
|---|---|---|---|---|
| 2 | 失败路径 | 让工具超时 | 无状态或日志 | 写 smoke test |
| 3 | 证据 | 点击引用 | 无法回到原文 | 保存 source_id |
| 4 | 迁移 | 列出瓶颈 | 下一章无问题 | 写部署问题 |
本页反向检查
交付物分层:源码配置用于运行,数据卡和模型卡用于理解,评估报告用于判断,错误地图用于迭代,回滚说明用于停用。
删除演练覆盖原始样例、派生切片、索引、日志、缓存和 API 密钥,对不可撤回权重写停用方案。
复盘回答哪个假设被证实、哪个被推翻、哪个错误最值得投入、哪个环节仍依赖专家直觉。
最终验收要在无口头说明的情况下完成正常、缺资料、越权、工具失败和一次回滚。
综合交付复盘案例
在领域助手综合交付的复查中,第 1 个问题是“陌生使用者能否从干净环境按 README 启动项目”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“陌生使用者能否从干净环境按 README 启动项目”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域助手综合交付的复查中,第 2 个问题是“正常、缺资料、越权和工具失败路径是否都有样例”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“正常、缺资料、越权和工具失败路径是否都有样例”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域助手综合交付的复查中,第 3 个问题是“结构化输出能否被程序校验并回到来源”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“结构化输出能否被程序校验并回到来源”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域助手综合交付的复查中,第 4 个问题是“模型、规则和工具结果是否在界面上区分”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“模型、规则和工具结果是否在界面上区分”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域助手综合交付的复查中,第 5 个问题是“数据卡、模型卡、评估报告和错误地图是否互相引用”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“数据卡、模型卡、评估报告和错误地图是否互相引用”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域助手综合交付的复查中,第 6 个问题是“删除与停用流程是否能清理派生数据和密钥”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“删除与停用流程是否能清理派生数据和密钥”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
在领域助手综合交付的复查中,第 7 个问题是“下一章训练、部署和监控问题是否来自真实瓶颈”。先用一个最小样本观察输入、输出和证据,再扩大到真实数据;这样可以把概念错误、数据错误和接口错误分开,不会在一开始就用大模型掩盖问题。
验收“下一章训练、部署和监控问题是否来自真实瓶颈”时,要同时记录通过条件和失败条件。通过不仅是页面显示了答案,还包括版本正确、边界被尊重、责任可追溯以及失败后有下一步。把这些条件写进自动测试或人工量表,下一次升级才能公平比较。
| 观察点 | 验证动作 | 失败信号 | 下一步 |
|---|---|---|---|
| 冷启动 | 清空环境运行 README | 依赖本机缓存 | 补安装步骤 |
| 失败路径 | 让工具超时 | 无状态或日志 | 写 smoke test |
| 证据 | 点击引用 | 无法回到原文 | 保存 source_id |
| 迁移 | 列出瓶颈 | 下一章无问题 | 写部署问题 |
本页反向检查
交付物分层:源码配置用于运行,数据卡和模型卡用于理解,评估报告用于判断,错误地图用于迭代,回滚说明用于停用。
删除演练覆盖原始样例、派生切片、索引、日志、缓存和 API 密钥,对不可撤回权重写停用方案。
复盘回答哪个假设被证实、哪个被推翻、哪个错误最值得投入、哪个环节仍依赖专家直觉。
最终验收无口头说明完成正常、缺资料、越权、工具失败和一次回滚。