
1. 医疗问答微调的真实场景与核心痛点Qwen3.5-4B 微调实战要解决的是一个很具体的问题通用大模型在医疗问答场景里经常给出正确的废话。你问它孕妇能不能吃螃蟹它可能回你一段建议咨询专业医生的套话既没有中医寒凉属性的分析也没有现代营养学的剂量视角。这不是模型不行而是它没在垂直语料上对齐过。LLaMA-Factory 是目前开源社区里把微调门槛压得最低的框架之一配合 Qwen3.5-4B 这个参数量刚好卡在效果够用 显存友好甜蜜点的基座模型普通开发者用一张 12GB 显存的卡就能跑通 LoRA 微调。这篇文章面向的是想快速做出医疗 AI 助手原型的开发者从数据准备、LoRA 训练配置到推理验证每一步都给可复制的命令和配置骨架。我试过在 RTX 4090 上跑 1 万条医疗问答数据训练 3 个 epoch大约 40 分钟出结果。微调后的模型在科室分诊、用药禁忌、症状追问这几个维度上回答的专业度明显比原版高一个档次。下面把整个流程拆开讲包括我踩过的坑。2. TaoToken 前置统一 Key 与 API 通道微调完成后你需要一个稳定的推理通道来验证效果。TaoToken 在这里的角色是统一 Key 和 API 通道让你不用为每个模型单独维护一套鉴权和调用逻辑。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。先注册账号然后在控制台创建 API Key。控制台地址https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。创建完 Key 之后你可以在模型对话页面直接测试微调后的模型效果https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。如果你后续要做长期编码或 Agent 集成可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。API Keys 管理页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。注意TaoToken 是合法的 API 聚合通道不要把它和任何灰色中转混为一谈。所有调用都走官方接口Key 只在控制台生成和管理。拿到 Key 之后把它写进环境变量后面所有请求都用这个通道export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api3. 可复制配置从数据到 LoRA 训练3.1 环境与模型下载硬件方面4B 模型 LoRA 微调一张 12GB 显存的卡就够RTX 4070 / 3090。8GB 显存可以上 QLoRA 量化方案。软件建议 Python 3.11PyTorch 2.0 以上CUDA 12.x。pip install modelscope modelscope download --model Qwen/Qwen3.5-4B --local_dir ./models/Qwen3.5-4B模型大约 9.3GB下载完检查一下文件完整性。LLaMA-Factory 安装git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e . pip install -r requirements/metrics.txt llamafactory-cli version3.2 医疗数据集格式与注册LLaMA-Factory 要求的数据格式是 instruction/input/output 三字段。把处理好的数据放到data/目录然后在data/dataset_info.json里注册{ medical_qa: { file_name: medical_qa.json, columns: { prompt: instruction, query: input, response: output } } }数据来源可以用 GitHub 上的 llm-medical-data 仓库或者 HuggingFace 上的 shibing624/medical 数据集。覆盖内科、外科、妇产科、儿科等科室格式比较规范。3.3 LoRA 训练 YAML 配置骨架在examples/train_lora/下创建qwen35_medical_lora.yaml### 模型配置 ### model_name_or_path: ./models/Qwen3.5-4B trust_remote_code: true ### 微调方法 ### stage: sft do_train: true finetuning_type: lora lora_rank: 64 lora_alpha: 128 lora_target: all ### 数据集配置 ### dataset: medical_qa template: qwen3 cutoff_len: 2048 preprocessing_num_workers: 8 ### 训练参数 ### output_dir: ./output/qwen35_medical_lora per_device_train_batch_size: 2 gradient_accumulation_steps: 8 learning_rate: 1.0e-4 num_train_epochs: 3.0 lr_scheduler_type: cosine warmup_ratio: 0.1 logging_steps: 10 save_steps: 500 ### 显存优化 ### bf16: true gradient_checkpointing: true参数解读lora_rank: 64是 LoRA 秩越大表达能力越强但显存占用也越大lora_target: all对所有线性层应用 LoRA效果更好gradient_checkpointing: true用时间换空间降低显存占用。启动训练llamafactory-cli train examples/train_lora/qwen35_medical_lora.yaml监控 loss 曲线tensorboard --logdir./output/qwen35_medical_lora/runs3.4 推理配置与合并导出推理配置文件examples/inference/qwen35_medical_lora.yamlmodel_name_or_path: ./models/Qwen3.5-4B adapter_name_or_path: ./output/qwen35_medical_lora template: qwen3 finetuning_type: lora命令行快速测试llamafactory-cli chat examples/inference/qwen35_medical_lora.yaml效果满意后合并 LoRA 权重llamafactory-cli export examples/merge_lora/qwen35_medical_merge.yaml合并配置model_name_or_path: ./models/Qwen3.5-4B adapter_name_or_path: ./output/qwen35_medical_lora template: qwen3 finetuning_type: lora export_dir: ./models/Qwen35-Medical export_size: 2 export_device: cuda export_legacy_format: false4. 验证请求通过 TaoToken 调用微调后模型合并后的模型可以用 vLLM 部署成 API 服务pip install vllm vllm serve ./models/Qwen35-Medical --port 8000或者用 LLaMA-Factory 内置 APIAPI_PORT8000 llamafactory-cli api examples/inference/qwen35_medical_lora.yaml部署好本地服务后通过 TaoToken 统一通道做验证请求。下面是一个 Python 调用示例import os import requests api_key os.environ[TAOTOKEN_API_KEY] base_url os.environ[TAOTOKEN_BASE_URL] headers { Authorization: fBearer {api_key}, Content-Type: application/json } payload { model: qwen3.5-4b-medical, messages: [ {role: system, content: 你是一个专业的医疗助手请根据患者描述给出建议。}, {role: user, content: 孩子3岁发烧38.5度要不要去医院} ], temperature: 0.3, max_tokens: 512 } resp requests.post(f{base_url}/v1/chat/completions, headersheaders, jsonpayload) print(resp.json()[choices][0][message][content])成功返回的结果应该包含分层建议物理降温、观察指标、就医指征。微调后的模型会从38.5度属于中度发热开始给出温水擦拭腋下腹股沟、保持通风、多喝水等具体操作并明确列出超过39度、持续3天、精神萎靡、抽搐等需要立即就医的情况。你也可以直接在模型对话页面手动测试https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。输入几个典型医疗问题对比微调前后的回答差异。5. 本篇常见错排查5.1 显存不够用CUDA out of memory把per_device_train_batch_size从 2 调到 1或者启用gradient_checkpointing: true。实在不行上 4-bit 量化把quantization_bit: 4加进 YAML。QLoRA 方案在 8GB 显存卡上也能跑。5.2 Loss 不下降或震荡先检查dataset_info.json里的字段映射是否正确prompt/query/response 三个字段必须和 JSON 数据里的 key 一一对应。学习率不要设太大1e-4 到 5e-5 之间比较稳。如果 loss 一直卡在 2.0 以上不动大概率是数据格式没被正确解析。5.3 微调后模型变傻灾难性遗忘训练轮数太多导致过拟合。把num_train_epochs从 3.0 降到 2.0或者在数据里混入 10% 的通用对话数据保持泛化能力。另外lora_rank不要盲目调大64 对 4B 模型已经够用128 反而容易过拟合。5.4 TaoToken 调用返回 401 或 403检查TAOTOKEN_API_KEY环境变量是否生效Key 有没有多余空格。如果是在容器里跑确认环境变量已经传进去。接入文档里有完整的鉴权说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。5.5 合并模型后推理结果和 LoRA 阶段不一致检查template字段是否一致。训练用qwen3推理和合并也必须用qwen3。模板不匹配会导致 prompt 格式错位模型输出会变得很奇怪。6. 语义一致 CTA医疗 AI 助手的原型跑通之后下一步是把它接入实际业务流。如果你需要长期做编码或 Agent 集成Coding Plan 提供了更稳定的调用配额https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。API Keys 管理页面可以随时创建和轮换 Keyhttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。医疗领域的 AI 应用一定要注意模型输出仅供参考不能替代专业医生的诊断。在产品设计时要做好免责声明和人工审核机制。整个流程从环境搭建到模型部署熟练的话半天就能搞定。LLaMA-Factory 把微调门槛降低了很多配合 Qwen3.5-4B 这样的高质量基座模型普通开发者也能做出效果不错的垂直领域 AI 助手。