skip to content
tlj 的工程笔记
← 项目

政务工单智能处理流水线

面试作品

把一批杂乱的工单文本,自动拆分事项、抽取要素、四级分类、识别群诉。重点是把通用性做进架构,而不是堆三条冗余流水线。

时间
2026-05
角色
独立完成(架构 / 算法 / 评估)
成果
可插拔 Strategy 架构 + 群诉双路召回 + 跨厂商交叉验证,300 条全量真实跑通

一份大模型算法岗的笔试题:给一批政务工单文本,做事项拆分、四要素抽取、四级分类,还要识别”群诉”(同一问题被很多人反复投诉)。题目反复强调一个词——通用性。我理解这道题考的不是你能不能把活干完,而是你怎么把”通用”做进架构里。

把”多解”做成架构,而不是堆工作量

题目里有一问要求”做成多解题”。直觉做法是跑三条冗余流水线,但那是堆工作量,不是通用性。

我的解法是:每个子任务设计成可插拔的 Strategy,规则、向量、LLM 三类方法各自实现一个接口,思路文档里逐个对比权衡、说明默认选哪个、为什么。代码里至少给一个子任务(群诉)保留两套可切换实现。这样”多解”体现在架构抽象加文档对比上,而不是把同一件事做三遍——这本身就是题目要的通用性。

整条流水线是:

加载(列名自适应) → 预处理(剥样板) → 事项拆分(三档策略对比选默认)
→ 四要素抽取 → 四级分类(国标锚定+数据涌现的冻结树)
→ 群诉识别(点位分块 ∪ faiss向量召回, 双路保recall, LLM裁决)
→ 跨厂商交叉验证 → 导出

群诉识别:双路保召回

群诉的难点在召回。脱敏把工单里的”区名、门牌号”抹掉了,如果纯按点位 key 分块,会漏掉”地标也被替换”的同点位工单(比如同一个地方被写成两种说法)。所以我没有只靠分块,而是双路:

分块负责”稳准”,向量负责”不漏”,各补对方的短板。

可插拔的 embedding,和一次设计验证

向量召回需要 embedding,但环境不一定有现成的端点。所以我把 embedding 源做成可插拔:默认走真 embedding API,TF-IDF 加 faiss kNN 作为纯离线兜底

这个设计很快就被现实验证了价值:主力模型 DeepSeek 没有 embedding 端点,群诉向量召回就只能先走 TF-IDF 兜底——正好说明了”为什么要做可插拔”。后来拿到智谱的 key,有 embedding-3(2048 维)真向量模型,一行配置就切过去了,召回质量直接上一档。把外部依赖做成可插拔,不是为了好看,是因为你事先不知道环境里到底有什么。

跨厂商交叉验证

分类和裁决这种主观判断,单模型容易自说自话。我用两个不同厂商的模型互相印证:主力用 DeepSeek V4 pro,第二判官用智谱 GLM-4.6,报两者的一致率。跨厂商比同厂商不同档位(比如 pro vs flash)更有说服力——真正独立的两个判断一致,才说明结果稳。

规模化:算法岗的硬加分

题目强调通用,那就得考虑规模。10 万条工单时:群诉的成对裁决是 O(n²) 会爆,分类树归纳喂全量摘要会超 context。我把规模化设计写进了文档:向量召回把群诉复杂度从 O(n²) 降到 O(n·k)、分块归纳、增量处理。并用 300×3 的小压测验证流水线在全量上能跑通。对算法岗来说,“能跑通”之外还能讲清楚”上规模怎么办”,是实打实的加分项。

小结

这道题我最在意的是没有被”多解题”带偏去堆工作量,而是把通用性落在 Strategy 抽象、可插拔依赖、规模化设计这些架构决策上。算法岗看的不只是你会调哪个模型,而是你怎么把一个具体任务抽象成一个能扩展的系统。