使用MongoDB Atlas和代理AI构建面向未来的开放式银行生态系统,为同意之旅和数据共享提供支持。
行业: 金融服务
产品和工具: MongoDB Vector Search、MongoDB MCP 服务器、MongoDB Queryable Encryption
合作伙伴: LangChain
解决方案概述
该解决方案提供了一个开放的银行生态系统,并演示了如何使用MongoDB Atlas和 Agentic AI在机构之间安全地股票财务数据。
了解如何实现代理AI框架,以简化同意审批流程,并为客户提供多银行的合并财务视图。 MongoDB Atlas作为与 BIAN 一致的数据层,为这些开放银行架构提供支持。
参考架构
图 1。开放银行参考架构。
如图所示,当客户登录 Leafy Bank(我们虚构的金融机构)时,该进程就开始了。客户同意或拒绝访问权限外部数据 — 第三方提供商 (TPP) 数据或其他金融机构数据(在本演示中: MongoDB Bank、NeoFinance 和 Green Bank)。
多代理工作流接收客户请求并执行以下任务:
主管代理:读取对话并将每个请求路由给正确的专家。
同意代理:指导客户与外部银行达成安全数据共享同意。它处理机构选择、同意创建、银行登录、显式客户批准和撤销。
财务建议代理:回答有关客户账户、交易和产品的即席问题,并通过 MCP服务器直接查询MongoDB,分析内部和外部银行的支出。
核心功能
该演示展示了MongoDB Atlas和代理AI为安全、智能的开放银行工作流程提供支持的以下功能:
用于同意和代理隐私的Queryable Encryption
以明文形式存储同意记录会将敏感字段暴露给数据库管理员、备份进程和潜在的违规行为。为了防范这些风险,开放银行法规要求机构在每个同意生命周期事件中保护消费者身份:创建、授权、数据检索和撤销。静态加密还可以保护AI代理配置(例如系统提示和工具定义),以限制专有逻辑的暴露。
MongoDB Queryable Encryption通过在驱动程序级别加密敏感字段来解决这个问题,确保服务器永远看不到明文。可以为相等查询配置需要过滤器的字段。驱动程序在发送查询值之前对其进行加密,因此服务器可以在不查看明文的情况下匹配密文。仅需要解密后读取的字段将保持加密,而不支持查询。
该演示在两个地方应用了Queryable Encryption :
同意集合(
openbankingConsentsleafy_bank_bian数据库中的 ,由开放银行后端托管),具有四个加密字段:Consumer.UserNameConsumer.UserIdPermissionsSourceInstitution.InstitutionName
Consumer.UserName字段支持相等查询,因此服务可以列出客户的同意情况,而数据库无需看到明文用户名。助手配置文件集合(聊天机器人后端中的
openbankingAgentProfiles),具有三个加密字段:agent_name(equality-queryable)system_prompttool_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,因此每个对基类进行类型提示的服务都会接受该连接而不进行修改。
使用MongoDB MCP 服务器 进行代理数据访问
财务顾问和消费者经常需要有关帐户数据的临时答案:“我的总余额是多少?”,“显示我最近的 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:用于发现。
每个集合不需要自定义工具代码。
使用 LangGraph 进行多代理编排
开放银行工作流程跨越不同的领域 — 同意管理、财务分析和内部银行数据查询。处理所有这三个问题的单个整体代理需要大型工具集和涵盖冲突关注点的系统提示。分成专门的代理可以使每个工具集较小,并且每次提示都有针对性。
主管代理协调以下专家:
同意代理:管理数据共享流。
财务建议代理:通过 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-EncryptedopenbankingConsents集合和cachedExternalData集合中的同意记录,该集合存储根据已批准的同意获取的外部数据。open_finance:此数据库包含外部机构的源数据(来自合作机构的external_accounts和external_products)以及机构注册表。
绿叶银行拥有并写入 leafy_bank_bian 数据。外部数据是通过同意借用的,而不是拥有的。根据已批准的同意从 open_finance 读取数据,缓存在标有 ConsentId 的 cachedExternalData 标签中,并在撤销同意或过期时清除数据。它永远不会合并到机构自己的账户和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 存储库中的说明进行操作。
第 2 部分:代理聊天机器人后端(GitHub存储库)
有关分步设置命令、环境变量和API 的详细信息,请按照上述每个存储库的 README文件中的说明进行操作。
关键要点
在MongoDB Atlas上统一开放银行数据:在MongoDB Atlas上统一内部和外部数据集作为操作数据层,以降低集成复杂性和重复。
通过聚合管道简化分析:使用MongoDB聚合管道在单个查询路径中计算内部和外部账户的余额、债务总额和支出分数。
使用MongoDB可查询加密保护敏感同意数据:将Queryable Encryption应用于同意属性,以便您可以对敏感字段查询,同时为受监管的开放银行工作负载保持强大的隐私控制。
利用代理AI简化同意流程:集成基于 LangGraph 的多代理聊天机器人,以自然语言解释同意范围、持续时间和目的,从而减少多银行流程中的放弃并改善客户体验。
使用符合 BIAN 的模型实现数据标准化:根据 BIAN 服务域标准对内部和外部帐户、事务和同意进行建模,以便每个机构的数据保持一致。
作者
Saul Calderon
Kiran Tulsulkar
Ainhoa Múgica
Andrea Alaman Calderon