Files
X-Financial/docs/improvement-roadmap.md
2026-06-18 22:12:38 +08:00

19 KiB
Raw Blame History

X-Financial 改进路线图

本文档基于 2026-06-18 对代码库的算法层、业务层、工程层综合评估生成。 每项改进都附有文件路径佐证,便于后续定位和追踪。 维护规则:状态变更请在对应章节同步更新;新增改进项追加到对应优先级末尾。

状态约定

标记 含义
待启动
🔄 进行中
已完成
⏸️ 暂缓(需说明原因)
取消(需说明原因)

优先级矩阵

优先级 编号 标题 状态
🔴 P0 安全 B2 HTTP Header 权限漏洞
🔴 P0 业务核心 B1 审批流转交/加签/撤回/会签
🔴 P0 共识 B10 800 行硬约束破防
🟠 P1 算法 A1 风险评分权重自适应
🟠 P1 算法 A4 LLM 票据分类 + 字段置信度
🟠 P1 算法 A7 LLM 幻觉检测
🟠 P1 业务 B6 规则覆盖不均衡
🟡 P2 业务 B3 申请/报销拆表
🟡 P2 业务 B4 可配置审批矩阵
🟡 P2 算法 A2 异常检测自适应阈值
🟢 P3 算法 A3 多模型异常检测集成
🟢 P3 算法 A5 票据分类持续学习
🟢 P3 算法 A6 Prompt 模板集中管理
🟢 P3 算法 A8 规则冗余建模
🟢 P3 算法 A9 行为画像 fairness 保护
🟢 P3 业务 B5 预算跨期/跨科边界
🟢 P3 业务 B7 审计日志防篡改
🟢 P3 业务 B8 审批 SLA 监控
🟢 P3 业务 B9 支付与凭证对接
🟢 P3 算法 A10 算法模块 800 行拆分

一、算法层面改进

A1. 风险评分权重自适应调优

优先级🟠 P1

证据

  • server/src/app/algorithem/risk_graph/engine.py:457-465
  • server/src/app/services/risk_rule_scoring.py:16-23

当前实现

risk_score = 0.35*S_rule + 0.25*S_anomaly + 0.20*S_graph + 0.15*S_policy + 0.05*S_history

五维权重和六因子权重均为硬编码常量,无法反映规则有效性差异。

问题

  • 已有 RiskObservationFeedback 表收集人工反馈,但反馈数据未反向更新权重
  • 不同费用类型(差旅/招待/通信)的合理权重差异大,目前一刀切

改进方向

  • 按费用类型分组的权重向量
  • 定期基于反馈数据做 logistic regression / Bayesian 更新
  • 权重变更需版本化、可回滚

验收标准

  • 权重从配置/数据库读取,不再硬编码
  • 反馈数据能触发权重自动调整
  • 不同费用类型可配置独立权重
  • 调整过程有日志和效果对比

A2. 金额异常检测自适应阈值

优先级🟡 P2

证据server/src/app/algorithem/risk_graph/engine.py:221-261

当前实现:固定分档阈值 1.0x→0, 1.25x→30, 1.5x→55, 2.0x→75, 3.0x→95

问题

  • 通信费(小额高频)和差旅(大额低频)的"1.5x"含义完全不同
  • peer p75 在新部门/新费用类型时样本稀疏
  • 已识别 peer_baseline_insufficient 不确定性,但无冷启动方案

改进方向

  • 改为自适应分位数(基于历史数据动态计算)
  • (费用类型 × 部门层级) 分组维护基线
  • 冷启动:全局基线 + 小样本置信度折扣

验收标准

  • 阈值按业务维度分组,不再全局统一
  • 新部门/新费用类型有冷启动策略
  • 基线样本不足时有降级机制
  • 增加单元测试覆盖冷启动场景

A3. 多模型异常检测集成策略

优先级🟢 P3

证据server/src/app/algorithem/risk_graph/anomaly_models.py

