行业: 金融服务
MongoDB 产品: MongoDB Atlas、MongoDB 向量搜索、Change Streams、MongoDB 时间序列集合、MongoDB 聚合管道
合作伙伴: Amazon Bedrock、LangChain
解决方案概述
传统借贷系统依赖彼此割裂的旧版应用程序,而这些应用程序并非为实时数据、自动化或数字优先的客户数体验而构建。客户现在期望获得即时决策和完全透明度,而贷款机构则应对日益上升的风险、监管压力和日益增长的数据复杂性。
此解决方案展示如何构建现代化的数字借贷系统。它用数据驱动的实时工作流程取代了线性的、依赖纸质文件的流程,该工作流程将发起、审批、批准、拨款和服务连接到一个管道中。
为什么选择 MongoDB?
代理工作流会产生几种不同类型的状态:操作记录、嵌入、活动指标以及代理自身的内存。每种类型的独立系统会增加基础设施,并在这些系统之间产生一致性问题。MongoDB Atlas 将所有这些集中存储在单一现代化数据平台中,并使用单一查询语言,从而减少集成工作量。
模式灵活性和 document model
贷款申请在其生命周期中,会从借款人、文档、信用数据、风险指标和决策中积累详细信息。它保持为一个可增长的文档,而不是分散在十几个表中的实体,每次读取时都需要连接。
多态详情天然适合此模型。雇佣收入和自雇收入在同一数组中包含不同的字段,不包含可为空的列,也没有子类型表。
代理生成的字段无需迁移即可出现。当承保代理添加新指标时,它直接写入字段,无需协调模式更改,也无需部署排序。
Atlas Vector Search 用于语义理解
嵌入存在于它们描述的文档中。一次查询可以返回语义匹配及其业务数据,无需同步数据库和独立的向量索引。
预过滤将搜索范围限定为单个应用程序。这可以防止一个借款人的文档出现在另一个借款人的搜索结果中,将访问控制要求转变为搜索参数,而不是应用程序逻辑。
聚合管道用于可解释的评分
风险评分在数据所在处运行。一个管道连接信用和收入记录,提取比率,并返回一个有界分数,无需向应用程序代码进行数据传输。
由于计算是声明式的,该解决方案将每个阶段暴露给界面。可解释性成为实现的一部分,而不是单独的报告工作。
使用 Change Streams 实现实时接口
业务员队列、借款人状态跟踪器和活动日志都从数据库读取更改事件。没有单独的消息代理介于已提交的写入和显示它的接口之间。
连接失败后,流会从存储位置恢复,因此,短暂的网络故障不会在 Atlas 审核流中产生间隙。
LangGraph 用于代理内存的 MongoDB 检查点程序
- 工作流状态在每个步骤中持久存储到 Atlas。为人工查看而暂停的应用程序不会因重启和重新部署而失效,并保留完整上下文恢复运行。
这些功能相结合,使单一平台能够从文档接收、审批、人工查看和组合监控等环节,从始至终承载代理借贷工作流,无需多数据库架构所需的集成界面。
参考架构
该解决方案由以下部分组成:
前端:体验层:Borrower Portal、Loan Officer 仪表盘、Demo Flow 和 Renewal 仪表盘。
后端:一个 FastAPI 服务,托管 LangGraph 代理管道,并通过 REST、SSE 和 WebSocket 公开。
MongoDB Atlas:用于运行记录、向量、时间序列指标、实时变更事件和代理内存的智能数据平台。
AI 与可观测性:Amazon Bedrock (Claude Haiku 4、用于结构化输出的工具使用)、和 Voyage AI (多模态嵌入)。
图 1。高级架构:基于 MongoDB 的代理式借贷。
助手
LangGraph 代理管道由以下部分组成:
图 2。代理式流。
监督器:在每个步骤之后检查工作流状态,并决定下一个操作:扩展以收集数据、进行审核、升级给人工处理,或完成。它管理重试策略和暂停条件,当应用程序因为借款人输入而受阻时。
文档验证器:检查文档类型是否完整,标记失败的提取,通过对提取的文本进行哈希运算检测重复上传,并对文档中的申请人姓名进行交叉检查。
信用检索器:检索针对应用程序中的每个借款人的征信机构记录,并将分数附加到工作流状态。
贷款应用程序代理:综合收集的文档和信用数据,整理成一个连贯的应用程序情况说明,并推进应用程序状态。
保险承保人:运行风险聚合,计算可承受比率和压力测试,通过向量搜索检索管理策略,并产生结构化建议:批准、拒绝或升级。
应用程序助理代理: 在管道之外运行,并利用他们自己的文件和政策语料库中的上下文回答借款人问题。
主管并行派遣文档验证员和信用查询员。文档提取和信用检索彼此没有依赖关系,因此,同时进行它们可以删除管道中最长的顺序等待。
图 3。LangGraph 代理管道。
自主性和人工监督(人工在环)
监督器在四种自主模式之一下运行:观察、建议、受限或自动。默认有界限的设置使管道在策略限制内自主运行,并在触发阈值时向负责人报告。示例,采购价格超过 $500K 或 GDS/TDS 比率超过策略限制。每个审批人员决策(批准、拒绝或修改并继续)都带有审批人员的 ID,并写入不可变的 Atlas 审核集合中。管道会通过 LangGraph checkpointer 恢复运行,因此,人工审核不会导致工作流状态丢失。
数据模型方法
该工作流会产生以下类型的数据,而 MongoDB Atlas 则会存储所有这些数据:
结构化的运营记录:每条记录在贷款生命周期中逐步发展,以一个不断增长的文档形式存在,而不是跨表连接的固定行。
集合:应用程序、借款人、信用报告、聊天记录、主管、续订。
{ _id: ObjectId('67500c01000000000000a002'), id: ObjectId('67500c01000000000000a002'), loansId: 'APP-2026-00011', borrowerIds: [ ObjectId('67500b01000000000000f002') ], borrowerNames: [ 'Grace Hopper' ], loanAmount: NumberInt('595000'), purchasePrice: NumberInt('850000'), downPayment: NumberInt('255000'), product: '7yr Fixed (30yr Amort)', property: { address: '226 W 108th St, New York City, NY 10025', type: 'Detached', purchasePrice: NumberInt('850000'), annualTax: NumberInt('11200') }, incomeSummary: { combinedGross: NumberInt('110400'), primary: NumberInt('110400'), coApplicant: null }, existingMonthlyDebt: NumberInt('0'), status: 'approved', statusHistory: [ { status: 'submitted', timestamp: ISODate('2026-03-05T14:32:11.000Z'), detail: 'Application received' }, { status: 'underReview', timestamp: ISODate('2026-03-07T10:00:00.000Z'), detail: 'Bureau pull complete; in underwriting' }, { status: 'conditionallyApproved', timestamp: ISODate('2026-03-12T15:30:00.000Z'), detail: 'Conditional approval pending appraisal' }, { status: 'approved', timestamp: ISODate('2026-03-20T11:15:00.000Z'), detail: 'Final approval issued' } ], createdAt: ISODate('2026-03-05T14:32:11.000Z'), updatedAt: ISODate('2026-03-20T11:15:00.000Z'), seedComplete: true }
带有向量的非结构化内容:提取的 PDF 文本及其 1024 维嵌入 (voyage-multimodal-3.5) 存储在同一个文档中,因此一次查询可以同时返回语义匹配及其业务数据。
集合:文档、策略。
{ _id: ObjectId('69deb9600e702ecf5ed0b9c5'), application_id: 'APP-2026-00002', doc_type: 'government_id', filename: '01_government_id.pdf', extracted_text: 'This is a British Columbia Government Identification Card document package issued by ServiceBC Registry Services on March 1, 2024 (Document Reference: SA-2024-BC-00847). The package contains identification cards for two individuals: Jane Marie Doe (applicant), born March 14...', structured_data: { persons: [ { full_name: 'Jane Marie Doe', date_of_birth: '1992-03-14', gender: 'F', height: '5\'7"', address: null, id_number: 'BC-7241-5583-JMD', expiry_date: '2029-03-14' }, { full_name: 'John Robert Doe', date_of_birth: '1990-08-22', gender: 'M', height: '5\'10"', address: null, id_number: 'BC-8392-6147-JRD', expiry_date: '2029-08-22' } ], text_summary: 'This is a British Columbia Government Identification Card document package issued by ServiceBC Registry Services on March 1, 2024 (Document Reference: SA-2024-BC-00847). The package contains identification cards for two individuals: Jane Marie Doe (applicant), born March 14, 1992, female...', issuing_authority: 'ServiceBC -- Registry Services', issuing_address: 'Service BC, 4946 Canada Way, Burnaby, BC V5G 4J6', issue_date: '2024-03-01', document_reference: 'SA-2024-BC-00847', document_type: 'Government Identification Card', jurisdiction: 'British Columbia, Canada', note: 'SYNTHETIC DOCUMENT -- FOR DEMONSTRATION PURPOSES ONLY' }, embedding: [ Double('0.0546875'), Double('-0.00074005126953125'), Double('-0.03955078125'), Double('0.018798828125'), ...... ], embedding_type: 'multimodal', embedding_pages: NumberInt('1'), status: 'parsed', created_at: ISODate('2026-04-14T22:02:08.271Z') }
代理内存:LangGraph 每线程省/市/自治区,因此,暂停的工作流可以从停止的位置准确恢复。
集合:检查点、检查点写入和检查点元数据。
{ _id: ObjectId('69deb00d938a6c352b22f83c'), thread_id: 'APP-2026-00002', idx: NumberInt('0'), checkpoint_id: '1f138480-5fd5-6ee2-bfff-20577a825d23', checkpoint_ns: '', task_path: '~__pregel_pull, __start__', task_id: 'd8f52fef-26db-0a3b-e30d-67652af78130', channel: 'messages', type: 'msgpack', value: BinData(0, 'kA==') }
协调和Atlas 审核记录:阻塞条件、管理员决策和分布式锁以文档形式存储,与其他数据使用相同的查询语言—无需维护单独的Atlas 审核系统。
集合:干预、hitlAtlas 审核、管道锁。
HITL_audit
{ _id: ObjectId('6a85cf398ec04b841ebc2a71'), application_id: 'APP-BA96654D', officer_id: 'officer-001', action: 'decline', notes: 'Declined after manual review', conditions: [], overrides: {}, timestamp: ISODate('2026-08-19T15:43:53.719Z') }
干预措施: 存储类型化的代理生成操作项,附带内部风险上下文以及借款人安全指导。阻塞项目会暂停工作流,直到解决后才会 trigger 重新评估。
{ _id: ObjectId('6a8c34e671e78aca4e8ca9ae'), application_id: 'APP-4E8CA981', type: 'stress_test_failure', status: 'pending', internal_context: { source_node: 'underwriter', risk_flag: 'osfi_b20_failure', severity: 'blocking', stress_gds: Double('0.6876'), stress_tds: Double('0.9604'), stress_rate: Double('0.0689'), gds_limit: Double('0.39'), tds_limit: Double('0.44'), is_insured: false }, borrower_context: { summary: 'Your application did not pass the OSFI B-20 mortgage stress test at the qualifying rate of 6.89%.', action_required: 'The stress test ensures you can afford payments if rates rise. You may improve your result by increasing your down payment, reducing existing debts, or choosing a less expensive property.', document_types_accepted: [] }, resolution: null, created_at: ISODate('2026-08-24T12:11:18.585Z'), resolved_at: null }
将这些统一管理是使解决方案可管理的关键。传统堆栈将运行记录放在关系数据库中,将向量放在专用向量存储中,将指标放在时间序列数据库中,并将代理状态放在缓存中 — 然后将大部分工程力量用于保持四个系统的一致。
构建解决方案
本节将向您介绍如何实现代理借出解决方案。有关完整的实施指南,请克隆存储库并按照 GitHub 自述文件中的设置说明进行操作。
构建此解决方案遵循以下步骤:
在 LangGraph 中构建代理管道。
实现监督器及其路由逻辑、并行文档验证器和信用拉取器节点、承保人的七阶段风险聚合以及由 MongoDBSaver 检查点支持的 HITL 中断/恢复闸门。
检查点也可用作调查记录。您可以重新构建代理在做出决策的那一刻所了解的信息,这是一种与他们所说的内容的日志不同的信息。
由于房屋抵押贷款申请是一个持续多天的长期过程,包含人工参与的步骤(承保人查看、文档重新提交、有条件批准)。MongoDBSaver 在每次执行后持久化整个图表状态。这意味着,一个应用程序可以暂停 3 天,等待借款人的工资单;当它恢复时,图表会准确地从停止的位置继续,并保留完整的状态。
示例设置:
from langgraph.checkpoint.mongodb import MongoDBSaver from langgraph.graph import StateGraph from pymongo import MongoClient client = MongoClient(ATLAS_URI) checkpointer = MongoDBSaver(client, db_name="lendflow") graph = StateGraph(MortgageState) # ... add_node(intake), add_node(document_verification), # add_node(underwriting), add_node(human_review) ... app = graph.compile(checkpointer=checkpointer) 如果图表在人工审核节点遇到 interrupt() 命令,invoke 将返回状态为已暂停。FastAPI 可以立即向客户端返回一个 202。当承保人几天后通过另一个终结点批准时,您只需使用相同的配置和新的输入再次调用,LangGraph 就会从上一个检查点恢复,而不是从头开始。
注意
该演示实现提供一个加拿大房屋抵押配置,包括 OSFI B-20 式压力测试和 GDS/TDS 承受能力比率。规则位于一个函数和一个集合中,因此,为了使解决方案适应不同市场,您可以通过更改根本的数据化配置 MongoDB 文档,而不是重写代码。
关键要点
借助单一平台 MongoDB Atlas 统一代理状态:代理工作流会产生运行记录、嵌入和检查点内存。将这四个全部存储在 Atlas 中,可以删除四个数据库堆栈的集成和一致性工作。
使用 Flexible Document Model 将贷款建模为一个不断发展的文档:document model 允许借款人、信用和风险数据在整个生命周期内累积到单个记录上,因此,新的代理编写字段和多态收入类型无需进行模式迁移。
使用 Atlas Vector Search 查询与其描述的数据相邻的向量:MongoDB 将每个嵌入存储为其描述的文档上的一个字段,而 Atlas Vector Search 则在该字段中查询它。一次查询可同时返回语义匹配及其业务数据,将搜索范围限定到单个应用程序可以防止一个借款人的文档出现在另一个借款人的结果中。
借助聚合框架,从设计上就可以使风险评分可解释和可配置:将风险计算作为声明式聚合管道运行,可以暴露分数的每个阶段,因此,可解释性来自于实现,而不是单独的报告层。
借助 LangGraph MongoDB Checkpointer 持久化代理内存,以便可靠的人工查看:该检查点允许因官员查看而暂停的工作流在重启后仍可继续,并以完整上下文恢复,并可作为 Atlas 审核追踪,记录代理在做出决策时所了解的信息。
作者
Peyman Parsi
梅哈尔·格雷瓦尔
Andrea Alaman Calderon
了解详情
进一步了解 MongoDB 和智能体 AI 如何为端到端数字借贷旅程提供支持,帮助简化工作流、降低风险并提升借款人体验。