项目概述
本项目实现内容审核服务:先跑廉价规则再做评分,产出“放行 / 复核 / 拦截”及理由,把边界内容送入人工队列,并记录每次决策以支持申诉。审核的错误代价是不对称的,因此系统让每个决策都可解释。
架构与关键决策
内容依次经过规则阶段与评分阶段各产生一个信号,由决策装配器合成动作与理由。每条决策连同命中规则或分数、模型版本一并存储,使申诉是针对证据的复核而非第二次主观判断。复核队列是一张带状态的普通表,可认领、可决策、可限时;阈值来自配置并随决策保存版本,从而可解释历史判定。
实施与测试
用明显良性、明显恶意与边界三类内容断言放行、拦截与复核三种动作;对一次拦截发起申诉并断言决策被重新打开且原理由仍在;修改配置中的阈值后断言同一输入的动作随之改变。
限制与后续
- 示例提供规则与评分接口,但未内置训练好的模型。
- 阈值为全局,尚未按类别或语言细分。
- 复核流程无升级与 SLA 计时,且不从不通过的申诉中自动学习。
代码示例
pnpm init
pnpm add pg express
pnpm add -D typescript tsx vitest
moderation-service/
├── src/pipeline.ts
├── src/rules.ts
├── src/scoring.ts
├── src/review-queue.ts
├── tests/moderation.test.ts
└── package.json
const hit = rules.find((r) => r.test(content));
const action = score > blockAt ? 'block' : score > reviewAt ? 'review' : 'allow';
await db.insertDecision({ itemId, action, reason, score });
await db.enqueue({ itemId, priority, status: 'pending' });
await db.reopen(decisionId, appealReason);
pnpm vitest run