最近我在内部做了一个不大、但上线后把整个内容团队都救了的组件——内容合规审查Skill。它被接进AI助手“龙虾”之后从原来只能查文本错别字、逻辑漏洞升级成能判断“这句话到底能不能对投资者说”的闸门。整个事情做下来我对“AI时代金融内容的合规防线”这句话有了完全不一样的理解。先说背景。我们平台每天会出现大量由AI生成的基金介绍、行情解读、投教科普、直播话术和用户问答回复量级早就超出了人工逐条审核的极限。传统做法是“内容团队抽检合规岗事后追责”但AI内容一旦直接进入对外渠道抽检永远堵不住口子。把合规审查能力直接做成一个Skill挂到“龙虾”上本质上是把“事后追责”改成“事中拦截”。这个方向我认为是未来金融科技平台必须走的一条路。这篇文章不聊虚的就把我从零搭建这套S审计能力的思路、技术选型、踩坑实录和上线后的数据变化全部摊开给正在做类似事情的团队一个可落地的参考。1. 项目背景与核心思路拆解1.1 人工审核为什么先失守了金融内容合规审查最核心的诉求从来不是“文笔好”而是“合法合规、不误导”。过去我们处理一篇基金推荐文章流程大概是这样运营写初稿、内容组长看一遍、合规岗再逐字过一遍确认没有收益率承诺、没有保本暗示、没有不规范排名最后才能发布。这套流程在图文时代勉强能用但到了AI生产内容的阶段就完全顶不住了。“龙虾”上线后一天能生成几百条甚至上千条定制化内容覆盖基金页点评、社区问答、投教短视频脚本。如果每一版都走人工审核内容团队扩招三倍都做不完。更麻烦的是人工审核在晚上和节假日是不接单的而用户提问、直播脚本生成是7x24小时的。你不可能让合规岗凌晨三点爬起来审一条AI生成的基金短评。我当时的判断是审查能力必须前置到AI生成链路里并且要做到“毫秒级响应”。人工审核可以保留但它应该做“争议内容复核”和“规则迭代”而不是像流水线工人一样每天通读几百条AI文案。1.2 “龙虾”的真实定位与合规压力“龙虾”是我们内部的一个AI助手项目覆盖文本生成、信息检索、数据问答和内容润色。和市面上通用大模型产品不同它面向的是金融业务场景输出的内容会直接或者间接影响用户决策。这就带来一个严重问题通用大模型倾向于“自信地胡说”它不会自动判断“业绩展示不满一年不能宣传”、“不能用‘稳赚’这种词”、“历史收益不代表未来表现”。很多团队给AI产品做合规靠的是“提示词约束”在System Prompt里写上一句“不要承诺收益不要使用绝对化用语”。我可以负责任地说这种方式在真实业务里效果极差。大模型的提示词遵循能力是概率性的同一个提示词今天能守住明天换个问法就漏了。而且提示词本身可以被使用者绕过甚至可以引导模型生成违规内容。所以必须有一个独立的、确定性更强的审查模块像一道闸门一样卡在AI内容和用户之间。之所以做成“Skill”是因为当时“龙虾”的架构本身就是插件化的。技能可以按需加载有的管数据查询有的管文本润色有的管知识库检索。把合规审查做成一个独立Skill好处是它不侵入“龙虾”的核心生成逻辑生成和审查解耦审查规则更新不需要重新训练生成模型只需要升级Skill本身的规则库和复核模型。这个解耦设计帮我们少走了很多弯路。1.3 为什么说“合规审查”是AI内容上线的底线金融领域的内容有一条隐形边界普通资讯和投资建议之间只隔着一层窗户纸。AI生成的“这只基金近期表现不错”和“这只基金值得买入”一个合规一个就可能踩线。关键在于“推荐”和“陈述”的区别人工审核能靠经验判断AI生成却不自知。如果这条边界被AI内容大量突破最直接的风险是用户被误导更深层的风险是平台会背上“未尽到审慎管理义务”的责任。监管在这块的态度一直很明确金融营销宣传必须真实、准确、适当不得误导投资者。AI生产内容让违规变得更容易、更隐蔽、更规模化如果不加拦截一旦出事就不是删一篇文章能解决的。所以内容合规审查Skill要解决的不是“文笔是否通顺”而是“这句话能不能在公开渠道对投资者说”。它更像是一个内容安全网关而不是一个质检工具。这个定位确定了后续所有的规则设计、模型选型、流程配置都有了明确方向。2. 合规审查Skill的产品设计与技术选型2.1 先分清哪些内容需要审四类高风险场景在动手写代码之前我们做了一次内容场景盘点。整个平台的AI生成内容如果按来源和对外可见度来分真正需要合规审查的并不是全部而是四类高风险场景。第一类是基金产品页和投教文章。这类内容直接影响用户投资决策最怕出现“历史业绩好就值得买”“成立以来年化达到XX%”这类表述业绩展示规则极其严格必须标注时间区间必须说明历史业绩不代表未来表现。第二类是社区和问答区里由AI生成的回复。用户问“这只基金能不能买”AI如果直接给建议就是典型的违规越界正确做法是给出客观信息提示用户自主决策。第三类是短视频、直播脚本。这类内容口语化的多容易在口头表达里夹带“稳了”“闭眼入”这种词审查难度比书面语大不少。第四类是营销短信和App推送文案属于强监管场景禁用词限制最严审核优先级最高。这四类内容我们分别定义了不同的审查规则包。比如产品页的规则偏向数据披露校验社区问答的规则偏向“建议性言论”判定短信推送则直接把禁用词命中设置为最高风险等级一票否决。做过内容合规的人都知道规则不能“一刀切”否则会大量误杀正常内容业务部门会直接炸掉。2.2 两段式判定架构为什么不用一个模型硬扛整个项目最关键的技术决策是摒弃了“用一个LLM判断是否违规”的单模型方案改为“规则引擎预筛LLM语义复核”的两段式架构。单模型方案听起来很美好直接把文本丢给大模型让模型判断有没有违规。但我们实测下来发现三个问题。第一可解释性差。模型说“违规”它为什么违规命中哪条规则对应哪段监管要求说不出依据后续举证和追责都困难。第二稳定性不够。大模型判断边界类内容是概率性的今天说违规明天同一句话可能就放行了这在合规场景里是不可接受的。第三成本高。所有文本都走大模型接口响应延迟和费用都扛不住。两段式架构的思路很简单先用规则引擎做第一道过滤用正则表达式、关键词词库、语义模板这些确定性手段把明显的违规内容直接拦截只有规则引擎判不了、判出来有争议的内容才交给第二段的LLM做深度语义复核。规则引擎的特点是快、稳、可解释LLM的特点是强、灵活、懂语境。把两者结合既能保证关键违规一定被抓住又能把LLM的处理量控制在一个合理范围。打个比方合规审查就像机场安检。第一道是金属探测门大部分违禁品直接报警又快又准过不了门的或者警报模糊的再让安检员开包检查。如果你把安检全换成机器人AI来判断理论上也行但速度和误判率都会出问题。2.3 合规词库与测试集决定整个系统效果的基础工程这个项目里最费时间、最容易被低估的是合规词库和测试集的构建。啥叫词库就是把业内常见的违规表述、禁用词、风险句式整理成结构化条目。我们一开始以为网上能直接买到或下载一份现成的金融禁用词表结果发现要么太宽泛要么不更新根本没法直接用。最后只能自己啃。词库构建分了三条线。第一条线是梳理监管罚单和通报案例把被处罚的违规表述逐条拆出来比如“预期年化收益率高达XX%”“最安全的投资方式”“稳赚不赔”这类经典描述。第二条线是人工审核记录复盘我们调了过去两年内容业务在审流程中拦截过的所有问题内容把高频违规话术抽出来。第三条线是“龙虾”生成内容的主动性测试让它故意生成带有擦边球性质的内容再把露出来的违规模式补进词库。测试集是另一块关键资产。我们建了正向测试集和反向测试集正向集是大量的合规内容用来检验审查系统会不会误杀反向集是违规样本用来检验系统能不能拦住。两套集合构建完之后每一次规则调整都要全量回归跑一遍防止新规则解决了旧问题又引入新误杀。我可以直接说这套测试集的价值不亚于审查系统本身它是后续所有优化工作的标尺。3. 实操过程与核心实现3.1 审查工作流的状态设计待审、拦截、放行、人工复核整条审查链路落地之后核心是一个四状态工作流。AI内容生成完成之后进入“待审”状态规则引擎开始第一轮扫描命中高风险级规则直接进入“拦截”状态内容不会对外发布同时回流给生成端重新改写如果只命中中风险规则或者规则引擎无法确定进入“人工复核”状态完全没命中任何规则直接“放行”。这里有一个设计细节很关键被拦截的内容不会简单丢弃而是带着“违规命中明细”重新返回给“龙虾”改写。命中明细里包含命中的规则编号、命中位置、违规类型和改写建议。比如“命中业绩展示违规建议删除收益承诺句式并增加历史业绩不代表未来表现提示”会作为改写指令注入生成端。这个闭环设计让“龙虾”在被拦截几次之后生成内容的初始合规率明显提升相当于用审查反哺生成。放行的内容也不是永久免检。我们还做了抽样回流机制被放行的内容按比例定期回到人工复核队列用来发现漏网的违规模式。这个机制花不了多少成本但对于保持规则时效性特别重要可以理解为“飞行检查”。3.2 关键实现细节与可复用参数规则引擎这块我直接贴一段当时核心逻辑的简化版本供参考。不需要完全照抄重点是理解命中逻辑和风险等级怎么联动。import re # 高风险规则直接拦截不进入复核 HIGH_RISK_PATTERNS [ r保本, r稳赚, r零风险, r不会亏, r无风险, r必涨, r稳了, r闭眼入, ] # 中风险规则命中后进入LLM复核 MEDIUM_RISK_PATTERNS [ r预期收益, r收益.{0,4}承诺, r最高攒钱, r推荐买入, r值得配置, r必选基金, ] def rule_engine(text): high_hits [] medium_hits [] for pattern in HIGH_RISK_PATTERNS: if re.search(pattern, text): high_hits.append(pattern) for pattern in MEDIUM_RISK_PATTERNS: if re.search(pattern, text): medium_hits.append(pattern) if high_hits: return {verdict: reject, risk_level: high, hits: high_hits} if medium_hits: return {verdict: manual, risk_level: medium, hits: medium_hits} return {verdict: pass, risk_level: low, hits: []}实际生产环境的规则引擎会比这段复杂很多但核心思路一致。正则规则之外我们还叠加了一层“否定前缀检查”和“上下文窗口限制”后面在误杀案例里会详细讲。风险等级阈值我们定过两版第一版追求高召回把所有命中中等风险的文本全部拉去人工复核结果人工复核队列暴涨三倍合规岗直接被淹没了。后来改成“高风险拦截中风险部分入复核队列低风险抽样复核”的分级策略人工复核压力才回到可接受范围。这个教训说明审查系统不是越严越好它要跟人工处理能力匹配否则会把真正的风险埋在一堆废线索里。3.3 与“龙虾”主链路的对接方式技术对接上我们没有修改“龙虾”的生成主逻辑。生成阶段完全不变生成结果出来之后通过一个中间件调用合规审查Skill的接口。审查通过内容继续往下游走审查不通过返回拦截结果给生成端改写。从接口调用到拿到审查结果整体时延压在200毫秒以内对用户体验基本无感。这么做的好处是合规审查和生成能力完全解耦。后续“龙虾”升级基座模型或者换一个新的生成框架审查部分完全不用动。反过来如果审查规则要更新也只需要升级Skill服务不碰生成逻辑。这个在微服务架构里看起来是常识但在AI应用落地时很容易被做成“面多了加水水多了加面”的耦合状态两个模块互相拖累最后哪个都改不动。对接时我们还加了一层“审计留痕”。每次审查请求都会记录下输入文本、命中规则、风险等级、审查结果、处理耗时、最终由谁改写或放行。这个留痕不仅是技术日志更是合规追溯的依据。如果某天一条已发布内容被质疑我们能精确还原它在发布前的审查路径随时进行回溯。3.4 实测数据与效果对比系统上线后的前两周我们做了详细的对比测试。同一批测试内容分别走纯人工审核、纯规则引擎、规则引擎LLM两段式审查得到的数据大概是这样审查方式单条耗时违规拦截率误杀率人工介入率纯人工审核5-10分钟85%1%以下100%纯规则引擎50毫秒72%8%0%规则LLM两段式180毫秒94%2.5%12%两段式的拦截率比纯规则引擎提升了22个百分点最核心的贡献来自LLM对语义的理解。比如“这只基金我已经持有了三年体验还不错”这句话本身没有任何禁用词但放在社区问答场景里由AI以一个普通用户的身份说出就容易给其他用户造成“我亲测有效”的暗示规则引擎发现不了但LLM能识别出这种变相推荐的语气。误杀率控制在2.5%左右人工介入率12%意味着每天真正需要人工看的AI内容数量大幅减少内容团队终于不用熬夜了。当然数据是测试集上的上线后前三天误杀率一度冲到6%后来靠加样本回归和规则微调慢慢压了回来。这就是测试集不够大的代价前两周一直在补课。4. 常见问题与排查技巧实录4.1 漏检与误杀最典型的矛盾怎么解决上线之后最大的矛盾不是拦不住违规而是误杀太多业务方受不了。比如我们词库里有一条“最高”的禁用规则本意是拦截“最高收益”“最高推荐”这类绝对化用语。结果有次“龙虾”生成了一篇基金分红公告解读里面正常写了“这是本基金历史上第九次分红”完全没问题但“分”和“红”之间没有触发规则小小的字面没问题。真正出问题的是另一句写“该基金2022年以来最高连续分红纪录”一个真实的数据描述直接被拦了。因为规则引擎只看字面不看语境。解决办法是给中风险规则加“否定前缀检查”和“语境豁免机制”。具体来说如果一个中风险规则命中但命中位置附近出现了“历史”“统计”“区间”“仅供参考”这些限定词就把风险等级降一档从“人工复核”降到“放行抽样”。这个豁免机制上线后误杀率直接砍了一半。另一个漏检点也很有意思。我们的规则引擎一直在追字面词但实际违规话术经常做变形处理比如“绝壁不会亏”“稳得一批”“下了重仓不会凉”这些网络化表达词库里根本没有。后来专门为“龙虾”生成的社区回复做了一个“网络热词变体映射表”把常见的谐音、缩写、方言变体统一映射到基础禁用词再进规则引擎判断。这一步补了不少漏检。4.2 模型幻觉与边界判断复核阶段的新风险两段式架构里的LLM复核帮我们解决了大量语义判断问题但它自己也引入了新风险最典型的两个。第一个是幻觉问题。LLM复核时偶尔会“凭空创造”违规理由。比如某条内容明明只是“基金净值更新了”LLM却输出“该内容存在承诺收益风险”。我们排查后发现这不是模型逻辑问题而是复核Prompt里给了太多“宁可错杀不可放过”的倾向性模型就开始把模棱两可的内容全往违规方向推。后来把复核Prompt改成“仅当有明确证据支持时才能判定违规”并限定必须输出命中理由对应的具体规则编号幻觉情况才明显减少。第二个是边界判断问题。金融内容里“陈述收益”和“承诺收益”之间的边界很多资深审核员都要想一下更别说LLM。比如“该基金过去一年上涨15%”是客观陈述“该基金一年内可上涨15%”就是变相承诺就差一个字性质完全不同。我们针对这类句式专门做了一批标注样本反复调优复核模型的判断阈值。最终发现与其让LLM直接判断“违规”不如让它判断“是否包含对未来收益的明确指向”再把这个判断结果交给规则层做最终裁定。把大模型的“直觉判断”转成“特征识别”准确率反而更高。4.3 性能与成本别让审查变成内容生产的瓶颈规则引擎预筛阶段把大概六成的内容直接放行真正进LLM复核的只有四成。这四成的单条处理时延被控制在800毫秒以内整体来说可以接受。但如果未来内容量再涨十倍成本还是扛不住。我的建议是建设中长期缓存机制。同一个用户画像、同一只基金、同一类问题AI生成的内容往往模板相似只要合规审查过一次就可以把结果缓存下来后续遇到匹配度高的问题直接复用审查结果。这个机制可以把LLM复核成本再降四到五成。另外一个策略是错峰批处理非实时场景比如短视频脚本、长文初稿可以把复核任务放到夜间批处理队列白天只需要保证实时问答内容走全量审查。上线后我最大的体会是合规审查不是一次性工程而是一个需要持续运营的基础设施。规则词库要按周更新测试集要按月补样本LLM复核的Prompt要按季度复盘优化。没有这个常态运营机制再强的技术架构也会在三个月后变成摆设。现在回顾整个项目内容合规审查Skill真正解决了三个层面的问题把AI生成内容的风险从不可控变成可控把合规团队从海量人工审核中解放出来也把“龙虾”这个AI助手从“能说”进化成“懂得什么不能说”。这背后最重要的一点是合规不能靠AI的自觉必须靠工程化的审查链路来兜底。再聪明的模型都需要一道独立的闸门。