模块 1 · 从用户视角出发
JinRong 是什么?
一次「问 AI」背后发生了什么
这是一个金融智能管家 Demo:四类人用四个不同的 AI 助手(客户 / 理财师 / 分析员 / 风控), 共用同一套数据和合规规则。没有真实银行 Core,用本地模拟库代替。
你已经在用的能力
- 登录后看持仓、流水、产品行情(平台只读 API)
- 和 AI 对话(同步或流式 SSE)
- 分析员问数(自然语言 → SQL → 表格)
- 风控看预警台账、做模拟交易造演示数据
想象:客户打开「客户助手」发一句话
下面是一次真实链路的简化版(2026-09 现状:客户线已走SSE 流式)。
点击「下一步」看数据怎么流
# web/src/api/chat.ts
'X-Agent-Type': agentType, // customer | risk | …
Authorization: `Bearer ${token}`
前端每次调「对话 API」都要带两样东西:登录令牌 + 你正在用哪条 Agent 线。
后端据此决定走客服 LangGraph 还是通用 顾问通用 tool→llm→guard 编排(agent_service.py),以及能不能过门禁。
分析员「问数工作台」调 API 时,要不要带 X-Agent-Type?
模块 2 · 认识主要角色
四个 Agent,
各干各的活
它们不互相打电话(不调彼此的 LLM)。要共享信息,走数据库里的画像层、预警表、平台 API。 像一栋楼里的四个窗口,共用同一套档案室。
四个窗口分别是谁
客户财富 Agent
服务登录客户本人:查持仓/流水、产品规则 RAG、合规话术。代码:登录客户 14 节点编排(customer_service.py)登录客户 14 节点编排
代理人助手
服务理财师:聊名下客户、公开知识库。代码:顾问通用 tool→llm→guard 编排(agent_service.py)顾问通用 tool→llm→guard 编排 + advisor 分支
数据分析 Agent
NL→SQL 问数、看板 metrics、口径资产。独立路由 /api/analyst/*
风控监测 Agent
预警台账、适当性、AML、模拟交易触发规则。代码:app/service/risk/*
群聊:一次请求里谁跟谁说话
理财师问「客户 CUST-9527 持仓如何」——简化对话:
代码地图(改功能前先找门)
客户打开「客户助手」时,编排跑在哪?
模块 3 · 进门钥匙
JWT 与 X-Agent-Type:
两套门禁别混
JWT 证明「你是谁」;X-Agent-Type 证明「你正在敲哪扇窗」。本项目里有两套验法,混用会 401。
两条通道(背下来能少踩一半坑)
| 场景 | 鉴权函数 | X-Agent-Type |
|---|---|---|
| 对话 / 风控 REST | get_auth_context | 必须(customer/advisor/risk/analyst) |
| 平台只读 / 问数 | get_platform_auth_context | 不要 |
| 模拟交易 | get_auth_context | 要;且角色需 risk_demo 或客户本人 |
risk.ts 曾缺 X-Agent-Type: risk,JWT 正确也会 401。指挥 AI 接新 REST 时记得对照这条表。
agent_type = request.headers.get("X-Agent-Type")
if not agent_type:
raise ApiError(401, "AUTH_401_MISSING_AGENT_TYPE")
assert_agent_access(auth, agent_type, ...)
读请求头:你声明自己是 customer 还是 risk?
没声明 → 直接 401,连业务代码都进不去。
再查矩阵:STAFF-30001 能不能走 risk 线?客户 token 能不能走 advisor 线?
Demo 账号(本地登录页一键用)
改 宿主 JWT 签发/验签(jwt_service.py)宿主 JWT 签发/验签 里角色后,必须重新登录 才会拿到新 JWT。
客户「我的持仓」页调 /api/customers/.../holdings,要带 X-Agent-Type 吗?
模块 4 · 数据从哪来
双 MySQL、Redis、
模拟 Core 与风控引擎
没有真实银行 Core。L0 事实(客户、持仓、流水)在 jinrong_core 模拟库;
Agent 会话、预警、审计在 jinrong_agent。像前台展示用的假金库 + 后台自己的笔记本。
分层速记
- L0 —
jinrong_core只读(Tool / 问数 SQL _guard 白名单) - L1/L2/L3 画像 — agent 库 MySQL 表(客户/顾问/风控 enrich)
- 会话窗口 — Redis(TTL 2h,挂了会降级回 MySQL)
- RAG — Milvus 向量库 +
data/kb/产品手册
风控演示:模拟交易 → 出预警
A-3 预设:CUST-3001 · 50 万 · 大额预警
# 分析 Agent 只读 SELECT,customer 域强制 self
assert_analyst_query_access(auth)
# 客户问数:仅趋势/统计,尾部「AI 分析有风险」
问数不是随便跑 SQL:先过权限域,再过只读与白名单。
客户角色不能查别人的数据,也不能给投资建议(产品规则写死在 guardrail)。
项目硬规则:Agent 能不能直接改 Core 里客户的「正式风险等级」?
模块 5 · 现状与下一步
现在做到哪?
怎么本地跑起来
分支 merger · 测试基线 825 pytest · 前端 22 Vitest · Redis Docker 6380。
文档入口:docs/memory/MEMORY.md §0 · 答辩提纲 docs/答辩/答辩知识点清单.md · 滚动版见模块 8。
已完成(2026-09-10 快照)
✓ 平台 API v0.1
客户/产品/顾问/合规只读 REST
✓ 四 Agent 对话 + SSE
客服 Wave3 · 游客 1B · customer 14 节点
✓ 问数 S3 + D-06
模板填参 · 结果缓存 + 写侧 bump · 问数 UI 标签
✓ 风控 + 前端 P0
台账/模拟/AML 页 · prepare_all.ps1 灌库
仍开放(指挥 AI 前先心里有数)
- 接口契约发群(稿在
docs/项目管理/接口契约发群-2026-09-09.md) - 风控演示种子 / cron 脚本(运维向,见 TODO)
- 画像 Redis L1/L2 热缓存未全接
- 口径字典种子 SQL 需本机执行一次
本地启动(最小路径)
pip install -r requirements.txt
.\scripts\demo\prepare_all.ps1 或 .\scripts\core\reset.ps1
.\scripts\dev\start-redis.ps1 → 6380
uvicorn app.main:app --reload :8000
cd web && npm run dev → :5173 代理 API
python -m pytest 验收 825 绿
模块 6 · 硬阀门
改代码前先念五条
踩了就是合规事故
四 Agent 可以各自演进,但有几条是全项目硬阀门——不是「最好遵守」,是写进合规文档、测试也会卡住的规则。 指挥 AI 加功能前,先用这张表判断「能不能做」。
五条硬阀门(2026-09 快照)
① Core 正式 C1~C5 不可被画像覆盖
L0 风评在 jinrong_core 是权威;L1 画像 enrich 只能辅助,不能改正式等级。
② 审计表只 INSERT
audit_log / input_guard_log 等只追加、不 UPDATE/DELETE——留痕不可篡改。
③ 仅 R-02 可阻断交易
适当性不匹配可在网关拦单;R-01/R-03 只生成预警,不自动冻户。
④ 代理人草稿不外发
顾问 Agent 产出是草稿;没有「一键发给客户」API,须人工复核后才能外用。
⑤ 四 Agent 不互调 LLM
跨角色协作走 L1/L2/L3 画像表与 risk_alert,禁止 A 调 B 的 LangGraph。
数据流:谁有权改什么
点击「下一步」看写入边界
AI 建议「大额预警命中就自动冻结账户」,你怎么回复?
模块 7 · 未实现对照
文档写了 ≠ 代码有
2026-09 快照表
指挥 AI 时最容易把「需求规格里的 P0」当成「仓库已经做完」。
下表是课程专用快照(不写入项目记忆文件),对照 merger 分支实际代码。
已实现(别重复造轮子)
未实现 / 演示停在某层(指挥 AI 前先查)
空壳 API
知识库空壳 API(knowledge.py)· 管理空壳 API(admin.py)空壳 API — T-21 拍板一期只做脚本入库,无上传/重建端点。
T-20 顾问工作台
A-03 话术草稿复核 · A-05 合规巡检台 · A-06 跟进草稿入库 — prompt 有约束,无前端/表流程。
前端仍简版
风控 P1 已接(筛选/适当性/AML)· 看板无钻取 · 分析 Chat 仍占位 · 平台适当性按钮部分未接。
运维 cron 无 UI
FR-9 超期升级 cron(escalation_scan.py)FR-9 cron · FR-10 行为扫描 cron(agent_behavior_scan.py)FR-10 cron — 引擎在,须手动跑脚本。
演示边界
转人工 = API 字段 + 橙色 Tag · debug 头仅 dev · 脱敏默认关 · 无真呼叫中心排队。
画像热缓存
L1 Redis 全量热缓存 · L2 Repository — 客服线部分已接,宿主/顾问未全接。
REQUIREMENTS.md 部分 Wave 条目仍标「未做」,与代码不同步——以本表 + 各模块深潜课为准。
鉴权三线速查(跨课总表)
对话 Chat → get_auth_context + X-Agent-Type
问数/平台 → get_platform_auth_context(无 Agent 头)
风控 REST → get_auth_context + X-Agent-Type: risk
401 MISSING_AGENT_TYPE:Chat 忘了带头,不是 JWT 坏了。
问数页加 X-Agent-Type: analyst 是错方向——会走错鉴权栈。
持仓页用平台鉴权,不要 Agent 头——和 Chat 不是一套。
AI 说「补全 knowledge 上传 API 就能用 RAG」,你怎么回?
模块 8 · 答辩动线
5~8 分钟 Demo
+ 必背铁律
对照 docs/答辩/答辩稿.md 与 DEMO-SOP-答辩全流程.md:先讲清四角色不互调 LLM与合规铁律,再按动线展示业务,收口讲四角色价值(不口播缺陷与测试数)。
手册 docs/答辩/README.md · 幻灯片 · 答辩稿 · 功能测试(内部)。
30 秒总架构(开口即说)
分层
浏览器 → FastAPI → 编排 service → tool/repository → 双库 MySQL + Redis + Milvus
四条入口
Chat · 客服 14 节点 · 问数 + analyze · /api/advisor-agent 顾问 REST(2026-09-12 合入)
铁律
L0 画像不可覆盖 · 仅 R-02 可阻断交易 · 风控不自动冻户 · 审计只 INSERT
推荐演示顺序(动画)
灌库:prepare_all.ps1 + seed_advisor_agent.ps1 · SOP + 幻灯片见 docs/答辩/
群聊:评委问「四个 Agent 为什么不互相打电话?」
诚实边界(主动说加分)
- 客户交易 2026-09-13:选购清单 · Modal · holding 同步(工作区未 commit)
- 顾问 REST 已合入 · T-20 / KYC D2 / D3 open
- L0 是模拟 Core,不是真银行托管库
- 问数与 Chat 已拆分 · D-09 多轮 · D-12 钻取 open
- 看板无钻取 · 行情 Phase B 草案未接
- 知识库 T-21 脚本入库,上传 API 一期不做
评委:「刷新 Dashboard 会先红一下再正常,是不是没做错误处理?」
docs/答辩/答辩知识点清单.md · 深潜按角色打开 课程中心。