对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

开放银行:与MongoDB进行安全数据共享

使用MongoDB Atlas和代理AI构建面向未来的开放式银行生态系统,为同意之旅和数据共享提供支持。

使用案例: 人工智能单一视图个性化

行业: 金融服务

产品和工具: MongoDB Vector SearchMongoDB MCP 服务器MongoDB Queryable Encryption

合作伙伴: LangChain

该解决方案提供了一个开放的银行生态系统,并演示了如何使用MongoDB Atlas和 Agentic AI在机构之间安全地股票财务数据。

了解如何实现代理AI框架,以简化同意审批流程,并为客户提供多银行的合并财务视图。 MongoDB Atlas作为与 BIAN 一致的数据层,为这些开放银行架构提供支持。

图 1:开放银行参考架构

图 1。开放银行参考架构。

点击放大

如图所示,当客户登录 Leafy Bank(我们虚构的金融机构)时,该进程就开始了。客户同意或拒绝访问权限外部数据 — 第三方提供商 (TPP) 数据或其他金融机构数据(在本演示中: MongoDB Bank、NeoFinance 和 Green Bank)。

多代理工作流接收客户请求并执行以下任务:

  • 主管代理:读取对话并将每个请求路由给正确的专家。

  • 同意代理:指导客户与外部银行达成安全数据共享同意。它处理机构选择、同意创建、银行登录、显式客户批准和撤销。

  • 财务建议代理:回答有关客户账户、交易和产品的即席问题,并通过 MCP服务器直接查询MongoDB,分析内部和外部银行的支出。

该演示展示了MongoDB Atlas和代理AI为安全、智能的开放银行工作流程提供支持的以下功能:

以明文形式存储同意记录会将敏感字段暴露给数据库管理员、备份进程和潜在的违规行为。为了防范这些风险,开放银行法规要求机构在每个同意生命周期事件中保护消费者身份:创建、授权、数据检索和撤销。静态加密还可以保护AI代理配置(例如系统提示和工具定义),以限制专有逻辑的暴露。

MongoDB Queryable Encryption通过在驱动程序级别加密敏感字段来解决这个问题,确保服务器永远看不到明文。可以为相等查询配置需要过滤器的字段。驱动程序在发送查询值之前对其进行加密,因此服务器可以在不查看明文的情况下匹配密文。仅需要解密后读取的字段将保持加密,而不支持查询。

该演示在两个地方应用了Queryable Encryption :

  1. 同意集合(openbankingConsents leafy_bank_bian数据库中的 ,由开放银行后端托管),具有四个加密字段:

    • Consumer.UserName

    • Consumer.UserId

    • Permissions

    • SourceInstitution.InstitutionName

    Consumer.UserName字段支持相等查询,因此服务可以列出客户的同意情况,而数据库无需看到明文用户名。

  2. 助手配置文件集合(聊天机器人后端中的openbankingAgentProfiles ),具有三个加密字段:

    • agent_name (equality-queryable)

    • system_prompt

    • tool_config

助手提示是在运行时从加密的MongoDB加载的。Queryable Encryption为每个字段生成一个单独的数据加密密钥。它支持将 AWS Key Management Service ( KMS)、 Azure Key Vault和 Google Cloud KMS作为密钥管理提供程序。

以下示例显示了开放式银行后端的加密连接设置:

from pymongo import MongoClient
from pymongo.encryption_options import AutoEncryptionOpts
class EncryptedMongoDBConnection(MongoDBConnection):
"""Subclasses the standard connection — services that type-hint
MongoDBConnection accept it without modification."""
def __init__(self, uri: str, auto_encryption_opts: AutoEncryptionOpts):
self.uri = uri
self.client = MongoClient(self.uri, auto_encryption_opts=auto_encryption_opts)

同意查询的工作方式与明文相同 —驱动程序透明地处理加密和解密:

# Standard query on a plaintext field — works as usual
consent = consents_collection.find_one({"ConsentId": consent_id})
# Equality query on an encrypted field — same syntax, driver encrypts the filter value
consents = list(consents_collection.find({"Consumer.UserName": user_name}))

加密连接扩展了标准 MongoDBConnection,因此每个对基类进行类型提示的服务都会接受该连接而不进行修改。