当前实现5 个模型独立输出(robust_statistics / isolation_proxy / local_outlier / temporal_jump / periodic_deviation),无集成。

问题

  • 多模型同时报警时聚合规则未定义
  • 单模型 vs 多模型共识的严重度差异未体现
  • 模型间冲突无裁决机制

改进方向

  • 引入 AnomalyEnsembler 集成层
  • 输出 consensus_score + model_disagreement_flag
  • 高风险图谱评分区分"单点异常"和"多维共识异常"

验收标准

  • 实现集成层并接入 engine.py
  • 集成结果包含共识度指标
  • 单元测试覆盖各种模型组合情况

A4. LLM 票据分类与字段置信度

优先级🟠 P1

证据

  • server/src/app/services/document_intelligence.py:143-153_classify_with_model 当前 return None
  • server/src/app/services/document_intelligence.py:20-37(字段抽取全正则)

问题

  • 规则层单点支撑,非标准票据格式失效
  • 无字段级置信度评分,无法判断哪些抽取值需要人工复核
  • LLM 分类合并策略代码已存在但未启用

改进方向

  1. 启用 LLM 分类层(合并逻辑可直接复用)
  2. 字段抽取增加置信度:{field: {value, confidence, source}}
  3. 低置信度字段(< 0.7)自动标记"需人工核对"

验收标准

  • LLM 分类层启用并通过对比测试
  • 每个抽取字段附带置信度评分
  • 低置信度字段触发人工复核标记
  • 提供准确率回归测试集

A5. 票据分类持续学习

优先级🟢 P3

证据server/src/app/services/document_intelligence_rules.py:120score_bias 硬编码)

问题新票种ETC 电子票、滴滴行程单新模板)需开发改代码才能识别。

改进方向

  • 分类规则做成可配置 + 可学习
  • 管理员上传样本自动更新关键词权重
  • 基于历史已分类票据做 TF-IDF 训练

验收标准

  • 后台提供分类规则管理界面
  • 新票种可通过样本上传识别
  • 历史数据可训练关键词权重

A6. Prompt 模板集中管理

优先级🟢 P3

证据

  • server/src/app/services/ontology_extraction.py
  • server/src/app/services/ontology_detection.py
  • server/src/app/services/risk_rule_generation.py
  • server/src/app/services/user_agent_response.py
  • server/src/app/services/user_agent_application.py
  • server/src/app/services/user_agent_review_core.py
  • server/src/app/services/knowledge_rag.py:214(查询重写硬编码在方法内)

问题

  • Prompt 散落在 12+ 文件,无版本化、无回滚、无 A/B 测试
  • 相同意图的 prompt 在不同 service 中重复

改进方向

  • 建立 prompts/ 集中目录 + PromptRegistry
  • (意图, 版本) 管理
  • 支持灰度发布和效果对比

验收标准

  • 所有 prompt 迁移到集中目录
  • 支持版本化与回滚
  • 提供 A/B 测试接口

A7. LLM 幻觉检测与事实校验

优先级🟠 P1

证据:当前系统缺少 LLM 输出的显式幻觉检测。本体解析有 confidence 门禁,但生成的解释文本、规则建议、对话回复无校验。

问题

  • LLM 可能编造不存在的政策条款、错误金额阈值、虚构审批人
  • 风险图谱解释文本幻觉会误导审批人
  • 唯一兜底是 data_quality_gate,仅管输入数据质量

改进方向

  • 关键输出(金额、政策条款、规则编号)做 grounded checkLLM 输出后用规则引擎反向校验
  • 对话回复中的具体数字、日期强制引用证据片段RAG 引用)

验收标准

  • 关键数值字段有反向校验机制
  • 对话回复中的事实声明可追溯到证据
  • 校验失败时有明确降级策略

A8. 规则冗余/相关性建模

优先级🟢 P3

