Files

437 lines
15 KiB
Markdown
Raw Permalink Normal View History

# 风控模块需求说明书
## 文档信息
| 项目 | 内容 |
|---|---|
| 文档版本 | v1.0 |
| 编制日期 | 2026-09-14 |
| 适用对象 | 主项目架构、前端、后端、测试、运维和风控业务人员 |
| 实现基线 | 当前 `RM2_develop` 风控模块代码 |
| 文档定位 | 主项目合并和联调时的风控模块统一需求口径 |
## 1. 背景与目标
本模块面向公募基金模拟交易场景,基于客户、产品、交易、资金、持仓、登录、工单等数据执行确定性风险扫描,生成风险预警,并提供证据查询、人工处置、通知、日报和只读 Agent 研判能力。
模块目标:
- 对异常交易和适当性风险形成可解释、可追溯的结构化预警。
- 支持风控人员确认、调查、关闭误报、完成结案和升级处理。
- 提供客户、产品、交易、资金、持仓、登录、预警和通知八类证据。
- 对高风险预警提供站内通知和邮件通知。
- 提供九段式风险日报和日报邮件。
- 提供“奶龙风控智能助手”只读查询和研判草案能力。
- 所有关键动作写入审计,支持按预警和客户追溯。
## 2. 范围
### 2.1 本期范围
- 风险概览。
- 预警队列、筛选、排序、分页和详情。
- 手动规则扫描。
- 定时规则扫描。
- 适当性错配、异常交易和频率筛查规则。
- 预警确认、调查、误报关闭、完成结案、升级和证据归档。
- 客户行为分更新。
- 八类证据只读查询。
- 通知记录查询。
- 高风险预警邮件通知。
- 九段式日报、流式生成和日报邮件发送。
- 奶龙风控智能助手只读工具调用。
- 风控操作审计。
### 2.2 不在本期范围
- 用户登录、JWT 签发和通用 RBAC 底座。
- 客户账户开户、充值、提现和真实资金操作。
- 修改交易、资金、持仓和产品事实。
- 自动确认、自动关闭或自动升级预警。
- 演示数据由演示机按 `26-演示机数据插入规则.md` 准备,风控模块不负责初始化。
- 正式前端页面由主项目统一前端实现,风控模块只提供接口和合并约束。
- 高风险预警邮件多收件人扩展。
- 将定时扫描自动注册到主项目统一 Worker。
## 3. 用户、角色与权限
### 3.1 角色
| 角色 | 使用范围 |
|---|---|
| 风控专员 `risk_operator` | 查询风控数据、执行规则扫描、人工处置和日报操作 |
| 管理员 `admin` | 具备风控业务权限,并负责配置和运维 |
### 3.2 权限
| 权限码 | 用途 |
|---|---|
| `risk:alert:read` | 风险概览、预警、证据、通知、日报和 Agent 只读查询 |
| `risk:alert:write` | 确认、调查、误报关闭、完成结案、升级和证据归档 |
| `risk:alert:scan` | 手动规则扫描 |
| `risk:report:mail` | 发送日报邮件 |
| `agent:run` | 运行奶龙风控智能助手 |
### 3.3 数据范围
- 风控查询必须执行服务端客户数据范围过滤。
- `data_scope=all` 可访问全部客户;受控范围只能访问归属客户。
- 没有有效客户归属时必须失败关闭,不能默认放开。
- 列表、详情、证据、通知、日报和 Agent 工具使用同一数据范围。
## 4. 预警状态与人工处置
### 4.1 状态
| 状态 | 含义 | 是否未闭环 |
|---|---|---|
| 待处理 | 预警已生成,尚未确认接收 | 是 |
| 调查中 | 已确认接收并进入人工调查 | 是 |
| 已排除 | 人工认定为误报并关闭 | 否 |
| 已结案 | 人工调查完成并形成处置结论 | 否 |
“升级处理”通过 `is_escalated`、`escalated_at` 和 `escalation_reason` 标记,不改变上述状态。
### 4.2 状态流转
```text
待处理
-> 确认接收
-> 进入调查
-> 关闭误报
待处理
-> 确认接收
-> 进入调查
-> 完成结案
待处理或调查中
-> 升级处理
-> 保持原未闭环状态
```
### 4.3 处置规则
| 操作 | 前置条件 | 结果 |
|---|---|---|
| 确认接收 | 状态为待处理且尚未确认 | 写确认状态、确认时间和处理人 |
| 进入调查 | 已确认且状态为待处理 | 状态改为调查中 |
| 关闭误报 | 已确认且未闭环 | 状态改为已排除,记录误报理由和关闭时间 |
| 完成结案 | 已确认且状态为调查中 | 状态改为已结案,写处置结论并更新行为分 |
| 升级处理 | 已确认、未闭环且尚未升级 | 写明升级理由,不改变闭环状态 |
| 上传证据 | 已确认且状态为调查中 | 每笔预警最多归档一个文件,归档后不可覆盖 |
### 4.4 行为分
- 初始行为分为 20 分。
- 完成结案时按预警等级扣分:
- 低风险扣 3 分。
- 中风险扣 5 分。
- 高风险扣 20 分。
- 最低扣至 0 分。
- 关闭误报和未闭环预警不扣分。
- 行为分变化必须写入审计。
行为分关注等级:
| 等级 | 分数范围 | 筛选值 |
|---|---|---|
| 正常 | 16-20 | `normal` |
| 轻微关注 | 11-15 | `slight` |
| 需要关注 | 6-10 | `attention` |
| 高度关注 | 1-5 | `high` |
| 立即关注 | 0 | `immediate` |
## 5. 风控规则
### 5.1 通用扫描规则
- 扫描只读取交易、资金、持仓、客户、产品、工单和登录数据。
- 同一交易和同一规则组合不能重复生成预警。
- 同一交易命中多个规则时合并为一条预警,保留最高风险等级并汇总规则和证据。
- 扫描结果写入 `fin_risk_alert` 和审计。
- 手动扫描和定时扫描共用同一扫描服务。
### 5.2 RW-003 大额快进快出
| 项目 | 要求 |
|---|---|
| 触发对象 | 赎回交易 |
| 条件 | 3 天内存在成功入金,且赎回比例不低于 80% |
| 金额要求 | 赎回金额不低于 500000 元 |
| 风险等级 | 高 |
| 核心证据 | 入金流水、赎回交易、金额、时间、赎回比例 |
### 5.3 RW-007 适当性错配
| 项目 | 要求 |
|---|---|
| 触发对象 | 申购交易 |
| 条件 | 产品风险等级高于客户风险承受等级 |
| 风险留痕 | 缺少风险揭示、二次确认或双录任一项即认为留痕不完整 |
| 豁免额度 | C3 买 R4 的单只持仓占比超过 20%,或 C4 买 R5 超过 10% |
| 风险等级 | 等级差不少于 2 时为高;等级差为 1 时为中 |
| 核心证据 | 客户等级、产品等级、等级差、留痕、豁免比例和工单 |
### 5.4 RW-012 老年客户异常赎回
| 项目 | 要求 |
|---|---|
| 触发对象 | 赎回交易 |
| 年龄要求 | 不低于 65 岁 |
| 金额要求 | 赎回金额不低于 300000 元 |
| 均值要求 | 赎回金额不低于近一年历史平均金额的 3 倍 |
| 设备要求 | 交易前最近一次成功登录使用非常用设备 |
| 风险等级 | 高 |
| 核心证据 | 年龄、金额、历史均值、倍数、登录时间和设备 |
### 5.5 RW-015 夜间小额交易
| 项目 | 要求 |
|---|---|
| 触发时间 | 北京时间 00:00-05:59 |
| 金额要求 | 不超过 10000 元 |
| 风险等级 | 低 |
| 定位 | 夜间小额行为筛查,不直接认定异常 |
### 5.6 RW-018 自动定投频繁交易筛查
| 项目 | 要求 |
|---|---|
| 触发对象 | 存在工单关联的交易 |
| 条件 | 工单渠道为“定投”或“自动定投” |
| 风险等级 | 低 |
| 定位 | 识别可能由有效定投产生的误报候选 |
## 6. 功能需求
### FR-01 风险概览
- 展示当前未闭环预警总数,不是当天新增数量。
- 展示高风险、中风险和低风险数量。
- 展示待处理数量和已超时数量。
- 返回最多 3 条重点高风险预警。
### FR-02 预警队列
- 默认只查询未闭环预警。
- 支持按关键词、客户编号、产品、风险等级、规则和创建时间筛选。
- 按高风险、中风险、低风险排序,同等级按创建时间倒序。
- 预警队列每页固定最多 10 条。
### FR-03 预警详情
- 返回预警编号、客户编号、脱敏姓名、产品、规则、等级、状态和证据摘要。
- 返回客户、交易、产品、工单、资金流水、持仓、登录记录和证据快照。
- 资金流水、持仓和登录记录各有详情上限,超过时通过 `evidence_truncated` 标识。
### FR-04 手动规则扫描
- 需要 `risk:alert:scan` 权限。
- 需要 `Idempotency-Key`。
- 与定时扫描互斥,不能同时执行。
- 返回新增预警数、高风险数、通知记录数和通知创建失败原因。
### FR-05 定时规则扫描
- 默认关闭。
- 开启后按配置间隔扫描。
- 多个进程同时运行时通过分布式锁避免并发重复扫描。
- 当前使用独立进程 `python -m app.worker.risk_scan_scheduler`。
- 正式接入主项目时,应注册到统一 Worker 或由部署编排统一启动。
### FR-06 人工处置
- 支持确认接收、进入调查、关闭误报、完成结案和升级处理。
- 所有写操作需要 `risk:alert:write`。
- 写操作需要幂等键,重复请求回放首次响应。
- 状态不允许跳步,重复操作返回冲突错误。
### FR-07 行为分
- 结案时更新客户行为分。
- 行为分与预警状态更新在同一事务内提交。
- 审计记录应包含变更前分数、扣分和变更后分数。
### FR-08 证据归档
- 支持 JPG、JPEG、PNG、WEBP、PDF、DOC、DOCX、XLS、XLSX、PPT、PPTX 和 TXT。
- 单个文件默认最大 10 MB。
- 文件保存到 `RISK_EVIDENCE_DIR`。
- 文件重命名为预警编号并增加原扩展名。
- 一笔预警只能归档一个文件,成功或重复归档均需有明确结果。
- 归档状态写入预警证据快照。
### FR-09 通知与预警邮件
- 高风险预警同时创建站内通知和邮件通知。
- 手动扫描和定时扫描均自动触发高风险预警邮件。
- 邮件发送成功写 `已发送`,失败写 `发送失败` 和失败原因。
- 邮件发送失败不回滚预警和站内通知。
- 当前高风险预警邮件只支持一个收件人。
- 日报邮件支持最多 10 个收件人,与预警邮件配置独立。
### FR-10 风险日报
日报按北京时间和固定九段式模板生成:
1. 当日预警数量。
2. 等级分布。
3. 重点风险事件。
4. 未闭环事项,包含全部历史未闭环预警。
5. 误报统计。
6. 类型分布。
7. 处置结果。
8. 规则效果。
9. 建议优化方向。
- 日报统计数据来自数据库,模型只生成建议。
- 模型不可用、返回空内容或输出不合规时使用规则化建议。
- 日报生成写入审计。
### FR-11 日报流式生成与邮件
- 流式接口使用 SSE。
- 事件类型包括 `start`、`progress`、`replace` 和 `done`。
- 日报邮件需要 `risk:report:mail` 权限。
- 日报邮件支持多个收件人和 dry-run。
### FR-12 奶龙风控智能助手
- 使用主项目 `agent_type=risk`。
- 只允许查询风险概览、预警列表和指定预警证据。
- 支持生成研判草案、沟通话术和工单摘要。
- 同一 `session_id` 内使用最近 10 轮会话历史,支持连续追问。
- 通用风险问答和预警上下文分别维护会话。
- 刷新页面后当前不承诺跨刷新恢复。
- Agent 不能确认、调查、关闭、升级预警,不能修改客户和交易事实。
- 客户姓名和敏感信息必须脱敏。
### FR-13 审计
以下动作必须写审计:
- 规则扫描生成预警。
- 定时扫描成功或失败。
- 确认、调查、误报关闭、完成结案和升级。
- 证据归档。
- 日报生成。
- 权限拒绝和安全操作。
## 7. 数据读写边界
### 7.1 主要写入表
| 表 | 用途 |
|---|---|
| `fin_risk_alert` | 预警、状态、人工处置和证据快照 |
| `fin_risk_notification` | 站内通知和邮件通知状态 |
| `biz_work_order` | 风险处置和关联工单兼容 |
| `interaction_audit` | 风控操作审计 |
### 7.2 只读数据源
| 数据 | 表 |
|---|---|
| 客户 | `sys_user`、`fin_customer_profile`、`fin_risk_assessment` |
| 产品 | `fin_product` |
| 交易 | `fin_transaction` |
| 资金 | `fin_capital_flow` |
| 持仓 | `fin_holding` |
| 登录 | `sys_login_record` |
| 工单 | `biz_work_order` |
风控模块不得修改交易、资金、持仓和产品事实。
## 8. 非功能要求
### 8.1 安全
- 所有接口必须经过主项目鉴权。
- 所有业务查询必须执行数据范围校验。
- Agent 工具必须执行工具白名单和权限校验。
- 日志、错误和响应不得泄露密码、密钥和完整敏感信息。
### 8.2 幂等
- 扫描、确认、调查、关闭、结案、升级等写接口必须携带 `Idempotency-Key`。
- 幂等键长度为 16-128 位 ASCII。
- 同一键重复提交返回首次结果。
- 同一键对应不同请求返回 `409 IDEMPOTENCY_CONFLICT`。
### 8.3 分页
- 预警列表和其他列表每页最多 10 条。
- 使用游标分页,游标绑定用户、筛选条件和数据范围。
- 不允许只把页码或 offset 暴露给客户端。
### 8.4 时区
- 数据库保存 UTC naive 时间。
- 对外时间统一转换为 ISO 8601。
- 日内判断、日报日期和夜间规则统一按 `Asia/Shanghai`。
### 8.5 降级
- 模型不可用时使用规则化建议。
- 邮件失败只影响通知状态。
- Redis 等外部依赖失败不得破坏核心预警查询和处置链路。
## 9. 配置要求
### 9.1 扫描
- `RISK_SCAN_SCHEDULE_ENABLED`
- `RISK_SCAN_INTERVAL_MINUTES`
- `RISK_SCAN_RUN_IMMEDIATELY`
- `RISK_SCAN_RETRY_LIMIT`
- `RISK_SCAN_POLL_SECONDS`
`RISK_SCAN_RUN_IMMEDIATELY` 当前仅保留兼容,不控制首次执行。
### 9.2 高风险预警邮件
- `RISK_ALERT_MAIL_ENABLED`
- `RISK_ALERT_MAIL_DRY_RUN`
- `RISK_ALERT_MAIL_RECIPIENTS`
当前只支持一个收件人。
### 9.3 SMTP
- `RISK_SMTP_HOST`
- `RISK_SMTP_PORT`
- `RISK_SMTP_USERNAME`
- `RISK_SMTP_PASSWORD`
- `RISK_SMTP_SENDER`
- `RISK_SMTP_USE_SSL`
- `RISK_SMTP_TIMEOUT_SECONDS`
### 9.4 证据
- `RISK_EVIDENCE_DIR`
- `RISK_EVIDENCE_MAX_FILE_SIZE_MB`
## 10. 验收标准
- 未闭环预警、等级分布、待处理和超时统计正确。
- 预警队列按风险等级排序,每页最多 10 条。
- 五类规则按条件正确触发,不重复生成同一交易同规则预警。
- 多规则命中同一交易时正确合并。
- 人工处置状态机不允许非法跳转。
- 结案后行为分正确扣减。
- 八类证据可按数据范围查询。
- 证据归档格式、大小和重复归档规则正确。
- 高风险预警邮件状态能体现真实发送结果。
- 日报九段式内容完整,历史未闭环预警不被分页截断。
- Agent 只读边界和脱敏规则有效。
- 关键操作均可在审计中追溯。
## 11. 当前限制与后续事项
- 高风险预警邮件当前只支持一个收件人。
- 定时扫描当前仍需独立进程,主项目需提供统一 Worker 注册或部署编排。
- 本期不支持对话历史长期归档和 Redis-only 会话方案。
- 正式前端已接入主项目,后续变更继续遵循 `17-风控模块-前端合并提示词与验收约束.md`。
- 主项目合并前需要按 `21-主项目合并后后端必改清单.md` 完成接入。