산업: 금융 서비스
MongoDB 제품: MongoDB Atlas, MongoDB 벡터 검색, Change Streams, MongoDB time series 컬렉션, MongoDB 집계 파이프라인
파트너: Amazon Bedrock, LangChain
솔루션 개요
기존의 대출 시스템은 실시간 데이터, 자동화 또는 디지털 우선 고객 경험을 위해 구축되지 않은, 서로 단절된 레거시 애플리케이션에 의존합니다. 고객은 이제 즉각적인 결정과 완전한 투명성을 기대하는 반면, 대출 기관은 증가하는 위험, 규제 압력, 복잡해지는 데이터 복잡성을 관리해야 합니다.
이 솔루션은 현대적인 디지털 대출 시스템을 빌드하는 방법을 보여줍니다. 이것은 서류 작업이 많은 선형 과정을 대출 신청, 대출 심사, 승인, 자금 지급 및 대출 관리를 하나의 파이프라인으로 연결하는 데이터 기반의 실시간 워크플로우로 대체합니다.
MongoDB를 선택하는 이유
에이전트 워크플로는 운영 기록, 임베딩, 활동 지표 및 에이전트 자체 메모리와 같은 여러 가지 고유한 유형의 상태를 생성합니다. 유형별 분리된 시스템은 인프라스트를 추가하고 서로 간에 일관성 문제를 유발합니다. MongoDB Atlas는 단일 현대적 데이터 플랫폼에 단일 쿼리 언어로 이 모든 데이터를 저장하여 인테그레이션 작업을 줄일 수 있습니다.
스키마 유연성 및 document model
대출 애플리케이션은 수명 주기를 거치면서 대출자, 문서, 크레딧 데이터, 위험 지표 및 결정으로부터 세부 정보가 축적됩니다. 읽을 때마다 연결되는 수십 개의 테이블에 확산된 개체 대신, 성장하는 하나의 문서로 유지됩니다.
다형 세부 정보는 이 모델에 자연스럽게 적합합니다. 근로 소득 및 자영업 소득은 동일한 배열 내에서 서로 다른 필드를 포함하며, 널(null) 허용 열이 없고 하위 유형 테이블도 없습니다.
에이전트 생성 필드는 마이그레이션 없이 나타납니다. 인수 에이전트가 새 지표를 추가하면 조정된 스키마 변경 없이 필드를 직접 쓰기 (write)하고 배포서버 순서 지정도 하지 않습니다.
시맨틱 이해를 위한 Atlas Vector Search
임베딩은 설명하는 문서에 있습니다. 하나의 쿼리는 비즈니스 데이터와 함께 의미론적 일치를 반환하여, 데이터베이스와 별도의 벡터 인덱스를 동기화할 필요성이 제거됩니다.
사전 필터링은 검색 범위를 단일 애플리케이션으로 제한합니다. 이것은 한 대출자의 문서가 다른 대출자의 결과에 포함되지 않도록 하여, 애플리케이션 로직 대신 액세스 제어 요구 사항을 검색 매개 변수로 바꾸는 것입니다.
집계 파이프라인: 설명 가능한 점수 매기기
데이터가 있는 곳에서 위험 점수화가 실행됩니다. 하나의 파이프라인은 크레딧 및 수입 기록을 결합하여 비율을 도출하고 애플리케이션 코드로 데이터 전송 없이 제한된 점수를 반환합니다.
계산이 선언적이기 때문에 솔루션은 각 단계를 인터페이스에 노출합니다. 설명 가능성은 별도의 보고 노력이 아니라 구현의 일부가 됩니다.
실시간 인터페이스를 위한 Change Streams
장교 큐, 차용자 상태 추적기 및 활동 로그는 모두 데이터베이스에서 변경 이벤트를 읽습니다. 커밋된 쓰기(write)와 이를 표시하는 인터페이스 사이에 별도의 메시지 브로커가 없습니다.
연결 실패 후 스트림은 저장된 위치에서 재개되므로 일시적인 네트워크 오류로 인해 감사 피드에 공백이 생기지 않습니다.
LangGraph 에이전트 메모리를 위한 MongoDB 체크포인터
- 워크플로 상태는 각 단계에서 Atlas에 유지됩니다. 사람의 검토를 위해 일시 중지된 애플리케이션은 다시 시작 및 재배포 후에도 유지되며 전체 컨텍스트와 함께 다시 시작됩니다.
이러한 역량들을 통해 단일 플랫폼에서 문서 접수부터 대출 심사, 인적 검토, 포트폴리오 모니터링에 이르기까지 에이전트 기반 대출 워크플로를 처음부터 끝까지 수행할 수 있으며, 다중 데이터베이스 아키텍처에 필요한 통합 표면이 필요 없습니다.
참조 아키텍처
이 솔루션은 다음과 같이 구성됩니다.
프론트엔드: 경험 계층: 대출자 포털, 대출 담당자 대시보드, 데모 흐름 및 갱신 대시보드.
백엔드: LangGraph 에이전트 파이프라인을 호스팅하고 REST, SSE 및 WebSocket을 통해 노출하는 FastAPI 서비스.
MongoDB Atlas: 운영 기록, 벡터, Time Series 지표, 실시간 변경 이벤트 및 에이전트 메모리를 지원하는 지능형 데이터 플랫폼입니다.
AI 및 과찰 가능: Amazon Bedrock (Claude Haiku 4, 구조화된 출력을 위한 도구 사용), 및 Voyage AI (멀티모달 임베딩).
그림 1. 고수준 아키텍처: MongoDB를 사용하는 에이젠틱 대출
에이전트
LangGraph 에이전트 파이프라인은 다음과 같은 요소로 구성됩니다.
그림 2. 에이전트 플로우.
Supervisor: 각 단계 후 워크플로우 상태를 검사하고 다음에 수행할 작업을 결정합니다: 데이터 수집을 위해 팬 아웃하거나, 인수 심사로 진행하거나, 사람에게 에스컬레이트하거나, 또는 완료합니다. 애플리케이션이 차용자 입력에 의해 차단될 때 재시도 정책과 일시 중지 조건을 담당합니다.
문서 검증기: 필수 문서 유형에 대한 완벽성 검사, 추출 실패 표시, 추출된 텍스트 해싱을 통해 중복 업로드 감지 및 문서 전체에 걸쳐 신청자 이름 검사.
크레딧 조회자: 애플리케이션의 각 차주의 신용 정보 기록을 조회하고 점수를 워크플로우 상태에 연결합니다.
대출 애플리케이션 에이전트: 수집된 문서와 크레딧 데이터를 정리하여 일관된 애플리케이션 내용으로 구성하고 애플리케이션 상태를 진행시킵니다.
인수자: 위험 집계를 실행하고, 가능한 지불 비율과 스트레스트를 계산하며, 벡터 검색을 통해 관리 정책을 조회하고, 조직화된 추천(승인, 거절 또는 에스컬레이션)을 생성합니다.
애플리케이션 지원 에이전트: 파이프라인 외부에서 작동하며 자신의 파일 및 정책 코퍼스의 컨텍스트를 사용하여 대출자의 질문에 답변합니다.
감독자는 문서 확인자와 크레딧 조회자를 동시에 파견합니다. 문서 추출과 크레딧 검색은 서로 의존하지 않습니다. 따라서 이들을 중척하면 파이프라인에서 가장 긴 순차적 대기 시간을 제거합니다.
그림 3. LangGraph 에이전트 파이프라인.
자율성 및 인간 감독(HITL)
감독자는 관찰, 제안, 제한 또는 자동의 4가지 자율 모드 중 하나로 작동합니다. 기본값인 제한된 파이프라인은 정책 제한 내에서 자율적으로 작동하도록 허용하고 임계값이 초과되면 담당자에게 에스컬레이션합니다. 예시, $500K를 초과하는 구매 가격 또는 정책 제한을 초과하는 GDS/TDS 비율이 있습니다. 모든 담당자 결정(승인, 거부 또는 수정 및 계속)에는 담당자의 ID가 포함되며 변경 불가능한 감사 컬렉션에 쓰기 (write)됩니다. 파이프라인은 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==') }
조정 및 감사 기록: 차단 조건, 임원 결정 및 분산된 잠금이 문서로 저장되며, 나머지 데이터와 동일한 쿼리 언어를 사용합니다. 별도로 유지관리할 감사 시스템이 없습니다.
컬렉션: 개입, 히트 감사, 파이프라인 잠금.
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 }
이러한 것들을 함께 유지하는 것이 솔루션을 관리하기 쉽게 만드는 것입니다. 일반적인 스택은 운영 기록을 관계형 데이터베이스에, 벡터를 전용 벡터 저장소에, 지표를 time-series 데이터베이스에, 그리고 에이전트 상태를 캐시에 배치한 다음, 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) 그래프가 사람 검토 노드에서 interrupt()를 만나면 invoke는 일시 중지된 상태로 반환됩니다. FastAPI는 클라이언트에게 202을 즉시 반환할 수 있습니다. 수일 후 인수자가 별도의 엔드포인트를 통해 승인하면 동일한 구성과 새 입력으로 다시 호출하기만 하면 됩니다. 그레서 LangGraph는 처음부터 시작하지 않고 마지막 체크포인트에서 다시 시작됩니다.
참고
이 데모 구현은 OSFI B-20 스타일 스트레스 테스트 및 GDS/TDS 감당성 비율을 포함한 캐나다 모기지 구성을 제공합니다. 규칙은 함수와 컬렉션에 있으므로, 코드를 다시 작성하는 대신에 기본 데이터로서의 구성 MongoDB 문서를 변경하여 다른 시장을 위한 솔루션을 재구성할 수 있습니다.
주요 학습 사항
단일 플랫폼인 MongoDB Atlas로 에이전트 상태 통합 에이전트 기반 워크플로는 운영 기록, 임베딩 및 체크포인트 메모리를 생성합니다. Atlas에 4가지 모두 저장하면 4개의 데이터베이스 스택의 통합 및 일관성 작업을 제거할 수 있습니다.
Flexible Document Model을 사용하여 대출을 하나의 진화하는 문서로 모델링합니다: document model은 전체 라이프사이클 동안 차주, 크레딧 및 위험 데이터가 단일 기록에 축적될 수 있도록 허용합니다. 따라서 새로 에이전트가 작성한 필드 및 다형 소득 유형에는 스키마 마이그레이션이 필요 없습니다.
Atlas Vector Search를 사용하여 설명하는 데이터 엽에서 벡터 쿼리: MongoDB는 각 임베딩을 설명하는 문서의 필드로 저장하며, Atlas Vector Search는 그곳에서 쿼리합니다. 하나의 쿼리는 의미론적 일치와 해당 비즈니스 데이터를 함께 반환합니다. 그리고 검색 범위를 단일 애플리케이션으로 제한하면 한 차주의 문서가 다른 차주의 결과에 포함되지 않습니다.
집계 프레임워크를 사용하여 위험 점수매기기를 설명 가능하고 설계 단계부터 구성 가능하게 만듭니다. 선언적 집계 파이프라인으로 위험 계산을 실행하면 점수의 모든 단계가 노출됩니다. 따라서 설명 가능성은 별도의 보고 계층이 아니라 구현에서 비롯됩니다.
LangGraph MongoDB Checkpointer를 사용하여 에이전트 메모리를 유지하여 안정적인 사람 검토 가능: 체크포인터를 사용하면 관리자 검토를 위해 일시 중지된 워크플로가 재시작 후에도 유지되고 완전한 컨텍스트로 다시 시작할 수 있습니다. 또한 에이전트가 결정을 내릴 때 알고 있던 내용에 대한 감사 추적 기록으로도 활용됩니다.
작성자
Peyman Parsi
메하르 그루월
Andrea Alaman Calderon
자세히 알아보기
MongoDB와 에이젠틱 AI가 워크플로를 간소화하고, 위험을 줄이며, 차입자 경험을 향상시키는 엔드 투 엔드 디지털 대출 여정을 지원하는 방법을 자세히 알아보세요.