证据server/src/app/services/risk_rule_scoring.py(多规则命中简单求和/max

问题:相关规则同时命中时分数被夸大。如 preapproval_absentdate_outside_trip 可能高度相关。

改进方向:引入规则相关矩阵,对相关规则命中分数做去冗余折扣。

验收标准

  • 建立规则相关矩阵
  • 命中聚合时考虑冗余
  • 测试验证去冗余效果

A9. 行为画像 fairness 保护

优先级🟢 P3

证据server/src/app/algorithem/employee_behavior_profile.py:345evaluate_weighted_profile / calculate_review_priority_score

问题:行为画像影响审核优先级,若基于受保护属性(性别/年龄)产生系统性偏差,会构成隐性歧视。

改进方向

  • 增加 fairness audit 接口(按人群分组统计风险分布)
  • 评分特征显式排除受保护属性
  • 定期输出偏差报告

验收标准

  • 评分特征清单明确排除受保护属性
  • 提供 fairness audit API
  • 定期偏差报告生成

A10. 算法模块 800 行拆分

优先级🟢 P3与 B10 同源,单独追踪算法模块进度)

证据

  • server/src/app/algorithem/employee_behavior_profile_tag_rules.py: 812 行 🔴
  • server/src/app/algorithem/risk_graph/engine.py: 794 行 🟡 临界

改进方向

  • employee_behavior_profile_tag_rules.py 按标签类别拆分(差旅类 / 招待类 / 办公类)
  • engine.py 的 5 个评分维度rule/anomaly/graph/policy/history拆为 5 个独立打分器

验收标准

  • 所有算法文件 ≤ 800 行
  • 拆分前后行为等价(单元测试通过)
  • 拆分后职责边界清晰

二、业务层面改进

B1. 审批流转交/加签/撤回/会签

优先级🔴 P0

证据

  • server/src/app/services/expense_claim_workflow_constants.py(仅 11 行固定阶段)
  • server/src/app/services/expense_claim_approval_flow.py:28approve_claim 串行硬编码)
  • 转交/加签/撤回代码中不存在

问题

  • 费控系统核心能力缺失
  • 现实中领导出差无法审批是常态
  • 无并行审批(会签),多人审批只能串行
  • 审批节点调整需改代码

改进方向

  • 引入审批矩阵:费用类型 × 金额区间 × 部门 → 审批节点列表
  • 支持节点动作:{approve, reject, return, transfer, countersign, withdraw, add_approver}
  • 短期优先实现"转交"和"撤回"两个最常用动作

验收标准

  • 支持转交(审批人转给他人)
  • 支持撤回(提交人在审批中撤回)
  • 支持加签(临时增加审批节点)
  • 支持会签(多节点并行)
  • 审批矩阵可后台配置
  • 关键操作有审计日志

B2. HTTP Header 权限漏洞修复

优先级🔴 P0安全

证据server/src/app/api/deps.py:33-213,通过 X-Auth-Username / X-Auth-Role-Codes / X-Auth-Is-Admin 等请求头识别身份。

问题

  • 任何人只要在请求头加 X-Auth-Is-Admin: true 就能获得管理员权限
  • 没有 token、没有签名、没有任何校验
  • 足以让所有费控规则形同虚设

改进方向

  • 引入真正的身份认证JWT 或 session cookie
  • 角色信息从服务端 session/token 获取,绝不信任客户端传来的角色声明
  • 短期方案前置网关nginx剥离这些头并注入真实身份

验收标准

  • 客户端无法通过伪造 Header 越权
  • 所有角色信息来自服务端校验
  • 现有 API 行为兼容(不破坏调用方)
  • 安全测试覆盖权限边界

B3. 申请单与报销单拆表

优先级🟡 P2

证据

  • server/src/app/models/financial_record.pyExpenseClaim 通过 expense_type 后缀 + claim_no 前缀区分
  • server/src/app/models/reimbursement.pyReimbursementRequest 几乎废弃service 仅 54 行 CRUD