财务顾问和消费者经常需要有关帐户数据的临时答案:“我的总余额是多少?”,“显示我最近的 10 笔事务”或“我有资格获得哪些产品?”。为每个可能的查询构建自定义API终结点是不切实际的。

MongoDB MCP 服务器将MongoDB集合公开为 LLM 代理可以直接调用的工具。该演示在应用程序初创企业时将 MCP服务器作为子进程启动,以只读模式将其连接到 leafy_bank_bian数据库,并通过持久会话将生成的工具传递给 LangGraph代理。

以下示例显示了 MCP服务器集成:

from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain_mcp_adapters.tools import load_mcp_tools
mcp_client = MultiServerMCPClient({
"mongodb": {
"command": "npx",
"args": ["-y", "mongodb-mcp-server@latest"],
"transport": "stdio",
"env": {
**os.environ,
"MDB_MCP_CONNECTION_STRING": LEAFY_BANK_MONGODB_URI,
"MDB_MCP_READ_ONLY": "true",
"MDB_MCP_DISABLED_TOOLS": disabled_tools,
},
}
})
# Persistent session keeps MongoDB connection state across tool calls
async with mcp_client.session("mongodb") as session:
all_mcp_tools = await load_mcp_tools(session)
# Pre-connect so the agent never handles connection strings
connect_tool = next((t for t in all_mcp_tools if t.name == "connect"), None)
if connect_tool:
await connect_tool.ainvoke({"connectionString": LEAFY_BANK_MONGODB_URI})
# Only expose read/query tools to the agent
allowed_tools = {"find", "aggregate", "count", "list-collections", "collection-schema"}
mcp_tools = [t for t in all_mcp_tools if t.name in allowed_tools]

叶子银行代理接收这些过滤后的工具以及从 LangGraph 配置中读取经过身份验证的客户标识符的 get_current_user_id 工具。它通过自主生成MongoDB查询来回答自然语言问题 —代理可以执行以下操作:

  • find:用于查找。

  • aggregate:用于计算。

  • Collection-schema:用于发现。

每个集合不需要自定义工具代码。

开放银行工作流程跨越不同的领域 — 同意管理、财务分析和内部银行数据查询。处理所有这三个问题的单个整体代理需要大型工具集和涵盖冲突关注点的系统提示。分成专门的代理可以使每个工具集较小,并且每次提示都有针对性。

主管代理协调以下专家:

  • 同意代理:管理数据共享流。

  • 财务建议代理:通过 MCP服务器分析支出并查询 Leafy 银行数据。

LangGraph 根据意图将每条客户消息路由到相应的专家, MongoDB Atlas通过检查点集合保留对话状态。

以下示例显示了具有结构化输出的监控程序路由:

from langgraph.graph import StateGraph, START, END
from langgraph.checkpoint.mongodb import MongoDBSaver
# Each specialist is built from a factory that loads its system prompt
# from a Queryable-Encryption-backed MongoDB collection at startup.
consent_agent = create_consent_agent(prompts["consent_agent"])
financial_advice_agent = create_financial_advice_agent(
prompts["financial_advice_agent"], mcp_tools
)
supervisor = create_supervisor_node(prompts["supervisor"])
def route_from_supervisor(state: AgentState) -> str:
# The supervisor writes its routing decision to state["next"]
return state.get("next", "FINISH")
workflow = StateGraph(AgentState)
workflow.add_node("supervisor", supervisor)
workflow.add_node("consent_agent", consent_agent)
workflow.add_node("financial_advice_agent", financial_advice_agent)
workflow.add_edge(START, "supervisor")
workflow.add_conditional_edges("supervisor", route_from_supervisor, {
"consent_agent": "consent_agent",
"financial_advice_agent": "financial_advice_agent",
"FINISH": END,
})
workflow.add_edge("consent_agent", "supervisor")
workflow.add_edge("financial_advice_agent", "supervisor")
checkpointer = MongoDBSaver(
client=db.client,
db_name=DATABASE_NAME,
checkpoint_collection_name=CHECKPOINTS_AIO_COLLECTION,
writes_collection_name=CHECKPOINTS_WRITES_AIO_COLLECTION,
)
graph = workflow.compile(checkpointer=checkpointer)

