Skip to content

项目四速成:AI 政务助手

深挖版见 04-项目-AI政务助手。本文目标:60 分钟读懂 + 20 分钟画熟 + 20 分钟背数字。 这个项目必提前背好的一段话:「企业应用开发工程师的岗位上怎么做起 AI 项目」——深挖版第七节第 1 条给了骨架,团队人数、投入比例你要填实。

记忆锚点:确定性归代码。 有唯一答案的判断(有效期、权限、字段、格式)绝不交给模型;模型只做语言活(意图、改写、解读、生成)。「能写成单元测试的逻辑就不交给模型。」

一、项目名片(30 秒能背)

  • 业务:区政务和数据管理部门的本地化 AI 服务平台,试点三类应用:办事指南问答、政策解读、公文辅助。政策有版本、有效力范围、有失效日期——答一条过期政策比答不出来严重;全程内网不能出网。
  • 我的位置:LangGraph 状态图、入库流水线、检索层、规则层、引用与拒答、前端页面归我;vLLM 部署与 GPU 是运维+客户方 IT(我提参数需求并联调);语料与标准答案是政务业务方(我设计评测集结构与打分规则)。
  • :Python / FastAPI / LangGraph / DeepSeek-R1 / vLLM / PostgreSQL(pgvector) / Elasticsearch / Redis / SSE / Docker。
  • 一句话价值内网可交付的 RAG——政策有版本有效力,答案必须指到具体条款,规则归代码、模型只做语言。

二、架构与一次政策问答的旅程(必须画得出)

一次政策问答(背):入口路由判定意图和权限(权限下推为检索过滤条件)→ 进对应子图 → 按查询类型选策略(文号类走原始 Query+过滤,口语类走 Multi-Query 改写)→ BM25+向量双路并发召回 → RRF 融合 → Reranker 精排 → 有效期/权限由代码硬过滤 → R1 生成并只许引用给定条款 → 引用校验 → 返回「文件+条款+位置」三元组;引用不足或低置信拒答转人工。热点问题直接命中 Redis 缓存(key 带版本号)。

三、技术方案五大块

3.1 LangGraph:主图 + 三个子图

  • 为什么拆三个子图:三类任务形态完全不同——办事指南是「事项字段查询」(材料/时限/窗口,字段化强)、政策解读是「条款检索+归纳」(必须带文号条款)、公文辅助是「格式约束下的生成」(几乎不检索但要过格式检查)。合并会让条件边爆炸、Prompt 互相污染。
  • 主图 State 刻意做薄:只有意图、用户权限上下文、当前子任务、最终结果与引用。权限放主图是因为它必须在检索之前生效、并作为过滤条件下推给 ES 和 pgvector;放子图就有某个子图漏加过滤的风险。
  • 条件边承担四件事:路由、澄清(按事项必填条件表判断缺哪个,一次问全不挤牙膏)、重试(召回为空换检索策略,有次数上限)、人工兜底。
  • 公文辅助为什么也成子图:它的价值在生成后的格式校验与模板约束——「生成→校验→不合规回修→上限后交人工」这条带回边的链路用图表达最自然。
  • 不做子图自由 handoff:政务要能解释「这个回答是走哪条链路产生的」,路由集中在入口。
  • State 里放引用 ID、条款位置、得分和摘要,不放全文(防 Checkpoint 膨胀)。

