業種: 金融サービス
MongoDB 製品: MongoDB Atlas, MongoDB ベクトル検索, Change Streams, MongoDB 時系列コレクション, MongoDB 集計パイプライン
パートナー: Amazon Bedrock、 LangChain
ソリューション概要
伝統的な融資システムは、リアルタイムデータ、オートメーション、またはデジタルファーストなカスタマーエクスペリエンスに向けてビルドするいない分散したレガシーアプリケーションに依存しています。カスタマーは現在、即座の意思決定と完全な透明性を期待しています。一方、貸し手は増大するリスク、規制圧力、増大するデータ複雑性を管理しています。
このソリューションでは、現代的なデジタル融資システムをビルドする方法を示します。これにより、線形的でペーパー作業の多いプロセスを、起源、引受、承認、資金調達、およびサービスを1つのパイプラインに接続するデータに基づいたリアルタイムのワークフローに置き換えます。
MongoDB を使用する理由
エージェントワークフローは、運用レコード、埋め込み、アクティビティメトリクス、およびエージェント自身のメモリなど、いくつかの異なる種類の状態を生成します。種類ごとにシステムを分けることはインフラを増やし、システム間の整合性の問題を引き起こします。MongoDB Atlas は、1 つのクエリ言語を備えた 1 つの現代的なデータ プラットフォームに、これらのすべてを保存します。これにより、統合作業が削減されます。
スキーマの柔軟性とdocument model
融資アプリケーションは、借入者、ドキュメント、クレジットデータ、リスクメトリクス、および決定からの詳細情報をライフサイクルを通じて蓄積します。読み取りのたびに十数のテーブルに分散して結合されるエンティティではなく、ドキュメントは成長していくつのみです。
Polymorphicな詳細は、このモデルに自然に適合します。雇用所得と事業所得は、同じ配列内で異なるフィールドを持ち、ナラブルなコラムやサブタイプテーブルはありません。
エージェントが生成したフィールドは、移行なしで表示されます。引受エージェントが新しいメトリクスを追加すると、調整されたスキーマ変更や配置順序なしでフィールドに直接書き込み (write)ます。
セマンティックな理解のための Atlas Vector Search
埋め込みは、自身が記述するドキュメント上に存在します。1 つのクエリでは、ビジネス データとともにセマンティックな一致が返されます。これにより、データベースと別々のベクトル インデックスを同期させる必要がなくなります。
事前フィルターは、1 つのアプリケーションに検索範囲を指定します。これにより、アクセス制御要件がアプリケーションロジックではなく、検索パラメータに変換されることで、ある借入者のドキュメントが別の借入者の検索結果に表示されないようになります。
集計パイプライン: 説明可能なスコアリング
リスクスコアリングは、データが存在する場所で実行されます。1 つのパイプラインは、クレジットと収入のレコードを結合し、比率を導出し、アプリケーション コードへのデータ転送なしで制限されたスコアを返します。
計算が宣言的であるため、ソリューションは各ステージをインターフェースに公開します。説明可能性は、個別のレポート作成作業ではなく、実装に組み込まれます。
Change Streams によるリアルタイムインターフェース
担当者キュー、借入者ステータストラッカー、およびアクティビティログはすべてデータベースから変更イベントを読み取ります。コミットされた書き込み (write) とそれを表示するインターフェースの間には、個別のメッセージブローカーは存在しません。
接続の失敗後にストリームは保存された位置から再開されます。そのため、一時的なネットワーク障害によって監査フィードにギャップが生じることはありません。
LangGraph エージェントメモリのための MongoDB チェックポインター
- ワークフローの状態は、各ステップで Atlas に持続化されます。ヒューマンによる検討するために一時停止されたアプリケーションは、再起動や再デプロイ後も状態が維持され、全てのコンテキストを維持して再開します。
これらの機能を統合することで、1つのプラットフォームでドキュメントの受付から引受け、人手による検討する作業、ポートフォリオのモニタリングまでのエージェント型融資ワークフローを、複数のデータベースアーキテクチャが必要とする統合の土台なしで端から端まで実行できるようになります。
参照アーキテクチャ
このソリューションは次のもので構成されています。
フロントエンド:エクスペリエンス層:借り手ポータル、融資担当者ダッシュボード、デモフロー、および更新ダッシュボード。
バックエンド: LangGraph エージェント パイプラインをホストし、REST、SSE、WebSocket を介して公開する FastAPI サービス。
MongoDB Atlas: オペレーション レコード、ベクトル、時系列メトリクス、リアルタイム変更イベント、およびエージェント メモリのためのインテリジェントなデータ プラットフォーム。
AI と可観測性:Amazon Bedrock(Claude Haiku 4、構造化された出力向けのツール使用)、および Voyage AI(マルチモーダル埋め込み)。
図1。ハイレベルアーキテクチャ: MongoDB によるエージェンティック・レンディング
エージェント
LangGraph エージェント パイプラインは次のように構成されています。
図2。エージェントフロー。
スーパーバイザー: 各ステップ完了後にワークフローの状態を検査し、次に何を行うかを決定します。データ収集のためにファンアウトする、引受審査に進む、人手にエスカレートする、または完了する。アプリケーションが借り手の入力でブロックされた場合、リトライ ポリシーとポーズ条件を所有します。
ドキュメント検証者:必要なドキュメントタイプと照合して完全性をチェックし、失敗した抽出にフラグを付け、抽出したテキストをハッシュ化することで重複アップロードを検出し、複数のドキュメントにわたって申請者名を交叉チェックします。
クレジットプラー:アプリケーション上の各借入者について信用情報機関のレコードを検索し、スコアをワークフローの状態に添付します。
ローンアプリケーションエージェント: 収集したドキュメントとクレジットデータを統合して整理されたアプリケーションの記述を作成し、アプリケーションのステータスを進めます。
Underwriter: リスク集計を実行し、支払能力比率とストレステストを計算し、ベクトル検索によって適用されるポリシーを検索し、構造化された推奨事項(承認、却下、またはエスカレーション)を作成します。
アプリケーションアシスタントエージェント: パイプラインの外で動作し、お客様自身のファイルとポリシーコーパスからのコンテキストを使用して、お客様の質問に答える。
監督者はドキュメント確認者とクレジット情報取得者を同時に派遣します。ドキュメント抽出とクレジット取得は互いに依存関係がありません。そのため、それらを重ねることで、パイプライン内で最も長い順次待機時間を除くことができます。
図3。LangGraph エージェント パイプライン。
自律性と人間による監督 (HITL)
スーパーバイザーは、監視、提案、制限、または自動の 4 つの自律モードのいずれかのモードで実行します。デフォルトでは制限が設定されているため、パイプラインはポリシーの制限範囲内で自律的に動作します。また、スレッショールが超えると担当者にエスカレートされます。例:$500K を超える購入価格や、GDS/TDS 比率がポリシーの制限を超える場合です。すべての役員決定(承認、却下、または変更して続行)には役員のIDが含まれ、不変の監査するコレクションに書き込み (write) が行われます。パイプラインはLangGraphチェックポインターを介して再開されるため、人間によるレビューによってワークフローの状態が失われることはありません。
データモデルアプローチ
ワークフローは次のようなデータの種類を生成し、MongoDB Atlas はそれらのすべてを保存します。
構造化された運用レコード: 各レコードは、複数のテーブルにまたがる固定された行㎏ではなく、1つの成長するドキュメントとしてローンのライフサイクルを通じて変化します。
コレクション: アプリケーション、レイテンシ、クレジットレポート、チャット履歴、担当者、更新。
{ _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) は同じドキュメント上に存在します。そのため、1 つのクエリでは意味的な一致とそのビジネスデータがまとめて返されます。
コレクション: ドキュメント、ポリシー。
{ _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 はスレッドごとに状態を保持するため、一時停止したワークフローは停止した場所から正確に再開されます。
コレクション: チェックポイント、チェックポイント書込み (write)、チェックポイントメタデータ。
{ _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==') }
調整と監査レコード: ドキュメントとして保存され、その他のデータと同じクエリ言語を使用する、ブロック条件、管理者の決定、分散されたロック。これにより、別の監査システムを保持する必要がありません。
コレクション: 介入、ヒット監査する、パイプラインロック。
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 }
これらをまとめておくことが、ソリューションを管理しやすくする理由です。従来のスタックでは、操作レコードを関係データベースに、ベクトルを専用のベクトル保存 (する)に、メトリクスを時系列データベースに、エージェントの状態をキャッシュに配置します。そして、エンジニアリングの大部分は、これら 4 つのシステムのコンシステントを維持することに費やされます。
ソリューションのビルド
このセクションでは、エージェント適量ソリューションを実装する方法を示します。完全な実装ガイドについては、リポジトリをクローンし、GitHub README のセットアップ手順に従います。
このソリューションの構築は、次の手順で行います。
LangGraph でエージェント パイプラインをビルドする
スーパーバイザーとそのルーティングロジック、並列ドキュメント検証ノードとクレジット取得ノード、引受人の7段階リスク集計、および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) グラフが human-review ノードで interrupt() を受け取った場合、invoke は状態が一時停止して返されます。FastAPI は、クライアントに 202 を直ちに返すことができます。引受人が数日後に別のエンドポイントを介して承認する場合は、同じ設定と新しい入力を使用して再度呼び出すだけです。LangGraph はゼロからではなく、最後のチェックポイントから再開します。
注意
このデモ実装には、OSFI B-20 スタイル ストレス テストおよび GDS/TDS アフォーダビリティ比率を含む、カナダの住宅ローン構成が搭載されています。ルールは1つの関数と1つのコレクションに定義されています。そのため、コードを書き直すのではなく、基礎の configuration-as-data MongoDB ドキュメントを変更することによって、別のマーケットに向けてソリューションを再構成します。
キーポイント
単一プラットフォーム MongoDB Atlas でエージェントの状態を統一する:エージェントによるワークフローは、運用レコード、埋め込み、およびチェックポイントされたメモリを発生させます。Atlas に4つのデータベースをすべて保存することで、4つのデータベーススタックの統合と整合性の作業を除く。
Flexible Document Model を使用して、融資を1つの進化するドキュメントとしてモデル化する: document model により、借入者、クレジット、リスクのデータをライフサイクル全体を通じて1つのレコードに蓄積することができます。そのため、新しいエージェントが記入したフィールドおよびポリモーフィックな収入タイプには、スキーマの移行は不要です。
Atlas Vector Search を使用して、ベクトルが記述するデータの隣でベクトルをクエリする: MongoDB は、各埋め込みをそれが記述するドキュメント上のフィールドとして保存します。そして Atlas Vector Search は、そこでそれをクエリします。1 つのクエリで、意味的な一致とそのビジネスデータがともに返されます。また、検索を 1 つのアプリケーションに限定すると、ある借入者のドキュメントが別の借入者の検索結果に含まれないようになります。
集計フレームワークを使用して、リスクスコアリングをデザインによって説明可能かつ構成可能にする:リスク計算を宣言的な集計パイプラインとして実行すると、スコアのすべてのステージが公開されるため、説明可能性は別個のレポート作成レイヤーからではなく、実装から得られます。
LangGraph MongoDB Checkpointer を使用して、信頼性の高い人間が検討するためにエージェントのメモリを永続化する: このチェックポインターを使用すると、担当者が検討するために一時停止されたワークフローが再起動後も存続し、完全なコンテキストで再開できます。また、エージェントが決定を下したときに何を知っていたかを示す監査する際の証跡としても機能します。
作成者
Peyman Parsi
メトリクスを再構築する
Andrea Alaman Calderon
詳細
MongoDB と agentic AI が、ワークフローを合理化し、リスクを低減し、借入者のエクスペリエンスを向上させるエンドツーエンドのデジタル融資ジャーニーをどのように実現するかについて詳しくはこちらで学ぶ。