4. 摘要生成的任务拆解与输出规范
盘口异常时段自动生成摘要,难点不在于“写一段话”,而在于让这段话可定位、可核验、可复用。如果只让模型自由发挥,很容易得到“某时段盘口出现异常波动,建议关注”这类正确但无用的句子。要解决这个问题,必须先把摘要生成拆成若干可独立定义、可独立校验的子任务,再为每个子任务规定字段约束,最后把结构化结果与自然语言结果绑定在同一份证据上。
一、四段式任务拆解
本节把摘要拆为四个部分:时段定位、异常类型、关键证据、影响评估。这四部分不是并列的四个句子,而是一条从“在哪里”到“是什么”到“凭什么”再到“意味着什么”的推理链。前一段的输出是后一段的输入约束,缺一段就会导致摘要失去可追溯性。
时段定位负责回答“异常发生在哪个时间窗口”。它需要给出起止时间戳、所属交易阶段(集合竞价、连续竞价、午间休市前后、尾盘等)、以及窗口的判定依据(例如触发阈值首次越界的时刻)。这里的关键约束是:时段必须是闭区间,且起止点要能对应到原始逐笔或快照数据的时间字段,不能只写“上午十点左右”。
异常类型负责回答“这属于哪一类盘口异常”。常见类型包括:买卖盘挂单量骤增或骤减、价差突然走阔、成交笔数密度异常、大单集中撤单、盘口深度单侧塌陷、价格短时快速跳动等。类型字段应当来自一个受控词表,而不是自由文本,否则后续统计和检索会失效。一个时段可能同时命中多个类型,因此该字段应设计为可多选的有序列表,并标注主类型。
关键证据负责回答“凭什么判定为异常”。这是四部分中最容易被弱化、也最需要严格约束的部分。证据不能是结论的复述,而应是可回指的原始观测:具体指标名、异常前后的数值对比、越界阈值、涉及的档位或合约、以及数据来源标识。证据条目应当是可枚举的,每条证据对应一个指标和一组数值,便于人工复核时逐条比对。
影响评估负责回答“这个异常对后续交易意味着什么”。它需要区分已发生的影响与潜在的风险提示,并给出影响的方向、强度等级和持续时间估计。影响评估必须建立在证据之上,不能引入证据之外的新事实。例如证据只显示买盘深度下降,就不能直接断言“价格将下跌”,而应表述为“买方承接力减弱,短期下行压力上升”。
二、结构化模板与自然语言摘要的字段约束
结构化模板是“机器可读的骨架”,自然语言摘要是“人可读的外衣”,两者必须共享同一组字段值,不能各自生成。实践中推荐的做法是:先产出结构化对象,再由模板渲染自然语言,而不是让模型直接写一段话再反向抽取字段。
结构化模板的核心字段约束如下。window 必须包含 start_ts、end_ts 和 phase 三个子字段,时间戳统一到秒级,phase 取自固定枚举。anomaly_type 为有序数组,第一个元素为主类型,其余为次类型,全部来自受控词表。rule_id 记录命中的检测规则编号,保证异常判定可复现。evidence 为对象数组,每条包含 metric(指标名)、before(异常前基准值)、after(异常期间值)、threshold(阈值)、level(档位或合约)、source(数据来源),并自动分配 E1、E2 这样的引用编号。impact 包含 direction(利多/利空/中性)、strength(弱/中/强)、duration(估计持续时长)和 evidence_ref(引用的证据编号数组)。confidence 为 0 到 1 的置信度,用于标注自动生成的可靠程度。
自然语言摘要则受三条硬约束。第一,时段必须完整复述,不能省略起止时间,也不能用“盘中”替代。第二,每条判断后必须挂证据编号,例如“买盘承接力减弱(E1)”,使读者能回到结构化证据中核对。第三,影响评估只能使用证据中出现过的指标,不得引入成交量、消息面等未在证据中列出的因素。这三条约束把自然语言从“自由写作”压回到“受控渲染”。
三、一个可执行的生成流程
实际实现时,可以按以下顺序推进。首先由检测模块输出候选异常窗口及其命中规则,形成 window 与 rule_id。然后由指标计算模块针对该窗口拉取盘口快照与逐笔数据,计算异常前后的指标值,填充 evidence 数组并分配编号。接着由类型映射模块根据 rule_id 与指标组合,从受控词表中选出主类型和次类型。最后由评估模块基于 evidence 计算 direction、strength、duration,并写入 impact。自然语言渲染器读取整个结构化对象,按固定句式模板拼接句子,并在每个结论后插入对应的证据编号。
下面是一份可直接参考的结构化输出示例,字段名与上文模板一致:
{
"window": {"start_ts": "2024-06-12 10:12:30",
"end_ts": "2024-06-12 10:15:00",
"phase": "连续竞价"},
"anomaly_type": ["买盘深度塌陷", "价差走阔"],
"rule_id": "R-DEPTH-07",
"evidence": [
{"id": "E1", "metric": "买一至买五总量",
"before": 8600, "after": 2100,
"threshold": 3000, "level": "五档", "source": "L2快照"},
{"id": "E2", "metric": "买卖价差",
"before": 0.01, "after": 0.04,
"threshold": 0.03, "level": "一档", "source": "L2快照"}
],
"impact": {"direction": "利空", "strength": "中",
"duration": "约3分钟", "evidence_ref": ["E1", "E2"]},
"confidence": 0.82
}
这份示例中的数值属于教学假设,用于说明字段如何填写,并非真实行情。可以看到,结构化对象已经把“在哪里、是什么、凭什么、意味着什么”全部固化下来,自然语言摘要只是它的一个视图。
四、校验与常见偏差
生成之后必须做一致性校验,重点检查四类问题。其一,时段越界:end_ts 早于 start_ts,或窗口跨越了休市边界却未标注。其二,类型与证据不匹配:声明“买盘深度塌陷”,但 evidence 中没有任何深度类指标。其三,影响评估超出证据:impact 中出现了 evidence_ref 未覆盖的判断。其四,自然语言与结构化字段不一致:摘要里写“约两分钟”,而 duration 字段是“约3分钟”。
把摘要拆成四段并施加字段约束,本质上是在用工程手段约束生成式输出的自由度。时段定位保证可回查,异常类型保证可统计,关键证据保证可复核,影响评估保证可追责。四者共享同一份结构化对象,自然语言摘要只做受控渲染,这样生成的摘要才既读得懂,也查得清。