☰
低资源训练DeepSeek:政务智能问答的LoRA微调与部署实战
2026/10/5 13:19:36 网站建设 项目流程

简介:一份面向政务信息化人员、算法工程师与NLP初学者的DeepSeek实践指南,聚焦算力有限、数据不足情况下政策智能问答系统的搭建与升级。文档从政务系统现状分析切入,依次讲解DeepSeek模型架构、低资源训练策略、问答系统总体架构、前端交互层、中间处理层与后端数据层设计,覆盖数据增强、迁移学习、模型压缩(剪枝、量化)等关键技术。资源包内含1个PDF文档,共31页,大小1.99MB,目录完整、文字与图表显示正常,阅读体验良好。借助这份材料,读者可获得从环境搭建、模型加载与微调,到训练监控、答案检索匹配、多轮对话支持及系统测试的全流程方法;末尾的案例分析、效果评估与改进建议,也为实际项目提供了可参考的落地路径。目前已有167人学习下载,适合作为政务系统智能化升级及低资源大模型落地的入门规划和设计方案。

1. 政务智能问答卡在算力上?低资源训练DeepSeek的可行路径

政务窗口和热线的咨询量从来没小过:政策文件一更新,坐席就要重新背稿,关键词检索答非所问,通用大模型倒是答得流利,可它在没有依据时也会一本正经地编。这个标题指向一条更务实的路:用 DeepSeek 做底座,靠低资源训练(LoRA/QLoRA 这类参数高效微调)在单张 24GB 显卡甚至 16GB 显存上,把模型调教成“懂本地政策、答案带依据”的政策智能问答服务。

这套方案解决的核心问题不是“跑多大模型”,而是“用得起的基础上让答案可追溯”。它适合三类人:政务系统集成商、政务云和数据局的技术团队、想给热线坐席减负的内部开发组。先给一个反直觉的结论:真正卡住项目的往往不是算力,而是语料清洗和评测集——这两件事没做对,再贵的卡也只会训出一个“背错法条的复读机”。

2. 低资源训练前的三件事:选基座、备语料、定评价方式

低资源训练不等于“拿个小模型随便跑跑”。在跑任何训练脚本之前,有三件事必须定下来:选哪个 DeepSeek 基座、准备什么样的政策语料、怎么判断模型有没有变好。这三件事做扎实了,训练本身反而成了最省心的一步。

2.1 找基座模型:先看显存和事实性,不看榜单

DeepSeek 系列发布过的模型从 7B 级到数百 B 参数都有,低资源训练场景下不用犹豫,直接锁定 7B 级。原因是显存账算得过来:7B 模型用 fp16 加载大约占 14GB 显存,int8 约 7GB,int4 约 4GB。QLoRA 在 int4 基础上挂一层低秩适配器,训练时的峰值显存还要算上激活值和梯度,单张 24GB 显卡是舒适区;16GB 显卡把 max_length 缩短到 1024、batch size 调成 1,也能跑。

选基座时先看“事实性”而不是榜单分数。政策智能问答的答案要求有依据,模型不需要在回答里展示长篇推理过程。像 DeepSeek 的 R1 系列,推理能力很强,但那种“多说多错”的风格在政务场景反而是负担——用户问“社保断缴有什么影响”,模型可能给你推演一大段,却不说清文件依据。常见做法是选官方的通用对话基座,指令跟随稳定、生成风格平实,再通过低资源训练注入政策知识。

动手前还有一个不起眼但关键的步骤:先拿没微调的基座模型,在 20 条典型政策问题上跑一遍零样本输出。看它是不是已经会拒答、会不会复述原文。这一步帮你确认两件事:一是基座本身对中国政策文本的理解底子够不够,二是后面微调到底能带来多大提升。如果基座在零样本下已经答得像模像样,说明 SFT 更多是在“调格式”;如果答得完全偏,那说明语料和提示词设计要重点下功夫。

2.2 政策语料准备:清洗、结构化、构造问答对

政务问答的数据源通常有四类:政府门户网站的政策原文及解读、办事指南与流程图、热线平台的历史工单、窗口常见问题 FAQ。这些数据没有一个能直接丢进训练脚本,得先过一遍清洗。