问题

  • 查询复杂度高,每个查询都要带 expense_type IN (...) 过滤
  • 字段冗余(申请单无发票字段但表里有)
  • 业务语义混乱("claim"分不清是申请还是报销)
  • 索引难优化

改进方向(需决策):

  • 方案 A保守保留单表增加 claim_kind 字段(application / reimbursement)显式区分
  • 方案 B彻底拆分为 ExpenseApplication + ExpenseReimbursement 两张表,通过 application_id 外键关联
  • 涉及数据迁移,需用户确认方案

验收标准

  • 方案决策完成
  • 数据迁移脚本可重入、可回滚
  • 迁移前后数据等价校验
  • 现有 API 行为兼容或平滑升级

B4. 可配置审批矩阵

优先级🟡 P2

证据server/src/app/services/expense_claim_approval_routing.py_APPLICATION_BUDGET_REVIEW_USAGE_THRESHOLD = 90% 等阈值硬编码)

问题:什么金额走什么审批、什么情况要预算管理者介入,全部硬编码。不同公司/部门差异大,无法运维配置。

改进方向:建立审批矩阵配置表:

approval_matrix(expense_type, amount_range, department_level, risk_level) 
  → [approver_roles, parallel_or_serial, sla_hours]

管理员后台维护,系统按矩阵动态生成审批流。

验收标准

  • 审批矩阵可后台配置
  • 系统按矩阵动态生成审批流
  • 配置变更有版本和审计
  • 矩阵未命中时有合理默认值

B5. 预算管控跨期/跨科边界

优先级🟢 P3

证据

  • server/src/app/services/budget.py780 行)
  • server/src/app/services/expense_claim_budget_flow.py112 行)
  • 预算占用/释放/核销/转移已实现,但边界场景验证不足

潜在漏洞

  • 跨财年结转:去年冻结的预算今年初未释放
  • 跨期占用Q1 提交的申请 Q2 才审批,占用的是哪个季度?
  • 跨科目调剂:差旅预算不够能否临时挪用办公预算?
  • 无对应单元测试

改进方向

  • 增加预算状态周期性对账任务(每日扫描 orphan reservation
  • 跨期策略明确化(默认跟随申请提交期,可配置)
  • 补充跨期/跨科目单元测试

验收标准

  • 跨期/跨科目边界单元测试覆盖
  • 周期性对账任务上线
  • orphan reservation 自动清理

B6. 规则覆盖不均衡补齐

优先级🟠 P1

证据server/rules/risk-rules/ 38 条规则分布:

  • 差旅travel13 条
  • 预算budget13 条
  • 申请application5 条
  • 报销reimbursement7 条
  • 标准standard5 条

问题

  • 招待费、市场推广、培训费、福利费、软件服务费几乎没有专门规则
  • 缺少供应商关联方交易、连号发票重复报销、跨年度重复报销检测
  • 这些恰是真实费控场景最易出问题的领域

改进方向

  1. 招待费规则(参与人数缺失、人均超标、同城招待、节假日招待)
  2. 供应商风险规则(同一供应商高频、关联方、工商信息异常)
  3. 重复报销检测(发票号哈希去重、跨期扫描)

验收标准

  • 招待费规则集≥5 条)
  • 供应商风险规则集≥3 条)
  • 重复报销检测规则≥2 条)
  • 每条新规则有对应单元测试

B7. 审计日志防篡改

优先级🟢 P3

证据

  • server/src/app/models/audit_log.py
  • server/src/app/services/audit.py72 行)
  • before/after JSON 快照完整,但无 hash chain 或数字签名

问题:数据库管理员(或有 DB 写权限的人)可静默篡改审计日志。

改进方向

  • 每条日志附加 prev_hash + current_hash = sha256(prev_hash + payload)
  • 定期锚定到外部存证(区块链 / 公证处 / WORM 存储)

