第1章 把模糊委托做成可验收的AI分流器
工作阶段: 定义工作并完成第一个可交付AI工程。
公共核心项目: 从“做一个企业运营服务助手”的含糊委托出发,与AI协同开发一个本地运行的“企业运营服务请求智能分流器”。
核心技术: 监督学习、中文文本分类、字符向量化、Embedding、Softmax四类分数、拒绝阈值与混淆矩阵。
输入输出链: 模拟中文请求 → 高风险规则门 → Keras文本分类模型 → 四类分数与候选去向 → 人工确认或接管。
应用中的AI: 在本地把普通请求分到“业务设备、网络与账号、公共设施、环境服务”四个候选去向的小型文本分类模型。
协助开发的AI: 帮助追问委托、审查标签、生成并解释代码、分析运行日志和提出限定修改的大语言模型。
人的责任: 确认任务和标签,核对数据,制定高风险门,运行并观察工程,审查AI修改,用固定测试决定采用、限用、退回或停止。
主要交付物: 任务与标签合同、数据卡、完整工程、Keras模型、本地网页、测试报告、模型卡和复现说明。
明确边界: 系统只给候选去向,不诊断故障、不承诺时限、不自动派单;高风险、低信心、多意图和范围外请求交给人。
跨章关系: 本章先跑通“数据—模型—应用—测试”;第2章再系统学习数据底座,第10—12章处理真实工作流、试运行与交付维护。
学习目标
完成本章学习后,你将能够:
- 把含糊委托改写为输入、标签、输出、边界和验收明确的文本分类任务;
- 审查带标签文本,区分训练、验证和固定测试,发现重复与来源泄漏;
- 在大语言模型协助下运行并读懂一个完整的Keras字符级中文分类模型;
- 解释字符编号、嵌入、句子表示和Softmax四类分数在当前项目中的作用;
- 说明规则、模型、阈值和人工确认怎样共同组成一个本地网页应用;
- 使用关键词基线、固定测试和限定修改完成验收与交接。
项目导入
“做一个企业运营服务助手,最好能自动处理各种报修”不能直接交给开发人员或模型。它没有说明接收什么请求、输出给谁、企业有哪些真实服务去向,也没有说明哪些错误会造成严重后果。若一开始把任务理解错了,后面的界面和代码越完整,返工范围越大。
本章把委托缩成一个可以训练和测试的作品:使用者在本地网页输入一条模拟企业运营服务请求,系统先检查高风险线索;普通请求再交给Keras小模型,得到四个候选去向的分数。系统只有在最高分和前两名分差同时达到门槛时才显示模型建议,其他情况转人工。页面始终保留原文和人工决定,不连接真实工单系统。
例如,输入:
门店收银台的扫码枪无法读取商品条码,请安排检查。
这条首次体验用的句子来自教学训练样例,不计入后面的固定测试。系统可以显示“业务设备”为最高分候选,同时列出另外三类分数,最后由值班人员接受、改判或转人工。若输入“墙上插座正在冒烟”,确定性规则必须先拦截,分类模型不运行,页面直接提示进入人工紧急渠道。
模拟中文请求
│
├─ 命中高风险规则 ─→ 不运行模型 ─→ 人工紧急渠道
│
└─ 未命中
└─ 字符向量化 → Embedding → 句子表示 → Softmax四类分数
│
┌─────────────────────────────┴────────────────────────┐
│最高分和前两名分差达到门槛 │未达到门槛或多意图
↓ ↓
显示候选去向 人工复核
└─────────────────────────────┬────────────────────────┘
↓
人工确认
本项目有两种AI。“应用中的AI”是训练后在本地运行的小模型;“协助开发的AI”是帮助学生理解任务和工程的大语言模型。学生不从空白手写全部Python,却必须亲自运行、查看中间结果、解释关键链路、限定一次修改并重跑测试。
课堂采用“先使用、再拆解、后重建”的顺序。第一次课先加载随资源提供的模型并体验网页,让学生知道要做出的作品是什么;随后打开数据、训练脚本和推理代码,沿同一条输入输出链理解技术;最后再建立环境、重新训练并比较自己的报告。这样既避免把安装和语法变成起点,又不会把完整实现藏在按钮后面。
建议用6—8学时完成。电脑只需CPU,不要求独立显卡;首次建立环境需要下载依赖,训练、评估和网页运行都可在本机完成。具体Python、TensorFlow和Keras版本以配套工程的requirements.txt为准,不把易变版本写成稳定知识。
本章成果
- 一份写清四个标签、人工接管和验收门的任务与标签合同;
- 一份包含来源、生成方式、字段、划分和局限的数据卡;
- 一个接受原始中文字符串、包含字符向量化的Keras端到端模型;
- 一个先执行规则门、再调用模型并保留人工决定的本地网页;
- 一份关键词基线、训练记录、固定测试和失败样例分析;
- 一个能由另一组复现的完整项目文件夹与模型卡。
AI协同开发路线
本章按“委托—合同—数据—基线—训练—应用—测试—修改—交付”推进。学生先把原始委托和真实限制交给开发AI,要求它只提出会改变输入、标签、输出、安全或验收的问题;学生根据企业责任人确认的材料回答,不能让AI代替业务部门补制度。随后,AI可以协助审查数据和生成完整代码,学生负责运行、提交日志、阅读差异和决定是否采用修改。
生成工程前可这样说明任务:“请先列出数据、训练、推理、网页和测试文件,不要先写代码。应用模型统一使用Keras/TensorFlow,网页服务使用Python标准库,不增加其他机器学习或Web框架。高风险规则必须在模型之前,任何输出都保留人工确认。得到我的确认后再逐个生成完整文件,并为每个文件说明输入、输出和测试方法。”
学生还要保存六类协同证据:最初提供的任务与限制;AI提出的必要问题;首版文件清单和解释;实际运行日志;限定修改及文件差异;固定回归和最终结论。聊天窗口中的最后一句回答不是交付物,能够复现的项目目录、版本和报告才是。
运行失败时,不要只发一句报错。应提供实际命令、环境版本、完整错误、相关文件、预期结果和已经尝试的动作。修改时限定文件和目标,例如“只检查inference.py为什么没有把该样例转人工,不修改模型、标签和页面;给出差异并运行全部回归”。
第一节 定义可训练、可验收的任务
一、从“万能助手”缩成四分类
一个可训练任务至少要说明:一条样本是什么,标签由谁定义,模型输出是什么,错误怎样处理。经确认,本章输入是一条不超过500个字符的模拟中文请求;输出是四个接收去向的相对分数和一个候选标签。程序没有正式派工权限。
四个标签不是模型自己发现的天然类别,而是人根据工作流确定的约定:
| 标签 | 本章纳入的普通请求 | 边界与人工责任 |
|---|---|---|
| 业务设备 | 扫码枪、业务电脑、会议音视频设备、订单打印机、叫号屏等 | 只分流,不判断内部故障原因 |
| 网络与账号 | 办公网、认证、账号、密码、平台登录等 | 不读取密码,不替用户修改账号 |
| 公共设施 | 作业照明、桌椅、门窗、饮水机、水龙头、扶手等 | 冒烟、漏电、人员受伤先过高风险门 |
| 环境服务 | 垃圾、污渍、纸屑、灰尘、一般积水和异味等 | 涉及用电、伤害或制度未知时转人工 |
一条请求同时出现“前台叫号屏无画面”和“工单平台账号无法登录”时,单标签模型会丢失一个意图,因此不能强行选最高分。程序先检查各类明确线索,发现多意图就转人工。请求过于含糊、完全范围外或模型前两类分数接近时,也交给人处理。
二、把高代价错误放到模型外
本工程用明确词表拦截冒烟、明火、起火、漏电、触电、电火花、人员受伤、流血、被困和坠落等线索。顺序必须是“先规则、后模型”。如果先让模型分类,再根据分类决定是否紧急,一个普通准确率很高的模型仍可能漏掉最重要的样例。
关键词规则透明、容易检查,却不能理解全部语言变化。它只是教学原型的第一道门,不是单位安全制度。使用者和值班人员仍须阅读原文;真实渠道和责任人必须来自本单位确认材料,不能由语言模型或训练数据推测。
三、建立简单基线
在训练神经网络前,先用baseline.py中的四组透明词表建立关键词基线:只命中一个标签时给出该标签;一个都未命中或同时命中多个标签时转人工。它不用训练,能解释每次判断,适合回答“复杂模型是否真的有必要”。模型运行链不把“必须命中一个关键词”作为许可条件,只把同时命中多个领域作为多意图证据;这样模型才有机会处理词表之外的普通表达,基线比较也不会预先决定模型答案。
关键词基线容易处理“扫码枪坏了”“垃圾桶满了”,却可能不认识“业务终端停在启动界面”“靠背总让人坐不稳”等没有典型关键词的表达。模型只有在相同的封存样例上改善普通分流,同时不破坏高风险门和人工接管,才值得保留。若简单方法已经满足任务,停止增加模型也是合格结论。
四、冻结任务合同和验收门
| 合同项目 | 冻结内容 |
|---|---|
| 使用者 | 提交模拟请求的学生;审查候选的值班人员角色 |
| 输入 | 脱敏中文文本,不收集姓名、电话、健康信息和密码 |
| 模型输出 | 四类Softmax分数、最高分候选与前两类分差 |
| 规则输出 | 高风险接管、空值与长度拒绝、多意图与未知线索 |
| 人工动作 | 接受、改判、转人工或进入紧急渠道 |
| 禁止动作 | 不自动派单,不承诺时限,不控制设备,不替代正式渠道 |
| 版本对象 | 标签、数据、模型、阈值、规则、网页和固定测试 |
| 验收 | 分类、高风险接管、人工复核、故障降级与另一组复现 |
配套工程给出首版运行门:普通分类固定样例通过率不低于75%,高风险样例必须全部在模型前拦截,人工复核样例通过率不低于75%。另有一条采用门:神经网络若不能在同一独立测试中相对透明基线带来可说明的改善,就不能仅因“用了AI模型”而替换简单方法。这些门槛在运行前冻结,不是把测试结果预先写成答案;实际数值必须由当前版本报告生成。任何高风险漏拦截都不能被普通分类的平均成绩抵消。
阶段检查: 另一位同学应能只看合同判断“新增员工休息区门禁处理并自动安排维修人员”已经改变数据、权限和错误后果,不能作为一句提示词直接加入首版。
第二节 准备数据并训练文本分类模型
一、审查480条生成式教学数据
配套工程包含480条模拟教学数据,其中384条用于训练、96条用于验证。四类保持均衡:每类96条训练、24条验证。字段包括sample_id、text、label、source_group和split。
sample_id,text,label,source_group,split
train-业务设备-001,客户服务前台的业务电脑停在启动界面,请安排检查。,业务设备,synthetic_workplace_train_v2,train
train-业务设备-005,门店收银台的扫码枪无法读取商品条码,请安排检查。,业务设备,synthetic_workplace_train_v2,train
validation-业务设备-001,刚才发现订单打印机发出异响后停止出纸,应该联系哪个服务组?,业务设备,synthetic_workplace_validation_v2,validation
validation-环境服务-001,刚才发现仓库入口散落大量塑料包装,应该联系哪个服务组?,环境服务,synthetic_workplace_validation_v2,validation
这些数据由固定信号、地点和句式模板可重复生成,适合第一次观察训练链,却不能代表真实工作现场语言。训练与验证使用不同地点和句式模板,但部分现象短语相同,因此验证结果主要检查模板变化,不足以证明真实泛化。另有29条由人工编写、训练期间不读取的固定系统样例,用来补充检查口语表达、多意图、信息不足和高风险边界。
source_group记录样例来自哪套生成或编写过程,split记录它只能用于训练还是验证。生成脚本只写train.csv,不读取或改写固定测试。学生可以检查脚本怎样组合信号、地点和句式,但不能为了提高结果反复生成到某条测试正好通过。数据版本发生变化时,要同时记录生成脚本、随机种子和文件摘要。
学生应检查:编号和文本是否重复;标签是否属于四类;每类数量是否均衡;split是否合法;固定测试文本是否混入训练。大语言模型可以生成候选表达,却不能自行批准标签或把固定测试答案写回训练文件。
二、理解字符怎样进入模型
中文句子通常没有空格。本章使用TextVectorization(split="character")把文本按Unicode字符切开,再把字符映射为整数。例如“扫码枪”会变成三个字符编号;词表之外的字符进入未知项,较长文本被截断或补齐到固定长度。
Embedding为每个字符编号学习一个32维向量。训练开始时这些数值没有专业含义;经过许多带标签样本后,在相似请求中出现的字符会形成对分类有用的表示。全局平均池化把一串字符向量汇总为一句话的表示,隐藏层再组合特征,最后四个Softmax分数总和为1。
Softmax分数表示模型在当前四个标签之间怎样分配相对支持,不是现场事实正确率,也不是经过校准的安全概率。平均池化实现简单、运行快,但会弱化字符顺序;生成数据规模小,模型还可能学到模板措辞而非真实工作含义。这些局限必须写入模型卡。
三、运行完整Keras主链
学生先运行教师提供的预训练版本,观察输入和输出;随后再让协助开发的AI解释并重建训练工程。纸书保留从训练文本建立词表、构建模型、训练、验证到保存的主要链路。课堂可逐格运行resources/ch01/project/notebooks/ch01_service_router_lab.ipynb,权威训练脚本、CSV校验、元数据摘要和完整命令行参数见resources/ch01/project/train.py。
import keras
import tensorflow as tf
LABELS = ("业务设备", "网络与账号", "公共设施", "环境服务")
# 词表只能根据训练部分建立,不能读取验证或固定测试。
vectorizer = keras.layers.TextVectorization(
max_tokens=2000,
standardize="lower_and_strip_punctuation",
split="character",
output_mode="int",
output_sequence_length=96,
name="character_vectorization",
)
adapt_dataset = tf.data.Dataset.from_tensor_slices(train_texts).batch(32)
vectorizer.adapt(adapt_dataset)
inputs = keras.Input(shape=(), dtype=tf.string, name="request_text")
x = vectorizer(inputs)
x = keras.layers.Embedding(
input_dim=len(vectorizer.get_vocabulary()),
output_dim=32,
mask_zero=True,
name="character_embedding",
)(x)
x = keras.layers.GlobalAveragePooling1D(name="average_pooling")(x)
x = keras.layers.Dense(32, activation="relu", name="hidden")(x)
x = keras.layers.Dropout(0.20, name="dropout")(x)
outputs = keras.layers.Dense(4, activation="softmax", name="category")(x)
model = keras.Model(inputs, outputs, name="enterprise_service_router")
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.003),
loss="sparse_categorical_crossentropy",
metrics=[keras.metrics.SparseCategoricalAccuracy(name="accuracy")],
)
history = model.fit(
train_dataset,
validation_data=validation_dataset,
epochs=35,
callbacks=[keras.callbacks.EarlyStopping(
monitor="val_accuracy", patience=6, restore_best_weights=True
)],
verbose=2,
)
model.save("models/service_router.keras")
大语言模型生成代码后,学生至少要回答:原始字符串在哪一行进入;为什么adapt只能看训练文本;Embedding学习的是什么;四个输出与标签顺序怎样对应;模型文件是否已经包含字符向量化。答不清这些问题,程序即使能运行也不算完成学习。
四、运行训练并读实际结果
训练时终端逐轮显示训练损失、训练准确率、验证损失和验证准确率。EarlyStopping连续若干轮看不到验证改善时停止并恢复较好权重,防止只追求更多轮数。程序保存模型、metadata.json和training_history.json,其中记录数据摘要、随机种子、依赖版本、训练轮数和验证结果。
配套参考模型已经在CPU环境真实运行:TensorFlow 2.21.0、Keras 3.15.1、随机种子20260807,训练14轮后停止并恢复第8轮权重,96条验证样例准确率为98.96%。这个数字并不证明模型已经“学会企业服务语言”,因为训练与验证虽然句式和地点不同,却共享合成机制与一批现象短语,结果容易过于乐观。
29条独立固定样例同时检验普通分流、安全门和拒绝能力。当前Keras模型通过16/16普通请求、5/5高风险拦截和8/8多意图或信息不足转人工;透明关键词基线也得到相同的16/16、5/5和8/8。两套系统在这批小型作者编写样例上打平,因此结果证明的是工程按合同运行,而不是神经网络优于简单规则,更不能据此宣布真实企业上线。
固定测试另取仓库、门店、客户服务和办公场景,并保留多意图、信息不足及高风险输入。M03同时涉及会议摄像头和业务账号,虽然模型给出“网络与账号”候选,但多意图规则、51.2%的低置信和2.7%的小分差共同触发人工复核。学生应打开元数据、训练历史、基线报告和模型报告,核对样本来源、阈值、逐题路由和混淆矩阵,而不是照抄总分。
可向开发AI提出:“读取训练历史、元数据、基线报告和模型报告,只描述文件中真实存在的现象;解释为什么验证集98.96%且两套系统在固定测试上打平,并列出最多三个进入真实企业前需要补充的证据。先不要改模型,不得把固定测试写进训练数据。”AI的解释仍是候选,学生要回到日志和代码核实。
第三节 把模型接入本地网页应用
一、先执行规则,再调用模型
inference.py是网页和固定测试共同使用的核心。它先验证文本,再找高风险词;只有通过规则门后才调用模型。模型故障、最高分不足、前两类过近或出现多个领域的明确线索时都转人工。没有命中关键词不等于模型一定不能理解;本版4条范围外样例恰好因最高分或分差不足被拒绝,但Softmax也可能对陌生输入过度自信,因此这些阈值不是可靠的“未知检测器”,只能与持续新增的边界测试和人工接管一起使用。
import numpy as np
def classify_request(text, model, metadata):
normalized = validate_text(text)
matched = find_high_risk_terms(normalized)
if matched:
return high_risk_result(normalized, matched) # 模型没有运行
if model is None:
return model_fault_result(normalized)
try:
# 使用 object 数组交给端到端字符串模型,避免 NumPy 固定宽度
# Unicode 类型在 Keras 3 中被误判为不支持的数据类型。
batch = np.asarray([normalized], dtype=object)
raw_scores = model.predict(batch, verbose=0)[0]
labels = metadata["labels"]
order = sorted(
range(len(labels)), key=raw_scores.__getitem__, reverse=True
)
top1, top2 = order[0], order[1]
confidence = float(raw_scores[top1])
margin = confidence - float(raw_scores[top2])
cue_groups = find_domain_cues(normalized)
review_reasons = []
if len(cue_groups) > 1:
review_reasons.append("请求包含多个服务去向的明确线索")
if confidence < metadata["thresholds"]["top1"]:
review_reasons.append("最高分低于门槛")
if margin < metadata["thresholds"]["top1_top2_margin"]:
review_reasons.append("前两类分差低于门槛")
return {
"route": "manual_review" if review_reasons else "model_suggestion",
"probabilities": dict(zip(labels, map(float, raw_scores))),
"model_suggestion": {
"label": labels[top1],
"confidence": confidence,
"margin": margin,
},
"review_reasons": review_reasons,
"human_decision_required": True,
"automation_permitted": False,
}
except Exception:
return model_fault_result(normalized, "模型推理失败,已转人工")
工程默认最高分门槛为0.60,前两名分差门槛为0.12。它们只是首版配置,不是自然规律。提高门槛通常会增加人工复核,降低门槛可能扩大模型建议,也可能放行更多错误。选择阈值要同时看验证样例、错误后果和人工工作量,不能为了通过测试不断降低要求。
二、把完整模型封装为稳定输入输出
训练保存的.keras文件包含字符向量化和神经网络,因此网页可以直接提交原始中文字符串,不需要在网页里复制另一套分词代码。metadata.json保存标签顺序和阈值;加载时若模型标签顺序与应用不同,网页服务可以继续打开,但模型进入安全降级,所有请求转人工,避免把第一列分数误解释成错误类别。
系统输出包含:原始请求、高风险门状态、四类分数、最高分候选、前两类分差、人工复核原因以及“禁止自动执行”标记。页面不只显示一个答案,是为了让使用者能够看见模型犹豫和规则接管位置。
三、运行本地网页并观察完整链路
完整服务器和页面分别位于app.py、static/index.html、static/styles.css和static/app.js。服务器只使用Python标准库,默认监听127.0.0.1;页面采用“输入请求—观察系统—人工决定”三步结构。代码全部可见,但纸书不重复几十行HTTP和样式样板。
页面应同时显示原文、高风险门是否运行、四类分数或“模型未运行”、模型建议、复核原因和人工动作。隐藏其他类别、只显示一个醒目答案会放大自动化错觉。服务只监听本机并不等于可以输入隐私;课堂仍只使用模拟或脱敏文本,下载的处理记录也要在交接前检查是否包含不必要信息。
cd resources\ch01\project
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python acceptance.py
python train.py
python evaluate.py
python app.py
# 浏览器打开 http://127.0.0.1:8000
运行后依次观察四种输入:普通业务设备请求应显示四类分数;含糊请求应转人工;同时包含两个去向的请求应说明多意图;高风险请求应显示“模型未运行”。要验证模型缺失时的安全降级,应先停止网页服务,临时移走模型文件,再重新启动服务;确认所有请求转人工而不是报出一个假答案后,将模型文件放回原位。
四、让学生参与而不是只点按钮
网页运行不是学习终点。学生要从页面结果回到inference.py,指出一次请求经过了哪些判断;从元数据找到标签顺序和阈值;从模型代码找到字符表示和Softmax;最后保存一次人工接受、改判或转人工的证据。
协助开发的AI可以解释工程,但学生要限定其工作范围。例如:“只解释一条请求从HTTP接口到classify_request再到页面结果的调用链,按文件列出输入和输出,不修改代码。”如果AI说规则在模型之后,学生应以实际文件和固定测试纠正它。
本章不要求学生记住服务器语法,也不把按钮颜色当作项目能力。需要掌握的是:同一个模型怎样被训练和加载,规则怎样挡在模型之前,网页怎样展示而不隐藏不确定性,人怎样保留最后决定。
第四节 用固定测试改进并交付项目
一、用29条封存样例测试系统
data/fixed_test.csv不被训练脚本读取,共29条:16条普通分类样例,每类4条;5条高风险样例;4条多意图和4条信息不足样例,共8条人工复核样例。它们使用人工编写的表达和独立source_group,用于检查训练模板之外的行为。
| 测试类型 | 数量 | 检查重点 |
|---|---|---|
| 普通分类 | 16 | 候选去向正确,分数和分差达到当前门槛 |
| 高风险 | 5 | 规则先拦截,model_suggestion为空 |
| 多意图 | 4 | 不强行压成一个标签,转人工 |
| 信息不足 | 4 | 没有充分线索时转人工,不编造请求内容 |
这29条CSV固定样例检查正常分类、高风险、低信心、多意图和信息不足等数据行为,但不包含模块故障或HTTP故障,因为这类状态不能仅靠一行输入数据表达。tests/中的31项单元、HTTP与网页策略测试另行覆盖数据隔离、关键词基线、模型推理异常时的安全降级、空输入、HTTP端点和页面决策策略。两部分合起来才是完整系统测试;页面能打开、某一条演示成功或验证准确率较高,都不能代替它们。
二、让验收程序自动留下证据
evaluate.py逐条调用网页使用的同一个推理函数,并根据期望行为判断是否通过。核心逻辑如下,完整报告可以另存为JSON:
def case_passed(row, result):
if row["expected_behavior"] == "high_risk":
return result["route"] == "high_risk" and result["model_suggestion"] is None
if row["expected_behavior"] == "manual_review":
return result["route"] == "manual_review"
if row["expected_behavior"] == "classify":
suggestion = result.get("model_suggestion") or {}
return (
result["route"] == "model_suggestion"
and suggestion.get("label") == row["expected_label"]
)
raise ValueError("未知测试行为")
required_rates = {
"classify": 0.75,
"high_risk": 1.00,
"manual_review": 0.75,
}
def check_required_rates(actual_rates):
for behavior, minimum in required_rates.items():
if actual_rates.get(behavior, 0.0) < minimum:
raise SystemExit(f"{behavior}未达到验收门:{minimum:.0%}")
最低门只用于判断当前版本是否达到基本运行条件,不能证明它仍是教材记录的正式版本。默认acceptance.py会现场生成关键词基线报告,并与reports/baseline_evaluation.json逐字段比较;加上--require-model后,还会现场加载当前Keras模型、生成完整模型报告并与reports/model_evaluation.json逐字段比较。验收同时重算data/train.csv的SHA-256并核对模型元数据,防止训练数据、模型或逐题结果变化后仍沿用旧报告。
运行后不能只看“通过/失败”。应打开失败明细,区分四种原因:标签合同不清,生成数据覆盖不足,字符平均表示能力有限,或规则与阈值设计不当。不同原因需要不同修改,不能一律增加训练轮数。
还要把模型测试与系统测试分开理解。模型测试关心普通请求的候选类别;系统测试还关心规则先后、模型不可用时的降级、低信心拒绝和人工决定。一个分类错误可能只增加人工改判,一次高风险漏拦截却可能直接否决版本。验收必须按错误后果设置门槛,不能用所有样例的一个平均数掩盖关键失败。
三、完成一次限定修改与固定回归
先用验证样例观察阈值,而不是根据29条封存测试逐题调答案。学生可只修改最高分门槛,例如从0.60调整为另一个候选值,前两名分差、数据、模型结构和固定测试保持不变。修改前预测:门槛降低可能减少人工复核,也可能增加错误建议;门槛提高则相反。
让开发AI只修改元数据或命令参数中的一个阈值,禁止改训练数据、测试文件和其他规则。学生审查差异后重新运行acceptance.py --require-model,记录普通分类、人工复核和高风险三类变化。如果固定测试已经反复参与调参,它就不再是完全独立的最终证据;新版本还需要补充从未见过的新封存样例。
另一条改进路线是增加一个经过人工确认的边界样例。新样例只能进入新的训练或验证版本,原固定失败样例不得直接复制成训练答案。修改数据后要重新生成模型、元数据和测试报告,并说明为什么这项新数据能代表一类真实表达,而不是只修一道题。
四、交付工程并迁移到专业场景
交付包至少包含:README与锁定依赖;任务和标签合同;生成脚本、训练/验证数据与数据卡;完整训练、推理、网页和测试代码;模型及元数据;固定测试报告;模型卡;AI协同记录、文件差异和人工决定;复现与回滚说明。另一组应能从干净目录建立环境、训练或加载模型、启动网页、运行29条测试并说明已知失败。
验收结论有四种:采用表示在冻结课堂范围内达到全部门槛;限用表示只给候选、必须人工确认;退回表示数据、分类、规则或复现仍需限定修改;停止表示授权、安全或维护条件不具备。对于生成式小数据和关键词安全门构成的首版,即使测试通过,合理结论通常仍是“课堂模拟范围限用”,不能直接接入企业真实系统。
专业迁移卡A:商贸咨询分流。 标签改为商品、订单、售后和账号;数据来自脱敏咨询,虚假价格和退款承诺属于高代价错误,最终去向由客服责任人确认。
专业迁移卡B:设备报障路由。 标签按机械、电气、网络和环境支持设计;停机、漏电和人员伤害必须先接管,设备技术人员批准规则。
专业迁移卡C:数字媒体技术支持。 标签改为拍摄、录音、剪辑和发布;素材授权与账号隐私不能交给分类模型,内容和技术负责人共同验收。
迁移不能只替换网页标题。必须重新建立标签合同、数据来源、高代价错误、规则门、固定测试、接收人员和维护责任。
交接完成后仍要保留停止条件:依赖无法安装、模型或元数据缺失、标签顺序不一致、输入超出范围、固定回归失败时,系统默认不提供普通建议。维护者只能在版本化副本上修改,验收通过后再替换当前版本;上一已验收模型、阈值和报告应能恢复。
本章小结
本章把含糊委托做成了第一个“数据—模型—应用—测试—交付”闭环。任务合同确定四个真实去向和人工责任;480条生成式教学数据用于训练与验证,29条人工固定样例保持在训练之外;字符向量化、Embedding、句子表示和Softmax组成Keras文本分类模型;高风险规则在模型之前,低信心、多意图和故障结果转人工;本地网页让四类分数、规则状态和人的决定可见。
大语言模型贯穿开发过程,却不替学生决定标签、修改验收门或承担正式处置。学生通过自然语言提供上下文、要求完整实现、提交运行日志和限定修改,再用文件差异与固定测试判断是否采用。真正的成果不是“模型给对了一次”,而是能够说明它学自什么数据、为何这样输出、什么时候不应使用,以及另一组怎样复现和接管。
关键术语
- 文本分类:把文本映射到预先定义标签的监督学习任务。
- 标签合同:对每个类别的含义、边界、责任人和高代价错误形成的约定。
- 训练集:用于调整模型参数的数据;本项目含384条生成式教学样例。
- 验证集:用于观察训练过程和选择配置、不直接调整参数的数据;本项目含96条样例。
- 固定测试:训练和调试期间隔离、用于系统验收的样例集合。
- 字符向量化:按Unicode字符切分文本并映射为整数序列的处理。
- 嵌入:把离散字符编号映射为可学习向量的模型层。
- Softmax分数:模型在当前四类之间分配的相对支持,不等于事实概率。
- 拒绝阈值:分数或分差不足时不输出普通建议、转人工的条件。
- 人工接管:高风险、证据不足、多意图、模型故障或权限越界时由有责任的人继续处理。
目标测试
- 为什么“做一个万能企业助手”不能直接作为训练任务?
A. 名称不够新颖 B. 没有明确输入、标签、输出、边界和验收 C. 没有使用最大模型 D. 网页颜色没有确定 - 下列哪一项必须在分类模型运行前处理?
A. 扫码枪无法识别条码 B. 工单平台账号无法登录 C. 墙上插座正在冒烟 D. 垃圾桶已经装满 TextVectorization为什么只能用训练部分执行adapt?
A. 验证文件太小 B. 防止验证或测试信息进入词表形成泄漏 C. Keras不能读取CSV D. 为了增加训练轮数- 模型最高Softmax分数为0.90,最合理的解释是什么?
A. 现场事实有90%概率正确 B. 可以自动派单 C. 模型在当前四类中给该类较高相对支持,仍需规则和人工确认 D. 数据一定没有偏差 - 判断并改错:“只要普通分类通过率很高,五个高风险样例漏掉一个也可以接受。”
- 判断并改错:“学生没有从空白手写全部Python,因此不需要理解数据、字符表示、模型和输出。”
- 为“业务设备”和“公共设施”各补充一条标签边界,并说明由谁确认。
- 说明生成式教学数据的一个优点和两个局限,解释为什么还需要人工固定测试。
- 设计一次只修改最高分阈值的控制变量实验,列出保持不变的条件和必须记录的结果。
- 某版本能打开网页,但多意图请求被强行分为一类,高风险测试有一条未拦截,另一组也无法复现环境。请作出采用、限用、退回或停止结论,并说明最小修改、责任人和重新验收范围。