受监管的工作流程(同意批准、KYC 审查、付款授权)需要人工检查点,在这些检查点,代理必须暂停并等待决策,然后才能继续。LangGraph 的 interrupt() 机制通过将完整图表状态序列化为MongoDB并将有效负载返回给调用者来处理此要求。当外部进程完成时,工作流将恢复:

from langgraph.types import interrupt, Command
# Agent pauses, returns review payload to the calling application
review = interrupt({
"type": "APPROVAL_REQUIRED",
"details": approval_details,
})
# Application resumes the workflow after the human decision
await agent.ainvoke(Command(resume=decision), config)

MongoDB Atlas检查点集合会保留完整会话状态:

  • 消息历史记录

  • 主动同意

  • 路由决策

工作流程可承受持续数秒(单击按钮)或数小时(通宵合规查看)的中断。每个子代理运行一个 ReAct 循环(原因 → 行动 → 观察),直到产生最终响应,然后将控制权返回给主管代理以进行下一个路由决策。

该演示使用两个MongoDB Atlas数据库:

  • leafy_bank_bian:此数据库包含运行演示的与 BIAN 一致的共享操作模型,例如客户 (PartyReferenceDataDirectory)、帐户 (CurrentAccount)、事务和产品。此数据库还保存 Queryable-Encrypted openbankingConsents集合和 cachedExternalData集合中的同意记录,该集合存储根据已批准的同意获取的外部数据。

  • open_finance:此数据库包含外部机构的源数据(来自合作机构的 external_accountsexternal_products)以及机构注册表。

绿叶银行拥有并写入 leafy_bank_bian 数据。外部数据是通过同意借用的,而不是拥有的。根据已批准的同意从 open_finance 读取数据,缓存在标有 ConsentIdcachedExternalData 标签中,并在撤销同意或过期时清除数据。它永远不会合并到机构自己的账户和ACID 事务记录中。

以下是集合中文档的示例:

  • accounts (来自 leafy_bank_bian):

    {
    "accountId": "ACC-e0583b3b",
    "accountBank": "Leafy Bank",
    "accountNumber": "212100310",
    "currency": "USD",
    "balance": { "current": 315, "available": 315, "ledger": 315, "hold": 0, "overdraftLimit": 0 },
    "customerSnapshot": { "customerId": "CUST-00528224" },
    "gl": { "accountCode": "2121", "costCenter": "CC-RETAIL-DEFAULT" },
    "productId": "PROD-STD-SA-USD",
    "openedAt": "2024-12-07"
    }
  • openbankingConsents (来自 leafy_bank_bian),在敏感字段上具有Queryable Encryption的同意记录:

    {
    "ConsentId": "urn:greenbank:Cf5b9ff59e06f77",
    "Status": "AUTHORISED",
    "Consumer": { "UserName": "< encrypted >", "UserId": "< encrypted >" },
    "Permissions": "< encrypted >",
    "Purpose": "FINANCIAL_ADVICE",
    "SourceInstitution": { "InstitutionName": "< encrypted >", "InstitutionId": "679a1001a9711d00a3bb01a1" },
    "CreationDateTime": "2026-02-05T10:55:30Z",
    "ExpirationDateTime": "2026-08-04T10:55:30Z",
    "StatusHistory": [
    { "Status": "AWAITING_AUTHORISATION", "DateTime": "2026-02-05T10:55:30Z" },
    { "Status": "AUTHORISED", "DateTime": "2026-02-05T10:56:06Z" }
    ]
    }

外部事务使用与 Leafy 银行自身事务相同的 BIAN 对齐模式— 帐户持有人在发出的事务中显示为付款人,在传入的事务中显示为收款人 — 因此来自不同机构的数据具有一致的形状。

请访问下一节中的 GitHub 存储库,探索解决方案中所有集合的示例数据。

要构建此解决方案,实现以下协调服务:开放银行后端、代理聊天机器人后端和集成用户界面。

要完整实现,请按照相应 Github 存储库中的说明进行操作。

1部分:开放式银行后端(GitHub存储库)

1
  • 创建MongoDB Atlas项目和集群。

  • 创建本演示中使用的两个数据库:leafy_bank_bian 用于内部数据,open_finance 用于外部数据和同意。

