第1章 把模糊委托做成可验收的AI分流器

工作阶段: 定义工作并完成第一个可交付AI工程。
公共核心项目: 从“做一个企业运营服务助手”的含糊委托出发,与AI协同开发一个本地运行的“企业运营服务请求智能分流器”。
核心技术: 监督学习、中文文本分类、字符向量化、Embedding、Softmax四类分数、拒绝阈值与混淆矩阵。
输入输出链: 模拟中文请求 → 高风险规则门 → Keras文本分类模型 → 四类分数与候选去向 → 人工确认或接管。
应用中的AI: 在本地把普通请求分到“业务设备、网络与账号、公共设施、环境服务”四个候选去向的小型文本分类模型。
协助开发的AI: 帮助追问委托、审查标签、生成并解释代码、分析运行日志和提出限定修改的大语言模型。
人的责任: 确认任务和标签,核对数据,制定高风险门,运行并观察工程,审查AI修改,用固定测试决定采用、限用、退回或停止。
主要交付物: 任务与标签合同、数据卡、完整工程、Keras模型、本地网页、测试报告、模型卡和复现说明。
明确边界: 系统只给候选去向,不诊断故障、不承诺时限、不自动派单;高风险、低信心、多意图和范围外请求交给人。
跨章关系: 本章先跑通“数据—模型—应用—测试”;第2章再系统学习数据底座,第10—12章处理真实工作流、试运行与交付维护。

学习目标

完成本章学习后,你将能够:

  1. 把含糊委托改写为输入、标签、输出、边界和验收明确的文本分类任务;
  2. 审查带标签文本,区分训练、验证和固定测试,发现重复与来源泄漏;
  3. 在大语言模型协助下运行并读懂一个完整的Keras字符级中文分类模型;
  4. 解释字符编号、嵌入、句子表示和Softmax四类分数在当前项目中的作用;
  5. 说明规则、模型、阈值和人工确认怎样共同组成一个本地网页应用;
  6. 使用关键词基线、固定测试和限定修改完成验收与交接。

项目导入

“做一个企业运营服务助手,最好能自动处理各种报修”不能直接交给开发人员或模型。它没有说明接收什么请求、输出给谁、企业有哪些真实服务去向,也没有说明哪些错误会造成严重后果。若一开始把任务理解错了,后面的界面和代码越完整,返工范围越大。

本章把委托缩成一个可以训练和测试的作品:使用者在本地网页输入一条模拟企业运营服务请求,系统先检查高风险线索;普通请求再交给Keras小模型,得到四个候选去向的分数。系统只有在最高分和前两名分差同时达到门槛时才显示模型建议,其他情况转人工。页面始终保留原文和人工决定,不连接真实工单系统。

例如,输入:

门店收银台的扫码枪无法读取商品条码,请安排检查。

这条首次体验用的句子来自教学训练样例,不计入后面的固定测试。系统可以显示“业务设备”为最高分候选,同时列出另外三类分数,最后由值班人员接受、改判或转人工。若输入“墙上插座正在冒烟”,确定性规则必须先拦截,分类模型不运行,页面直接提示进入人工紧急渠道。

模拟中文请求
   │
   ├─ 命中高风险规则 ─→ 不运行模型 ─→ 人工紧急渠道
   │
   └─ 未命中
        └─ 字符向量化 → Embedding → 句子表示 → Softmax四类分数
                                                    │
                      ┌─────────────────────────────┴────────────────────────┐
                      │最高分和前两名分差达到门槛                            │未达到门槛或多意图
                      ↓                                                       ↓
                 显示候选去向                                             人工复核
                      └─────────────────────────────┬────────────────────────┘
                                                    ↓
                                                人工确认

本项目有两种AI。“应用中的AI”是训练后在本地运行的小模型;“协助开发的AI”是帮助学生理解任务和工程的大语言模型。学生不从空白手写全部Python,却必须亲自运行、查看中间结果、解释关键链路、限定一次修改并重跑测试。

课堂采用“先使用、再拆解、后重建”的顺序。第一次课先加载随资源提供的模型并体验网页,让学生知道要做出的作品是什么;随后打开数据、训练脚本和推理代码,沿同一条输入输出链理解技术;最后再建立环境、重新训练并比较自己的报告。这样既避免把安装和语法变成起点,又不会把完整实现藏在按钮后面。

建议用6—8学时完成。电脑只需CPU,不要求独立显卡;首次建立环境需要下载依赖,训练、评估和网页运行都可在本机完成。具体Python、TensorFlow和Keras版本以配套工程的requirements.txt为准,不把易变版本写成稳定知识。

本章成果

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文本分类模型;高风险规则在模型之前,低信心、多意图和故障结果转人工;本地网页让四类分数、规则状态和人的决定可见。

大语言模型贯穿开发过程,却不替学生决定标签、修改验收门或承担正式处置。学生通过自然语言提供上下文、要求完整实现、提交运行日志和限定修改,再用文件差异与固定测试判断是否采用。真正的成果不是“模型给对了一次”,而是能够说明它学自什么数据、为何这样输出、什么时候不应使用,以及另一组怎样复现和接管。

关键术语

目标测试

  1. 为什么“做一个万能企业助手”不能直接作为训练任务?
    A. 名称不够新颖 B. 没有明确输入、标签、输出、边界和验收 C. 没有使用最大模型 D. 网页颜色没有确定
  2. 下列哪一项必须在分类模型运行前处理?
    A. 扫码枪无法识别条码 B. 工单平台账号无法登录 C. 墙上插座正在冒烟 D. 垃圾桶已经装满
  3. TextVectorization为什么只能用训练部分执行adapt?
    A. 验证文件太小 B. 防止验证或测试信息进入词表形成泄漏 C. Keras不能读取CSV D. 为了增加训练轮数
  4. 模型最高Softmax分数为0.90,最合理的解释是什么?
    A. 现场事实有90%概率正确 B. 可以自动派单 C. 模型在当前四类中给该类较高相对支持,仍需规则和人工确认 D. 数据一定没有偏差
  5. 判断并改错:“只要普通分类通过率很高,五个高风险样例漏掉一个也可以接受。”
  6. 判断并改错:“学生没有从空白手写全部Python,因此不需要理解数据、字符表示、模型和输出。”
  7. 为“业务设备”和“公共设施”各补充一条标签边界,并说明由谁确认。
  8. 说明生成式教学数据的一个优点和两个局限,解释为什么还需要人工固定测试。
  9. 设计一次只修改最高分阈值的控制变量实验,列出保持不变的条件和必须记录的结果。
  10. 某版本能打开网页,但多意图请求被强行分为一类,高风险测试有一条未拦截,另一组也无法复现环境。请作出采用、限用、退回或停止结论,并说明最小修改、责任人和重新验收范围。