清洗的第一步是格式转换。政府公开文件很多是 PDF 或扫描件,先用工具批量转纯文本,转完一定要人工抽查几份,重点看表格转置和页眉页脚污染。第二步是脱敏,身份证号、手机号、家庭住址这些用正则批量替换。政务数据合规是红线,语料一旦泄露个人信息,项目还没上线就先违规了。第三步是保留文件的“元信息”,每段文本打上标签:发文机关、文号、成文日期、生效日期、失效日期、所属政策领域。这是后续避免新旧政策答串的关键。

for f in raw_policy/*.pdf; do pdftotext -layout "$f" "txt/$(basename "$f" .pdf).txt" done

pdftotext 的 -layout 参数会尽量保留原文的版面结构,对“章-条-款”这种层级分明的政策文本特别有用。转完后你得到的是一堆 txt,下一步按章节做结构化切分。政策文件不建议按固定字数硬切,最好按“章─条─款”的层级切,一条一记录,每块控制在 256 到 512 字之间。这个长度对后面的向量检索最友好:太短丢失上下文,太长召回时噪声太大。

清洗完成后,还需要人工构造问答对。常见做法是找业务人员写“市民原话问法”,“孩子上幼儿园要准备什么材料”就比“入园材料有哪些”更接近热线真实场景。初始数据集有 500 到 2000 条高质量问答对就能看到明显效果,政务问答数据贵在精而不在多。如果你的项目连问答对都凑不齐,可以用 DeepSeek 先批量生成候选问答,再由业务人员逐条核对,通过率能到六成左右,剩下的边用边补。

2.3 先定评测再训练:自动指标会骗人,人工评分才可信

低资源训练最常见的翻车不是模型训崩了,而是训完不知道变好了多少。很多人只看 loss 下降和几个 ROUGE 分数就宣布成功,结果一上线全露馅。政策问答的答案没有唯一标准,同一个意思换种说法,自动指标分数可能很低,但人工判对;反过来,模型把文件名称说错了,ROUGE 却可能因为字面重合而分数很高。

我一般会在训练前先做一套离线评测集:从热线平台拉最近一年的真实咨询问题,脱敏后抽 100 到 200 条,每条配上参考答案和“依据条目”。然后定四个评分维度:内容准确、依据可查、不编造、拒答正确。表格式的评分标准长这样:

维度满分标准踩分点
内容准确答与现行政策一致,数字和条件无错引用已废止条款
依据可查给出文号或文件名,读者能定位只给结论不给来源
不编造不知道的明确说不知道生成不存在的文件或比例
拒答正确无依据时不强行回答对隐私问题给猜测性答案

评测集前置还有一个好处:训练前用基座模型在评测集上跑一遍,拿到一个“原始分”。训练后再跑同一套题,看分数变化。自动指标(ROUGE/BLEU)不是没用,而是用来做回归——确保新模型没有把旧能力改坏。如果 ROUGE 大幅波动而人工评分没变,多半是数据或提示词模板出了偏差。记住,评分集是训练的“眼睛”,这步省了,后面全是黑匣子。

3. 落地LoRA微调DeepSeek:显存占用与关键参数怎么设

预览一下 QLoRA 在 24GB 显卡上的显存分配:基座 int4 占 4GB,LoRA adapter 占几十 MB,激活值占大头,但控制住 max_length 就不至于爆。训练速度不快,epoch 数也不多,政务数据量小,通常几小时到一天能跑完一轮。这个体量,完全撑得起“发布新政策就重新微调一轮”的迭代节奏。

3.1 最小可跑的LoRA训练脚本:transformers + PEFT

先给一份可以直接落地的脚本骨架,用的是 HuggingFace Transformers 和 PEFT 库。这里假设你已经把数据做成了 Dataset 格式,每条样本是“问题+答案”拼接的文本。

import torch from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training # 1. 4bit量化加载基座,这就是QLoRA的核心 quant_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True, ) model = AutoModelForCausalLM.from_pretrained( "你的基座模型路径", # 本地下载好的 DeepSeek 7B 对话模型目录 quantization_config=quant_config, device_map="auto", ) tokenizer = AutoTokenizer.from_pretrained("你的基座模型路径") tokenizer.pad_token = tokenizer.eos_token # 政务文本短样本多,padding必须处理 model = prepare_model_for_kbit_training(model) # 2. LoRA配置:只训练低秩矩阵,冻结基座 lora_cfg = LoraConfig( r=8, lora_alpha=16, target_modules=[ "q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj", ], lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", ) model = get_peft_model(model, lora_cfg) model.print_trainable_parameters() # 预期只有约0.1%参数可训练

这段脚本的逻辑是:先用 4bit 量化把基座模型压到极小显存占用,再用 PEFT 在每一层注意力矩阵旁边挂一个低秩分支。训练时梯度只经过低秩分支,基座权重不动,所以显存和算力开销都大幅下降。bnb_4bit_use_double_quant=True会让量化再做一次二次量化,省几个 GB 显存,代价是加载稍慢,政务场景完全值得。device_map="auto"负责在多卡环境下自动分配层,单卡时会全部落在显存里,不占用 CPU offload。

训练超参接着来:

from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir="./policy_qa_lora", per_device_train_batch_size=2, gradient_accumulation_steps=8, num_train_epochs=3, learning_rate=2e-4, warmup_ratio=0.03, logging_steps=10, save_strategy="epoch", fp16=True, report_to="none", ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, tokenizer=tokenizer, ) trainer.train()

这里per_device_train_batch_size=2配合gradient_accumulation_steps=8,等效 batch size 是 16。政务数据量小,等效 batch 太大会让训练震荡,太小则 loss 曲线噪声大不好判断收敛。save_strategy="epoch"建议保留,别用 step 保存,不然一轮下来 checkpoint 多到爆。fp16 在 20 系以上 N 卡都能开,A 卡用户改用 bf16。

3.2 影响政策问答质量的四个参数:rank、学习率、epoch 和 max_length

LoRA 的四个核心参数里,r(rank)是最容易拍脑袋的。政务问答数据集通常只有几百到两千条,r=8起步就够。r 太大(比如 64)会把低秩分支变成一个小而全的模型,在小数据上轻则过拟合,重则基座原有的通用能力被覆盖;r 太小(比如 2)记不住政策文本里的特殊格式。政务文件里满是“国办发〔2023〕X号”这类文号、日期加括号的组合,rank 太低直接记不住,生成时要么漏字要么把年份编错。lora_alpha和 r 的关系一般按alpha = 2r设置,alpha 是缩放系数,影响低秩分支的更新幅度。

学习率方面,LoRA 微调比全参微调高一个数量级是正常的。我用 2e-4 起步,训练时如果 loss 在前 100 步就开始震荡,降到 5e-5 再试。warmup_ratio 0.03 到 0.05 之间,避免开头大步长把量化后的基座权重冲坏。

epoch 数是个玄学与经验并存的值。政务小数据 3 到 5 轮通常是甜点区。判断标准不是训练 loss 压得多低,而是评测集分数变化。如果你看到训练 loss 一直在降,但评测集准确率到第 3 轮后不再升甚至下降,马上停。低资源训练里“训过头”比“欠拟合”更常见。

最后是 max_length——一个容易被忽略但对政务场景致命的参数。政策问答的输入往往带着一长段政策原文,输出要引用文件名称、条款编号和日期,如果 max_length 只设 512,你的训练目标可能在生成到一半时被硬生生截断,模型学到的全是残缺答案。设置时先看语料里最长样本的长度,加 20% 余量,常见的做法是 1024 起步,确实有长文本需求再提到 2048。max_length 提高会显著增加显存占用,这是在显存预算和答案完整度之间的直接取舍。

3.3 显存不够时的折中方案:QLoRA 优化与多卡并行

先说单卡怎么压。如果 16GB 显卡跑 7B 都吃力,第一步把 batch size 调到 1,用梯度累积补等效 batch。第二步检查是否有 CPU 与 GPU 之间的传输出问题,prepare_model_for_kbit_training会自动给量化层插上保留 fp16 的前向钩子,这个不加的话训练时数值稳定性会翻车。第三步考虑把 max_length 从 2048 降到 1536,政务长文检索有 RAG 兜底,训练时截掉尾巴比 OOM 中断强。

多卡并行又是另一个坑。很多人一上来就上 DeepSpeed,但名字里都带 Deep 的 DeepSeek 和 DeepSpeed 是两个东西,一个是模型一个是训练框架,配置时风向标一旦搞混,能折腾一整天。政务项目通常只有一两张卡,我一般不建议上 DeepSpeed Stage 3,直接用单卡或双卡 DataParallel,配合 PEFT 就能吃得下 7B 级模型。真到了两张 24GB 卡都装不下的程度,你要先反思的不是并行方案,而是数据是不是没洗干净导致序列过长。

给一个容易踩的提示:QLoRA 训练时如果看到 loss 起初很低但几百步后突然飙升,多半是 intra-epoch 数据混洗没关(skip_special_tokens设置问题)或者某个异常长样本把梯度撑爆。政务语料里偶尔会混进一个 5000 字的“政策解读”全文,训练前按 max_length 做 truncation 和过滤,比训练中 Debug 高效得多。

4. 从微调模型到政策问答服务:合并权重、RAG接入与推理部署

模型训完只是第一步。政务问答系统要真正能用,还要解决三件事:把 LoRA 权重落成可对外服务的模型、接上政策库做检索增强、用合适的推理框架把服务跑起来。这一章这些环节逐个过一遍。

4.1 导出与加载:把LoRA权重合并进基座模型

LoRA 训练结束后,你手上是一套基座权重加一套轻量 adapter。这里的导出有两种选择:合并成单模型,或保留 adapter 分离加载。

from peft import PeftModel from transformers import AutoModelForCausalLM, AutoTokenizer import torch base_model = AutoModelForCausalLM.from_pretrained( "你的基座模型路径", torch_dtype=torch.float16, device_map="auto", ) lora_model = PeftModel.from_pretrained(base_model, "./policy_qa_lora/checkpoint-3") merged = lora_model.merge_and_unload() merged.save_pretrained("./policy_qa_final") tokenizer.save_pretrained("./policy_qa_final")

merge_and_unload会把低秩矩阵的权重直接折叠回原模型,得到一个干净的完整权重。这样做的好处是对后续推理框架最友好:vLLM、Triton 加载推理模型时不需要感知 PEFT 适配器,直接按普通模型处理,少一层依赖少一层报错。分离加载的好处是切换领域方便,如果你想在同一基座上叠加“社保问答”和“公积金问答”两套 adapter,保留 LoRA 权重就能按需切换。政务场景建议走合并路线,部署越简单,运维越省心。

这里有个实际翻车点:很多人合并后只保存 model,忘了保存 tokenizer。结果上线时 pad_token 丢失,要么连不上 vLLM,要么推理时每个 batch 长度不一致导致生成乱码。合并完成后立刻做一个最小验证——加载权重,输入一句“生育津贴怎么领”,看输出是否正常、是否带正确文号。这种两分钟的检查能省下后续一晚上的排查。

4.2 给问答加政策依据:RAG检索接入与chunk大小选择

政务问答几乎是 RAG 最典型的落地场景。政策更新快、条款之间存在相互引用,模型记忆再准也比不上一份实时可查的原文。RAG 的职责是:根据用户问题,先从政策库召回相关条款,再把条款原文拼进提示词,让模型基于原文生成答案。

整体流程不复杂:用户输入问题后,先做一层“查询改写”,把口语转成政策术语,“孩子上学怎么办”改写成“适龄儿童入学条件及流程”,然后做向量检索,取相似度最高的 3 到 5 条文本片段,最后连同用户问题一起组装成提示词,发给本地部署的 DeepSeek 模型。中文政策场景里,“查询改写”这步往往比换更大的向量模型更提升效果。

from sentence_transformers import SentenceTransformer import numpy as np encoder = SentenceTransformer("BAAI/bge-small-zh-v1.5", device="cuda") question = ["生育津贴怎么领?"] doc_texts = [ "申领生育津贴需在产后60日内提交……", "材料清单包括:身份证、结婚证、出生医学证明……", ] q_vec = encoder.encode(question) d_vecs = np.array([encoder.encode(t) for t in doc_texts]) scores = q_vec @ d_vecs.T top_indices = np.argsort(scores[0])[::-1][:2]

这个示例把召回逻辑压缩到了最小。中文政策文本建议用中文预训练的 embedding 模型,英文向量模型对“生育津贴”这类词的语义把握不如中文模型。检索后不要只取“分数最高的一条”,政务答案常常横跨多个条款,取 top3 到 top5 拼接,模型才有足够上下文回答完整的“材料+流程+依据”。chunk 长度在 2.2 里说了 256 到 512 字,但还要加一条:切分时保留条款编号,检索结果里能看到“第X条”字样,模型才知道引用对象是什么。

4.3 用vLLM做推理服务:温度、top_p与max_new_tokens设置

合并后的模型可以直接用 vLLM 起服务。vLLM 是当前本地部署 DeepSeek 类模型最常见的推理框架,自带连续批处理和 KV Cache 优化,单张 24GB 卡就能支撑几十路并发,政务窗口那点 QPS 完全够用。

python -m vllm.entrypoints.openai.api_server \ --model ./policy_qa_final \ --served-model-name policy-qa \ --gpu-memory-utilization 0.9 \ --max-model-len 2048 \ --tensor-parallel-size 1

gpu-memory-utilization 0.9的意思是 kv cache 可以占用剩余显存的九成,政务问答答案长度稳定,给足显存能显著提高并发上限。max-model-len要和训练时的 max_length 对齐,否则服务端会截掉后半段长文本答案。tensor-parallel-size 1单卡用,双卡改成 2 可吃下更大模型。

服务起来后用 openai 兼容接口调用:

curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "policy-qa", "messages": [{"role": "user", "content": "生育津贴怎么领"}], "temperature": 0.1, "top_p": 0.85, "max_tokens": 512 }'

推理参数在政务场景的推荐值很固定:

参数推荐值原因
temperature0.1~0.3政务答案要稳定,温度越高同一问题答案越飘
top_p0.85配合低温度做核采样,兼顾自然度和确定性
max_tokens512~1024答案要引用完整条款,给太少会被截断
repetition_penalty1.0~1.1政策文本里专有名词多,太高压制有效输出

政务系统如果部署在政务内网,整个链路都在本地,敏感数据不出环境,这也是本地化部署而非调用云端 API 的主要理由。如果你是要嵌入微信公众号或企业微信这类入口,vLLM 的 OpenAI 兼容接口可以直接复用现有 SDK,不需要额外改协议。

5. 低资源训练与政务问答常见坑:数据泄漏、幻觉与串台排查

模型能跑了之后,真正的排查战才开始。政务问答让我印象最深的五类问题,每一个都花过不止一个通宵定位。按“现象→原因→解决”的方式记在这里,基本都是血泪经验。

5.1 训练loss降了,推理时答非所问:提示词模板不一致

现象:训练时 loss 平滑下降,评测集分数也不错,一上线用户问“社保怎么转移”,模型回了一句“根据以上问题,分析如下”然后开始复述 prompt。

原因:这是政务项目里出现频率最高的低级错误——训练数据用的提示词模板和推理时不一致。基座模型的 chat 模板有严格的 system/user/assistant 结构,你在数据清洗阶段如果手工拼了字符串而不是走 tokenizer 的 chat template,训练完的模型只认训练时那套格式。

解决:把提示词模板提成一个常量,训练和推理强制共用。用tokenizer.apply_chat_template统一生成输入,训练脚本和启动脚本读取同一份配置。排查方法很简单:从训练集里抽一条样本,打印喂给模型的实际 token 序列;再从线上接口打印一条推理请求的输入序列,并排对比,差异一眼就暴露了。

提示:政务系统经常多人协作,一人负责清洗一人负责部署,模板不一致很容易在交接时埋下。建议在项目结构里单独建一个 prompt_template.py,谁也改不错。

5.2 模型一本正经地编造政策条款:幻觉根源与RAG兜底

现象:用户问“医保报销比例是多少”,模型答了一个具体百分比,还附了个文件号,而实际上根本没这条政策,或者百分比是去年的。

原因:DeepSeek 这类生成式模型的本质是“续写最像样的下文”,微调能教会它熟悉政策格式,但教不会它“不知道就说不知道”。政务数据量小,模型遇到没见过的问法,会自觉用见过的高频词去补齐细节,编得越顺溜越危险。

解决:三个手段一起上。第一,在 system prompt 里写明“只能根据以下政策原文回答,原文未提及的内容请明确拒绝”。第二,RAG 召回结果为空,或召回的相似度分数低于阈值时,直接让模型输出“未找到相关政策依据”,而不是凭训练记忆硬答。第三,在训练数据里专门加入几十条“无依据拒答”样本,让模型学会正确的拒绝方式。政务场景里,说“不知道”远比说“错的”安全。

5.3 显存没爆系统却OOM:max_length与attention的浪费

现象:训练时看显存占用只到 60%,跑着跑着突然 OutOfMemory,日志里一堆 memory allocation 报错。

原因:Transformer 的 attention 计算量随序列长度平方增长,显存占用也是。你感觉“显存够”,是因为监控面板看的是一整块 GPU 的占用,而单个 batch 里恰好出现了一批长样本,峰值瞬间顶到上限。政务语料里常有 1500 字的“政策解读”混在 300 字的问答对里,batch 内 padding 到最长样本,直接把你以为的余量吃光。

解决:训练前对所有样本做长度分布统计,超过 max_length 的直接截断或滤掉,不要让长尾样本参与训练。batch size 调到 1 到 2,配合梯度累积,比跑一半 OOM 再重启强得多。还有一个细节:per_device_eval_batch_size也要显式设置,很多人只设了训练 batch,eval batch 默认成了 8,一验证就炸。

5.4 新旧政策冲突时答错:时间戳与覆盖机制

现象:2024 年新规已经发布,问“医保个人账户使用范围”时模型背的还是 2022 年的旧条款,人工复核时直接判定不合格。

原因:政策库是个动态集合,旧文件没废弃,新文件没标注生效时间,RAG 召回时新旧文本同时进入上下文,模型不知道怎么取舍,大概率选它更“眼熟”的旧文本。

解决:这需要在数据入库存阶段就解决问题,而不是靠模型。每份政策文件的切块元信息里带上“生效日期、失效日期、是否有效”三个字段,检索时在召回阶段先按时间过滤一次;组装提示词时把召回文本的文件名和日期附上,模型看到“国办发〔2024〕XX号”比“国办发〔2021〕XX号”更晚,会把矛盾处自动导向新规。训练数据里也要做清理,如果问答对引用的条款已被新规替代,直接删掉旧问答对,别让过时知识留在记忆里。

5.5 多轮问答串台:历史对话管理缺失

现象:“刚才那个生育津贴还没说完,继续”——用户想延续刚才话题,结果模型把整段历史连上下文一起处理,生成了和上一轮无关甚至矛盾的回答。

原因:政务问答的产品设计往往默认用户会连续提问,但实际咨询里每个问题高度独立。“社保怎么转移”和“公积金提取材料”完全不是一回事,把多轮历史全塞进上下文,等于给模型喂了一堆无关噪声。

解决:第一版不做多轮对话,只做单轮问答。用户每次咨询都当作新问题,配合 RAG 重新召回,单轮的确定性和可维护性最高。如果产品上确实需要“继续问”的体验,用“摘要+最近一轮”替代“全文历史”,并且把对话摘要排除在检索范围之外。政务领域,少而准比多而杂强。

6. 政策问答上线前的评估闭环:用真实政务问题压测模型

最后一环通常被压缩成“上线前测一下”,但政务场景值得做成一个持续运行的小流程。我的做法是把评估拆成三条线:回归集、压测、新数据回流。

回归集是训练的“后悔药”。从热线平台导出最近一年的真实咨询工单,脱敏后按行政区划和事项类型抽 300 条,配上参考答案和依据文号。每轮微调或知识库更新后,全量跑一遍,对比准确率变化。政务政策一年要更新好几次,没有这个回归集,你根本不知道哪次语料调整把“公积金贷款额度”这题答坏了。

上线前压测按最坏情况算,不按平均算。并发还是其次,首要看首 token 延迟的 P95——用户问完话到看见第一个字的时间。政务问答里多数问题短,答案长,首 token 延迟比吞吐量更影响体验。vLLM 这类框架的快慢取决于显存里能不能塞下足够长的 KV cache,压测时记得把 max_tokens 按真实答案长度设置,而不是调一个标准值。

上线后最容易被团队忽略的是数据回流。用户反复追问“不是这个意思”“我问的是另一个城市”,这些都说明模型没理解真实意图。把这类不满意的对话每小时回流到待标注池,每两周人工过一次,能进入训练集和评测集。政务问答没有“做完”的一天,只有“持续变好”的惯性。

写一个我自己的教训:第一次上线时我们盯着自动指标和响应延迟,自认为稳了,结果用户问“灵活就业人员怎么参保”,模型答出了政策原文的部分内容,却漏掉了最重要的“需先办理就业登记”——因为训练数据里这条前置条件正好被截断了。从那以后,我的评测集里专门加了一类“政策流程限题”,考察模型答全链条步骤而不是单点知识。如果你想在政务问答上少踩坑,这条最值得带走。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询