3.2 入库流水线:结构切分 + 元数据(政务项目的核心资产)

  • 难点在结构:政策有「章-条-款-项」层级,办事指南有强字段(材料/时限/窗口/依据),公文有模板。固定长度切窗口会把条款切两半、把材料清单表格切碎——检索出来的证据没法直接支撑回答。
  • 切分按结构走:政策以条款为最小单元,长条款再细分并保留父级标题链;办事指南按字段块切(一个字段块=一个可回答单元);表格单独抽取保留结构,不拉平成文本、不参与常规长度切分。
  • 元数据不是附属信息(必背这句):文号、发布部门、发布/生效/失效日期、效力范围、版本号、条款位置——检索靠它过滤、回答靠它组装引用、政策更新靠它判断谁失效。抽不到元数据的文档不许进检索(留空=绕过过滤)。
  • 增量重建:新版本入库 → 切换可见标记 → 旧版本置失效(不物理删,政务要留痕可查历史);重复上传按内容哈希去重。检索默认只查有效版本,明确要求查历史才放开。
  • 为什么答旧版的坑防得住:版本+失效日期是检索的硬过滤条件,不依赖模型判断新旧;缓存 key 带版本号,更新整批失效。
  • 入库走异步队列:状态可查、失败可重试、失败原因分类,失败文件不进可见集合(防半成品污染召回)。

3.3 双路召回 + RRF + Rerank(必被问「为什么双路」)

  • 为什么必须双路(举具体例子):政务查询一半是口语(「社保能不能异地办」——BM25 抓不住),一半是精确串(「浙政办发〔某〕XX 号」——向量在语义空间没有区分度,会给一堆「像政策文件」但文号不对的)。两类失败模式互补。
  • 为什么 RRF 不加权求和:BM25 分数和余弦相似度不同量纲不同分布,加权权重没有稳定含义、换批数据就失效;RRF 只用排名,鲁棒。代价是丢掉分数绝对信息——所以拒答阈值改用精排分数。
  • Reranker 是质量关键一跳:召回放宽取多(保召回),精排只留少量进上下文(保精度+token 预算);精排分数兼任拒答阈值依据。两路并发发起再融合,否则延迟叠加。
  • 查询策略动态选:明确文号/事项名 → 原始 Query + 条款/有效期过滤;口语模糊 → Multi-Query 改写(不是无条件开——成倍增加开销和噪声,改写结果同样过融合精排);追问类带会话已确认条件重写。
  • 权限过滤必须下推进查询条件,不能召回后再筛——否则 top-k 被无权文档占满,等于变相削减召回。
  • 怎么证明双路更好:同一评测集跑四组——单路向量、单路 BM25、融合、融合+精排,看 Recall@K 和最终准确率差值。这是调参依据(能说出这四组,比报数值更有说服力)。

3.4 规则与模型解耦(本项目最重要的一条设计)

  • 代码负责(背清单):事项字段校验、政策有效期过滤、公文格式检查(标题层级/编号/成文日期/附件落款/禁用词表)、权限控制。
  • LLM 只负责(背清单):意图识别、查询改写、政策解读、文本生成。
  • 为什么:政策是否有效是日期比较——零成本、零错误率,交给模型等于把确定性问题变成概率问题;解耦的直接好处是可测:规则层写单元测试,模型层用评测集打分,出问题立刻分清是谁的错。
  • 规则和模型冲突听规则的:模型说政策适用但代码判定已失效,按失效处理。
  • 拒答条件是规则不是模型自觉:引用为空 / 精排最高分低于阈值 / 答案句子无法被引用覆盖 / 意图低置信且澄清后仍不明确——命中任一条走拒答+人工兜底,并给原文片段和人工入口。
  • 政务取向(要说出来):「我不确定,这是原文,请你核对」是完全可接受的输出;硬答一条过期政策才是事故。
  • 引用是结构化三元组「文件+条款+位置」;答案每个事实句要能对上引用,对不上就删或整体拒答。

