MongoDB AtlasとObjectBoxを活用して、オフライン環境でもパーソナルウォレットとそのAIアシスタントを機能させる方法をご覧ください。
ユースケース: エッジおよびモバイル, インテリジェント検索, 決済
業種: 金融サービス
製品およびツール: MongoDB Atlas データベース、 MongoDB Atlas Vector Search、 MongoDB MCP サーバー、 MongoDB Search、 MongoDB トリガーする、 Voyage AI
ソリューション概要
従来のウォレットアプリやバンキングアプリは、多くの場合、安定したインターネット接続に依存しています。ユーザーが交通機関で移動中の場合や、地方、モバイルネットワークが不安定な場所にいる場合、最も必要なときに残高の確認、取引の確認、連絡先の管理、送金、ウォレットへのアクセスができないことがあります。
ユーザーは、短時間の切断時にも役立つウォレットを必要としています。ユーザーは、一時的なネットワーク停止時によってブロックされることなく、ウォレットにアクセスして金融タスクを完了できる必要があります。接続が回復すると、ウォレットはユーザーのアカウントを同期する必要があります。
このソリューションは、接続が制限されている場合に、ウォレットの重要な機能にアクセスできなくなるという問題に対処します。ユーザーがオフラインのときでもウォレットデータを利用できるようにし、ネットワークからの即時応答を必要とせずに、取引の確認、連絡先の管理、送金のキューへの追加などの主要な操作を行えるようにします。また、ユーザーがウォレット情報にアクセスし、オンラインとオフラインの両方で支払い操作を準備できるよう支援する AI アシスタントも搭載しています。接続が復旧すると、ソリューションは最新の変更をバックエンドと同期します。中核となる価値は継続性です。一時的なネットワーク障害が発生している間も、ユーザーは資金を管理し、サポートを受けることができます。
MongoDB は、このアプローチに柔軟なデータ基盤を提供します。残高、取引、連絡先、支払いリクエスト、保留中の操作などのウォレット情報を、統合されたデータレイヤーでモデル化します。統合データレイヤーにより、アプリケーションは切断中に必要なウォレットの状態を維持し、ユーザーが再接続したときに更新を反映できます。また、同じデータ基盤から関連するウォレットのコンテキストが AI アシスタントに提供されるため、接続時と切断時の両方でこうした操作をサポートできます。
図1。ソリューションの高レベルアーキテクチャ
参照アーキテクチャ
このソリューションは、エッジ デバイスと MongoDB Atlas を中核コンポーネントとして使用し、外部の PSP と統合します。アーキテクチャ全体において、各コンポーネントには明確に定義されたロールがあります。エッジ デバイスはオフラインファーストのインタラクションをサポートし、MongoDB Atlas は一元的なデータ永続性と AI からアクセス可能なデータ サービスを提供し、PSP は規制された決済操作を取り扱います。
図2。参照アーキテクチャの概要
エッジでは、モバイル アプリケーションがローカル ObjectBox データベースにデータを保存し、デバイス内での推論のために Ollama を実行します。Voyage AI モデルがそれと並行して実行され、デバイス上にトランザクションのメモを埋め込むことで、ネットワークがなくても意味的なリコールが引き続き機能します。ObjectBox Sync サーバーは MongoDB Atlas スキーマをミラーリングするため、アプリケーションはオンラインとオフラインで同じ論理構造を読み書きします。
MongoDB Atlas は、トランザクション、問い合わせ、リクエスト、通知、チャットなどの運用ウォレットデータを保持します。次の Atlas 機能はそのデータを基盤としています。
MongoDB Atlas Vector Search: Voyage AI 埋め込みを使用して、トランザクションノートを意味に基づいて検索します。
MongoDB Atlas のハイブリッド検索: 1 つの
$rankFusionパイプライン内でベクトル検索結果と言語検索クエリを統合します。この仕組みは、正確な販売者名と曖昧な説明に対して、正しいトランザクションを返します。Atlas Triggers:
transactionsコレクションへのすべての挿入と更新に反応し、PSP 転送参照をキーとして耐久性がある履歴レコードをアップサートします。MongoDB MCP サーバー: 読み取りツールを公開し、AI アシスタントが MongoDB Atlas を直接クエリできるようにします。
外部 PSP は、支払い実行と ID のレコードシステムとして残ります。これは転送を承認および決済する一方で、アプリはユーザーエクスペリエンスをサポートするために必要な参照とアプリケーションデータのみを保存します。
この責任分離により、ローカルの応答性、クラウドベースのインテリジェンス、およびセキュアな支払い実行が結合されます。
アーキテクチャプロセスフロー
これらのプロセスフローは、サブシステムが交流してアーキテクチャルな強韌性とインテリジェントアシスタンスをどのように提供するかを示します。オフライン決済フローにより、接続障害時でも重要な金融操作が続行され、ウォレットの信頼性が維持されます。チャットボット支援フローは、ローカルインテリジェンスを活用してインタラクションを簡約化します。これにより、会話型インターフェースは常にクラウドに依存することなくても応答可能であり続けられることが実証されます。これらのプロセスを統合することで、あらゆるネットワーク環境でコンシステントなユーザー エクスペリエンスを提供します。
オフライン支払いフロー
このフローでは、ユーザーの操作とリアルタイムのネットワーク接続を切り離すことで、財務上の信頼性を確保しています。トランザクションをローカルでキューに入れることで、制限された環境でもシームレスな支払い体験を維持し、接続が復元されたときにのみ中央プラットフォームと同期します。
図 3. オフライン支払いシーケンス
デバイスの接続が切れても、アプリは動作を続けます。オフライン決済フローでは:
ユーザーが支払いを開始します。
アプリケーションは、ObjectBoxに保存された最後に同期された残高に対して金額を検証します。
トランザクションは、
local_pendingステータスでローカルにキューに入れられます。接続が復旧すると、アプリケーションは再接続を検出し、保留中のすべてのトランザクションを検索します。
保留中の各取引は、決済のために PSP に送信されます。
決済後、アプリケーションは PSP 参照を保存し、トランザクションを決済済みとしてマークします。
ObjectBox 同期 サーバーは、更新されたトランザクション状態をMongoDB Atlasに伝播します。
このパスワードなしは、接続が失われた際のアプリケーションの継続性を維持しつつ、決済が外部のPSPを通じてのみ行われるようにします。
チャットボットによる支払いフロー
この会話型フローは、ローカルなエッジベースのAIを使用して、永続的なクラウド接続に依存せずにインテリジェントアシスタンスを提供します。ユーザーの意図をローカルで処理し、支払いの下書きと問い合わせの解決を可能にします。そして、システムが再接続したときに、確認されたトランザクションを安全に実行します。
図5。チャットボット支援の支払いシーケンス
このソリューションは、LangGraphエージェントを使用してAIアシスタントをビルドします。チャット ボットのワークフローは次のように動作します。
ユーザーは、「ルイスを夕食に誘うために20を送る」のようなリクエストを送信します。
エージェントは目的の問い合わせを解決します:
オンラインの場合、MongoDB MCP サーバーを介して MongoDB Atlas をクエリします。
オフライン時は、ObjectBoxから直接問い合わせを解決します。
エージェントは支払いを作成し、ユーザーに確認カードを提示します。
ユーザーがトランザクションを明確に確認するまで、資金は動かない。
確認後、次のアクションが実行されます。
オンラインモードでは、アプリケーションは送金を PSP に送信し、エンリッチメントレコードを MongoDB Atlas に書き込みます。
オフライン モードでは、アプリケーションはトランザクションをローカルにキューに格納し、後で再生できるようにします。
支払いが送信されたりキューに入ったりしたら、ユーザーは通知を受け取ります。
このインタラクションモデルは、自然言語による支払い開始を明示的なユーザーの承認と組み合わせつつ、コアアーキテクチャによって定義された同じオンラインおよびオフラインの実行境界を維持します。
データモデルアプローチ
このソリューションでは、ミラーリングされた document model を使用します。このデザインパスワードなしは、MongoDB Atlas とオンデバイス ObjectBox 保存 (する)で同じウォレットエンティティおよびドキュメント構造を維持します。モデルは、BIAN 準拠の外部 PSP を基盤としてビルドされたオフラインウォレットに対応します。
PSP は、決済実行と身元確認のためのレコードシステムであり続けます。一方、アプリケーションはユーザー エクスペリエンスをサポートするために、参照とアプリケーション レベルのエンリッチメントを保存します。このエンリッチメントには、ノート、セマンティック埋め込み、および同期またはライフサイクル状態が含まれます。MongoDB Atlas と ObjectBox で同じ論理スキーマを使用することで、アプリケーションがオンラインとオフラインの両方でコンシステントに動作することが可能になります。
以下のコレクションは、このソリューションがオフライン支払いエクスペリエンスをサポートするためにアプリケーションデータをモデル化している方法を示しています。
コレクション | 説明 |
|---|---|
| 残高や認証情報を直接保存するのではなく、完了済みと保留中の資金の移動を保存し、参照によってPSPにキー付けします。 |
| Atlas のみで検索可能な履歴を維持します。Atlas trigger は、PSP リファレンスをキーとして、決済されたすべての転送をここで upsert します。そのため、ハイブリッド検索は、デバイス同期では分断できない安定したコーパス上で実行されます。 |
| ユーザーが支払いを行ったり、送金をリクエストしたりできる相手を表します。PSPの取り決め参照から、ウォレットに適した問い合わせレコードに解決されます。 |
| 支払いリクエストの作成から決済または異議申し立てまで、そのライフサイクル全体を追跡します。 |
| ユーザー向けの支払いイベントとウォレットイベントを配信します。これには、キューに入れられたアクションと完了したアクションのステータス更新が含まれます。 |
| 所有ユーザーにスコープされ、ウォレット体験とリンクされた AI アシスタントの会話履歴を保存します。 |
walletTransactionsHistory 以外のすべてのコレクションは ObjectBox データベースをミラーします。MongoDB Atlas は履歴データを保持し、ハイブリッド検索に必要なベクトルインデックスとテキストインデックスを提供します。
以下に、walletTransactions コレクションに保存されている財布トランザクションの document model があります。これは、外部 PSP を介して送信または受信される単一の支払いを表します。ドキュメントは、転送を追跡するために必要な運用データと、検索、オフラインリプレイ、および AI アシスタントを動作させるために必要なリッチャーデータ(埋め込み、同期状態)を取り込みます。
{ "_id": { "$oid": "unique_id" }, "leafyPayTransferReference": "string", "ownerPartyRef": "string", "counterpartyArrangementReference": "string", "amount": "number", "currency": "string", "note": "string", "noteEmbedding": [ "number", "..." ], "direction": "sent | received", "leafyPayStatus": "pending | settled | failed | exception", "localSyncStatus": "local_pending | synced", "createdAt": { "$date": "ISODate" }, "settledAt": { "$date": "ISODate" }}このモデルは、運用コンテキストとエンリッチメントを統合し、クラウドとデバイス環境での配置を簡約化します。アプリケーションは保留中のアクティビティをレンダーし、オフライン書き込み (write)をリプレイし、1 回の読み取りを使用して AI アシストによるトランザクションの取得をサポートします。これらの操作を実行できるのは、同期状態 (localSyncStatus)、結算状態 (leafyPayStatus)、およびセマンティック検索ベクトル (noteEmbedding)が同じドキュメント内に存在するからです。
機密な金融処理は PSP 内に残りますが、MongoDB Atlas と ObjectBox は応答性、検索、およびユーザー エクスペリエンスに必要なウォレット アプリケーション データのみを保存します。本番環境では、これらのコレクションに、より厳格な検証、アクセス制御、および監査する記録を追加して拡張することができます。
ソリューションのビルド
ソリューションをローカルで実行するには、2 段階で配置します。まず、SSO、同意、および支払いの実行を取り扱うPSPを起動します。その後、アプリケーション UI、バックエンド サービス、ObjectBox、Ollama、Voyage AI、および同期コンポーネントを実行する Leafy Wallet を起動します。
ローカル配置の場合は、両方のリポジトリを横並びにクローンします。
Github LOCAL 配置の指示に従ってください。
モデルを配置します。
回復力に優れたオフラインファーストのエクスペリエンスをサポートするために、コンテナ化されたサービスのコレクションとしてソリューションをデプロイします。図に示すように、フロントエンド、FastAPI バックエンド、MongoDB Atlas がクラウド接続されたパスを処理し、ObjectBox Sync Server がデバイス上の ObjectBox ストアと Atlas の橋渡しをします。
この設定により、ウォレットはデータをローカルに保存して切断時でも即座に応答できるようになり、接続が回復するとキューに入れられたトランザクションが自動的にクラウドにフラッシュされます。このコンテナ化されたモデルを使用して、エッジデバイスとAtlasクラスターの両方でコンシステントな論理データ構造を維持します。
環境を設定する
PSP と Leafy Wallet のリポジトリを並べてクローンします。
git clone https://github.com/mongodb-industry-solutions/leafy-wallet.gitgit clone https://github.com/mongodb-industry-solutions/sec-fsi-pci-dss.git起動する前に、フロントエンドとバックエンドの個別の環境ファイルを構成します。これらのファイルは、重要な接続文字列、API認証情報、サービスのエンドポイントとなる接続されたデバイスを管理し、フロントエンド、バックエンド、および外部サービス間の安全な通信を可能にします。
#frontendCLIENT_ID=<id>CLIENT_SECRET=<secret>PSP_BASE_URL=http://host.docker.internal:8081PSP_FRONTEND_URL=http://localhost:8083APP_BASE_URL=http://localhost:8080REDIRECT_URI=http://localhost:8080/api/auth/callbackLOOKUP_DIGEST_KEY=<key>
#backendMONGODB_URI="<your-atlas-connection-string>"DATABASE_NAME="<db-name>"APP_NAME=leafy-wallet-backendOLLAMA_BASE_URL=http://localhost:11434OLLAMA_EMBEDDING_MODEL=nomic-embed-textLOOKUP_DIGEST_KEY="<key>"フロントエンドの構成では、PSP_BASE_URL が http://host.docker.internal:8081 を指すようにする必要があります。これにより、コンテナ化されたアプリケーションからローカルで実行されている PSP にアクセスできます。
Leafy Wallet アプリケーションを起動します
PSPが実行されたら、MongoDB ベクトル検索インデックスを作成し、Docker ComposeでLeafy Walletを起動します。
cd leafy-wallet/backenduv run python scripts/create_vector_index.pycd ..docker compose up -d --buildLeafy Walletはhttp://localhost:8080で起動し、バックエンド、ObjectBox、Ollama、同期サービスがコンテナで実行されます。
両方のスタックが実行されたら、ブラウザで Leafy Wallet を開き、SSO で続行します。
キーポイント
接続が途切れた場合でもウォレット機能を使用可能に保つ: ネットワークアクセスを必須条件ではなく、機能強化として扱います。MongoDB Atlas をバックエンドとするローカルストアは、短時間の接続切断中に残高、トランザクション、問い合わせ、リクエスト、チャットフローを利用可能な状態に保ち、デバイスが再びオンラインになったら再度同期します。
MongoDB Atlas でアプリケーションのコンテキストを保持し、決済は PSP に任せます。 ユーザーエクスペリエンスを形成するエイリアス、ノート、同期状態、および埋め込みは Atlas に保存されます。一方、決済プロバイダーは、身元、承認、および決済のレコードシステムとして機能します。この分裂により、規制された実行をエクスペリエンスレイヤーに取り込まずに、エクスペリエンスレイヤーの柔軟性を維持できます。
デバイスとクラウドで同じ論理データモデルの読み取りと書き込みを行う: MongoDB Atlas のコレクション構造を組み込みストアにミラーリングし、変更をバックグラウンドで同期します。両側で同一のスキーマを使用することで、オフライン機能で通常必要となる変換レイヤーが不要になるため、接続状況に応じてアプリケーションコードを分岐させる必要がありません。
document model 内で操作コンテキストとエンリッチメントをまとめて保持する: 読み取りを簡素化し、アトミック更新をサポートし、AI アシストのエクスペリエンスでデータを使いやすくするため、転送詳細、ノート、同期状態、および埋め込みを同じドキュメント内に保存 (する)。
ローカルの応答性とクラウドのインテリジェンスを組み合わせる: MongoDB Atlas Vector Search、MongoDB MCP Server、およびオンデバイスストレージにより、アシスタントは自然言語によるトランザクションの検出と支払いのドラフト作成を取り扱うことができます。ユーザーは、デバイスがオンラインかどうかにかかわらず、同じ動作を体験できます。
作成者
Felipe Trejos, MongoDB
Miguel Aréjula Aísa, MongoDB