验收标准

  • 审计日志实现 hash chain
  • 篡改可被检测
  • 外部存证机制(至少文档化)

B8. 审批 SLA 与时效监控

优先级🟢 P3

证据:审批节点无超时提醒代码。

问题:单据卡在某领导处一周无人管,系统无感知。

改进方向

  • 每个审批节点配置 SLA如 24h/48h
  • 后台定时任务扫描超时单据
  • 自动催办 / 升级到上级 / 转交

验收标准

  • SLA 可配置
  • 超时自动催办
  • 超时升级机制
  • SLA 报表可查

B9. 支付与凭证对接

优先级🟢 P3业务延伸方向

证据:状态机到 paid 就结束,无银企直连、无会计凭证生成。

问题:报销审批通过后仍需财务人工付款、手工录凭证,未形成完整闭环。

改进方向

  • 银企直连(用友 / 金蝶 / 远光 API
  • 自动生成会计凭证(借:管理费用-差旅,贷:银行存款/应付职工薪酬)

验收标准

  • 至少接入一个财务系统
  • 凭证自动生成
  • 支付状态回传

B10. 800 行硬约束拆分(业务模块)

优先级🔴 P0

证据services/ 下 ≥ 800 行的文件,共 20 个

文件 行数 超标幅度
services/user_agent_application.py 1451 +81%
services/risk_rule_template_executor.py 1164 +45%
services/expense_claim_draft_flow.py 1064 +33%
services/expense_claims.py 1042 +30%
services/receipt_folder.py 1034 +29%
services/steward_planner.py 935 +17%
api/v1/endpoints/agent_assets.py 925 +16%
services/orchestrator_execution.py 900 +12.5%
services/finance_dashboard.py 884 +10.5%
services/knowledge_rag.py 877 +9.6%
services/settings.py 873 +9.1%
services/agent_assets.py 856 +7%
services/employee.py 850 +6.25%
services/employee_behavior_profile_service.py 823 +2.9%
services/risk_rule_generation.py 821 +2.6%
services/agent_foundation_asset_topup.py 809 +1.1%
services/ontology_extraction.py 808 +1%
services/demo_company_simulation_seed.py 805 +0.6%
services/knowledge.py 800 临界
另约 20 个文件在 700-800 行区间 🟡

前端超大文件

文件 行数
web/src/views/scripts/TravelReimbursementCreateView.js 4066 🔴🔴
web/src/views/scripts/TravelRequestDetailView.js 2861 🔴🔴
web/src/views/scripts/useTravelReimbursementSubmitComposer.js 2173 🔴🔴
web/src/composables/useRequests.js 1799 🔴
web/src/views/scripts/travelReimbursementReviewModel.js 1662 🔴
多个 .vue 文件 800-1130 🔴

改进方向

  • 按 AGENTS.md 既定的拆分原则(编排 / 状态 / 持久化 / 权限 / 文件存储 / OCR / 规则审核 / 响应构建 / 序列化)逐个拆
  • 优先 Top 5user_agent_application / risk_rule_template_executor / expense_claim_draft_flow / expense_claims / receipt_folder
  • 每次拆分配套定向测试

验收标准

  • 所有类/文件 ≤ 800 行
  • 拆分前后行为等价(测试通过)
  • 拆分后职责边界清晰
  • CI 中加入行数检查(防止回潮)

三、推进原则

  1. P0 优先B2安全、B1核心能力、B10共识必须先行。
  2. 算法优化在 P0 落地后做:再准的算法也会被权限漏洞和流程缺失抵消。
  3. 小步快跑:每项改进拆成可独立验证的子任务,配套测试。
  4. 不破坏既有协议:对外 API 尽量稳定,内部实现先拆。
  5. 800 行约束所有改动前后检查受影响类行数CI 加入行数门禁。

四、变更日志

日期 变更 操作人
2026-06-18 路线图初始版本,基于代码库全量评估生成 Sisyphus