Initial commit: InternalAuditInterprise
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# ADR-0001 · 技术选型决策记录
|
||||
|
||||
> 项目:AIAudit(本地私有化大模型电信运营商 AI 全域内审平台)
|
||||
> 状态:已接受(MVP 基线)
|
||||
> 日期:2026-06
|
||||
> 关联:`0-req-AIAudit.md`、`1-prd-AIAudit.md`、`2-task-AIAudit.md`(任务 P0.1)
|
||||
|
||||
## 背景
|
||||
平台需在本地内网部署、数据零出域,具备本体/知识图谱、双时态/时序、本地 LLM 推理、向量检索等能力,并需信创适配。技术选型需在"能力完整"与"组件最少、出域面最小、便于信创"之间取得平衡。
|
||||
|
||||
## 决策
|
||||
|
||||
| 层 | 选型 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 后端 | Python 3.12 + FastAPI | 贴近 LLM/数据/ML 生态,异步任务友好 |
|
||||
| 前端 | React + TypeScript + Vite | 看板/下钻交互成熟 |
|
||||
| 主存储 | PostgreSQL 16 | 一库多能,降低组件数与出域面 |
|
||||
| 知识图谱 | PostgreSQL + Apache AGE | 免独立图库,信创友好,满足 MVP 多跳穿透 |
|
||||
| 双时态/时序 | PostgreSQL 时态列 + TimescaleDB | 双时态回放 + 时间序列一体 |
|
||||
| 向量检索 | pgvector | 与主库同栈,免独立向量库 |
|
||||
| 任务调度 | Celery + Redis | 全量扫描异步任务、进度反馈 |
|
||||
| 文件/对象 | MinIO(本地 S3) | 凭证/底稿存储,不出域 |
|
||||
| LLM 推理 | Provider 抽象:开发期 DashScope 公网千问;生产 vLLM + 本地 70B | 见下"LLM 抽象与红线" |
|
||||
| 部署 | 本地 Homebrew 安装(开发)→ 生产内网裸机/信创环境 | 不使用 Docker;开发直接用本机 PostgreSQL 16 + 本地服务 |
|
||||
|
||||
## LLM 抽象与数据零出域红线(关键约束)
|
||||
- LLM 通过统一 `LLMProvider` 接口接入,至少实现两种:`DashScopeProvider`(公网千问,**仅开发/测试**)、`VllmProvider`(本地,生产)。
|
||||
- **红线:公网 Provider 只允许处理脱敏/样例假数据,严禁传入任何真实审计数据。** 通过配置开关 + 环境标识(dev/prod)强约束;prod 环境禁用任何公网 Provider。
|
||||
- 切换 Provider 仅改配置,不改业务代码。
|
||||
|
||||
## 本机环境结论(开发机)
|
||||
- Mac mini · Apple M4 · 16GB · macOS 26.5.1(ARM64);磁盘可用 ~170GB。
|
||||
- 开发 MVP 够用(样例数据 + 公网千问 API + Docker 组件)。
|
||||
- **不能本地运行 70B**;生产推理需独立 GPU 服务器(A100/H100/国产 GPU)跑 vLLM。
|
||||
|
||||
## 备选与未选原因
|
||||
- 独立 Neo4j 图库:能力更强但增加组件与信创/授权负担,MVP 暂不引入;图谱压力增大时再评估。
|
||||
- 独立时序库 / 独立向量库:同理,先用 PG 一体化,后续按压力拆分。
|
||||
- 后端 Java Spring Boot:企业集成习惯好,但 LLM/数据/ML 生态以 Python 为主,会多一层;若团队为 Java 班底可改为"Java 主服务 + Python 分析/推理服务"。
|
||||
|
||||
## 影响
|
||||
- 开发环境:本机 Homebrew 安装 PostgreSQL 16 + TimescaleDB + pgvector,不使用 Docker(已移除 docker-compose 与自定义镜像);初始化脚本见 `infra/postgres/setup_local.sh`。
|
||||
- 生产部署需规划独立 GPU 推理节点(任务 P3.5 信创适配同步评估)。
|
||||
@@ -0,0 +1,33 @@
|
||||
# ADR-0002 · 数据中台建模决策(本体 / 双时态 / 时序 / 图谱)
|
||||
|
||||
> 项目:AIAudit 状态:已接受(MVP) 日期:2026-06
|
||||
> 关联:`0-req-AIAudit.md`(R2、R3)、任务 P1.2 / P1.3
|
||||
|
||||
## 背景
|
||||
审计数据中台需同时满足:①按审计本体组织实体与关系(知识图谱穿透);②双时态建模(业务时间+系统时间,可回放历史);③时间序列(时序造假识别)。需在能力与可靠性/组件数之间平衡。
|
||||
|
||||
## 决策
|
||||
|
||||
### 1. 本体与知识图谱:关系表 + 递归 CTE(MVP)
|
||||
- 用 `entity`(实体)+ `entity_relationship`(关系边)两张通用表承载审计本体,实体类型与关系类型由 `ontology_entity_type` / `ontology_relationship_type` 字典定义。
|
||||
- 多跳穿透(如实控人识别)用 PostgreSQL **递归 CTE** 实现。
|
||||
- 不在 MVP 引入 Apache AGE,规避源码编译的构建脆弱性;后续多跳压力增大再评估迁移到 AGE/Neo4j。
|
||||
|
||||
### 2. 双时态建模
|
||||
- 关键审计对象采用双时态:
|
||||
- 业务有效期:`valid_from` / `valid_to`(应用时间)。
|
||||
- 系统记录期:`system_from` / `system_to`(事务时间)。
|
||||
- 用 `tstzrange` + `btree_gist` 排他约束防止同一实体业务有效期重叠。
|
||||
- "按任意历史时点回放"= 给定 `(as_of_valid, as_of_system)` 过滤两条时间线。
|
||||
|
||||
### 3. 时间序列
|
||||
- 行为/指标类数据(用户生命周期事件、回款、话务、佣金、资源使用)写入 `metric_event` 等表。
|
||||
- 生产环境(Linux)用 TimescaleDB `create_hypertable` 转为超表,按时间分区/压缩。
|
||||
- **本地开发(macOS)**:因 TimescaleDB 在 macOS 上 Homebrew 编译不稳定,本地跳过该扩展,`metric_event` 作为普通索引表使用;超表转换在迁移中条件执行(扩展存在才转),**不影响功能**,仅少了规模优化。
|
||||
|
||||
### 4. 数据版本与可追溯
|
||||
- 每批数据落地登记 `data_version`(来源、批次、时间、行数),业务记录引用 `data_version_id`,使任一结论可回溯到当时数据版本(R3)。
|
||||
|
||||
## 影响
|
||||
- MVP 仅依赖 TimescaleDB + pgvector + btree_gist,镜像可靠(`timescaledb-ha:pg16` 内置)。
|
||||
- 图能力以关系建模实现,接口层(统一穿透查询服务)对上层屏蔽底层是关系还是图库,便于将来替换。
|
||||
@@ -0,0 +1,779 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""精美版:本地LLM审计方案 PPTX,带流程图/热力矩阵/架构分层/卡片排版。"""
|
||||
from pptx import Presentation
|
||||
from pptx.util import Inches, Pt, Emu
|
||||
from pptx.dml.color import RGBColor
|
||||
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
|
||||
from pptx.enum.shapes import MSO_SHAPE
|
||||
from pptx.oxml.ns import qn
|
||||
import copy
|
||||
|
||||
# ---------- 主题色 ----------
|
||||
BG = RGBColor(0x0A, 0x16, 0x2E) # 主深蓝背景
|
||||
BG2 = RGBColor(0x0E, 0x20, 0x42) # 次背景
|
||||
CARD = RGBColor(0x14, 0x2B, 0x52) # 卡片
|
||||
CARD2 = RGBColor(0x1B, 0x37, 0x66) # 卡片亮
|
||||
CYAN = RGBColor(0x2D, 0xE0, 0xD0) # 主青
|
||||
CYAN_D = RGBColor(0x16, 0x9B, 0x97)
|
||||
BLUE = RGBColor(0x3B, 0x82, 0xF6) # 蓝
|
||||
PURPLE = RGBColor(0x8B, 0x7CF if False else 0x7C, 0xF6)
|
||||
GOLD = RGBColor(0xF5, 0xB7, 0x42) # 金
|
||||
RED = RGBColor(0xEF, 0x5A, 0x5A) # 红(高风险)
|
||||
ORANGE = RGBColor(0xF2, 0x8B, 0x3C)
|
||||
GREEN = RGBColor(0x35, 0xC7, 0x59)
|
||||
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
|
||||
LIGHT = RGBColor(0xCB, 0xD8, 0xEC) # 正文浅
|
||||
MUTE = RGBColor(0x8A, 0x9C, 0xB8) # 弱化
|
||||
|
||||
FONT = "PingFang SC"
|
||||
FONT_B = "PingFang SC"
|
||||
|
||||
SW, SH = Inches(13.333), Inches(7.5)
|
||||
prs = Presentation()
|
||||
prs.slide_width, prs.slide_height = SW, SH
|
||||
BLANK = prs.slide_layouts[6]
|
||||
|
||||
|
||||
# ---------- 底层工具 ----------
|
||||
def _set_grad(shape, c1, c2, angle=90):
|
||||
"""给 shape 设置线性渐变填充。"""
|
||||
sp = shape.fill._xPr # spPr
|
||||
# 移除已有填充
|
||||
for tag in ('a:noFill','a:solidFill','a:gradFill','a:blipFill','a:pattFill','a:grpFill'):
|
||||
for e in sp.findall(qn(tag)):
|
||||
sp.remove(e)
|
||||
grad = sp.makeelement(qn('a:gradFill'), {})
|
||||
lst = grad.makeelement(qn('a:gsLst'), {})
|
||||
for pos, col in ((0, c1), (100000, c2)):
|
||||
gs = grad.makeelement(qn('a:gs'), {'pos': str(pos if pos else int(pos*1000))})
|
||||
if pos == 0: gs.set('pos','0')
|
||||
else: gs.set('pos','100000')
|
||||
clr = gs.makeelement(qn('a:srgbClr'), {'val': '%02X%02X%02X' % (col[0],col[1],col[2])})
|
||||
gs.append(clr); lst.append(gs)
|
||||
grad.append(lst)
|
||||
lin = grad.makeelement(qn('a:lin'), {'ang': str(int(angle*60000)), 'scaled':'1'})
|
||||
grad.append(lin)
|
||||
# 插入到 ln 之前
|
||||
ln = sp.find(qn('a:ln'))
|
||||
if ln is not None: sp.insert(list(sp).index(ln), grad)
|
||||
else: sp.append(grad)
|
||||
|
||||
|
||||
def bg_gradient(slide, c1=BG, c2=BG2):
|
||||
r = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, 0, 0, SW, SH)
|
||||
r.line.fill.background(); r.shadow.inherit = False
|
||||
r.fill.solid(); r.fill.fore_color.rgb = c1
|
||||
_set_grad(r, c1, c2, angle=120)
|
||||
return r
|
||||
|
||||
|
||||
def rrect(slide, x, y, w, h, color=None, grad=None, line=None, lw=1, radius=0.08):
|
||||
sp = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE, x, y, w, h)
|
||||
sp.shadow.inherit = False
|
||||
try:
|
||||
sp.adjustments[0] = radius
|
||||
except Exception:
|
||||
pass
|
||||
if grad:
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = grad[0]
|
||||
_set_grad(sp, grad[0], grad[1], angle=90)
|
||||
elif color is not None:
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = color
|
||||
else:
|
||||
sp.fill.background()
|
||||
if line is not None:
|
||||
sp.line.color.rgb = line; sp.line.width = Pt(lw)
|
||||
else:
|
||||
sp.line.fill.background()
|
||||
return sp
|
||||
|
||||
|
||||
def rect(slide, x, y, w, h, color=None, grad=None, line=None, lw=1):
|
||||
sp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, x, y, w, h)
|
||||
sp.shadow.inherit = False
|
||||
if grad:
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = grad[0]; _set_grad(sp, grad[0], grad[1])
|
||||
elif color is not None:
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = color
|
||||
else:
|
||||
sp.fill.background()
|
||||
if line is not None:
|
||||
sp.line.color.rgb = line; sp.line.width = Pt(lw)
|
||||
else:
|
||||
sp.line.fill.background()
|
||||
return sp
|
||||
|
||||
|
||||
def circle(slide, x, y, d, color=None, grad=None, line=None, lw=1.5):
|
||||
sp = slide.shapes.add_shape(MSO_SHAPE.OVAL, x, y, d, d)
|
||||
sp.shadow.inherit = False
|
||||
if grad:
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = grad[0]; _set_grad(sp, grad[0], grad[1])
|
||||
elif color is not None:
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = color
|
||||
else:
|
||||
sp.fill.background()
|
||||
if line is not None:
|
||||
sp.line.color.rgb = line; sp.line.width = Pt(lw)
|
||||
else:
|
||||
sp.line.fill.background()
|
||||
return sp
|
||||
|
||||
|
||||
def chevron(slide, x, y, w, h, color):
|
||||
sp = slide.shapes.add_shape(MSO_SHAPE.CHEVRON, x, y, w, h)
|
||||
sp.shadow.inherit = False
|
||||
sp.fill.solid(); sp.fill.fore_color.rgb = color
|
||||
sp.line.fill.background()
|
||||
return sp
|
||||
|
||||
|
||||
def shape_text(shape, runs, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, wrap=True):
|
||||
tf = shape.text_frame; tf.word_wrap = wrap; tf.vertical_anchor = anchor
|
||||
tf.margin_left = Pt(4); tf.margin_right = Pt(4)
|
||||
tf.margin_top = Pt(2); tf.margin_bottom = Pt(2)
|
||||
for i, para in enumerate(runs):
|
||||
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
|
||||
p.alignment = align; p.space_after = Pt(2); p.space_before = Pt(0)
|
||||
for (t, sz, c, b) in para:
|
||||
r = p.add_run(); r.text = t
|
||||
r.font.size = Pt(sz); r.font.color.rgb = c; r.font.bold = b; r.font.name = FONT
|
||||
|
||||
|
||||
def txt(slide, x, y, w, h, runs, align=PP_ALIGN.LEFT, anchor=MSO_ANCHOR.TOP,
|
||||
wrap=True, sa=6, line_spacing=None):
|
||||
tb = slide.shapes.add_textbox(x, y, w, h); tf = tb.text_frame
|
||||
tf.word_wrap = wrap; tf.vertical_anchor = anchor
|
||||
for i, para in enumerate(runs):
|
||||
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
|
||||
p.alignment = align; p.space_after = Pt(sa); p.space_before = Pt(0)
|
||||
if line_spacing: p.line_spacing = line_spacing
|
||||
for (t, sz, c, b) in para:
|
||||
r = p.add_run(); r.text = t
|
||||
r.font.size = Pt(sz); r.font.color.rgb = c; r.font.bold = b; r.font.name = FONT
|
||||
return tb
|
||||
|
||||
|
||||
def header(slide, kicker, title):
|
||||
rect(slide, Inches(0.7), Inches(0.62), Inches(0.14), Inches(0.62), grad=(CYAN, BLUE))
|
||||
txt(slide, Inches(0.98), Inches(0.5), Inches(11.5), Inches(0.4),
|
||||
[[(kicker, 13, CYAN, True)]], sa=0)
|
||||
txt(slide, Inches(0.95), Inches(0.82), Inches(11.6), Inches(0.7),
|
||||
[[(title, 29, WHITE, True)]], sa=0)
|
||||
|
||||
|
||||
def footer(slide, page):
|
||||
rect(slide, 0, Inches(7.18), SW, Inches(0.32), color=BG2)
|
||||
txt(slide, Inches(0.7), Inches(7.16), Inches(6), Inches(0.32),
|
||||
[[("数据不出域 · 审计全穿透", 9.5, MUTE, False)]], anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(slide, Inches(11.6), Inches(7.16), Inches(1.0), Inches(0.32),
|
||||
[[(f"{page:02d} / 23", 10, CYAN, True)]], align=PP_ALIGN.RIGHT,
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
|
||||
|
||||
def new(kicker=None, title=None, page=None):
|
||||
s = prs.slides.add_slide(BLANK)
|
||||
bg_gradient(s)
|
||||
# 右上角装饰圆
|
||||
circle(s, Inches(11.6), Inches(-1.0), Inches(3.2), color=BG2)
|
||||
circle(s, Inches(12.4), Inches(-0.4), Inches(1.6), color=CARD)
|
||||
if kicker is not None:
|
||||
header(s, kicker, title)
|
||||
if page is not None:
|
||||
footer(s, page)
|
||||
return s
|
||||
|
||||
|
||||
# ============== 1 封面 ==============
|
||||
def cover():
|
||||
s = prs.slides.add_slide(BLANK)
|
||||
bg_gradient(s, RGBColor(0x07,0x10,0x24), RGBColor(0x10,0x29,0x52))
|
||||
# 几何装饰
|
||||
circle(s, Inches(9.8), Inches(-1.6), Inches(5.2), color=RGBColor(0x10,0x24,0x48))
|
||||
circle(s, Inches(11.2), Inches(0.2), Inches(2.8), grad=(CYAN_D, BG))
|
||||
for i, d in enumerate([Inches(0.16)]*3):
|
||||
circle(s, Inches(10.2+ i*0.5), Inches(4.6 + i*0.35), d, color=CYAN)
|
||||
rect(s, 0, 0, Inches(0.22), SH, grad=(CYAN, BLUE))
|
||||
txt(s, Inches(0.9), Inches(1.7), Inches(3), Inches(0.5),
|
||||
[[("AI · 全域内审", 15, CYAN, True)]], sa=0)
|
||||
rect(s, Inches(0.95), Inches(2.2), Inches(2.4), Pt(4), color=CYAN)
|
||||
txt(s, Inches(0.88), Inches(2.45), Inches(10.5), Inches(1.7),
|
||||
[[("数据不出域", 56, WHITE, True)], [("审计全穿透", 56, CYAN, True)]], sa=4)
|
||||
txt(s, Inches(0.95), Inches(4.95), Inches(10.5), Inches(1.2),
|
||||
[[("基于本地私有化大模型的电信运营商 AI 全域内审体系", 20, WHITE, True)],
|
||||
[("不是一套工具,而是一套建在自己机房里、越用越聪明的审计能力体系", 14.5, LIGHT, False)]], sa=8)
|
||||
rect(s, Inches(0.95), Inches(6.35), Inches(0.5), Pt(3), color=CYAN)
|
||||
txt(s, Inches(0.95), Inches(6.5), Inches(6), Inches(0.4),
|
||||
[[("2026 年 6 月", 13, MUTE, False)]], sa=0)
|
||||
cover()
|
||||
|
||||
|
||||
# ============== 2 痛点:三个数字 + 三类困局 ==============
|
||||
def pain():
|
||||
s = new("现状 · 困局", "为什么传统审计“查不过来”?", 2)
|
||||
# 三个大数字卡片
|
||||
stats = [("150亿", "年业务规模", BLUE), ("5000万", "潜在异常金额", GOLD), ("5%", "传统抽样覆盖率", RED)]
|
||||
x = Inches(0.95); w = Inches(3.62); gap = Inches(0.27)
|
||||
for i,(num, lab, col) in enumerate(stats):
|
||||
cx = x + i*(w+gap)
|
||||
c = rrect(s, cx, Inches(1.75), w, Inches(1.55), color=CARD, radius=0.1)
|
||||
rect(s, cx, Inches(1.75), Inches(0.1), Inches(1.55), color=col)
|
||||
txt(s, cx+Inches(0.25), Inches(1.92), w-Inches(0.3), Inches(0.85),
|
||||
[[(num, 38, col, True)]], sa=0)
|
||||
txt(s, cx+Inches(0.27), Inches(2.75), w-Inches(0.3), Inches(0.4),
|
||||
[[(lab, 14, LIGHT, False)]], sa=0)
|
||||
# 三类困局
|
||||
cases = [
|
||||
("拆单规避", "8 个客户各签 600 万 ICT 项目全拆成 80 万以下,三重一大抽样完美避开。"),
|
||||
("稳定的定,稳定的退", "每月新增 6000 人订彩铃,3 个月后首月用户全退订,渠道已领佣金、骗补后弃养。"),
|
||||
("Excel 干不过来", "海量单据只能抽样,查不全查不深,5000 万异常如针落大海。"),
|
||||
]
|
||||
y = Inches(3.55)
|
||||
for i,(t, d) in enumerate(cases):
|
||||
cy = y + i*Inches(0.78)
|
||||
rrect(s, Inches(0.95), cy, Inches(11.55), Inches(0.66), color=CARD if i%2 else CARD2, radius=0.12)
|
||||
circle(s, Inches(1.12), cy+Inches(0.13), Inches(0.4), grad=(CYAN, BLUE))
|
||||
txt(s, Inches(1.12), cy+Inches(0.13), Inches(0.4), Inches(0.4),
|
||||
[[(str(i+1), 16, WHITE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(1.7), cy, Inches(2.4), Inches(0.66),
|
||||
[[(t, 14.5, CYAN, True)]], anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(4.0), cy, Inches(8.3), Inches(0.66),
|
||||
[[(d, 12.5, LIGHT, False)]], anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(0.95), Inches(6.05), Inches(11.55), Inches(0.5),
|
||||
[[("核心矛盾:", 13, GOLD, True),
|
||||
("数据涉政企合同/用户隐私/财务凭证,上公有云=裸奔;不上 AI 又干不过来。", 13, WHITE, False)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
pain()
|
||||
|
||||
|
||||
# ============== 通用表格 ==============
|
||||
def style_table(table, headers, rows, col_widths, total_w, top, left=Inches(0.95),
|
||||
hrow=Inches(0.52), rrow=Inches(0.62), fs=12, hfs=13):
|
||||
n = len(rows)+1
|
||||
for i,w in enumerate(col_widths):
|
||||
table.columns[i].width = Inches(w)
|
||||
table.rows[0].height = hrow
|
||||
for i in range(1, n): table.rows[i].height = rrow
|
||||
# remove default style banding via first row formatting
|
||||
for j,h in enumerate(headers):
|
||||
c = table.cell(0,j); c.fill.solid(); c.fill.fore_color.rgb = CYAN_D
|
||||
c.vertical_anchor = MSO_ANCHOR.MIDDLE
|
||||
p = c.text_frame.paragraphs[0]; p.alignment = PP_ALIGN.CENTER
|
||||
c.text_frame.word_wrap = True
|
||||
r = p.add_run(); r.text = h; r.font.size = Pt(hfs); r.font.bold = True
|
||||
r.font.color.rgb = WHITE; r.font.name = FONT
|
||||
for i,row in enumerate(rows, start=1):
|
||||
for j,val in enumerate(row):
|
||||
c = table.cell(i,j); c.fill.solid()
|
||||
c.fill.fore_color.rgb = CARD if i%2 else CARD2
|
||||
c.vertical_anchor = MSO_ANCHOR.MIDDLE
|
||||
c.text_frame.word_wrap = True
|
||||
p = c.text_frame.paragraphs[0]
|
||||
p.alignment = PP_ALIGN.CENTER if j==0 else PP_ALIGN.LEFT
|
||||
r = p.add_run(); r.text = val; r.font.size = Pt(fs)
|
||||
r.font.bold = (j==0)
|
||||
r.font.color.rgb = CYAN if j==0 else LIGHT
|
||||
r.font.name = FONT
|
||||
|
||||
|
||||
def table_slide(page, kicker, title, headers, rows, note=None, col_widths=None,
|
||||
fs=12, hfs=13):
|
||||
s = new(kicker, title, page)
|
||||
total = sum(col_widths)
|
||||
top = Inches(1.85)
|
||||
shp = s.shapes.add_table(len(rows)+1, len(headers), Inches(0.95), top,
|
||||
Inches(total), Inches(0.5)+Inches(0.6)*len(rows))
|
||||
# 去掉自带样式
|
||||
tbl = shp.table
|
||||
style_table(tbl, headers, rows, col_widths, total, top, fs=fs, hfs=hfs)
|
||||
if note:
|
||||
ny = top + Inches(0.5)+Inches(0.62)*len(rows) + Inches(0.3)
|
||||
rrect(s, Inches(0.95), ny, Inches(11.55), Inches(0.7), color=CARD2, radius=0.18)
|
||||
rect(s, Inches(0.95), ny, Inches(0.1), Inches(0.7), color=GOLD)
|
||||
txt(s, Inches(1.25), ny, Inches(11.1), Inches(0.7),
|
||||
[[("▶ ", 13, GOLD, True), (note, 13, WHITE, True)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
return s
|
||||
|
||||
|
||||
# ============== 3 三方对比 ==============
|
||||
table_slide(3, "破局 · 定位", "本地 LLM 让“安全”和“智能”不再二选一",
|
||||
["对比维度", "传统抽样审计", "公有云 AI 审计", "本地 LLM 审计(我们)"],
|
||||
[
|
||||
["数据范围", "按金额抽样,查不全", "全量扫描,但数据出域", "全量扫描,数据不出机房"],
|
||||
["规则能力", "规则写死,反向规避", "模型强,但合规风险高", "模型私有化,合规可控"],
|
||||
["响应效率", "Excel 翻表,效率低", "实时预警,依赖外网", "内网闭环,秒级响应"],
|
||||
["交互模式", "人找数据", "数据找人,但数据送人", "数据找人,数据原地不动"],
|
||||
["能力归属", "经验在人脑,人走经验走", "能力在外部,租用即失", "能力沉淀本地,越用越聪明"],
|
||||
],
|
||||
note="把千问 70B / DeepSeek 装进本地机房,让 AI 在数据旁边干活,而不是把数据送给 AI。",
|
||||
col_widths=[2.0, 3.1, 3.2, 3.25])
|
||||
|
||||
|
||||
# ============== 4 审计域全景 + 风险热力矩阵 ==============
|
||||
def domain_heat():
|
||||
s = new("方法论 · 框架", "审计域全景图 + 风险分级模型", 4)
|
||||
# 左:五大风险域
|
||||
domains = [
|
||||
("收入域", "政企穿透·跨期匹配·云空转", CYAN),
|
||||
("成本域", "渠道佣金·终端补贴·摊销", BLUE),
|
||||
("采购域", "网络建设·工程·围标串标", PURPLE),
|
||||
("资金域", "回款挂账·网间结算·流向", GOLD),
|
||||
("合规域", "员工舞弊·权限·积分套现", GREEN),
|
||||
]
|
||||
txt(s, Inches(0.95), Inches(1.75), Inches(6), Inches(0.4),
|
||||
[[("五大风险域 · 全覆盖", 15, WHITE, True)]], sa=0)
|
||||
y = Inches(2.25)
|
||||
for i,(t,d,col) in enumerate(domains):
|
||||
cy = y + i*Inches(0.82)
|
||||
rrect(s, Inches(0.95), cy, Inches(6.0), Inches(0.68), color=CARD, radius=0.14)
|
||||
rect(s, Inches(0.95), cy, Inches(0.12), Inches(0.68), color=col)
|
||||
circle(s, Inches(1.2), cy+Inches(0.14), Inches(0.4), color=col)
|
||||
txt(s, Inches(1.55), cy, Inches(1.5), Inches(0.68),
|
||||
[[(t, 15, WHITE, True)]], anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(3.0), cy, Inches(3.85), Inches(0.68),
|
||||
[[(d, 11.5, LIGHT, False)]], anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
# 右:风险热力矩阵 3x3
|
||||
txt(s, Inches(7.4), Inches(1.75), Inches(5), Inches(0.4),
|
||||
[[("风险热力矩阵 · 有优先级", 15, WHITE, True)]], sa=0)
|
||||
gx, gy = Inches(8.35), Inches(2.35)
|
||||
cell = Inches(1.25)
|
||||
# 颜色矩阵 [行=金额影响 高->低][列=概率 低->高]
|
||||
heat = [
|
||||
[ORANGE, RED, RED],
|
||||
[GOLD, ORANGE, RED],
|
||||
[GREEN, GOLD, ORANGE],
|
||||
]
|
||||
labels = [
|
||||
["", "", "优先\n全量监控"],
|
||||
["重点\n定向穿透", "", ""],
|
||||
["", "", "批量\n聚类筛查"],
|
||||
]
|
||||
for r_ in range(3):
|
||||
for c_ in range(3):
|
||||
cx = gx + c_*cell; cyy = gy + r_*cell
|
||||
rrect(s, cx, cyy, cell-Inches(0.08), cell-Inches(0.08),
|
||||
color=heat[r_][c_], radius=0.12)
|
||||
if labels[r_][c_]:
|
||||
lines = [[(seg, 9.5, WHITE, True)] for seg in labels[r_][c_].split("\n")]
|
||||
txt(s, cx, cyy, cell-Inches(0.08), cell-Inches(0.08),
|
||||
lines, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
# 轴标签
|
||||
txt(s, gx-Inches(0.05), gy-Inches(0.05), cell*3, Inches(0.3), [], sa=0)
|
||||
txt(s, Inches(7.55), gy, Inches(0.75), cell*3,
|
||||
[[("金\n额\n影\n响", 11, CYAN, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, gx, gy+cell*3-Inches(0.02), cell*3, Inches(0.35),
|
||||
[[("发生概率 低 → 高", 11, CYAN, True)]], align=PP_ALIGN.CENTER, sa=0)
|
||||
# 底注
|
||||
ny = Inches(6.35)
|
||||
rrect(s, Inches(0.95), ny, Inches(11.55), Inches(0.62), color=CARD2, radius=0.2)
|
||||
rect(s, Inches(0.95), ny, Inches(0.1), Inches(0.62), color=GOLD)
|
||||
txt(s, Inches(1.25), ny, Inches(11.1), Inches(0.62),
|
||||
[[("▶ ", 13, GOLD, True),
|
||||
("不是工具集合,而是有体系、有优先级的全域审计框架。", 13, WHITE, True)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
domain_heat()
|
||||
|
||||
|
||||
# ============== 5 四大引擎(2x2卡片)==============
|
||||
def engines():
|
||||
s = new("能力 · 底座", "“本地 AI 审计大脑”四大核心引擎", 5)
|
||||
cards = [
|
||||
("01", "本地私有化 LLM 引擎", "模型本地化部署,数据绝不出域;推理、规则配置、报告生成、线索解释。", CYAN),
|
||||
("02", "全量穿透引擎", "直连 BSS/OSS/ERP/财务,不抽样,对所有合同、回款、行为做关联扫描。", BLUE),
|
||||
("03", "规则进化引擎(护城河)", "自然语言描述新造假→自动转规则→沙箱验证→把顾问经验固化为机构资产。", GOLD),
|
||||
("04", "线索驱动引擎", "对异常聚类做人话解释,输出附证据链的高价值线索,直推审计员桌面。", GREEN),
|
||||
]
|
||||
W, H = Inches(5.7), Inches(2.18)
|
||||
gx, gy = Inches(0.95), Inches(1.85)
|
||||
gapx, gapy = Inches(0.18), Inches(0.22)
|
||||
for i,(no,t,d,col) in enumerate(cards):
|
||||
r,c = divmod(i,2)
|
||||
x = gx + c*(W+gapx); y = gy + r*(H+gapy)
|
||||
rrect(s, x, y, W, H, color=CARD, radius=0.07)
|
||||
rect(s, x, y, Inches(0.14), H, color=col)
|
||||
circle(s, x+Inches(0.35), y+Inches(0.32), Inches(0.85), grad=(col, BG2))
|
||||
txt(s, x+Inches(0.35), y+Inches(0.32), Inches(0.85), Inches(0.85),
|
||||
[[(no, 26, WHITE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, x+Inches(1.4), y+Inches(0.35), W-Inches(1.6), Inches(0.6),
|
||||
[[(t, 17, WHITE, True)]], sa=0)
|
||||
txt(s, x+Inches(1.4), y+Inches(1.0), W-Inches(1.65), Inches(1.05),
|
||||
[[(d, 12.5, LIGHT, False)]], sa=0, line_spacing=1.15)
|
||||
engines()
|
||||
|
||||
|
||||
# ============== 6-13 场景页 ==============
|
||||
def scene(page, no, name, color, blocks):
|
||||
s = prs.slides.add_slide(BLANK); bg_gradient(s)
|
||||
# 左侧色带
|
||||
rect(s, 0, 0, Inches(3.0), SH, color=BG2)
|
||||
rect(s, Inches(3.0), 0, Inches(0.06), SH, color=color)
|
||||
circle(s, Inches(0.55), Inches(2.0), Inches(1.9), grad=(color, BG2))
|
||||
txt(s, Inches(0.55), Inches(2.05), Inches(1.9), Inches(1.9),
|
||||
[[(no, 60, WHITE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(0.3), Inches(0.55), Inches(2.4), Inches(0.4),
|
||||
[[("场景", 14, color, True)]], align=PP_ALIGN.CENTER, sa=0)
|
||||
txt(s, Inches(0.25), Inches(4.15), Inches(2.55), Inches(1.6),
|
||||
[[(seg, 19, WHITE, True)] for seg in name.split("\n")],
|
||||
align=PP_ALIGN.CENTER, sa=2)
|
||||
# 右侧内容卡片
|
||||
y = Inches(0.7)
|
||||
icons = {"经典案例":"●","扩展案例":"●","AI 审计点":"◆","本地 LLM 能力":"▲","业务链路":"►"}
|
||||
for label, text in blocks:
|
||||
h = Inches(1.18) if len(text) > 46 else Inches(0.95)
|
||||
rrect(s, Inches(3.3), y, Inches(9.55), h, color=CARD if "案例" not in label or "扩展" in label else CARD2, radius=0.08)
|
||||
# 标签条
|
||||
lab_col = color if label in ("AI 审计点","本地 LLM 能力","业务链路") else CYAN
|
||||
txt(s, Inches(3.55), y+Inches(0.12), Inches(9.1), Inches(0.36),
|
||||
[[(label, 13.5, lab_col, True)]], sa=0)
|
||||
txt(s, Inches(3.55), y+Inches(0.46), Inches(9.1), h-Inches(0.5),
|
||||
[[(text, 12.5, LIGHT, False)]], sa=0, line_spacing=1.12)
|
||||
y = y + h + Inches(0.12)
|
||||
footer(s, page)
|
||||
|
||||
scenes = [
|
||||
("01","政企收入\n全链路穿透", CYAN, [
|
||||
("业务链路","立项→审批→报价→签约→开票→回款,全链路穿透。"),
|
||||
("经典案例(拆单规避+虚假回款)","8 个客户各签 600 万拆成 79-99 万规避审批,尾款 500 万长期挂账;注册地址同楼、法人为同一人亲属、付款账户同一实控企业。"),
|
||||
("AI 审计点","合同金额阈值边缘聚集;工商关联穿透识别隐性实控人;回款时序聚类识别批量违约。"),
|
||||
("本地 LLM 能力","自然语言查数、关联推理、一键生成《政企客户回款异常专项线索清单》。"),
|
||||
]),
|
||||
("02","市场业务\n真实性", BLUE, [
|
||||
("经典案例(稳定的定,稳定的退)","每月新增 6000 人订彩铃,3 个月后首月用户全退订,骗补后弃养;号码集中乡镇、通话记录为零。"),
|
||||
("扩展案例(物联网卡虚假激活)","批量开通 10 万张卡称智慧停车,激活后零流量,按激活量领每台 50 元补贴,半年后集体沉默。"),
|
||||
("AI 审计点","用户生命周期时序识别;佣金与业务质量匹配;沉默/零通话用户聚类;交付物与收入交叉验证。"),
|
||||
("本地 LLM 能力","识别脉冲式增长+规律性衰减的周期性造假,自动提炼为新规则。"),
|
||||
]),
|
||||
("03","收入与成本\n跨期匹配", PURPLE, [
|
||||
("经典案例(趸交收入一次性确认)","24 个月套餐送手表,收入应分 24 月却因趸交一把确认,手表成本却摊 24 月,确认时点严重错配。"),
|
||||
("扩展案例(提前确认)","云项目约定按用量计费,财务却在设备上架当月全额确认,客户前 6 月几乎零使用。"),
|
||||
("AI 审计点","自动勾稽确认政策 vs 账务 vs 合同;识别一次性确认异常分录;成本摊销与收入跨期匹配。"),
|
||||
("本地 LLM 能力","跨系统自动勾稽,识别收入成本确认时点错配的异常分录模式。"),
|
||||
]),
|
||||
("04","渠道佣金与\n代理商套利", GOLD, [
|
||||
("经典案例(虚假放号+套机套卡)","批量买老人机插 5G 卡激活后丢弃,领 5G 迁转佣金每台 200 元+补贴 300 元,次月用户全流失。"),
|
||||
("扩展案例(异地窜货套利)","从邻省低价采购同款机,本省以新用户入网名义领高额补贴,手机回流二级市场。"),
|
||||
("AI 审计点","IMEI 与用户绑定真实性;佣金与在网时长匹配;终端流向追踪;代理商质量时序衰减。"),
|
||||
("本地 LLM 能力","IMEI 级终端流向追踪,识别激活-沉默-流失套利闭环。"),
|
||||
]),
|
||||
("05","网络建设与\n工程采购", GREEN, [
|
||||
("经典案例(围标串标+虚增工程量)","3 家投标报价差异不足 1%、方案雷同,中标后同一班组施工,签证单同一笔迹不同日期批量签字。"),
|
||||
("扩展案例(虚假巡检)","系统显示月巡检 2000 次,GPS 比对实际只到 300 站,其余照片复用+坐标伪造。"),
|
||||
("AI 审计点","投标报价相似度与文件雷同度;工程量与资源消耗匹配;巡检轨迹与工单交叉;马甲供应商识别。"),
|
||||
("本地 LLM 能力","NLP 比对投标雷同度,GPS 轨迹与工单交叉验证,识别马甲供应商。"),
|
||||
]),
|
||||
("06","互联互通与\n网间结算", CYAN, [
|
||||
("经典案例(话务量操纵)","与境外合谋虚假国际来话刷量,主叫为虚商号段,时长均为 30/60 秒整数倍,明显非真人。"),
|
||||
("扩展案例(短信网关刷量)","SP 伪造记录申报成功发送 10 亿条按 0.05 元/条结算,实际到达率不足 10%。"),
|
||||
("AI 审计点","话务量时序异常与整数时长聚集;结算数据与原始信令比对;SP/CP 业务量与结算交叉验证。"),
|
||||
("本地 LLM 能力","识别整数倍通话时长等非人类行为,信令级原始数据比对。"),
|
||||
]),
|
||||
("07","云业务/IDC\n与新兴业务", BLUE, [
|
||||
("经典案例(云资源空转)","政企客户签 3 年云服务年付 100 万,CPU 利用率长期<5%、存储近空,却全额确认收入,实控人为领导亲属。"),
|
||||
("扩展案例(IDC 机柜虚租)","宣称出租率 90%,实际大量机柜无设备、电费为零,收入来自关联方预付租金。"),
|
||||
("AI 审计点","资源使用量 vs 计费量匹配;出租率与电力消耗勾稽;关联方与预付异常;确认与验收时序一致性。"),
|
||||
("本地 LLM 能力","资源利用率与计费量自动比对,关联方网络挖掘,识别空转收入。"),
|
||||
]),
|
||||
("08","员工内部舞弊\n与资源滥用", PURPLE, [
|
||||
("经典案例(内部号码套利)","员工用权限批量开员工测试号对外出租免流套餐,流量收入全计入内部成本未确认收入。"),
|
||||
("扩展案例(积分套现)","勾结外部商户虚构消费批量刷积分兑换礼品卡变现,某商户单日发放量超正常 100 倍。"),
|
||||
("AI 审计点","权限操作日志异常模式;测试号实际用途偏离;积分流向追踪;权限与岗位匹配度。"),
|
||||
("本地 LLM 能力","操作日志异常挖掘,权限-岗位匹配分析,积分流向网络追踪。"),
|
||||
]),
|
||||
]
|
||||
pg = 6
|
||||
for no,name,col,blocks in scenes:
|
||||
scene(pg, no, name, col, blocks); pg += 1
|
||||
|
||||
|
||||
# ============== 14 数据治理 ==============
|
||||
def governance():
|
||||
s = new("工程 · 地基", "数据接入与治理层(全量穿透的前提)", 14)
|
||||
items = [
|
||||
("多源异构接入","适配 BSS/OSS/ERP/财务/合同/工单/信令各系统接口、数据库、文件,统一汇入本地数据湖。", CYAN),
|
||||
("主数据对齐","客户、合同、号码、工单、供应商跨系统实体统一,解决主键对不上。", BLUE),
|
||||
("数据质量探查与清洗","缺失、重复、口径不一自动探查清洗,建立质量评分。", PURPLE),
|
||||
("增量同步与时效","从年度快照升级为近实时增量,支撑常态化监控。", GOLD),
|
||||
]
|
||||
W, H = Inches(5.7), Inches(1.55)
|
||||
gx,gy = Inches(0.95), Inches(1.85)
|
||||
for i,(t,d,col) in enumerate(items):
|
||||
r,c = divmod(i,2)
|
||||
x = gx + c*(W+Inches(0.18)); y = gy + r*(H+Inches(0.2))
|
||||
rrect(s, x, y, W, H, color=CARD, radius=0.08)
|
||||
rect(s, x, y, Inches(0.12), H, color=col)
|
||||
circle(s, x+Inches(0.32), y+Inches(0.3), Inches(0.55), color=col)
|
||||
txt(s, x+Inches(0.32), y+Inches(0.3), Inches(0.55), Inches(0.55),
|
||||
[[(str(i+1), 18, WHITE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, x+Inches(1.05), y+Inches(0.2), W-Inches(1.2), Inches(0.45),
|
||||
[[(t, 15.5, WHITE, True)]], sa=0)
|
||||
txt(s, x+Inches(1.05), y+Inches(0.66), W-Inches(1.25), Inches(0.8),
|
||||
[[(d, 12, LIGHT, False)]], sa=0, line_spacing=1.12)
|
||||
ny = Inches(5.5)
|
||||
rrect(s, Inches(0.95), ny, Inches(11.55), Inches(0.95), color=CARD2, radius=0.12)
|
||||
rect(s, Inches(0.95), ny, Inches(0.1), Inches(0.95), color=GOLD)
|
||||
txt(s, Inches(1.25), ny, Inches(11.1), Inches(0.95),
|
||||
[[("我们把脏活写进方案、承担下来", 14.5, GOLD, True)],
|
||||
[("数据治理是这套体系工作量最大、最该提前立项的一环,而非回避。", 12.5, WHITE, False)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=3)
|
||||
governance()
|
||||
|
||||
|
||||
# ============== 15 人机协同闭环(流程图)==============
|
||||
def closed_loop():
|
||||
s = new("闭环 · 价值", "人机协同闭环:线索之后才是价值", 15)
|
||||
steps = ["AI 全量扫描","生成线索+证据链","审计员复核研判","自动生成底稿","定性 / 整改","复核销项闭环"]
|
||||
cols = [CYAN, BLUE, PURPLE, BLUE, GOLD, GREEN]
|
||||
n = len(steps)
|
||||
x0 = Inches(0.85); y = Inches(2.1); w = Inches(1.95); h = Inches(0.95); ov = Inches(0.32)
|
||||
step_w = (Inches(12.5) - w) / (n-1)
|
||||
for i,(t,col) in enumerate(zip(steps, cols)):
|
||||
x = x0 + step_w*i
|
||||
ch = chevron(s, x, y, w+ov, h, col)
|
||||
shape_text(ch, [[(seg, 12.5, WHITE, True)] for seg in t.split(" ")] if " " in t else [[(t,12.5,WHITE,True)]],
|
||||
align=PP_ALIGN.CENTER)
|
||||
# 返回箭头示意(闭环)
|
||||
txt(s, Inches(0.85), Inches(3.05), Inches(12), Inches(0.4),
|
||||
[[("◄──────────────── 规则进化反哺,越用越聪明 ────────────────►", 12, MUTE, True)]],
|
||||
align=PP_ALIGN.CENTER, sa=0)
|
||||
# 三栏角色
|
||||
roles = [
|
||||
("AI 侧","出线索、附证据链、给判定理由、自动生成可追溯底稿。", CYAN),
|
||||
("审计员侧","复核研判、定性、决定整改或移交、最终签字。", BLUE),
|
||||
("闭环管理","线索分派、取证留痕、整改跟踪、销项复核全流程在线。", GOLD),
|
||||
]
|
||||
W = Inches(3.7); gx = Inches(0.95); y2 = Inches(3.75)
|
||||
for i,(t,d,col) in enumerate(roles):
|
||||
x = gx + i*(W+Inches(0.22))
|
||||
rrect(s, x, y2, W, Inches(1.85), color=CARD, radius=0.08)
|
||||
rect(s, x, y2, W, Inches(0.5), color=col)
|
||||
txt(s, x, y2, W, Inches(0.5), [[(t, 15, WHITE, True)]],
|
||||
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, x+Inches(0.25), y2+Inches(0.65), W-Inches(0.5), Inches(1.1),
|
||||
[[(d, 12.5, LIGHT, False)]], sa=0, line_spacing=1.18)
|
||||
ny = Inches(5.95)
|
||||
rrect(s, Inches(0.95), ny, Inches(11.55), Inches(0.62), color=CARD2, radius=0.2)
|
||||
rect(s, Inches(0.95), ny, Inches(0.1), Inches(0.62), color=GOLD)
|
||||
txt(s, Inches(1.25), ny, Inches(11.1), Inches(0.62),
|
||||
[[("▶ ", 13, GOLD, True),
|
||||
("从“发现工具”升级为“办案平台”——每一步都接得住、留得痕。", 13, WHITE, True)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
closed_loop()
|
||||
|
||||
|
||||
# ============== 16 误报治理 ==============
|
||||
def fp_control():
|
||||
s = new("可信 · 落地", "误报治理与置信度分级(专业 = 诚实)", 16)
|
||||
# 左:三级置信漏斗
|
||||
txt(s, Inches(0.95), Inches(1.8), Inches(6), Inches(0.4),
|
||||
[[("三级置信分流", 15, WHITE, True)]], sa=0)
|
||||
tiers = [("高置信","直接推送处置", GREEN, 6.0),
|
||||
("中置信","人工复核研判", GOLD, 4.6),
|
||||
("低置信","归档备查", MUTE, 3.2)]
|
||||
y = Inches(2.35)
|
||||
for t,d,col,w in tiers:
|
||||
ww = Inches(w)
|
||||
x = Inches(0.95) + (Inches(6.0)-ww)/2
|
||||
rrect(s, x, y, ww, Inches(0.85), color=col, radius=0.22)
|
||||
shape = txt(s, x, y, ww, Inches(0.85),
|
||||
[[(t, 15, WHITE, True)],[(d, 12, WHITE, False)]],
|
||||
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=1)
|
||||
y = y + Inches(1.0)
|
||||
# 右:要点卡片
|
||||
pts = [
|
||||
("每条线索可解释","附证据链 + 判定理由,拒绝黑盒打分。", CYAN),
|
||||
("反馈学习闭环","审计员标注误报/属实,系统持续校准阈值,准确率随使用上升。", BLUE),
|
||||
("公开运营指标","命中率、准确率、线索转化率上看板,成效可量化可追溯。", GOLD),
|
||||
]
|
||||
x = Inches(7.4); yy = Inches(2.35)
|
||||
for t,d,col in pts:
|
||||
rrect(s, x, yy, Inches(5.1), Inches(0.85), color=CARD, radius=0.1)
|
||||
rect(s, x, yy, Inches(0.1), Inches(0.85), color=col)
|
||||
txt(s, x+Inches(0.3), yy+Inches(0.1), Inches(4.7), Inches(0.32),
|
||||
[[(t, 13.5, CYAN, True)]], sa=0)
|
||||
txt(s, x+Inches(0.3), yy+Inches(0.42), Inches(4.7), Inches(0.4),
|
||||
[[(d, 11.5, LIGHT, False)]], sa=0, line_spacing=1.05)
|
||||
yy = yy + Inches(1.0)
|
||||
ny = Inches(6.05)
|
||||
rrect(s, Inches(0.95), ny, Inches(11.55), Inches(0.7), color=CARD2, radius=0.18)
|
||||
rect(s, Inches(0.95), ny, Inches(0.1), Inches(0.7), color=GOLD)
|
||||
txt(s, Inches(1.25), ny, Inches(11.1), Inches(0.7),
|
||||
[[("▶ ", 13, GOLD, True),
|
||||
("主动交代精准度反而显专业——藏着不说,才是最大的风险。", 13, WHITE, True)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
fp_control()
|
||||
|
||||
|
||||
# ============== 17 平台架构(分层)==============
|
||||
def architecture():
|
||||
s = new("架构 · 全栈", "本地私有化 LLM 审计平台架构", 17)
|
||||
layers = [
|
||||
("应用层","自然语言查询 · 线索看板 · 智能报告 · 预警推送 —— 审计人员零门槛使用", CYAN),
|
||||
("引擎层","全量穿透引擎 + 规则进化引擎 + 线索生成引擎 —— LLM 驱动三大引擎", BLUE),
|
||||
("数据层","本地数据湖(BSS/OSS/ERP/财务/合同/工单/信令)—— 直连内网,零出域", PURPLE),
|
||||
("模型层","千问 70B / DeepSeek / 自研行业模型 —— 审计领域微调,懂电信业务", GOLD),
|
||||
("算力层","本地 A100 / H100 / 国产 GPU 集群 —— 承载 70B 级推理,信创可适配", GREEN),
|
||||
]
|
||||
y = Inches(1.8); h = Inches(0.82); lw = Inches(9.9)
|
||||
for i,(t,d,col) in enumerate(layers):
|
||||
rrect(s, Inches(0.95), y, lw, h, color=CARD, radius=0.06)
|
||||
rrect(s, Inches(0.95), y, Inches(1.7), h, color=col, radius=0.06)
|
||||
txt(s, Inches(0.95), y, Inches(1.7), h, [[(t, 15, WHITE, True)]],
|
||||
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(2.85), y, lw-Inches(2.0), h, [[(d, 12.5, LIGHT, False)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
y = y + h + Inches(0.12)
|
||||
# 右侧贯穿条:安全合规与自审计
|
||||
rrect(s, Inches(11.05), Inches(1.8), Inches(1.45), h*5+Inches(0.48), grad=(CYAN_D, BLUE), radius=0.08)
|
||||
txt(s, Inches(11.05), Inches(1.8), Inches(1.45), h*5+Inches(0.48),
|
||||
[[("安", 17, WHITE, True)],[("全", 17, WHITE, True)],[("合", 17, WHITE, True)],
|
||||
[("规", 17, WHITE, True)],[("·", 14, WHITE, True)],[("自", 17, WHITE, True)],
|
||||
[("审", 17, WHITE, True)],[("计", 17, WHITE, True)]],
|
||||
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=1)
|
||||
ny = Inches(6.6)
|
||||
txt(s, Inches(0.95), ny, Inches(11.55), Inches(0.4),
|
||||
[[("全链路内网闭环 · 数据零出域 · 权限分级 · 不可篡改日志 · 版本留痕", 13.5, CYAN, True)]],
|
||||
align=PP_ALIGN.CENTER, sa=0)
|
||||
architecture()
|
||||
|
||||
|
||||
# ============== 18 独立性与自审计 ==============
|
||||
def independence():
|
||||
s = new("制度 · 独立性", "独立性与系统自审计:系统本身也经得起审计", 18)
|
||||
items = [
|
||||
("防放水","规则配置、阈值调整全程留痕,任何改动可追溯,杜绝调教规则放水。", CYAN),
|
||||
("防拦截","线索一旦生成即不可删除,处置过程全程记录,杜绝线索被拦下。", BLUE),
|
||||
("权限分级","配规则、看线索、改阈值、出报告分权管理,相互制衡。", PURPLE),
|
||||
("三重留痕","模型版本、规则版本、数据版本可回溯,任一结论可还原当时状态。", GOLD),
|
||||
]
|
||||
W, H = Inches(5.7), Inches(1.95)
|
||||
gx,gy = Inches(0.95), Inches(1.9)
|
||||
for i,(t,d,col) in enumerate(items):
|
||||
r,c = divmod(i,2)
|
||||
x = gx + c*(W+Inches(0.18)); y = gy + r*(H+Inches(0.22))
|
||||
rrect(s, x, y, W, H, color=CARD, radius=0.08)
|
||||
circle(s, x+Inches(0.3), y+Inches(0.32), Inches(0.7), grad=(col, BG2))
|
||||
txt(s, x+Inches(0.3), y+Inches(0.32), Inches(0.7), Inches(0.7),
|
||||
[[("🔒" if False else "■", 18, WHITE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, x+Inches(1.2), y+Inches(0.3), W-Inches(1.4), Inches(0.5),
|
||||
[[(t, 17, col, True)]], sa=0)
|
||||
txt(s, x+Inches(1.2), y+Inches(0.85), W-Inches(1.45), Inches(1.0),
|
||||
[[(d, 12.5, LIGHT, False)]], sa=0, line_spacing=1.15)
|
||||
txt(s, Inches(0.95), Inches(6.4), Inches(11.55), Inches(0.4),
|
||||
[[("既当运动员又当裁判是内审大忌——用制度化留痕与分权,让系统自己也透明可查。", 13, CYAN, True)]],
|
||||
align=PP_ALIGN.CENTER, sa=0)
|
||||
independence()
|
||||
|
||||
|
||||
# ============== 19 四重跃升 ==============
|
||||
table_slide(19, "价值 · 跃升", "本地 LLM 带来的四重跃升",
|
||||
["关键跃升", "从 → 到", "价值内涵"],
|
||||
[
|
||||
["审计覆盖面", "5% → 100%", "全量扫描,异常无处藏身"],
|
||||
["数据出域风险", "存在 → 归零", "全链路内网闭环,满足等保最严要求"],
|
||||
["审计节奏", "年度快照 → 7×24 常态化", "动态舞弊实时捕捉"],
|
||||
["能力归属", "外部租用 → 本地永久沉淀", "规则进化,越用越聪明"],
|
||||
],
|
||||
note="安全 · 能力 · 效率 · 进化——四重价值,远超传统 BI 工具。",
|
||||
col_widths=[2.8, 4.2, 4.55], fs=13, hfs=13.5)
|
||||
|
||||
|
||||
# ============== 20 ROI ==============
|
||||
table_slide(20, "测算 · 回报", "价值测算:把“异常”变成客户的钱",
|
||||
["价值来源", "测算逻辑", "年化收益(保守)"],
|
||||
[
|
||||
["可挽回收入/止损", "全量覆盖挖出抽样漏掉的异常并整改", "数千万级"],
|
||||
["外部咨询费节省", "常态化自有能力替代重复性项目采购", "百万级 / 年"],
|
||||
["人力释放", "审计员从翻表取数转向研判处置", "数倍效率提升"],
|
||||
["风险事件预防", "提前发现合规风险,规避处罚与声誉损失", "难以估量"],
|
||||
],
|
||||
note="投入一次本地化建设,沉淀的是持续产生收益的永久资产,而非每年重复支出的项目费用。",
|
||||
col_widths=[2.9, 5.85, 2.8], fs=13, hfs=13.5)
|
||||
|
||||
|
||||
# ============== 21 差异化 ==============
|
||||
def differentiation():
|
||||
s = new("差异化 · 主张", "我们的差异化:能力沉淀,而非一次性交付", 21)
|
||||
pairs = [
|
||||
("能力沉淀","项目制交付","项目制是租大脑、人走经验走;我们是装一个永久、越用越聪明的本地大脑。", CYAN),
|
||||
("常态化","年度快照","舞弊是动态的,时序类造假正是本地 LLM + 全量数据的主场。", BLUE),
|
||||
("数据不出域","数据出域","一比特不出机房是结构性优势,让安全合规部门站在我们这边。", PURPLE),
|
||||
("共存切入","正面替代","先做以前做不动的全量穿透与常态化监控层,跑出线索、证明价值、自然扩展。", GOLD),
|
||||
]
|
||||
y = Inches(1.85); h = Inches(1.12)
|
||||
for i,(a,b,d,col) in enumerate(pairs):
|
||||
rrect(s, Inches(0.95), y, Inches(11.55), h, color=CARD if i%2 else CARD2, radius=0.07)
|
||||
rrect(s, Inches(1.15), y+Inches(0.28), Inches(2.4), Inches(0.56), color=col, radius=0.3)
|
||||
txt(s, Inches(1.15), y+Inches(0.28), Inches(2.4), Inches(0.56),
|
||||
[[(a, 14, WHITE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(3.65), y, Inches(0.7), h, [[("vs", 14, MUTE, True)]],
|
||||
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
rrect(s, Inches(4.35), y+Inches(0.28), Inches(2.2), Inches(0.56), color=BG2, line=MUTE, lw=1, radius=0.3)
|
||||
txt(s, Inches(4.35), y+Inches(0.28), Inches(2.2), Inches(0.56),
|
||||
[[(b, 13, MUTE, True)]], align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, Inches(6.75), y, Inches(5.6), h, [[(d, 12.5, LIGHT, False)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=0, line_spacing=1.12)
|
||||
y = y + h + Inches(0.13)
|
||||
differentiation()
|
||||
|
||||
|
||||
# ============== 22 实施路径(时间轴)==============
|
||||
def roadmap():
|
||||
s = new("实施 · 路径", "3 个月本地部署跑通(含同台盲测验证)", 22)
|
||||
phases = [
|
||||
("第 1 个月","算力 + 模型部署","GPU 到位;模型本地化部署;对接各业务系统;构建本地数据湖。", CYAN),
|
||||
("第 2 个月","场景微调 + 历史盲测","行业微调与场景适配;用历史数据全量重跑,与既有审计结论同台盲测。", BLUE),
|
||||
("第 3 个月","投产 + 线索闭环","正式上线;生成首批 200-500 条线索;核查反馈;规则库首轮进化。", GOLD),
|
||||
]
|
||||
# 时间轴
|
||||
rect(s, Inches(1.2), Inches(2.55), Inches(11.0), Pt(3), color=CARD2)
|
||||
W = Inches(3.7); gx = Inches(0.95)
|
||||
for i,(ph,t,d,col) in enumerate(phases):
|
||||
x = gx + i*(W+Inches(0.22))
|
||||
cx = x + W/2
|
||||
circle(s, cx-Inches(0.18), Inches(2.4), Inches(0.36), color=col)
|
||||
rrect(s, x, Inches(2.95), W, Inches(2.4), color=CARD, radius=0.07)
|
||||
rect(s, x, Inches(2.95), W, Inches(0.6), color=col)
|
||||
txt(s, x, Inches(2.95), W, Inches(0.6), [[(ph, 16, WHITE, True)]],
|
||||
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE, sa=0)
|
||||
txt(s, x+Inches(0.25), Inches(3.7), W-Inches(0.5), Inches(0.5),
|
||||
[[(t, 14.5, col, True)]], sa=0)
|
||||
txt(s, x+Inches(0.25), Inches(4.2), W-Inches(0.5), Inches(1.1),
|
||||
[[(d, 12.5, LIGHT, False)]], sa=0, line_spacing=1.18)
|
||||
ny = Inches(5.7)
|
||||
rrect(s, Inches(0.95), ny, Inches(11.55), Inches(0.95), color=CARD2, radius=0.1)
|
||||
rect(s, Inches(0.95), ny, Inches(0.1), Inches(0.95), color=GOLD)
|
||||
txt(s, Inches(1.25), ny, Inches(11.1), Inches(0.95),
|
||||
[[("交付物", 14, GOLD, True)],
|
||||
[("本地 AI 审计平台 + 可进化规则库 + 已验证高价值线索 + 同台盲测成效报告。", 13, WHITE, False)]],
|
||||
anchor=MSO_ANCHOR.MIDDLE, sa=3)
|
||||
roadmap()
|
||||
|
||||
|
||||
# ============== 23 结尾 ==============
|
||||
def closing():
|
||||
s = prs.slides.add_slide(BLANK)
|
||||
bg_gradient(s, RGBColor(0x07,0x10,0x24), RGBColor(0x10,0x29,0x52))
|
||||
circle(s, Inches(-1.5), Inches(4.5), Inches(4.5), color=RGBColor(0x10,0x24,0x48))
|
||||
circle(s, Inches(10.5), Inches(-1.5), Inches(4.5), color=RGBColor(0x10,0x24,0x48))
|
||||
rect(s, 0, 0, SW, Inches(0.18), grad=(CYAN, BLUE))
|
||||
rect(s, 0, Inches(7.32), SW, Inches(0.18), grad=(BLUE, CYAN))
|
||||
txt(s, Inches(1.0), Inches(2.0), Inches(11.3), Inches(1.2),
|
||||
[[("数据不动 · AI 动脑 · 造假者跑不掉", 40, WHITE, True)]], align=PP_ALIGN.CENTER, sa=0)
|
||||
rect(s, Inches(5.4), Inches(3.25), Inches(2.5), Pt(3), color=CYAN)
|
||||
txt(s, Inches(1.0), Inches(3.5), Inches(11.3), Inches(0.7),
|
||||
[[("本地大模型 + 全量穿透 + 规则进化 = 运营商内审的“新质生产力”", 19, CYAN, True)]],
|
||||
align=PP_ALIGN.CENTER, sa=0)
|
||||
txt(s, Inches(1.0), Inches(4.5), Inches(11.3), Inches(1.2),
|
||||
[[("让我们把千问 70B 装进您的机房", 17, LIGHT, False)],
|
||||
[("150 亿业务全量扫描,敏感数据一比特不出域", 17, LIGHT, False)]],
|
||||
align=PP_ALIGN.CENTER, sa=8)
|
||||
txt(s, Inches(1.0), Inches(6.3), Inches(11.3), Inches(0.5),
|
||||
[[("2026 年 6 月", 13, MUTE, False)]], align=PP_ALIGN.CENTER, sa=0)
|
||||
closing()
|
||||
|
||||
|
||||
out = "数据不出域,审计全穿透_精美版.pptx"
|
||||
prs.save(out)
|
||||
print("saved:", out, "slides:", len(prs.slides._sldIdLst))
|
||||
@@ -0,0 +1,284 @@
|
||||
# 数据不出域,审计全穿透(优化版)
|
||||
|
||||
> 基于本地私有化大模型的电信运营商 AI 全域内审体系
|
||||
> 让 150 亿业务里的每一分钱,都在本地 AI 的显微镜下原形毕露
|
||||
> 2026 年 6 月
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 1 · 封面
|
||||
|
||||
### 数据不出域,审计全穿透
|
||||
|
||||
- 基于本地私有化大模型的电信运营商 AI 全域内审体系
|
||||
- 不是一套工具,而是一套"建在自己机房里、越用越聪明"的审计能力体系
|
||||
- 2026 年 6 月
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 2 · 为什么传统审计"查不过来"?
|
||||
|
||||
**三个数字看清困局**
|
||||
|
||||
- **150 亿** —— 年业务规模
|
||||
- **5000 万** —— 潜在异常金额
|
||||
- **5%** —— 传统抽样覆盖率
|
||||
|
||||
**三类典型困局**
|
||||
|
||||
- **"拆单规避"**:8 个客户各签 600 万 ICT 项目,全拆成 80 万以下小额合同,三重一大抽样完美避开。按金额抽样,大额拆分后消失在雷达之外。
|
||||
- **"稳定的定,稳定的退"**:每月新增 6000 人订购彩铃,3 个月后首月用户全部退订。渠道已按新增量领取佣金,形成"骗补后弃养"闭环——造假藏在时序里。
|
||||
- **"Excel 干不过来"**:安全云盘 + 宏 + 人工,面对海量单据只能抽样,查不全、查不深。150 亿业务海洋中,5000 万异常如针落大海。
|
||||
|
||||
> **核心矛盾**:审计数据涉及政企合同、用户隐私、财务凭证,上公有云大模型 = 裸奔;不上 AI 又干不过来。怎么办?
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 3 · 本地 LLM 让"安全"和"智能"不再二选一
|
||||
|
||||
| 对比维度 | 传统抽样审计 | 公有云 AI 审计 | 本地 LLM 审计(我们) |
|
||||
| --- | --- | --- | --- |
|
||||
| 数据范围 | 按金额抽样,查不全 | 全量扫描,但数据出域 | 全量扫描,数据不出机房 |
|
||||
| 规则能力 | 规则写死,反向规避 | 模型能力强,但合规风险高 | 模型私有化,合规可控 |
|
||||
| 响应效率 | Excel 翻表,效率低 | 实时预警,但依赖外网 | 内网闭环,秒级响应 |
|
||||
| 交互模式 | 人找数据 | 数据找人,但数据送人 | 数据找人,数据原地不动 |
|
||||
| 能力归属 | 经验在人脑,人走经验走 | 能力在外部,租用即失 | 能力沉淀在本地,越用越聪明 |
|
||||
|
||||
> 把千问 70B / DeepSeek 装进本地机房,让 AI 在数据旁边干活,而不是把数据送给 AI。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 4 · 【新增】审计域全景图 + 风险分级模型
|
||||
|
||||
**不是 8 个孤立场景,而是一张覆盖全业务的审计地图**
|
||||
|
||||
把所有审计场景归入五大风险域,做到"全覆盖、有优先级":
|
||||
|
||||
| 风险域 | 覆盖场景 | 关注核心 |
|
||||
| --- | --- | --- |
|
||||
| 收入域 | 政企收入穿透、收入成本跨期匹配、云业务空转 | 收入真实性、确认时点 |
|
||||
| 成本域 | 渠道佣金、终端补贴、成本摊销 | 成本真实性、套利 |
|
||||
| 采购域 | 网络建设、工程采购、围标串标 | 采购合规、虚增工程量 |
|
||||
| 资金域 | 回款挂账、网间结算、资金流向 | 资金真实性、关联交易 |
|
||||
| 合规域 | 员工舞弊、权限滥用、积分套现 | 内控有效性、权限合规 |
|
||||
|
||||
**风险热力图(发生概率 × 金额影响)**
|
||||
|
||||
- 高概率 + 高金额 → 优先全量监控(如政企拆单、渠道骗补)
|
||||
- 低概率 + 高金额 → 重点定向穿透(如围标串标、云空转)
|
||||
- 高概率 + 低金额 → 批量聚类筛查(如积分套现、内部号码)
|
||||
|
||||
> 让客户一眼看出:我们不是"工具集合",是"有体系、有优先级的全域审计框架"。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 5 · "本地 AI 审计大脑"四大核心引擎
|
||||
|
||||
- **① 本地私有化 LLM 引擎(底座)**:千问 70B / DeepSeek 等模型本地化部署,审计数据绝不出域。负责异常模式推理、自然语言规则配置、报告自动生成、线索解释。
|
||||
- **② 全量穿透引擎**:直连 BSS / OSS / ERP / 财务系统,本地数据库直接喂给本地 LLM。不抽样,对所有合同、回款、用户行为做关联扫描。
|
||||
- **③ 规则进化引擎(护城河)**:审计人员用自然语言描述新造假模式,LLM 自动转化为可执行规则,沙箱验证命中率,持续对抗迭代——**把顾问脑子里的经验固化成机构永久资产**。
|
||||
- **④ 线索驱动引擎**:LLM 对异常聚类做"人话解释"(如"这 8 个客户疑似同一实控人"),输出高价值线索并附证据链,直接推送审计人员桌面。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 6 · 场景一:政企收入全链路穿透
|
||||
|
||||
- **业务链路**:客户立项 → 移动立项 → 审批 → 报价 → 签约 → 首款/二款开票 → 回款
|
||||
- **经典案例(拆单规避 + 虚假回款)**:某地市公司 8 个"客户"各签 600 万 ICT 项目,全拆成 79 万-99 万合同规避三重一大审批。首款付 100 万、二款付 300 万,尾款 500 万长期挂账。经穿透,8 个客户注册地址在同一写字楼、法人为同一人亲属、付款账户来自同一实控企业。
|
||||
- **AI 审计点**:合同金额分布异常(集中在阈值边缘);工商关联穿透(隐性实控人识别);回款时序聚类(批量违约模式)。
|
||||
- **本地 LLM 能力**:自然语言查数、关联推理、一键生成《政企客户回款异常专项线索清单》。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 7 · 场景二:市场业务真实性("养卡骗补")
|
||||
|
||||
- **经典案例(稳定的定,稳定的退)**:某渠道每月新增 6000 人订购彩铃,每过三个月首月用户全部退订,渠道已按新增量领取佣金,形成"骗补后弃养"闭环。用户号码归属地高度集中在某几个乡镇,且通话记录为零。
|
||||
- **扩展案例(物联网卡虚假激活)**:某代理商批量开通 10 万张物联网卡,声称用于"智慧停车",实际激活后无任何流量,已按激活量领取每台 50 元补贴,半年后卡片集体沉默。
|
||||
- **AI 审计点**:用户生命周期时序模式识别;渠道佣金与业务质量匹配度;沉默/零通话用户批量聚类;项目交付物与收入确认交叉验证。
|
||||
- **本地 LLM 能力**:识别"脉冲式增长 + 规律性衰减"的周期性造假,自动提炼为新规则。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 8 · 场景三:收入与成本跨期匹配
|
||||
|
||||
- **经典案例(趸交收入一次性确认)**:用户办 24 个月套餐送智能手表,收入应分 24 个月确认,但因趸交财务一把全确认,手表成本却摊 24 个月——确认时点严重错配。某省一年此类业务 5000 万,在 150 亿总收入中如针落大海。
|
||||
- **扩展案例("以销定产"变"提前确认")**:某政企云项目约定"按实际使用量计费",但财务在设备上架当月即全额确认收入,客户前 6 个月几乎零使用。
|
||||
- **AI 审计点**:自动勾稽收入确认政策 vs 实际账务 vs 合同条款;识别趸交/预收款一次性确认异常分录;成本摊销与收入确认跨期匹配;设备交付与收入确认时间差监控。
|
||||
- **本地 LLM 能力**:跨系统自动勾稽,识别收入成本确认时点错配的异常分录模式。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 9 · 场景四:渠道佣金与代理商套利
|
||||
|
||||
- **经典案例(虚假放号 + 套机套卡)**:某代理商为完成"5G 用户净增",批量买低价老人机插 5G SIM 卡激活后丢弃,用户从未产生 5G 流量,已领"5G 迁转"佣金每台 200 元 + 终端补贴 300 元,次月用户全部流失。
|
||||
- **扩展案例(异地窜货套利)**:代理商从邻省低价采购同款手机,在本省以"新用户入网"名义领高额补贴,手机实际回流二级市场。
|
||||
- **AI 审计点**:终端 IMEI 与用户绑定真实性;佣金发放与在网时长匹配度;终端流向追踪(激活即沉默/跨省流通);代理商业务质量时序衰减分析。
|
||||
- **本地 LLM 能力**:IMEI 级终端流向追踪,识别"激活-沉默-流失"套利闭环。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 10 · 场景五:网络建设与工程采购
|
||||
|
||||
- **经典案例(围标串标 + 虚增工程量)**:某基站项目 3 家投标报价差异不足 1%,技术方案大量雷同,中标后施工队为同一班组,工程量签证单存在"同一笔迹不同日期"批量签字。
|
||||
- **扩展案例(虚假巡检与虚报工单)**:某外包商系统显示每月完成 2000 次基站巡检,GPS 轨迹比对实际只到过 300 个站点,其余为"照片复用 + 坐标伪造"。
|
||||
- **AI 审计点**:投标关联分析(报价相似度、文件雷同度);工程量与资源消耗匹配验证;巡检轨迹与工单交叉验证;供应商画像(同一实控人"马甲"识别)。
|
||||
- **本地 LLM 能力**:NLP 比对投标文件雷同度,GPS 轨迹与工单交叉验证,识别"马甲"供应商。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 11 · 场景六:互联互通与网间结算
|
||||
|
||||
- **经典案例(话务量操纵套利)**:某运营商与境外运营商合谋虚假国际来话刷量,主叫归属地为虚商号段,通话时长均为 30 秒/60 秒整数倍,明显非真人。
|
||||
- **扩展案例(短信网关刷量)**:某 SP 伪造发送记录申报"成功发送"10 亿条行业短信按 0.05 元/条结算,实际到达率不足 10%。
|
||||
- **AI 审计点**:话务量时序异常(突发峰值、整数时长聚集);网间结算数据与网络侧原始信令比对;SP/CP 业务量与收入结算交叉验证;国际来话真实路由溯源。
|
||||
- **本地 LLM 能力**:识别"整数倍通话时长"等非人类行为,信令级原始数据比对。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 12 · 场景七:云业务 / IDC 与新兴业务
|
||||
|
||||
- **经典案例(云资源"空转"确认收入)**:某政企客户签 3 年云服务年付 100 万,实际 CPU 利用率长期低于 5%、存储几乎为空,但财务按合同全额确认收入,且该"客户"实控人为地市公司某领导亲属。
|
||||
- **扩展案例(IDC 机柜"虚租")**:某 IDC 宣称出租率 90%,实际大量机柜无设备、电费为零,收入来自关联方"预付租金"。
|
||||
- **AI 审计点**:云资源实际使用量 vs 合同计费量匹配度;IDC 出租率与电力消耗勾稽;新兴业务客户画像(关联方识别、预付模式异常);收入确认与交付验收时序一致性。
|
||||
- **本地 LLM 能力**:资源利用率与计费量自动比对,关联方网络挖掘,识别"空转"收入。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 13 · 场景八:员工内部舞弊与资源滥用
|
||||
|
||||
- **经典案例(内部号码套利)**:某营业厅员工利用权限批量开通"员工测试号"对外出租"免流套餐",测试号产生大量流量收入但全部计入内部成本未确认收入。
|
||||
- **扩展案例(积分/会员体系套现)**:某员工勾结外部商户虚构消费批量刷积分,兑换高价值礼品卡在二级市场变现,某商户单日积分发放量超正常 100 倍。
|
||||
- **AI 审计点**:员工权限操作日志异常模式识别;内部测试号实际用途偏离;积分/电子券流向追踪;权限与岗位匹配度(如客服岗有财务调账权限)。
|
||||
- **本地 LLM 能力**:操作日志异常模式挖掘,权限-岗位匹配度分析,积分流向网络追踪。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 14 · 【新增】数据接入与治理层(地基工程)
|
||||
|
||||
**全量穿透的前提,是把脏活干在前面**
|
||||
|
||||
- **多源异构接入**:适配 BSS / OSS / ERP / 财务 / 合同 / 工单 / 信令各系统的接口、数据库、文件,统一汇入本地数据湖。
|
||||
- **主数据对齐**:客户、合同、号码、工单、供应商跨系统实体统一,解决"主键对不上"。
|
||||
- **数据质量探查与清洗**:缺失、重复、口径不一自动探查并清洗,建立质量评分。
|
||||
- **增量同步与时效**:从年度快照升级为近实时增量,支撑常态化监控。
|
||||
|
||||
> 数据治理是这套体系工作量最大、最该提前立项的一环。我们把它写进方案、承担下来,而不是回避。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 15 · 【新增】人机协同闭环:线索之后才是价值
|
||||
|
||||
**从"发现工具"升级为"办案平台"**
|
||||
|
||||
```
|
||||
AI 全量扫描 → 生成线索 + 初步证据链 → 审计员复核研判 →
|
||||
系统自动生成审计底稿 → 定性分类 → 整改 / 移交 → 复核销项闭环
|
||||
```
|
||||
|
||||
- **AI 侧**:出线索、附证据链、给判定理由、自动生成可追溯底稿。
|
||||
- **审计员侧**:复核研判、定性、决定整改或移交、最终签字。
|
||||
- **闭环管理**:线索分派、取证留痕、整改跟踪、销项复核全流程在线。
|
||||
|
||||
> 不是"给你一堆线索然后呢",而是"从发现到闭环,每一步都接得住、留得痕"。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 16 · 【新增】误报治理与置信度分级(专业 = 诚实)
|
||||
|
||||
**全量扫描必然产生海量疑似项——关键是不让审计员淹死在假阳性里**
|
||||
|
||||
- **三级置信分流**:高置信直接推送处置、中置信人工复核、低置信归档备查。
|
||||
- **每条线索可解释**:附证据链 + 判定理由,拒绝"黑盒打分"。
|
||||
- **反馈学习闭环**:审计员标注"误报/属实",系统持续校准阈值,准确率随使用上升。
|
||||
- **公开运营指标**:命中率、准确率、线索转化率上看板,成效可量化、可追溯。
|
||||
|
||||
> 主动交代精准度,反而显专业。藏着不说,才是最大的风险。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 17 · 本地私有化 LLM 审计平台架构
|
||||
|
||||
- **应用层**:自然语言查询 · 线索看板 · 智能报告 · 预警推送 —— 审计人员零门槛使用
|
||||
- **引擎层**:全量穿透引擎 + 规则进化引擎 + 线索生成引擎 —— LLM 驱动三大引擎
|
||||
- **数据层**:本地数据湖(BSS / OSS / ERP / 财务 / 合同 / 工单 / 信令)—— 直连内网,零出域
|
||||
- **模型层**:千问 70B / DeepSeek / 自研行业模型 —— 审计领域微调,懂电信业务
|
||||
- **算力层**:本地 A100 / H100 / 国产 GPU 集群 —— 承载 70B 级大模型推理,信创可适配
|
||||
- **安全合规与自审计层(贯穿全栈)**:权限分级 · 操作不可篡改日志 · 模型/规则版本留痕 · 全链路审计轨迹
|
||||
|
||||
> 全链路内网闭环 · 数据零出域
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 18 · 【新增】独立性与系统自审计(制度设计)
|
||||
|
||||
**审计系统本身,也要经得起审计**
|
||||
|
||||
- **防放水**:规则配置、阈值调整全程留痕,任何人改动可追溯,杜绝"调教规则放水"。
|
||||
- **防拦截**:线索一旦生成即不可删除,处置过程全程记录,杜绝"线索被领导拦下"。
|
||||
- **权限分级**:配规则、看线索、改阈值、出报告分权管理,相互制衡。
|
||||
- **可追溯**:模型版本、规则版本、数据版本三重留痕,任一结论可回溯到当时的模型与数据状态。
|
||||
|
||||
> 既当运动员又当裁判是内审的大忌——我们用制度化的留痕和分权,让这套系统自己也透明可查。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 19 · 本地 LLM 带来的四重跃升
|
||||
|
||||
- **安全价值**:敏感数据不出机房,满足国资/运营商/等保最严要求,模型-数据-推理-结果全链路内网闭环。
|
||||
- **能力价值**:70B 级本地模型具备语义推理、规则自生长、报告生成能力,远超传统 BI;行业微调,懂电信业务。
|
||||
- **效率价值**:自然语言交互,不写 SQL、不翻 Excel,问一句就出线索,从"人找数据"到"数据找人"。
|
||||
- **进化价值**:每发现一种造假,LLM 自动提炼规则,系统越用越精准,形成机构专属审计知识库。
|
||||
|
||||
| 关键跃升 | 从 → 到 |
|
||||
| --- | --- |
|
||||
| 审计覆盖面 | 5% → 100% |
|
||||
| 数据出域风险 | 存在 → 归零 |
|
||||
| 审计节奏 | 年度快照 → 7×24 常态化 |
|
||||
| 能力归属 | 外部租用 → 本地永久沉淀 |
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 20 · 【新增】价值测算:把"异常"变成客户的钱
|
||||
|
||||
**以 150 亿业务规模、5000 万潜在异常为基准的保守测算**
|
||||
|
||||
| 价值来源 | 测算逻辑 | 年化收益(保守) |
|
||||
| --- | --- | --- |
|
||||
| 可挽回收入/止损 | 全量覆盖挖出抽样漏掉的异常并整改 | 数千万级 |
|
||||
| 外部咨询费节省 | 常态化自有能力替代重复性项目制采购 | 百万级/年 |
|
||||
| 人力释放 | 审计员从翻表取数转向研判处置 | 数倍效率提升 |
|
||||
| 风险事件预防 | 提前发现合规风险,规避处罚与声誉损失 | 难以估量 |
|
||||
|
||||
> 投入一次本地化建设,沉淀的是持续产生收益的永久资产,而非每年重复支出的项目费用。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 21 · 【新增】我们的差异化:能力沉淀,而非一次性交付
|
||||
|
||||
**为什么是"建一套体系",而不是"买一份报告"**
|
||||
|
||||
- **能力沉淀 vs 项目制交付**:项目制是"租大脑",人走经验走、明年再付一次;我们是"装一个永久的、越用越聪明的本地大脑",规则进化引擎把每一次审计经验固化为机构资产。
|
||||
- **常态化 vs 年度快照**:舞弊是动态的,审计不能一年一次。时序类造假(养卡、骗补、脉冲式增长)恰恰是抽样和年度审计抓不到的,正是本地 LLM + 全量数据的主场。
|
||||
- **数据不出域 vs 数据出域**:对等保/国资/数据安全红线极高的运营商,"一比特不出机房"是结构性优势,让安全合规部门站在我们这边。
|
||||
- **共存切入 vs 正面替代**:先做底层全量穿透与常态化监控这块"以前做不动的层",跑出线索、证明价值,能力自然沉淀、份额自然扩展。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 22 · 3 个月本地部署跑通(含同台盲测验证)
|
||||
|
||||
- **第 1 个月 · 算力 + 模型部署**:机房 GPU 到位;千问 70B / DeepSeek 本地化部署;对接 BSS/OSS/ERP/财务/工单/信令;构建本地数据湖。
|
||||
- **第 2 个月 · 场景微调 + 历史盲测**:历史审计案例行业微调;政企/市场/财务/工程场景适配;**用过去 2-3 年历史数据全量重跑,与既有审计结论同台盲测,验证能否挖出此前抽样漏掉的真实线索**。
|
||||
- **第 3 个月 · 投产 + 线索闭环**:正式上线;生成首批 200-500 条线索;审计人员跟进核查反馈;规则库首轮进化。
|
||||
|
||||
> **交付物**:一套本地私有化 AI 审计平台 + 一套可进化的审计规则库 + 一批已验证的高价值线索 + 一份同台盲测成效报告。
|
||||
|
||||
---
|
||||
|
||||
## 幻灯片 23 · 审计的终极形态
|
||||
|
||||
- **数据不动、AI 动脑、造假者跑不掉**
|
||||
- 本地大模型 + 全量穿透 + 规则进化 = 运营商内审的"新质生产力"
|
||||
- 让我们把千问 70B 装进您的机房
|
||||
- 150 亿业务全量扫描,敏感数据一比特不出域——这才是电信运营商该有的 AI 审计
|
||||
|
||||
> 2026 年 6 月
|
||||
Binary file not shown.
Reference in New Issue
Block a user