ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

DeepSeek低资源训练实践:政务政策问答的RAG+QLoRA落地指南

DeepSeek低资源训练实践:政务政策问答的RAG+QLoRA落地指南 简介面向政务信息化从业者与AI应用开发者的实操型技术指南围绕DeepSeek低资源训练在政策智能问答场景中的落地展开帮助解决政务系统政策检索低效、政策解读不精准等问题。文档从政务系统升级背景与需求切入系统梳理DeepSeek模型架构特点重点讲解数据增强、迁移学习、模型压缩三类低资源训练策略并覆盖智能问答系统架构、数据准备与预处理、训练环境搭建与监控调优、答案检索与生成、多轮对话支持、系统集成测试等完整链路配有案例分析、效果评估及改进建议。资源为1个PDF文件共31页大小约1.99MB目录完整文字、图表均显示正常。目前已有167人学习下载适合作为政务智能问答项目方案设计与技术验证的参考。1. 把政务系统升级押在 DeepSeek 低资源训练上政策智能问答不靠堆算力把政务系统升级的方向押在 DeepSeek 低资源训练上不是因为它省显卡而是因为政策问答这个场景本来就该这么落地。我见过太多政务问答项目的共性困境政策更新快、问法口语化严重、答案必须带出处传统意图匹配和人工维护的问答库往往在新政策发布当周就开始答错运维只能连夜补数据。DeepSeek 这类开源模型给出的是另一条路——不用几十张卡做大规模预训练而是用一张 24G 显存的卡把“政策条文检索”和“政务口吻回答”拆开处理低成本做出可溯源的智能问答。这篇指南会顺着架构选型、数据准备、低资源训练、部署避坑和验证口径一条条拆开讲。适合政务信息中心工程师、集成商和需要在内网落地问答系统的团队参考。2. 架构与选型RAG 做知识、微调做口吻低资源才能落地2.1 为什么政策问答不该让模型背条文纯微调和纯检索的天花板政务政策问答里最容易出现的误解是“把政策条文直接微调进模型参数”。表面上看模型记住了条文回答也流畅但生产环境很快就暴露问题第一政策文本按季度更新每次更新都要重训一轮训练成本和审核成本都压在运维身上第二模型给出的答案很难追溯到“哪份文件的哪一条”政务场景里这是硬伤——市民追问依据时系统答不出出处基本等于不可用第三微调数据量不够时模型会一本正经地编造条款号这个现象在政务语料上尤其常见。反过来只做纯检索也有天花板。向量检索能精确找到“第十二条写了什么”但市民的问题往往不是条款原文而是“刚毕业来这边工作租房补贴找谁办、带什么材料”。这类口语化问法需要改写和归纳纯检索给不出像样的回答体验上还是像查数据库。常见的落地做法是把两者拆开DeepSeek 负责把口语问法转成检索条件、把检索片段组织成有政务口吻的完整回答检索库负责提供知识来源。这样政策更新时只需要重建索引模型权重不用动。方案知识更新成本溯源能力口语化回答生产维护重点纯模型微调高政策一变就要重训弱难解释依据强数据标注、定期重训纯检索低重建索引即可强直接命中原文弱答得像查库切分质量、召回率RAG 轻量微调低索引与权重解耦强回答尾部带依据中高口吻对齐提示词模板、索引更新所以标题里的“低资源训练”核心不是让模型记住更多政策而是让模型学会两件事把口语问法映射到检索可以命中的表达以及按政务规范组织答案、明确拒绝回答不了的题。知识在检索侧能力在模型侧这两件事分开以后低资源才真正可行。2.2 DeepSeek 权重怎么选从 1.5B 到 14B低资源边界在哪“低资源”得有个可操作的边界我的经验是一张 24G 显存卡加 64G 内存的机器就能把训练和部署两头都跑起来。DeepSeek 系列里有大量 7B/8B、14B/16B 量级的蒸馏权重这些权重继承了大模型的政策理解和推理能力尺寸又适合单卡微调。560B 以上的 MoE 大权重虽然效果好但部署依赖多卡集群和大内存和低资源的方向不符政务项目里多数也批不下这种预算。选型时按部署条件和回答质量要求来定我一般这样分档1.5B 到 3B 适合只做简单的办事指南问答CPU 都能跑得动边缘盒子也能部署7B/8B 是政策问答里性价比最高的档位24G 卡可以做 QLoRA 训练没卡时 CPU 8bit 量化也能勉强服务内部试用14B 到 16B 效果最好跨条款归纳能力明显强一截但 CPU 推理速度会掉到每秒几个 token最好配一块卡。具体到项目里我通常先拿 7B/8B 跑通全链路再根据评估结果决定要不要升到 14B/16B。权重量级训练显存需求CPU 推理体验适合场景1.5B ~ 3B8G 以下流畅简单指南问答、边缘盒7B ~ 8B16G ~ 24G可接受速度偏慢多数政策问答、常规业务14B ~ 16B24G慢基本需要 GPU跨条款归纳、复杂咨询这里说的“训练”都是 QLoRA 轻量微调不是全量微调。全量微调光优化器状态就把显存吃光了低资源无从谈起。QLoRA 的细节放在第 4 章展开选型阶段只要记住权重选蒸馏版量化用 4bit训练只动低秩适配器。2.3 可复现的 DeepSeek 本地部署环境安装与离线化准备环境准备是整个项目里最容易劝退人的一环尤其是政务内网不能直连公网时依赖装不上会卡你好几天。我先给一套标准环境再补离线安装的做法。# Python 3.10 虚拟环境训练与部署复用同一套 conda create -n ds-policy python3.10 -y conda activate ds-policy # 训练侧依赖 pip install transformers datasets accelerate peft bitsandbytes sentencepiece # 推理加速 pip install vllm # 检索侧向量模型依赖 pip install sentence-transformers # 政务内网离线安装时在带外网机器上先执行 # pip download -r requirements.txt -d ./offline_pkgs # 再把 offline_pkgs 拷入内网机器在目标环境执行 # pip install --no-index --find-links./offline_pkgs -r requirements.txt逻辑上这套依赖分成三层transformers 全家桶负责加载和训练模型vllm 负责上线后的吞吐sentence-transformers 负责把政策切片转成向量。bitsandbytes 是实现 4bit 量化的关键库没有它 QLoRA 就是空谈。内网离线安装时最稳妥的做法是在一台和目标机器 glibc 版本一致、CUDA 驱动一致的带外机器上导出离线包否则容易出现 torch 装上了但 CUDA 不可用的“假成功”。政务内网装环境这不是玄学是兼容性工程。提示政务内网没有外网时模型权重和依赖包都要走线下拷贝。权重文件体积不小提前确认拷贝介质和审批流程别等环境搭好了才发现权重进不来。3. 政策语料与训练数据从公开条文到问答对的三道工序数据准备决定这个项目最后是“能用的系统”还是“演示用的模型”。政策问答有个天然优势语料是结构化的公文不需要像通用对话那样花大力气清洗。但反过来说公文的切分粒度直接决定检索效果切错了后面再怎么调模型都救不回来。整个数据工程分三道工序拆条文、扩问法、建训练集。3.1 按条款切分而不按字数切分政策文本的结构化拆分政策原文最常见的格式是“第一章 总则”“第十二条 补贴标准”这种结构。如果按固定长度切很容易把“第十二条”和正文内容切到两个片区里检索时只命中正文没有条款号溯源就断了。正确做法是先按公文结构拆出章、节、条再对超长条款做滑窗切分。import re def split_policy(text: str, overlap: int 64, max_len: int 512): blocks [] lines text.splitlines() current {title: , content: []} for line in lines: line line.strip() if not line: continue # 识别“第X章”“第X节”“第X条”开头的结构行 head line.split(。)[0] if re.match(r^第[一二三四五六七八九十百零〇][章节条], head): if current[content]: blocks.append(current) current {title: line[:30], content: []} else: current[content].append(line) if current[content]: blocks.append(current) pieces [] for b in blocks: text_block .join(b[content]) if len(text_block) max_len: pieces.append({title: b[title], text: text_block}) continue # 对超长条款做滑窗切分overlap 防止把关键实体切成两半 step max_len - overlap for i in range(0, len(text_block), step): pieces.append({ title: b[title], text: text_block[i:i max_len], }) return pieces这个切分逻辑里有三个参数值得反复调overlap 设 64 个字符能覆盖“补贴标准为每人每月 X 元”这种跨窗口的实体max_len 设 512正好是向量模型比较舒服的输入长度也方便和问答上下文拼接title 保留前 30 个字符用于在回答里锚定“这份文件”。如果你的政策文档没有明显的“第X条”结构比如一些实施方案只有自然段那就退回到固定长度切分但一定要把文档标题拼进每个切片的前缀里否则检索结果会失去文件归属。3.2 低成本问答对构造用 DeepSeek API 做问法扩展训练数据不需要上万条政务问答的核心矛盾是“市民问法口语化”和“政策条文书面化”之间的落差。低资源微调真正要学的是这个映射关系所以数据构造重点是问法多样性。常见做法是先人工写 30 个种子问法覆盖“申请条件、所需材料、补贴标准、办理时限、办理地点”这几类高频诉求再调用 DeepSeek 的 API 对每段政策切片做问法扩展。DeepSeek 官方接口兼容 OpenAI 协议调用方式上和 OpenAI SDK 一致只是换掉 base_url 和 api_key数据构造阶段这么用成本很低。import json import os from openai import OpenAI client OpenAI( api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), ) SEED_QUESTIONS [ 谁可以申请这项政策, 需要准备哪些材料, 补贴标准是多少, 办理时限是多久, 要去哪里办理, ] def expand_questions(policy_text: str): prompt ( 你是政务问答训练数据构造助手。请针对下面这段公开政策条文 生成8个普通市民可能使用的口语化问法覆盖申请条件、材料、标准、时限、地点。\n 只输出JSON数组字段名为questions不要输出解释。\n f政策条文{policy_text}\n f参考问法{json.dumps(SEED_QUESTIONS, ensure_asciiFalse)} ) resp client.chat.completions.create( modelos.getenv(DEEPSEEK_EXPAND_MODEL, deepseek-chat), messages[{role: user, content: prompt}], temperature0.7, ) content resp.choices[0].message.content # 有些兼容接口不支持 response_format做一层正则兜底 match re.search(r\[.*\], content, re.S) if not match: return [] return json.loads(match.group()).get(questions, [])这里 temperature 设 0.7是为了让扩展出的问法有足够多样性又不至于跑偏到无关话题。如果生成的问法和政策片段明显对不上比如把“企业申报”问法安到“个人补贴”条文上需要人工过滤掉。政务场景下尤其要注意所有输入到 API 的语料只使用已公开发布的政策原文和官方解读绝不把办事人的真实聊天记录送出去做扩展。如果政务内网完全隔离、无法调用外部 API就把这段逻辑换成调用第 4 章微调前的本地 DeepSeek 权重prompt 不变只是慢一些。3.3 训练集长什么样字段、比例与质检闸门数据构造完成后每条训练样本包含五个字段user_question 是扩展出的口语问法standard_query 是标准化的问题描述policy_context 是命中的政策切片原文source_clause 是文件名加条款号answer 是人工审核过的标准回答。这个结构决定了后面的训练和评估都围绕“来源可溯”展开answer 里必须出现“依据文件名-条款号”或者至少明确引用条款内容。样本比例上除了正常问答对一定要混入 10% 到 15% 的不可答样本。不可答样本的构造方法是把政策切片换成无关内容比如“今天天气怎么样”“隔壁市有什么政策”answer 统一写成“该问题无法从当前政策条文确定建议咨询XX部门”。这部分样本的作用是教模型在检索内容不足时拒答而不是硬编。政务智能问答出了幻觉是事故级别的问题训练阶段就要把拒答能力焊进去。质检环节不要省。我的做法是从生成的问答对里随机抽 30 条逐条检查三件事问法是否口语化、答案是否完全来自政策片段、条款号是否对得上原文。只要抽检中发现两条以上答案存在“政策片段里没有但模型编出来”的内容整批数据就退回重新生成。这一步过了才进入训练环节。4. 低资源训练落地QLoRA 单卡微调 DeepSeek 完整流程数据就绪以后训练环节反而是最机械的。低资源训练的标准方案是 QLoRA把基座模型加载成 4bit 量化冻结全部原始权重只训练一小撮低秩适配器。这样显存占用落在 24G 以内训练时长可控产出物也只是一个几百 MB 的适配器文件保存、回滚、跨机器拷贝都很方便。整个流程分四步对话模板对齐、量化加载、超参设置、合并导出。4.1 先对齐对话模板训练样本和推理模板必须同一套微调之前要先把问答对转成模型认识的对话格式。这里最容易埋雷训练时用一套 system prompt上线推理时写了另一套结果模型在训练时学到的“口吻”在推理时全部失效。正确做法是把 system prompt 固定下来训练和推理用同一个模板。train_examples [] for item in qa_pairs: messages [ {role: system, content: 你是政务政策问答助手。只依据给定的政策条文回答不编造条款号。}, {role: user, content: item[user_question]}, {role: assistant, content: item[answer] \n依据 item[source_clause]}, ] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptFalse ) train_examples.append({text: text})这段代码的逻辑是把每一条问答对封装成 system/user/assistant 三段式消息再用 tokenizer 自带的 chat template 转成训练文本。注意两个细节一是 add_generation_prompt 必须设 False否则训练文本末尾会多一个助手指引符模型会学到奇怪的输出习惯二是“依据文件名-条款号”作为答案的一部分参与训练而不是只写在 system prompt 里这样生成结果天然携带出处。训练样本长度超过 max_seq_length 的直接截断但要保证截断发生在答案之后不要让“依据”被截掉。4.2 4bit 量化加载与 LoRA 挂载把显存压到 24G 以内模型加载是 QLoRA 的核心步骤。4bit 量化把权重压到原来的四分之一nf4 数据类型在低比特下保持了较好的精度double quant 再对量化常数做一次量化进一步省显存。import torch from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig ) from peft import LoraConfig, prepare_model_for_kbit_training, get_peft_model MODEL_PATH ./deepseek-14b-distill bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_use_double_quantTrue, bnb_4bit_compute_dtypetorch.bfloat16, ) model AutoModelForCausalLM.from_pretrained( MODEL_PATH, quantization_configbnb_config, device_mapauto, torch_dtypetorch.bfloat16, ) tokenizer AutoTokenizer.from_pretrained(MODEL_PATH) tokenizer.pad_token tokenizer.eos_token model prepare_model_for_kbit_training(model) lora_config LoraConfig( r16, lora_alpha32, lora_dropout0.05, target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], biasnone, task_typeCAUSAL_LM, ) model get_peft_model(model, lora_config) device_mapauto 可以让模型自动分布到可用显存单卡场景直接占用整卡显存。pad_token 必须设置否则批量训练时长度补齐会报错。prepare_model_for_kbit_training 会调整模型内部结构开启 gradient checkpointing 支持这一步不做后续训练会直接显存溢出。target_modules 这段列表要按实际模型架构核对不同版本的 DeepSeek 蒸馏权重模块命名可能略有差异稳妥做法是先打印 model.named_modules() 确认。r16、lora_alpha32 是政务问答这类小数据任务里的保守值rank 再大容易在几百条数据上过拟合。 ### 4.3 训练超参怎么设epoch、批量、学习率、序列长度 训练参数直接决定模型是“学会口吻”还是“背下数据”。政务问答训练集通常只有几百到一千条目标不是让模型记住政策原文而是让它学会口语问法和规范回答之间的映射所以训练轮次不能多学习率也不能太大。 python from transformers import TrainingArguments, Trainer training_args TrainingArguments( output_dir./ds-policy-lora, num_train_epochs2, per_device_train_batch_size2, gradient_accumulation_steps4, gradient_checkpointingTrue, learning_rate2e-4, lr_scheduler_typecosine, warmup_ratio0.05, bf16True, max_grad_norm1.0, logging_steps10, save_strategyepoch, optimadamw_torch, ) trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, tokenizertokenizer, ) trainer.train()per_device_train_batch_size 设 2配合 gradient_accumulation_steps 4实际批量是 8这是 24G 显存下跑 14B 量级的常见组合。如果显存还是不够把 per_device_train_batch_size 降到 1accumulation 提到 8。num_train_epochs 设 2 是政务小数据的经验值第一轮学口吻第二轮巩固第三轮就开始过拟合了。bf16 只在较新的显卡上可用如果你的机器是 20 系之前的显卡要改成 fp16。学习率 2e-4 是 LoRA 微调的常用起点loss 如果震荡可以降到 1e-4。训练过程中盯 loss 就够了不用追求无限收敛loss 降到 0.3 到 0.5 之间且趋于平稳就可以停了。4.4 合并导出与最小验证用 fp32 防复读机训练完成后会产生一个 LoRA 适配器目录里面有 adapter_model.safetensors 和 adapter_config.json。适配器可以单独保存和加载但生产部署用 vLLM 时直接跑 adapter 会多一层加载复杂度我习惯把适配器合并回基座模型导出成一个完整权重目录。python - PY import torch from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer base AutoModelForCausalLM.from_pretrained( ./deepseek-14b-distill, torch_dtypetorch.float32, device_mapcpu ) model PeftModel.from_pretrained(base, ./ds-policy-lora/checkpoint-xx) model model.merge_and_unload() model.save_pretrained(./ds-policy-merged) tokenizer AutoTokenizer.from_pretrained(./deepseek-14b-distill) tokenizer.save_pretrained(./ds-policy-merged) PY合并时用 torch.float32 是我踩过坑后留下的习惯。第一次我用 fp16 合并导出后的模型变成复读机同一个短语反复输出几十遍原因就是低精度累加误差在合并时被放大。换成 fp32 后问题消失。合并完成后一定要先做单条验证再决定是否上线加载导出目录用训练时的 system prompt 问一条测试数据确认模型能输出带“依据文件名-条款号”的完整回答。这一步能拦住大部分部署期的问题。5. 部署避坑与常见问题排查从 vLLM 到离线环境的五个坑训练完成只算走了一半部署才是政务项目真正见真章的地方。政务内网的部署条件五花八门有的机器有 GPU有的只有 CPU还有的网络隔离到连 pip 都装不了。我的部署原则是有卡走 vLLM无卡用 CPU 量化兜底接入层把溯源规则写死。5.1 有卡走 vLLM无卡用 CPU 量化兜底有 GPU 的环境vLLM 是首选推理引擎。它把训练完的 DeepSeek 权重包装成 OpenAI 兼容接口前端和测试工具可以直接复用社区生态不用自己写推理框架。CUDA_VISIBLE_DEVICES0 python -m vllm.entrypoints.openai.api_server \ --model ./ds-policy-merged \ --served-model-name ds-policy \ --port 8000 \ --gpu-memory-utilization 0.85 \ --max-model-len 4096 \ --trust-remote-codegpu-memory-utilization 设 0.85是为了给显存留出余量避免并发上来时 KV cache 溢出导致服务崩溃。max-model-len 设 4096训练时最长序列是 2048部署时留一倍余量给检索上下文避免超过长度限制报错。启动完成后用 curl 调 /v1/chat/completions 验证接口正常再接入检索层。如果内网机器没有 GPU就先把合并后的 HF 权重用 llama.cpp 的转换工具转成 GGUF做 Q8_0 量化再用 llama-server 提供同样的 OpenAI 兼容接口。8bit 量化下 7B/8B 量级在 CPU 上大约每秒 10 到 15 个 token对政务问答这种“问一句、等几秒”的场景够用但并发超过五个就要排队只适合内部试用。5.2 接入层设计把“依据文件名-条款号”焊死在回答里部署层只解决“模型能跑”接入层才决定“答案能不能用”。政务问答系统上线前接入层要做三件事把检索命中的政策切片拼进请求约定回答必须带依据输出不合规时兜底拒答。下面是一个标准的请求拼装结构{ system: 你是政务政策问答助手。只依据给定的政策条文回答不编造文件号和条款号。如果条文不足以回答直接说明需要咨询哪个部门不要猜测。回答末尾必须给出依据文件名-条款号。, retrieved_docs: [ {file: XX市人才引进实施办法, clause: 第十二条, text: 对首次来本市就业的硕士给予每月1500元租房补贴连续发放36个月。}, {file: XX市人才引进实施办法, clause: 第十五条, text: 申请材料包括身份证、学历证明、劳动合同。} ], user: 刚毕业的硕士来这边工作能拿多少租房补贴 }system 里明确写了“回答末尾必须给出依据”检索结果把文件名和条款号直接暴露给模型模型照抄即可不需要自己记出处。接入层还要加一道输出校验如果回答文本里没有“依据”两个字或者依据中的条款号不在本次检索命中的集合里直接拦截掉返回“该问题无法从当前政策条文确定”。这道校验是政务智能问答的兜底安全网防止模型在检索质量差的时候强行作答。5.3 五条踩坑记录现象、原因、解决第一条训练 loss 降到 0.4 左右开始震荡问答里出现大量重复短句。原因是训练集里混入了过长和过短的极端样本模型被带偏。解决方法是统计样本长度分布过滤掉 20 字以下和 1200 字以上的答案再把完全重复的问法去重。第二条训练时测试正常merge_and_unload 导出后模型变成复读机。原因是合并时用了 fp16低精度误差被放大。解决方法是回到 4.4 节用 fp32 重新合并。这条属于合并阶段最典型的翻车没有捷径。第三条vLLM 部署后答非所问和训练时的表现完全不一致。原因是训练用的 chat template 和 vLLM 启动时默认的模板不是同一套。解决方法是把训练时的 tokenizer_config.json 里保存的 chat template 导出成 jinja 文件vllm 启动时用 --chat-template 参数显式传入。第四条新政策发布后系统仍然命中旧政策条文。原因是向量索引没有重建旧文本还残留在库里。解决方法是把上线流程改成“先重建索引再清缓存最后切流”并且在索引字段里加上 publish_date检索排序时对旧政策做时间衰减而不是物理删除。第五条政务内网离线安装依赖时反复失败。现象是 pip 离线包换一台机器就装不上报错大多和 glibc 版本或 CUDA 驱动不匹配有关。解决方法是先在目标机器上执行 ldd --version 和 nvidia-smi 确认环境再到配置完全一致的带外机器上导出离线包。训练机和部署机分开时这个检查要提前做不要等到项目上线前夜才动手。注意部署环境千差万别以上五条是我在政务项目里重复遇到的高频问题。你的环境如果更特殊按照“现象记录、原因定位、复现验证”的顺序排查比直接抄网上配置靠谱得多。6. 验证口径与进阶收尾50 问评估集、更新链路和一点教训6.1 三个指标一套脚本能答、敢拒、会溯源部署完成后别急着宣布上线。我每次都会构造一个 50 问的评估集其中 30 问是政策条文能回答的20 问是政策条文覆盖不到的比如“明天天气怎么样”“隔壁市的政策如何执行”。评估集跑完后只统计三个指标可答正确率、拒答准确率、溯源命中率。import re def evaluate(eval_set, responses): stats {answerable_ok: 0, unanswerable_ok: 0, source_hit: 0, total_answerable: 0, total_unanswerable: 0} for item, resp in zip(eval_set, responses): if item[type] answerable: stats[total_answerable] 1 if 依据 in resp and any(c in resp for c in item[must_hit]): stats[answerable_ok] 1 stats[source_hit] 1 else: stats[total_unanswerable] 1 if 无法 in resp or 不能确定 in resp or 咨询 in resp: stats[unanswerable_ok] 1 return stats可答正确率的及格线是 85%低于这个值说明检索或微调还有问题拒答准确率要求 90% 以上不可答的问题必须答“无法确定”不能硬答溯源命中率要求 100%因为回答里没有准确依据这条样本直接算失败。三个指标全部通过才算具备上线条件。指标计算方式及格线可答正确率可答问题中答案完整且正确的比例85%拒答准确率不可答问题中正确拒答的比例90%溯源命中率可答回答中依据条款号命中的比例100%6.2 更新链路与路由扩展别让知识死在权重里上线之后还要想清楚更新链路。政策更新时只需要重新切分政策文本、重建向量索引、清理缓存模型权重完全不用动。只有当问法风格发生明显偏移时才考虑增量微调而且增量数据要和旧数据混合训练避免灾难性遗忘。进阶一点的做法是路由简单指南类问题走轻量模型跨条款复杂咨询走大模型由检索结果的数量和置信度决定路由。这套方案最大的好处是模型始终不直接存储政策知识知识在索引里索引可更新模型可解释。我最初做这类项目时总想把所有政策内容都塞进模型参数里结果每次政策更新都要重新训练成了典型的费力不讨好。后来改成检索负责知识、微调负责口吻维护成本一下子降下来。低资源是被场景逼出来的政务系统要的是可更新、可溯源、可解释而不是一个什么都知道却什么都说不清的黑匣子。希望帮到你。本文还有配套的精品资源点击获取
返回列表