2
  • 填充规划文档和自述文件中描述的集合。

  • 加载示例数据以运行端到端参考流程。

3
  • 生成本地主密钥,或为生产配置云KMS (示例AWS KMS)。

  • 运行设置脚本以创建可查询加密的 encrypted_consents集合及其密钥保管库。

4
  • 部署 open-finance-next-gen FastAPI应用(在本地或首选运行时)。

  • 为存储库中记录的MongoDB连接、 KMS提供商和API设置配置环境变量。

5

实现并验证以下任务的安全终结点:

  • 管理同意:为客户创建、批准、撤销和列出同意。

  • 获取外部客户数据:检索按同意范围筛选的帐户、贷款、还款历史记录、身份证明和交易。

  • 缓存外部数据:存储根据已批准同意获取的数据,以便建议代理无需实时重新获取即可读取数据。

  • 计算数据:使用聚合管道确定余额、债务总额和贷款可转移性要约。

按照自述文件中的说明配置索引和同意到期处理(背景清理程序)。

第 2 部分:代理聊天机器人后端GitHub存储库

1
  • 从聊天机器人存储库部署基于 LangGraph 的多代理后端。

  • 配置 LLM提供商(示例,Claude 到Amazon Bedrock)、开放式银行后端的HTTP客户端以及用于设置检查点对话状态的MongoDB连接。

2
  • 运行设置脚本以创建 Queryable-Encrypted encrypted_agent_profiles集合。

  • 播种代理系统提示和工具配置;图表会在初创企业时加载它们。

3

实施主管模式,以便将客户消息路由到正确的代理。配置两个代理以执行以下任务:

  • 同意代理:列出机构、创建同意、触发外部银行登录以及批准或撤销数据共享。它使用 LangGraphinterrupt() 暂停以进行银行登录和显式同意批准。

  • 财务建议代理:回答有关客户账户、交易和产品的即席问题,并分析内部和外部银行的支出。它直接通过只读 MCP服务器查询MongoDB 。

4
  • 在初创企业时将MongoDB MCP 服务器作为子进程启动,并以只读模式连接到 leafy_bank_bian数据库。

  • 仅向财务建议代理公开读取和查询工具(findaggregatecountlist-collectionscollection-schema)。

5
  • 提供 Web 或移动前端可以调用的聊天终结点(示例,具有服务器发送事件的 FastAPI)。

  • 确保终结点流式传输中间消息并处理 LangGraph 中断,以进行银行登录和同意批准。

3部分:集成用户界面(GitHub存储库)

1
  • 部署 open-finance-next-gen-ui Next.js应用,点其指向聊天机器人和开放银行后端URL。
2

运行 README 文件中的参考场景:

  • 连接外部银行并通过AI助手授予同意。

  • 查看内部和外部账户的合并、多银行头寸。

  • 向财务建议代理询问各银行的支出见解。

3
  • 保留操作和同意数据。

  • 支持聚合工作负载和对话检查点。

  • 支持完整的代理同意和建议过程。

有关分步设置命令、环境变量和API 的详细信息,请按照上述每个存储库的 README文件中的说明进行操作。

  • 在MongoDB Atlas上统一开放银行数据:在MongoDB Atlas上统一内部和外部数据集作为操作数据层,以降低集成复杂性和重复。

  • 通过聚合管道简化分析:使用MongoDB聚合管道在单个查询路径中计算内部和外部账户的余额、债务总额和支出分数。

  • 使用MongoDB可查询加密保护敏感同意数据:将Queryable Encryption应用于同意属性,以便您可以对敏感字段查询,同时为受监管的开放银行工作负载保持强大的隐私控制。

  • 利用代理AI简化同意流程:集成基于 LangGraph 的多代理聊天机器人,以自然语言解释同意范围、持续时间和目的,从而减少多银行流程中的放弃并改善客户体验。

  • 使用符合 BIAN 的模型实现数据标准化:根据 BIAN 服务域标准对内部和外部帐户、事务和同意进行建模,以便每个机构的数据保持一致。

  • Saul Calderon

  • Kiran Tulsulkar

  • Ainhoa Múgica

  • Andrea Alaman Calderon