3.5 vLLM 内网部署与韧性

  • 为什么内网:政务数据不出网是硬约束不是偏好——选型空间被显存和内网可获得的权重限死。
  • 为什么 vLLM 不用 Ollama:vLLM 有连续批处理 + PagedAttention(并发请求共享显存提吞吐)+ 原生 OpenAI-compatible 接口;Ollama 定位单机便捷推理,多用户服务化吞吐差距明显。一句话版 KV cache:自回归生成要缓存每层 KV,显存占用随「并发数 × 上下文长度」线性增长,所以 max_model_len / max_num_seqs / gpu_memory_utilization 是一组要一起定的参数——讲关系不编数值(硬件是运维定的,我提需求)。
  • 为什么 R1 推理模型做 RAG(必被问):政策解读和公文起草受益于推理与长文组织,且当时内网可获得的权重里它效果最好;但代价明确——输出慢、思维链耗 token、格式遵循弱。对策:结构化任务(意图枚举、字段抽取)不交给它自由输出,用受限枚举+容错解析(提取最后一个合法 JSON 块)+ 后处理兜底;如果重来会大小模型分工——小模型做路由和结构化,R1 只做解读和生成。
  • 思维链不给用户看:政务用户看到模型「纠结」会降低信任、还可能把中间猜测当结论;只推阶段事件,思维链入日志排查。
  • Redis 两个用途分清:会话状态(带 TTL)+ 热点结果缓存(key = 归一化问题 + 权限维度 + 知识库版本号——不带权限会跨权限泄露,不带版本会缓存出过期答案)。
  • 韧性四件套:模型超时、节点级重试(只对可重试错误)、最大循环次数、结构化降级——降级不是报错而是有序退化:精排不可用退到融合结果、生成不可用退到直接返回原文条款、模型完全不可用退到检索结果列表+人工入口。
  • 延迟四招:SSE 阶段事件先给反馈(检索完成先推命中文件条款)、限制最大输出长度、热点走缓存、字段型办事指南问题绕过大模型直接模板化回答。

四、简历 bullet 对照表

简历 bullet两个技术锚点20 秒展开方向
主图+三子图状态图主图 State 薄 / 权限放主图下推条件边做路由澄清重试兜底;子图各自维护证据,不互相污染
入库流水线结构切分保留层级 / 元数据是过滤条件和引用依据版面解析、条款级切分、表格单独抽;增量重建「写新→切可见→置旧失效」
双路+RRF+Rerank两类失败模式互补 / RRF 用排名不用分数文号类靠 BM25、口语类靠向量;按查询类型动态选策略;返回文件+条款+位置
规则与模型解耦确定性归代码清单 / 拒答条件是规则可测试性是直接收益;规则冲突听规则;「能写单元测试的不交给模型」
vLLM 内网 + 韧性 + SSEvLLM 服务化能力 / 缓存 key 带版本号讲参数关系不编数值;结构化降级四级退;思维链只入日志

五、数字解释卡(4 个)

简历上的数口径被问「怎么来的」第一句话
180 条评测集三类场景分层之和;含应拒答用例;正确答案由政务业务方确认,我定结构和打分规则「按三类场景分层出的题,专门放了一层应该拒答的用例;标准答案是业务方确认的,判定规则是我定的」
办事指南回答准确率 91%分母 = 办事指南类问题数;分子 = 关键字段(材料/时限/窗口/依据)逐项全对的问题数;漏一项材料即错,表述差异不算错「按关键字段逐项比对,漏一项材料就算错——这个口径比较严;判定是脚本比对标准答案加主观项抽样人工复核」
政策引用完整率 93%分母 = 需要引用政策的回答数;分子 = 引用到文件+条款齐全且都在有效期内的回答数;引用了已废止政策算不完整「93% 要求引用能落到条款且在有效期内——引了废止政策判不完整;这是引用校验脚本输出的,不是人工感觉」
处理时间 小时级 → 分钟级常规政策解读与公文初稿:原来人工翻文件+拟稿的时间 vs 系统端到端时间;量级对比不是精确计时,基线是业务方反馈「这是量级口径:原来一份解读人工要翻几份文件对条款,几十分钟到小时级;现在系统出带引用的初稿是分钟级,人只做核对」

数字互查关系:91% 会被追问「判定细则」——材料漏一项算不算错(算);93% 会被追问「废止政策算不算」——算不完整(这两个追问答案就是亮点,主动讲)。

