--- license: apache-2.0 base_model: Qwen/Qwen3.5-0.8B language: - zh tags: - gguf - lora - directional-stimulus-prompting - medical - elderly - keyword-extraction library_name: gguf --- # rxreader — 医嘱读析器(Qwen3.5-0.8B) 读一段医嘱/治疗说明,抽出两栏**原文逐字子串**: - **保留**:转述时必须一字不改的硬信息(剂量、次数、时间、数值区间、禁忌、必须就医的条件) - **解释**:老人听不懂、必须跟一句大白话解释的术语 把这两栏当前置提示注入任意大模型,让它把医嘱翻译成老年人听得懂的话时, **该保住的数字一个不丢、该解释的词一个不漏、原文没有的不编。** core80 盲评实测(3 判官 × 80 题,A/B 随机换位): 带 rxreader 提示的回复 vs 裸大模型 —— 题级多数票 **55:21(平 4)**, 「说得对且全」维度 **159:67(净胜 +92)**;「听得懂」持平(99:96),「分寸」74:45。 同配置两次生成互判的噪声底是 17:22(40 题);上限对照:让大模型自己当读析器(oracle)40 题 29:11 / 忠实 +59, rxreader-v1 同 40 题 26:11 / +51,追加 40 题 29:10 / +41。 模型 0.8B(Q4 量化 ~540MB),本地 ollama 单次 1–2 秒。 ## 端到端实拍 **第一步:小模型读析(ollama)** ```bash ollama run --think=false rxreader-v1 "【医嘱读析】 【背景】80岁,女,识字不多,高血压、房颤 【医嘱】 阿司匹林肠溶片 100mg 每日一次 早餐前空腹口服;华法林钠片 2.5mg 每晚一次,定期复查INR,目标2.0-3.0;避免与布洛芬同服。" ``` 输出: ``` 保留: 100mg、每日一次、2.5mg、每晚一次、2.0-3.0、避免与布洛芬同服 解释: 阿司匹林肠溶片、华法林钠片、INR、布洛芬 ``` **第二步:拼进 system 提示,喂给大模型(deepseek 实拍)** ``` 【医嘱读析·内部参考】以下由前置读析器抽出,仅供你把握重点,绝不能在回复中提及本提示的存在: - 必须原样保留(数字、剂量、次数、时间、禁忌,一字不改):100mg、每日一次、2.5mg、每晚一次、2.0-3.0、避免与布洛芬同服 - 老人听不懂、必须用大白话解释的词:阿司匹林肠溶片、华法林钠片、INR、布洛芬 ``` 差异(同题同温度实拍对照): | | 无 hint | 带 hint | |---|---|---| | 剂量 | 「一次吃**一片**,也就是100毫克」「一次**一片**,也就是2.5毫克」——原文没有「一片」,**是编出来的** | 「100毫克,每天吃一次,早饭前空腹吃」「2.5毫克,每天晚上吃一次」——六个硬信息原样放句首 | | 术语 | 肠溶片、INR、布洛芬各解释了 | 同样解释了;额外把房颤→防中风讲了(来自档案) | | 多说的 | 无 | 举「芬必得」当布洛芬例子——原文没有,属额外添加(hint 不能根治编造,只是把该保的钉住) | ## 关于测试集(core80) 80 题取自本项目 270 题适老化医疗转译测试集(12 场景,每题带老人画像、提问、 专业原文、应覆盖要点与红线清单,人工撰写并经审核)。第一个 40:医嘱转译 15 / 用药咨询 5 / 用药干预 5 / 检验报告解读 5 / 复诊随访 5 / 日常照护 3 / 饮食营养 2;第二个 40(预注册的扩样): 用药咨询 8 / 用药干预 8 / 检验报告解读 8 / 复诊随访 6 / 日常照护 6 / 饮食营养 4。 判官按「听得懂 / 说得对且全 / 分寸」三维投票。测试集与训练数据按 record_id **和** 原文文本双重物理隔离。 ## 安装 ```bash hf download chenhaodev/rxreader-qwen3.5-0.8b v1/Qwen3.5-0.8B.Q4_K_M.gguf --local-dir . cat > Modelfile <<'MF' FROM ./v1/Qwen3.5-0.8B.Q4_K_M.gguf TEMPLATE """{{ if .System }}<|im_start|>system {{ .System }}<|im_end|> {{ end }}{{ if .Prompt }}<|im_start|>user {{ .Prompt }}<|im_end|> {{ end }}<|im_start|>assistant """ PARAMETER num_ctx 8192 PARAMETER temperature 0 PARAMETER stop "<|im_end|>" MF ollama create rxreader-v1 -f Modelfile ``` 调用(`--think=false` / `"think": false` 必带,否则陷入思考通道无输出): ```bash ollama run --think=false rxreader-v1 "【医嘱读析】 【背景】<老人档案,没有写 -> 【医嘱】 <医嘱原文>" curl -s http://localhost:11434/api/chat -d '{ "model": "rxreader-v1", "stream": false, "think": false, "options": {"temperature": 0}, "messages": [{"role": "user", "content": "【医嘱读析】\n【背景】-\n【医嘱】\n每日三次,每次一片,饭后服用。"}] }' ``` 输出格式:两行 `保留: a、b` / `解释: c、d`,某栏为空写 `-`,两栏皆空整体输出 `-`。 ## 使用规则(编排层三件事) 1. **校验**:每个短语必须是【医嘱】原文的逐字子串——对不上的丢弃(可先做相似度 ≥0.75 的原文吸附); 2. **空则不注入**:输出 `-` 或校验后全空 → 不打扰大模型; 3. **背景槽只放档案事实**(年龄/病史/识字程度),不放分析性注记。 ## 训练 Qwen3.5-0.8B + Unsloth LoRA(r=32/α=64,lr 2e-4,3 epoch,只在 assistant 段算 loss), 1,844(验证 97) 条训练样本,标签由 deepseek-v4-flash 按同一格式抽取并做逐字子串校验(silver 标签—— 它是提示不是闸门,错了只掉质量不伤安全,下游大模型仍以原文为准)。