feat: add durable ASR-to-patient extraction and guarded review
This commit is contained in:
@@ -8,6 +8,32 @@
|
||||
|
||||
**真实模型门禁仍未通过**:9月29日本地 Dify 探针返回 `CONFIG_MISSING`;10月7日已按用户指定兼容接口发起合成音频检查,返回 `AUDIO_NOT_PROCESSED`,详见文末。不能把 HTTP 200、上传成功或文本能力当成音频识别成功。媒体测试中的完整一小时WAV→MP3、HTTP回环模型和浏览器合成数据不是实际Dify识别验收;混合口音需代表性脱敏样例。
|
||||
|
||||
## 2026-10-08 最新结论:两阶段链路可用,语义准确度门禁未通过
|
||||
|
||||
已增加 `asr_then_llm`:真实音频分片 → ASR 转写 → 可配置文本模型提炼 → 人工审阅。原件、转写、提炼响应分别留存,不把纯文本输入冒充模型听过音频;前端显示转写进度与失败后保留的原文。该结论优先于本文下方历史记录,**不等于功能已获准上线**。
|
||||
|
||||
- 用户授权的 4 段录音,独立转写共 23/23 片段成功,约 41.8 分钟。没有逐字人工听写金标准,不能据此报告 ASR 准确率,也不代表所有方言/一小时真实模型通过。
|
||||
- 使用这些真实 ASR 缓存,当前 Qwen 的 4 份 V2 结果通过结构校验,但逐项对照原文发现提问当症状、约数精确化、未提及病史补阴性、说话人/机构归属错误。**4 份均未通过严格语义验收**;所有 13 个候选均需复核、未自动选中。身份可绑定任意本地测试诊单,不意味着可以忽略录音内的患者/家属区别。
|
||||
- 完整原生 Upload → 持久队列 → 独立 Worker → 实际 ASR → 实际 Qwen → review 已用 1 段录音在隔离 MySQL 跑通;其他准确度评估复用缓存,不冒充重复执行完整链路。
|
||||
- 只在一次性测试诊单明确审阅后采纳有支持的字段;含糊血糖、未经确认病史等不写入。另将已校验的真实缓存结果显式导入本地验收任务测试日常记录,不冒充新的 ASR 请求。冲突刷新会取消选择,必须重新审阅;重复确认不增行。
|
||||
- 原生首轮有一个 ASR 片段超时终态不明,保留 `needs_reconciliation`,没有清除或盲目重发。独立缓存的成功不改变这个旧请求的状态。
|
||||
- vLLM 对 `uniqueItems` 返回 HTTP400;生成 schema 已适配,服务端仍拒绝重复引用与重复枚举。开启 thinking 的 4 次请求耗尽 8192 输出预算而不完整;显式关闭 thinking 后结构输出完成,**但语义质量仍失败**,不可拿结构成功替代准确度。
|
||||
- 所有生产开关保持关闭;未部署本功能、未执行生产迁移、未改真实患者记录。本轮本地 MySQL 使用专用随机 `fa_pipeline_*` 库和真实 Access/Store/Worker/Apply 服务,不是生产登录态浏览器验收。
|
||||
|
||||
### 两阶段配置与恢复约束
|
||||
|
||||
使用 `server/.env.followup-audio.example` 中 `QWEN_DRIVER=asr_then_llm` 及独立 `QWEN_ASR_*`、`QWEN_EXTRACTION_*` 配置;`openai` 槽位也支持同样结构。名称只是逻辑槽位,不自动更换供应商。模型地址、密钥、模型名、chunk策略、输出格式/schema/citation版本及 thinking 选项均绑定验证指纹。
|
||||
|
||||
- ASR 默认 120 秒 PCM16k 单声道分片,整段覆盖;未做说话人分离,片段边界不是逐字时间戳。小分片配置产生超过 1000 段时在首次网络请求前拒绝。
|
||||
- `QWEN_EXTRACTION_RESPONSE_FORMAT=json_schema`、`QWEN_EXTRACTION_MAX_TOKENS=8192`;当前本地验收显式 `QWEN_EXTRACTION_ENABLE_THINKING=false`。这只是已测配置,不是质量通过凭证,不提供协议/模型自动回退。
|
||||
- 服务端证据窗口由真实转写生成,模型只返回引用 ID。宽窗口不能证明每个事实;程序保留模型日期弃权,不把别句日期补给该事件,矛盾日期留空并强制审阅。
|
||||
- 阶段检查点存入加密的 `pipeline_cipher`;先持久化 intent,再发请求。已完成 ASR 可复用;超时/未知结果锁定核验;已完成但不合格的提炼保留,不重新无限调用。
|
||||
- 已部署旧表时补执行 `server/sql/2026_10_08_followup_audio_pipeline.sql`,**仍须正式发布授权和备份**。首次安装用更新后的主迁移,两个迁移均幂等。90 天清理覆盖新检查点全文,必要采纳证据仍按审核规则保留。
|
||||
- HTTPS 为默认;仅经管理员明确建立的 SSH 隧道可启用 `QWEN_ALLOW_LOOPBACK_TUNNEL=true`,只接受字面 `127.0.0.1`/`[::1]`。不允许外网 HTTP、localhost 别名或跨地址重定向。不要把本地临时隧道地址直接当生产配置。
|
||||
- 这次连接的是本单位 ASR 与 Qwen 服务。Dify 侧尚未配置/验收 speech2text 应用,不宣称已通过 Dify 音频链路。
|
||||
|
||||
下一质量门槛:取得人工回听/标注金标准,先解决主体、问答肯否、模糊数量和未提及字段问题,再测短/中/一小时及混合口音;门槛通过前不得打开真实客服入口。部署回退脚本恢复源码,不撤销任何已写业务记录。
|
||||
|
||||
## 使用与数据规则
|
||||
|
||||
- 入口:网页问诊列表→编辑患者→回访录音。PC/H5共用现有编辑组件;桌面客户端不增加入口。
|
||||
@@ -68,12 +94,12 @@ php think followup-audio:cleanup
|
||||
|
||||
```sh
|
||||
cd /Users/long/.codex/worktrees/followup-audio/zyt
|
||||
FOLLOWUP_AUDIO_TEST_ALLOW_DISPOSABLE=1 FOLLOWUP_AUDIO_TEST_MYSQL_PORT=23316 FOLLOWUP_AUDIO_TEST_MYSQL_PASSWORD=followup_audio_isolated_test php server/tests/FollowupAudioCoreTest.php
|
||||
FOLLOWUP_AUDIO_TEST_ALLOW_DISPOSABLE=1 FOLLOWUP_AUDIO_TEST_MYSQL_PORT=23316 FOLLOWUP_AUDIO_TEST_MYSQL_PASSWORD="$TEST_MYSQL_PASSWORD" php server/tests/FollowupAudioCoreTest.php
|
||||
node --test admin/tests/followup-audio.test.cjs
|
||||
node admin/scripts/verify-daily-records.cjs
|
||||
```
|
||||
|
||||
数据库命令只允许一次性本地测试容器,禁止换为线上端口。测试容器连接信息是固定合成测试凭据,不是业务凭据。
|
||||
数据库命令只允许一次性本地测试容器,禁止换为线上端口。测试容器密码通过专用环境变量注入,不读取业务 .env。
|
||||
|
||||
发布回退先关闭入口并停止本功能消费者,保留旧静态资源和数据库备份。新增表/列应保留以保护审计;源码回退脚本只恢复源码,**不撤销已写入病历**。正式记录若需恢复,必须按审核轨迹和当前版本另做受控补偿,不能整库回滚覆盖其他人的新数据。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user