RemitMatch: 클라우드를 보지 않는 AI 회계 장부 정리 도구
요약
RemitMatch는 소규모 상점이나 회계 전문가를 위해 개발된 로컬 우선 AI 조정(reconciliation) 도구입니다. 이 도구는 은행 명세서와 미결제 인보이스 CSV 파일을 업로드하여, 문자열이 동일하지 않아도 지불자 참조의 의미를 비교해 결제 항목을 매칭합니다. 사용자가 최종적으로 승인해야 하는 방식으로 작동하여 정확성을 높였습니다.
핵심 포인트
- 은행 명세서만으로는 어떤 인보이스가 결제되었는지 알기 어렵다.
- RemitMatch는 로컬에서 실행되는 AI 조정 데스크이다.
- 오픈 가중치 모델이 지불자 참조의 '의미'를 비교한다.
- 사용자가 최종 승인해야 하므로 정확성이 높다.
이 글은 Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle 제출물입니다.
제가 만든 것
은행 명세서는 돈이 도착했다고 알려줄 뿐, 어떤 인보이스가 결제되었는지는 항상 말해주지 않습니다.
작은 제과점 공급업체를 운영한다고 상상해 보세요. 회계 소프트웨어에는 Nimali Grocery Stores에 대한 미결제 인보이스가 있습니다. 은행 CSV 파일에는 다음과 같이 나와 있습니다:
BNK-002 | 2026-10-04 | LKR 42,750 | NIMALI STORES ONLINE TRANSFER
또 다른 결제는 CEFT SUNRISE BAKERY PAYMENT라고 되어 있고, 또 다른 것은 인보이스 번호는 포함하지만 고객의 전체 이름은 포함하지 않습니다. 두 행이 같은 결제인 것처럼 보일 수 있습니다. 하나의 결제가 동일한 금액을 청구하는 두 하드웨어 상점 중 어느 것과 관련될 수도 있습니다.
이러한 각각의 항목들은 사람이 개별적으로 확인하기는 쉽습니다. 하지만 이 모든 것을 합치면 계정 조정(reconciliation) 작업은 성가시고 반복적인 일이 됩니다. 그리고 사업체가 작을 때는, 이 작업을 하는 사람이 종종 제품 판매, 배송 및 지원까지 담당하는 사람인 경우가 많습니다.
그래서 저는 RemitMatch를 만들었습니다. 프리랜서, 소기업 및 회계 장부 정리 전문가들을 위한 로컬 우선(local-first) AI 조정 데스크입니다.
사용자는 미결제 인보이스 CSV와 은행 결제 CSV를 업로드합니다. 오픈 가중치 모델(open-weight model)은 문자열이 동일하지 않더라도 지불자 참조(payer references)의 _의미_를 비즈니스 이름과 비교합니다. 결정론적 규칙(Deterministic rules)은 금액, 인보이스 ID 및 날짜를 검증합니다. 인터페이스는 잠재적인 일치 항목들의 순위를 매기고, 왜 제안되었는지 설명하며, 중복 또는 충돌을 표시합니다.
중요한 점은 이 소프트웨어가 돈이 결제되었다고 스스로 결정하지 않는다는 것입니다. 인간이 각 후보를 승인해야 합니다. 명시적으로 승인되고, 정확한 금액이며, 일대일로 매칭된 항목만 내보내기(export)에 나타납니다.
누가 지불할까요?
저의 초기 타겟 고객은 비용이 많이 드는 엔터프라이즈 수준의 조정(reconciliation) 도구를 사용하지 않지만 많은 직접 은행 이체(direct bank transfers)를 처리하는 소규모 상점이나 회계사입니다. 잠재적인 제품은 단순히 “AI 회계”가 아닙니다. 이는 고객 자신의 노트북에 설치할 수 있는, 범위가 좁고 시간 절약형 도구이며, 설정, 구성 및 지원을 통해 수익을 창출합니다. 이것은 비즈니스 가설일 뿐이며, 누군가 저에게 돈을 지불했다는 주장이 아닙니다.
데모 (Demo)
로컬 데모: https://drive.google.com/file/d/1NvHNomwMgcdKh6FW0Ptya9ztoc3iv1Sq/view?usp=sharing
또한 리포지토리의 합성 파일(synthetic files)을 사용하여 직접 흐름을 재현할 수 있습니다:
python -m pip install -r requirements.txt
python scripts/download_model.py # 한 번만 필요
python -m streamlit run app.py
http://127.0.0.1:8501을 열고 **로컬 AI 매칭 실행(Run local AI matching)**을 선택하십시오. BNK-002, 의도적으로 중복된 BNK-008 및 BNK-011, 그리고 고의적으로 모호한 하드웨어 이체인 BNK-009에 대한 제안들을 검토해 보십시오. 유효한 정확 금액 후보를 승인한 다음, 검토된 CSV 파일을 내보내십시오.
데모 데이터는 가상의 것입니다. 앱은 이를 호스팅되는 AI 추론 API로 전송하지 않습니다.
코드 (Code)
GitHub: https://github.com/DinukaEk/remitmatch
이 프로젝트에는 Streamlit 인터페이스, 감사 가능한 조정(auditable reconciliation) 코드, 일회성 로컬 모델 설정, 합성 샘플 CSV 파일, 기준선 평가 스크립트(baseline-evaluation script), 그리고 핵심 단위 테스트 모음(core unit-test suite)이 포함되어 있습니다. 코드는 MIT 라이선스이며, 임베딩 모델은 Apache-2.0 라이선스를 따릅니다.
AI가 중요한 부분을 확인하고 싶은 검토자들은 리포지토리의 matcher.py부터 시작하십시오: 이 파일의 reconcile() 함수는 임베딩 인코더(embedding encoder)를 호출하고, 의미 인식 이름 유사성(meaning-aware name similarity)을 금융 특화 규칙과 결합하며, 검사 가능한 후보 증거(inspectable candidate evidence)를 반환합니다.
제가 구축한 방법 (How I Built It)
저는 언어 모델에게 '회계사 역할을 하라'고 요청하지 않았습니다. 돈과 관련된 워크플로우에서 유창한 언어가 유효한 결제 매칭을 의미하는 것은 아닙니다.
대신, RemitMatch는 두 가지의 명확히 구분되는 책임을 가집니다:
1. 오픈 웨이트 AI가 복잡한 텍스트 작업을 처리합니다.
저는 Apache-2.0 라이선스가 적용된 임베딩 모델인 sentence-transformers/all-MiniLM-L6-v2를 오픈 소스 Sentence Transformers 라이브러리를 통해 사용합니다. 이 모델은 사용자 기기의 Python 프로세스에서 실행됩니다. 결제 참조 번호와 고객 이름이 로컬 문장 벡터로 변환되어, 의미적 유사성이 후보 순위에 기여할 수 있게 합니다.
2. 명시적인 코드가 재무 제약 조건을 처리합니다.
각 후보에는 검사 가능한 순위 공식이 있습니다:
38% 로컬 AI 이름 유사성
22% 어휘 비즈니스명 유사성
23% 금액 유사성
...
이 가중치는 통계적 신뢰도 백분율이 아니라 엔지니어링 휴리스틱입니다. 추가 규칙은 반복되는 은행 행, 하나의 송장(invoice)을 대상으로 하는 다중 입금, 모호한 후보, 그리고 금액 차이를 감지합니다. 금액 처리는 부동 소수점 산술 대신 Python의 Decimal을 사용합니다. 사용자가 수동으로 승인해야 하며, 내보내기(export)는 정확한 금액의 일대일 연결만을 강제하고 실시간 은행이나 ERP와 연결되어 있지 않습니다.
포함된 테스트는 모델 가중치를 다운로드할 필요 없이 실행될 수 있도록 주입 가능한 결정론적 테스트 인코더를 사용합니다. 별도의 scripts/evaluate.py 스크립트를 통해 누구나 실제 모델 + 규칙과 규칙만 적용한 경우를 작게 레이블링된 합성(synthetic) 데이터셋에서 비교할 수 있습니다. 저는 몇 개의 가상의 행을 가지고 실제 세계의 정확성을 주장하지 않으려는 의도적인 선택을 했습니다.
가장 어려웠던 설계 결정
모델을 선택하는 것이 아니었습니다. 무엇을 자동화하지 않을지 결정하는 것이었습니다.
의미론적 모델(semantic model)은 두 회사의 이름이 유사할 경우 전표를 잘못된 고객과 확신을 갖고 연결할 수 있습니다. 일치하는 금액 역시 우연일 수 있습니다. 그래서 저는 송장 상태를 자동으로 변경하기보다는 검토자 중심 인터페이스(reviewer-first interface)를 선택했습니다. 최고의 부업 소프트웨어는 반드시 모든 것을 처리하는 소프트웨어인 것은 아닙니다. 때로는 판매 가능한 기능이 10분간의 탐정 작업을 짧고 점검 가능한 체크리스트로 바꾸는 것일 수 있습니다.
Open Innovation은 왜 중요한가?
이 제품에게 있어, 로컬 실행(local execution) 자체가 기능이며 구현 세부 사항이 아닙니다.
대안들을 고려해 봅시다. 호스팅되는 AI 서비스는 이름 해석에 분명히 도움을 줄 수 있으며, 일부 어려운 참조 건에서는 더 나은 성능을 보일 수도 있습니다. 그러나 이를 사용한다는 것은 은행 참조 정보와 고객 세부 정보를 외부 프로세서로 전송하고, 사용량 기반 가격 책정(usage-based pricing)을 예산으로 잡고, 해당 제공업체가 선택하는 모든 모델 동작 및 약관을 받아들여야 함을 의미합니다.
오픈 가중치 임베딩 모델(open-weight embedding model)은 경제성과 프라이버시 경계를 변화시킵니다:
- 설계 단계부터 사적(Private by design): 일회성 모델 다운로드 후, 인터넷 연결 없이 추론(inference)을 실행할 수 있습니다. 민감한 CSV 콘텐츠는 호스팅되는 AI 모델 API에 제출되기보다는 사용자의 로컬 애플리케이션 내부에 머무릅니다.
- 낮은 한계 추론 비용(Low marginal inference cost): 요청당 모델 API 요금이 없습니다. 고객들은 여전히 컴퓨터, 설정 및 유지보수 비용을 지불합니다.
- 수정 가능한 시스템(A modifiable system): 모델은 도메인 적응형 대안으로 교체될 수 있으며, 점수 산정 규칙(scoring rules)은 로컬 은행 이체 어휘에 맞춰 조정될 수 있습니다.
- 더 강력한 신뢰 스토리(A stronger trust story): 기술 사용자들은 코드를 검사하고, 제거 실험(ablation)을 실행하며, 모델과 회계 규칙 모두가 어디에 기여했는지 확인할 수 있습니다. 외부 AI 제공업체의 가격 책정에 의존하지 않고 시스템을 변경하거나 제거할 수 있습니다.
이것은 오픈 이노베이션(open innovation)이 특정 비즈니스 제약 조건에 더 잘 작동하는 지점입니다. 반드시 모델 정확도가 높다는 의미가 아니라, 데이터에 대한 로컬 통제권과 예측 가능한 인프라 비용을 확보할 수 있다는 뜻입니다. 어떤 오픈 모델이 항상 폐쇄형(closed) 모델보다 우수하다고 장담할 수는 없습니다. 하지만 사용자가 자신의 민감한 데이터가 어디로 갈지 결정권을 갖게 된다는 것을 장담할 수 있습니다.
다음으로 검증하고 싶은 것들
현재 프로토타입은 LKR 단위의 일대일, 정확 금액 입금 건만 처리합니다. 부분 결제, 다중 인보이스 이체, 환불, 또는 네이티브 싱할라어/타밀어 은행 참조 번호는 아직 해결하지 못했습니다. 이것들은 숨겨야 할 기능이라기보다는 중요한 한계점입니다.
다음으로는 실제 사업주와 함께 앉아 동의를 얻었거나 익명화된 그들의 이체 설명 샘플을 사용하고, 세 가지를 측정해 보고 싶습니다. 입금 건 매칭에 소요되는 시간, 상위 3개 후보 중 정확한 인보이스가 나타나는 빈도, 그리고 사설 로컬 소프트웨어에 대한 선호도가 설정 또는 지원 비용을 정당화할 만큼 충분히 강력한지 여부입니다.
그것이 해커톤 프로토타입을 사이드 허슬(side hustle)로 바꿀 것입니다.
Hacktoberfest 2026을 위해 제작되었습니다. 여기서의 이야기는 조작된 고객 후기나 주장되는 운영 배포가 아니라, 작동하는 MVP와 상업적 가설입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기