Context 与定位
本方案使用 AgentScope-Java v2.0 构建「银行智能中台」(代号:龙虾),定位为基础服务层——不直接面向终端用户,而是作为其他业务系统的后端能力引擎被调用。
龙虾的定位边界
做什么:提供 AI Agent 对话能力 + 30万存量服务工具化封装 + 统一的智能工具调度入口。
不做什么:不做终端用户认证(由上游渠道完成)、不做 IM/消息渠道、不做业务流程编排(由调用方系统负责)。
鉴权模型:三维授权体系
龙虾作为基础服务,调用方来自三个维度的交叉,鉴权模型必须从传统 RBAC 升级为三维 ABAC:
三维主体矩阵
| 维度 | 行内员工 (B2E) | 对公客户 (B2B) | 对私客户 (B2C) |
|---|---|---|---|
| 身份标识 | 工号 (HR/UM系统) | 企业客户号 (ECIF) | 个人客户号 (CIF) |
| 身份来源 | 行内 LDAP/统一用户中心 | 核心客户信息系统 | 核心客户信息系统 |
| 典型角色 | 客户经理 / 风控审批 / 柜员 / 运营 | 企业法人 / 财务 / 经办人 | 个人持卡人 |
| 数据可见范围 | 所属机构 + 岗位授权范围 | 仅限本企业及关联企业 | 仅限本人 |
| 接口可见性 | 按角色 + 系统白名单 | 按产品签约 + 企业类型 | 按产品持有 + 客户等级 |
渠道维:调用方系统身份
龙虾不直接面向终端用户,所有调用来自上游业务系统。每个渠道具有不同的可信等级和接口权限集:
| 渠道类型 | 典型系统 | 认证强度 | 典型调用场景 |
|---|---|---|---|
| 内部业务系统 | 信贷系统 / 风控系统 / 柜面 | 高(行内 SSO + mTLS) | 客户经理查客户征信 → 龙虾调CBS接口 |
| 电子渠道 | 手机银行 / 网银 / 小程序 | 中(用户已登录 + 设备指纹) | 客户问"我的贷款额度" → 龙虾调零售信贷接口 |
| 外部合作方 | 第三方支付 / 银联 / 合作平台 | 低(仅限特定API + 证书绑定) | 合作方查产品利率 → 龙虾调产品信息接口 |
| 管理后台 | Web Dashboard | 高(管理员工号 + OTP) | 租户管理员配置工具白名单 |
数据维:谁能看什么数据
鉴权不仅控制"能否调接口",还控制"能看什么数据"。数据范围分三级:
| 数据范围 | 说明 | 适用场景 |
|---|---|---|
| SELF | 仅限数据主体本人/本企业 | C端客户查自己的账户/征信/贷款 |
| BRANCH | 所属分行/支行范围内 | 客户经理查本支行所有客户 |
| ALL_AUTHORIZED | 按角色+产品签约的完整授权范围 | 风控审批员跨支行评估风险 |
令牌传播链:渠道认证 → 龙虾授权
龙虾不做终端认证,而是信任上游渠道已完成的认证,通过令牌传播链实现鉴权:
终端用户 (员工/客户) │ [渠道完成认证] │ 手机银行 → 密码/生物识别 │ 柜面 → 工号+密码+OTP │ 信贷系统 → 行内SSO ▼ 渠道系统 │ 调用龙虾时携带: │ ┌─────────────────────────────────┐ │ │ X-Channel-Id: credit-system │ ← 谁在调我 │ │ X-End-User-Type: EMPLOYEE │ ← 终端用户类型 │ │ X-End-User-Id: EMP-00342 │ ← 终端用户标识 │ │ X-Data-Scope: BRANCH │ ← 数据范围 │ │ X-Tenant-Id: branch-beijing │ ← 所属租户 │ │ Authorization: Bearer <JWT> │ ← 渠道签发的JWT │ └─────────────────────────────────┘ ▼ 龙虾 (基础服务) │ 验签 → 解析三维上下文 → 决定可用接口+数据过滤 │ ├─ 1. 验渠道签名 → 确认调用来自合法渠道 ├─ 2. 解析用户身份 → EMPLOYEE / CORP_CUSTOMER / RETAIL_CUSTOMER ├─ 3. 叠加数据范围 → SELF / BRANCH / ALL_AUTHORIZED └─ 4. 执行工具调用 → 仅返回授权范围内的数据
核心设计决策:为什么是令牌传播而非统一认证
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 统一认证中心 (所有渠道跳转龙虾登录) | 权限集中管控 审计日志完整 | 渠道接入成本高 用户体验割裂 存量系统改造大 | 新建系统、 渠道数量少 |
| 令牌传播 (渠道认证后签发JWT) | 渠道零改造接入 终端用户体验无感 存量系统友好 | 需信任渠道认证强度 需渠道签名校验 | 已有多个渠道 存量系统多 (本方案选择) |
| 混合模式 (关键操作回源验证) | 安全性与便利性平衡 | 实现复杂度最高 | 金融交易等高安全场景 |
风险提示
令牌传播的核心风险是"渠道认证强度不一致"——柜面系统使用工号+OTP(高安全),手机银行可能仅用密码+设备指纹(中安全)。龙虾需要根据渠道认证强度,对高风险操作(大额转账、授信审批)追加二次确认。
架构总览(5 层扩展版)
原 5 层架构不变,但 Gateway Layer 从单纯的"多租户路由"升级为"三维鉴权网关":
┌──────────────────────────────────────────────────────────────────┐
│ Web Dashboard (唯一前端) │
│ Vue3 + Arco Design │ SSE流式 │ 租户管理 │ 审计 │ 工具市场 │
└──────────────────────────┬───────────────────────────────────────┘
│ SSE / HTTP REST
┌──────────────────────────▼───────────────────────────────────────┐
│ Gateway Layer ★ 升级为三维鉴权网关 │
│ │
│ ┌──────────────┐ ┌────────────────┐ ┌─────────────────────┐ │
│ │ 渠道签名校验 │ │ 三维上下文构建 │ │ 令牌校验 + 范围裁剪 │ │
│ │ ChannelId→ │ │ User×Channel │ │ JWT验签 → DataScope│ │
│ │ 公钥验签 │ │ ×DataScope │ │ → 预过滤 BitMap │ │
│ └──────────────┘ └────────────────┘ └─────────────────────┘ │
│ │
│ Spring Boot 3.5 + WebFlux │ Redis Session │ Nacos 注册 │
└──────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────────────┐
│ Agent Orchestration Layer (智能体编排) │
│ Master Agent → Router Agent → Sub-Agent Pool │
│ 信贷 │ 风控 │ 客服 │ 数据查询 │ 运营 │ 合规 │ IT运维 │ ... │
└──────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────────────┐
│ Capability Layer (能力层) │
│ Tools (30万服务) │ Skills 技能库 │ Memory 三层记忆 │ Sandbox │
└──────────────────────────┬───────────────────────────────────────┘
│
┌──────────────────────────▼───────────────────────────────────────┐
│ Enterprise Service Integration (30万存量服务集成) │
│ 元数据注册 → ToolDefinition自动生成 → 动态调用 │
└──────────────────────────────────────────────────────────────────┘
关键技术决策与分析
| 决策点 | 选型 | 依据 | 替代方案 | 优缺点 |
|---|---|---|---|---|
| Agent 框架 | AgentScope-Java v2.0-RC2 | 分布式+事件系统+Middleware完整,天然支持多Agent编排 | LangChain4j / Spring AI / 自研 | ✓ 原生Java生态,无 Python 依赖;✗ RC2 尚未GA,API可能变动 |
| 唯一交互界面 | Web Dashboard(无IM) | 银行内网环境,浏览器天然可用;IM渠道需额外适配 | 企业微信/钉钉/飞书 Bot | ✓ 零渠道适配成本;✗ 员工需打开浏览器,不如IM方便 |
| 鉴权模型 | 三维ABAC(用户×渠道×数据范围) | 调用方包含行内员工+C端客户,渠道多样,传统RBAC无法覆盖 | 纯RBAC / OAuth2.0 Scope / OPA策略引擎 | ✓ 覆盖全场景;✗ 实现复杂度高,上下文传播需全链路治理 |
| 30万服务集成 | 自动发现+动态Tool生成 | 手工封装需225人年,物理不可行 | 手工MCP Server封装 / API网关手动配置 | ✓ 唯一可行方案;✗ 依赖OpenAPI覆盖率(当前~40%) |
| 多租户隔离 | Workspace物理隔离 + 三维TenantContext | 银行合规底线:租户间数据不可互见 | 逻辑隔离(单DB+tenant_id列)/ 混合模式 | ✓ 安全最高;✗ 资源开销大,每租户独立Agent实例 |
| 通信协议 | SSE(对话流)+ HTTP REST(管理API) | 比WebSocket简单可靠,银行内网丢包率低 | WebSocket / gRPC Stream | ✓ 防火墙友好,无协议升级;✗ 单向流,客户端不能中途发指令 |
30万存量服务集成策略
核心思路:ToolDefinition 而非 MCP Server
这是整个方案最关键的差异化设计。面对30万存量服务,手工封装 MCP Server 需要 225 人年,物理不可行。本方案的核心创新是:自动化产物是数据库记录(ToolDefinition),而非进程(MCP Server)。
| 对比维度 | 手工MCP模式 | 自动化ToolDefinition模式(本方案) |
|---|---|---|
| 产物 | 每个服务一个MCP Server进程 | 每条API一条ToolDefinition记录(~2KB) |
| 30万服务资源 | 15TB内存 + 30万进程 | ~600MB数据库 + 0新进程 |
| 启动速度 | MCP Server冷启动2-5s | 无需启动,随查随用 |
| 新服务上线 | 需手工编写+部署 | 注册中心出现 → 10分钟内自动可用 |
| 调用链 | Agent → MCP Client → MCP Server → 真实服务(多一跳) | Agent → ServiceInvoker → 真实服务(直连) |
| 维护成本 | 30万个进程的运维监控 | 1个ServiceInvoker通用组件 |
自动化管道
注册中心(Nacos/Eureka) → 元数据提取 → LLM描述增强 → 分组标注
每10分钟增量同步 OpenAPI/Swagger qwen-turbo批量 按客群/业务线
gRPC Reflection 原始 → 语义增强 自动分类
API Gateway元数据
→ ToolDefinition入库 → 工具市场上架 → 租户启用 → Agent可调用
PostgreSQL+pgvector 状态:待审核 人工一次配置 零人工
+Elasticsearch全文索引
元数据覆盖率与降级策略
自动生成的工具质量取决于上游API文档的完整度。对不同类型的服务采用分级处理:
| 元数据质量 | 预期占比 | 处理方式 | 工具质量 |
|---|---|---|---|
| OpenAPI/Swagger 完整 | ~40% | 完整解析 name/desc/params/response schema,LLM增强描述 | ⭐⭐⭐⭐⭐ 高 |
| gRPC Proto Reflection | ~15% | Proto 解析 → method/field映射 → 补充业务描述 | ⭐⭐⭐⭐ 较高 |
| API Gateway 基础元数据 | ~35% | 提取 path+method+基础参数 → LLM推断业务语义 | ⭐⭐⭐ 中等 |
| 无元数据(遗留系统) | ~10% | 仅生成占位ToolDefinition(name+path),标记"待完善" | ⭐⭐ 低(需人工补文档) |
实用主义策略
优先保障核心系统(CBS/CRM/风控/信贷等前20%高频服务)的工具质量,这些系统通常已有完整OpenAPI文档。长尾遗留系统允许低质量占位,逐步补文档——80%的Agent调用集中在前20%的工具上。
核心挑战:30万工具 × 64K 上下文 → 准确高效调用
问题量化
30万工具 × 每工具~300 tokens = 9000万 tokens。64K上下文可用空间约40K tokens,单次可装载工具 ≤ 130个——仅占全部工具的 0.04%。必须把工具选择变成一个三级过滤漏斗。
三级过滤漏斗
30万工具
│
▼
┌──────────────────────────────────────────────────────────┐
│ Layer 0: 确定性预过滤 (Deterministic Pre-filter) │
│ ★ 核心创新:三维上下文硬过滤 │
│ │
│ 用户画像 × 渠道权限 × 数据范围 → BitMap AND 运算 │
│ │
│ 规则1: 渠道 → 手机银行看不到柜面专用接口 │
│ 规则2: 用户类型 → C端客户看不到员工管理工具 │
│ 规则3: 客群/角色 → 对公客户经理物理看不到对私储蓄工具 │
│ 规则4: 地区 → 北京分行看不到上海分行专属服务 │
│ 规则5: 已开通系统 → 未签约产品对应接口不可见 │
│ 规则6: 数据范围 → SELF/Branch/ALL 三级过滤 │
│ 规则7: 合规评级 → 低评级用户看不到高风险操作 │
│ │
│ 效果: 30万 → 500~3000(削减 99%+) │
│ 延迟: < 5ms (纯内存BitMap) 确定性: 100% 无遗漏 │
└──────────────────────────┬───────────────────────────────┘
│ ~2000 候选
▼
┌──────────────────────────────────────────────────────────┐
│ Layer 1: 意图提取 + 混合检索 │
│ Dense(向量) + Sparse(BM25) → RRF融合 → Top-100 │
│ 延迟: < 80ms 命中率: >95% │
└──────────────────────────┬───────────────────────────────┘
│ 100 候选
▼
┌──────────────────────────────────────────────────────────┐
│ Layer 2: 精排 + Agent上下文注入 │
│ Cross-encoder → 100→15 注入Agent context │
│ 延迟: < 150ms 最终准确率: >97% │
└──────────────────────────────────────────────────────────┘
检索准确性保障(六层)
| 层级 | 机制 | 效果 | 可验证性 |
|---|---|---|---|
| L0 确定性预过滤 | 7条规则 × BitMap AND(新增3条渠道/类型/数据范围规则) | 30万→500~3000,100%确定性 | 抽样100用户,验证过滤后工具数 |
| L1 工具描述增强 | LLM离线增强:用途+客群+常见问法+注意事项 | 语义检索命中率提升30%+ | A/B对比增强前后检索效果 |
| L2 混合检索+精排 | Dense+Sparse → RRF → Cross-encoder Rerank | Top-15命中率>97% | 人工标注1000条银行问法 |
| L3 Agent自行验证 | LLM判断检索结果是否匹配意图 → 不匹配则 search_tools() | 首次无结果率<3% | 统计二次检索触发率 |
| L4 用户/租户个性化 | 高频工具加权 + 协同过滤 | 常用工具排第一 | 统计首位工具点击率 |
| L5 人工反馈闭环 | Dashboard「工具选错了」按钮 → 回流校准Reranker | 持续优化 | 误调用率趋势图 |
为什么预过滤必须是确定性的
向量检索是概率性的(可能漏、可能错),但在银行场景,某些"漏"和"错"不可接受——对公客户经理看到对私储蓄工具 → 合规事故;未签约产品的API被调用 → 越权。Layer 0 用 BitMap 确定性硬过滤,保证了这类错误的概率为 0。
关键场景走查
场景 1:客户经理查客户征信(B2E 典型场景)
触发: 客户经理在信贷系统输入 "查张三的征信"
│
渠道: 信贷系统 (Channel=credit-system, Auth=mTLS+SSO)
│ Header: End-User-Type=EMPLOYEE, User-Id=EMP-00342, Data-Scope=BRANCH
▼
龙虾 Gateway:
│ Layer 0 预过滤:
│ 规则1: credit-system → 允许信贷/风控/查询类接口
│ 规则2: EMPLOYEE → 允许内部员工工具集
│ 规则3: 客户经理+对公 → 对公信贷类 + 通用查询
│ 规则4: 北京分行 → 北京分行可见的服务
│ 规则5: 已开通CBS,CRM → CBS+CRM的API
│ 规则6: BRANCH → 可查本支行客户数据
│ 规则7: 合规评级HIGH → 全部工具可用
│ → 30万 → 约1200个候选工具
│
│ 意图提取: "查征信" → {intent:征信查询, domain:credit, entity:个人客户}
│ 混合检索: 在1200个候选内 → Top-100
│ 精排: → Top-15 → 注入Agent
│
▼
Agent: 选择 cbs_query_credit_report(idNumber="110101...")
│ 调用前: PermissionMiddleware 验证:
│ ✓ 客户经理可查征信 (角色权限)
│ ✓ 张三在北京分行范围内 (数据范围)
│ ✓ 信用查询是读操作 (自动放行)
▼
ServiceInvoker → CBS核心信贷系统 → 返回征信报告
│ 审计中间件记录: EMP-00342 | credit-system | query_credit_report | 北京分行 | SUCCESS
▼
Agent: "张三征信评分720分,共有3笔贷款记录..." (脱敏展示)
场景 2:C端客户查贷款额度(B2C 典型场景)
触发: 对私客户在手机银行问 "我能贷多少钱"
│
渠道: 手机银行 (Channel=mobile-bank, Auth=密码+设备指纹)
│ Header: End-User-Type=RETAIL_CUSTOMER, User-Id=CUST-88231, Data-Scope=SELF
▼
龙虾 Gateway:
│ Layer 0 预过滤:
│ 规则1: mobile-bank → 仅限电子渠道开放的接口(不含柜面/内部专用)
│ 规则2: RETAIL_CUSTOMER → 仅限C端客户可见工具
│ 规则3: 对私客户 → 对私产品类工具
│ 规则6: SELF → 仅限本人数据(硬限制)
│ → 30万 → 约300个候选工具
│
│ 意图提取: "我能贷多少钱" → {intent:贷款额度查询, domain:retail_loan}
│ 混合检索: 300候选 → Top-50
│ 精排: → Top-10 → 注入Agent
│
▼
Agent: 选择 retail_query_loan_limit(customerId="CUST-88231")
│ 调用前: PermissionMiddleware 验证:
│ ✓ 数据范围=SELF → 只能查 CUST-88231 本人的贷款信息
│ ✓ 渠道=mobile-bank → 贷款额度查询是开放接口
│ ✗ 如果Agent试图调 "修改贷款额度" → DENY(写操作 + 渠道认证强度不够)
▼
ServiceInvoker → 零售信贷系统 → 返回额度信息
▼
Agent: "您目前的可用额度为30万元,其中信用贷20万、抵押贷10万..."
场景 3:跨渠道数据泄漏防御(安全关键场景)
攻击假设:攻击者获取了手机银行的合法Token(C端客户身份),试图通过龙虾查询非本人数据。
攻击路径: 手机银行Token → 龙虾 → 构造请求查他人征信
防御层次:
① Data-Scope=SELF → 硬限制,只能查 CUST-88231 本人
② Layer 0 预过滤 → tool_definitions 的 data_scope 字段 = SELF 的工具
只有"本人可查"标签的接口才出现在候选池
③ PermissionMiddleware → 工具调用前再次校验:
请求的 customerId 必须 == Context.endUserId
不匹配 → DENY + 告警
④ SensitiveDataMiddleware → 即使绕过(理论上不可能),输出脱敏
⑤ AuditMiddleware → 全量记录: 谁、什么时候、从哪个渠道、调了什么、返回了什么
结论: 5层纵深防御。即使单层被突破,后续4层仍可拦截。
银行合规中间件链
龙虾内置5个核心中间件,以责任链模式串联,每次 Agent 操作依次经过。中间件不是"可选插件"而是银行合规的底线实现。
| 中间件 | 拦截时机 | 功能 | 为什么必须 |
|---|---|---|---|
| ChannelAuthMiddleware | 请求到达时 | 验证渠道签名+令牌有效性+构建三维上下文 | 防止非法系统调用龙虾;渠道认证强度分级决定了后续权限决策 |
| PermissionCheckMiddleware | 每次工具调用前 | 工具白名单校验 + 写操作人工确认 + 数据范围校验 | 防止越权操作;写操作必须本人确认(即使角色允许) |
| SensitiveDataMiddleware | 用户输入&LLM输出时 | 身份证/银行卡/手机号自动脱敏 + 疑似泄露告警 | 防止敏感数据通过LLM泄漏(即使内网也可能有日志泄露风险) |
| AuditMiddleware | 每次操作全程 | 全量记录:谁+渠道+操作+入参+出参+耗时+成功/失败 | 银保监会合规要求;事后溯源唯一依据 |
| ComplianceMiddleware | 每次Agent决策后 | 检查Agent输出是否符合监管要求(不推荐非持牌产品、不提供投资建议等) | LLM幻觉可能导致合规风险——Agent可能"建议"客户买非授权产品 |
里程碑规划(12 周)
| 阶段 | 周期 | 核心目标 | 交付物 | 风险点 |
|---|---|---|---|---|
| Phase 1 骨架+单Agent对话 | Week 1-3 | Spring Boot + AgentScope 基础搭建;HarnessAgent 最小可用;Web Dashboard 对话界面 | 可对话的 Dashboard 原型;千问模型联通;基础 Workspace | AgentScope RC2 稳定性;千问模型延迟 |
| Phase 2 多Agent+工具市场MVP | Week 4-6 | Sub-Agent池;Router Agent;动态Tool生成引擎;30万服务扫描器 | 工具市场Dashboard;信贷/风控/客服三个Sub-Agent可用;~100个核心系统工具自动生成 | OpenAPI覆盖率不足导致工具质量差;Router Agent意图识别不准 |
| Phase 3 三维鉴权+合规+企业集成 | Week 7-9 | 三维ABAC鉴权落地;5个合规中间件全部就绪;渠道签名校验;租户物理隔离 | 完整鉴权链路可演示;敏感数据脱敏生效;审计日志可查询 | 渠道对接工作量可能超预期;合规中间件可能误拦截 |
| Phase 4 生产加固 | Week 10-12 | 分布式部署;Sandbox隔离;监控告警;压力测试;安全渗透测试 | 1000并发会话稳定运行;P99延迟<5s;安全测试通过报告 | 性能瓶颈未知;国产化适配(信创) |
关键风险与缓解
| 风险 | 概率 | 影响 | 缓解措施 | 触发信号 |
|---|---|---|---|---|
| AgentScope v2.0 未按预期GA | 中 | 高 | 基于RC2开发核心逻辑,预留升级脚本;备选方案:退回AgentScope v1.x + 自研补缺失功能 | RC3延迟超过4周 |
| 30万服务OpenAPI覆盖率不足40% | 高 | 中 | 三种降级路径(Swagger→gRPC→基础元数据);优先保障核心系统工具质量(前20%高频服务) | Phase 2扫描后覆盖率<30% |
| 三维鉴权上下文丢失/篡改 | 中 | 严重 | 渠道签名校验+JWT防篡改;全链路traceId关联验证;异常上下文自动降级为最小权限 | 审计日志发现上下文不一致 |
| LLM幻觉触发错误业务操作 | 中 | 严重 | 写操作必须人工确认;ComplianceMiddleware拦截不合规输出;关键操作二次确认 | Agent输出含非授权建议 |
| 多租户数据泄漏 | 低 | 严重 | Workspace物理隔离+审计全量+渗透测试;租户销毁时立即清理所有数据 | 渗透测试发现跨租户访问 |
| C端与B2E权限混淆 | 中 | 高 | 三维ABAC的UserType字段决定权限模型分叉;代码审查确保两套逻辑完全隔离 | C端客户成功调用了B2E接口 |
| 银行系统响应慢/超时 | 高 | 低 | 3次重试+降级提示+缓存GET结果;对超过2s的接口异步化 | P95延迟>3s |
验证方式
- Dashboard E2E:打开浏览器 → 登录 → 发送消息 → SSE流式返回 → 工具调用卡片展示 → 审计日志可查询
- 三维鉴权验证:C端客户Token + Data-Scope=SELF → 试图查他人数据 → 被拦截;员工Token + Data-Scope=BRANCH → 可查本支行数据
- 多租户隔离:租户A的Agent调用工具返回"未授权",租户B同名工具正常
- 渠道隔离:手机银行渠道 → 仅开放电子渠道工具集;信贷系统渠道 → 完整内部工具集
- 30万服务扫描:启动后10分钟内完成全量元数据同步,Dashboard工具市场可见新服务
- 合规验证:输入身份证号 → 自动脱敏;尝试write工具 → 被拦截弹确认;Agent输出含投资建议 → ComplianceMiddleware拦截
- 压力测试:JMeter 1000并发SSE连接 → 错误率<1%,P99延迟<5s