说不准时的兜底句:「具体参数和数值是运维侧定的/要回去核记录,但这几组参数之间为什么是联动关系,我可以完整讲。」

六、高频追问 6 题(每题 3-4 句接住)

  1. 企业应用开发岗位上怎么做起 AI 项目的?(必背骨架)—— 公司承接区里政务信息化项目,AI 平台是试点方向,团队从现有交付团队抽人、没有单独 AI 岗编制,岗位名称没变。我最初进项目做前端交付(问答界面、流式渲染,本来就是我的职责),后来项目缺后端和 RAG 的人,我从 2024.11 起承接入库流水线、检索链路和状态图。岗位没变、做的事变了——这也是后来专门跳到 AI 应用开发岗的原因。
  2. 政策更新后怎么保证不答旧的? —— 三层:版本+失效日期是检索硬过滤(不靠模型判断);重建按「写新→切可见→置旧失效」避免双有效窗口;缓存 key 带知识库版本号更新整批失效。知识更新要端到端验证:「新的搜得到」和「旧的搜不到」都要验。
  3. 为什么双路召回,一组对比数据有吗? —— 文号类和口语类失败模式互补(举两个例子);同一评测集跑单路/融合/融合+精排四组看差值;能说出该比哪几组比背一个数值重要。
  4. 为什么用推理模型做 RAG?慢怎么办? —— 政策解读和公文起草受益,且当时内网可得权重里效果最好;结构化环节不依赖它自由输出(受限枚举+容错解析);延迟靠先推证据事件、限输出长度、热点缓存、字段型问题绕过大模型;重来会大小模型分工。
  5. vLLM 硬件参数答不上怎么办? —— 坦白部署是运维负责,但讲清关系:显存=权重+KV cache,KV 随并发×上下文长度增长,三个参数联动定;量化省显存影响精度;Ollama 是场景不同不是优劣。讲关系比记数字更证明真做过。
  6. 评测集只有 180 条够吗? —— 试点阶段规模,作用是「防退步」不是「证明高水平」;结构上分层、含应拒答用例、答案业务方确认;改进方向是线上真实问题和被拒答样本持续回灌。别临时编更大的数。

故障故事一句话版(换成你真实的):⚠️ 推荐背「政策更新仍答旧版」:新版指南上线仍返回旧材料清单 → 查轨迹日志分辨三处(旧 chunk 没置失效 / 检索没带版本过滤 / 缓存存了旧答案)→ 版本硬过滤 + 重建顺序 + 缓存带版本 → 沉淀「知识更新必须端到端验证,旧搜不到比新搜得到更重要」。

七、速记卡(面试前 10 分钟)

  • 锚点:确定性归代码。代码清单:字段校验/有效期/格式/权限;模型清单:意图/改写/解读/生成。
  • 两条硬约束:不出网、不能答错(答错 > 答不出)。
  • 主图薄 State 四字段:意图、权限、子任务、结果;权限在检索前生效并下推。
  • 元数据六个字段:文号、部门、发布/生效/失效日期、效力范围、版本、条款位置;抽不到不进检索。
  • 双路一句话:文号靠 BM25、口语靠向量,RRF 只用排名,Reranker 分数兼拒答阈值。
  • 重建顺序:写新 → 切可见 → 置旧失效;缓存 key 带版本号。
  • vLLM 三个联动参数:max_model_len / max_num_seqs / gpu_memory_utilization;KV cache 随并发×上下文涨。
  • 韧性四件套:超时、重试、最大循环、结构化降级(精排→融合→原文→人工)。
  • 岗位问题骨架:无编制 → 前端切入 → 缺人承接后端 RAG → 所以跳槽 AI 岗。
  • 数字:180 条(三层+拒答用例)/ 91%(关键字段全对,漏项即错)/ 93%(含有效期内要求)/ 小时→分钟(量级口径)。