LLM을 활용하여 Beancount로 부기 자동화 및 개선
Beancount는 일반 텍스트 복식 부기 시스템으로, 최근 ChatGPT와 같은 대규모 언어 모델 (LLM) 덕분에 접근성이 향상되었습니다. 사업주, 스타트업 창업자, 엔지니어, 회계사를 포함한 기술 사용자는 LLM을 활용하여 Beancount의 텍스트 기반 원장의 유연성과 투명성을 유지하면서 지루한 부기 작업을 자동화할 수 있습니다. 이 보고서는 LLM이 거래 분류, 이상 징후 탐지, 분개 항목에 대한 스마트 제안, 자연어에서 항목 생성, 명세서 대사를 포함하여 Beancount 워크플로를 간소화할 수 있는 실용적인 방법을 살펴봅니다. 구현 팁, 기존 도구, 기회 및 제한 사항에 대한 논의와 함께 이러한 기능을 설명하기 위한 예제 프롬프트와 출력이 제공됩니다.
LLM을 통한 자동 거래 분류
부기의 가장 시간이 많이 소요되는 측 면 중 하나는 거래를 설명자(예: 수취인, 메모 또는 금액)를 기준으로 올바른 계정에 할당하는 거래 분류입니다. LLM은 언어 이해 및 광범위한 지식을 활용하여 각 거래에 대한 적절한 비용 또는 수입 계정을 제안함으로써 이를 크게 가속화할 수 있습니다.
예를 들어 Beancount 원장에 분류되지 않은 항목이 있는 경우:
2023-02-28 * "Amazon.com" "Laptop Stand, ... Portable Notebook Stand..."
Assets:Zero-Sum-Accounts:Amazon-Purchases -14.29 USD
(missing expense account)
LLM에 대한 프롬프트는 거래 균형을 맞추기 위한 적절한 비용 계정을 요청할 수 있습니다. 실제 사례에서 LLM은 노트북 스탠드의 아마존 구매를 Expenses:Office-Supplies:Laptop-Stand로 분류했습니다. 마찬가지로 와이퍼 블레이드 구매를 Expenses:Car:Maintenance로, 주방 가전 제품을 Expenses:Kitchen:Appliances로 지정하여 품목 설명에서 지능적으로 범주를 추론했습니다. 이러한 예는 LLM이 컨텍스트 (수취인 및 설명)를 사용하여 적절한 Beancount 계정을 선택하는 방법을 보여줍니다.
Beanborg와 같은 최신 도구는 이 기능을 통합합니다. Beanborg는 거래 데이터를 올바른 비용 계정에 자동으로 매칭할 수 있는 오픈 소스 Beancount 임포터입니다. 기본적으로 규칙 기반 엔진을 사용하지만, 머신러닝 및 ChatGPT도 분류 제안에 지원합니다. Beanborg를 사용하면 은행 CSV를 가져와 대부분의 항목을 자동 분류할 수 있습니다(예: "Fresh Food Inc."를 포함하는 수취인은 규칙 또는 LLM 지원에 따라 Expenses:Groceries로 분류될 수 있습니다).
분류에 LLM을 사용하는 방법: GPT-4와 같은 모델에 거래 설명 배치를 제공하고 가능성이 높은 계정을 지정하도록 요청할 수 있습니다. 한 가지 제안된 워크플로는 다음과 같습니다. GPT를 사용하여 소량의 비용을 분류하고, 수동으로 실수를 수정하고, Beancount의 내장 임포터 플러그인 (예: smart_importer)을 사용하여 향후 거래에 대한 이러한 예에서 학습합니다. 이 하이브리드 접근 방식은 LLM의 광범위한 지식을 활용하여 새로운 또는 드문 거래에 사용하고 (_PILOT Parallel Calligraphy Pens_가 미술 용품 비용 계정에 속해야 한 다고 추론하는 경우), 일관되게 해당 분류를 적용합니다.
예제 프롬프트 및 응답: 다음 표는 사용자가 LLM과 상호 작용하여 거래를 분류하는 방법을 보여줍니다.
| 사용자 프롬프트 (거래 세부 정보) | LLM 제안 계정/항목 |
|---|---|
분류: "Starbucks - Latte $5.00 on 2025-04-01" | 제안: Expense – Expenses:Food:Coffee (커피 구매) 예상 |
분류: "Amazon.com - Bosch Rear Wiper Blade $11.60" | 제안: Expenses:Car:Maintenance (자동차 부품 교체) |
분류: "Salary payment from ACME Corp $5000" | 제안: Income:Salary (급여 수입) |
완료 항목: 2025-07-10 * "Office Depot" "printer ink" Assets:Checking -45.00 USD | 추가: Expenses:Office:Supplies 45.00 USD (항목 균형) |
이러한 예에서 LLM은 일반적인 지식 (Starbucks는 커피, Amazon 자동차 부품은 자동차 유지 보수와 관련, ACME 급여는 수입)을 활용하여 올바른 Beancount 계정을 제안합니다. 또한 누락된 균형 분개를 추가하여 분개 항목을 완료할 수도 있습니다 (Office Depot의 경우 지불을 상쇄하기 위해 사무용품 비용 계정을 제안). 시간이 지남에 따라 이러한 AI 기반 분류는 시간을 절약하고 거래 분류에 대한 수동 노력을 줄일 수 있습니다.
이상 징후 탐지 및 중복 식별
분류 외에도 LLM은 일반 영어로 거래 설명 및 패턴을 분석하여 중복 항목 또는 비정상적인 비용과 같은 원장의 이상 징후를 식별하는 데 도움이 될 수 있습니다. 기존 소프트웨어는 해시 또는 엄격한 규칙을 통해 정확한 중복 항목을 잡을 수 있습니다 (예를 들어 Beanborg는 CSV 데이터의 해시를 사용하여 동일한 거래를 두 번 가져오는 것을 방지합니다). 그러나 LLM은 보다 컨텍스트를 인식하는 검토를 제공할 수 있습니다.
예를 들어 최근 거래 목록으로 LLM에 프롬프트를 표시하고 _“이러한 항목 중 중복되거나 비정상적인 이상값이 있습니까?”_라고 물을 수 있습니다. LLM은 컨텍스트 분석에 뛰어나기 때문에 두 항목의 날짜와 금액이 같거나 설명이 매우 유사한 경우 이를 잠재적인 중복으로 플래그할 수 있습니다. 또한 정상적인 지출 패턴을 인식하고 편차를 감지할 수 있습니다. 한 소스에서 지적했듯이 “금융 거래 스트림의 컨텍스트에서 LLM은 전형적인 것을 학습하고 적합하지 않은 것을 식별하여 비정상적인 지출 습관을 감지할 수 있습니다.”
비정상적인 금액의 예: 일반적으로 연료에 50를 지출하지만 갑자기 연료 거래가 $300인 경우 LLM은 이를 이상 징후로 강조 표시할 수 있습니다 (“이 연료 비용은 일반적인 패턴보다 10배 더 큽니다”). LLM은 규칙 기반 시스템에서 간과할 수 있는 미묘한 편차까지 감지하여 이상 징후를 식별합니다. 하드 임계값이 아닌 컨텍스트 (예: 타이밍, 범주, 빈도)를 고려합니다.
중복 예: 거의 동일한 두 개의 원장 라인 (가까운 날짜에 동일한 수취인 및 금액)이 주어진 경우 LLM은 _“ACME Corp에 대한 $100의 2025-08-01 및 2025-08-02 거래는 중복인 것으로 보입니다.”_라고 응답할 수 있습니다. 이는 여러 소스에서 데이터가 입력되었거나 은행에서 거래를 이중으로 게시한 경우에 특히 유용합니다.
LLM 기반 이상 징후 탐지는 여전히 새로운 영역이지만, 자연어로 플래그된 _이유_를 설명하여 기존 방법을 보완합니다. 이는 인간 검토자가 문제를 신속하게 이해하고 해결하는 데 도움이 될 수 있습니다 (예: 중복을 확인하고 하나의 항목을 삭제하거나 이상값 비용을 조사).
저널 완성을 위한 스마트 제안
LLM은 Beancount에서 분개 항목을 작성하거나 수정할 때 지능형 도우미 역할을 할 수 있습니다. 거래를 분류할 뿐만 아니라 부분 항목을 완료하거나 불균형을 수정하는 방법도 제안합니다. 이는 원장에 대한 스마트 자동 완성 기능이 있는 것과 같습니다.
계정 및 금액 제안: 수취인과 금액으로 새 거래를 입력했지만 어떤 계정에 속하는지 결정하지 않았다고 가정합니다. LLM은 설명에 따라 계정을 제안할 수 있습니다 (분류에서 다루었듯이). 또한 상호 보완적인 분개를 제공하여 항목 균형을 맞출 수 있습니다. 예를 들어 사용자는 다음과 같이 쓸 수 있습니다.
2025-09-10 * "Cloud Hosting Inc" "Monthly VM hosting fee"
Assets:Bank:Checking -120.00 USD
[Missing second posting]
LLM에 _“이 거래의 다른 면은 무엇입니까?”_라고 물으면 클라우드 호스팅 요금이 사업 비용임을 인식하여 항목 균형을 맞추기 위해 Expenses:Business:Hosting 120.00 USD를 제안할 수 있습니다.
Beancount Google 그룹에서 한 사용자는 Amazon 구매 항목의 한쪽 배치를 ChatGPT에 공급하고 **“각 거래의 균형을 맞추기 위해 분류된 비용 분개를 추가”**하도록 요청하여 이를 입증했습니다. GPT는 각 누락된 분개를 그럴듯한 비용 계정으로 채웠습니다 (때로는 "Laptop Stand"에 대한 계정을 만드는 것처럼 너무 세분화됨). 이는 LLM이 불완전한 데이터가 주어지면 완전한 분개 항목을 작성할 수 있는 방법을 보여줍니다.
내레이션 개선: LLM은 항목의 내레이션 또는 설명을 개선하는 데 도움이 될 수도 있습니다. 설명이 너무 애매한 경우 (예: 은행 명세서의 내부 코드) LLM에 원장에 대해 더 명확하게 다시 작성하도록 요청할 수 있습니다. LLM은 자연어를 잘 처리하므로 명확성을 위해 "PUR CHK 1234 XYZ CORP"를 "Check #1234 to XYZ Corp"로 변환할 수 있습니다.
안내 및 학습: 시간이 지남에 따라 LLM은 거래를 입력할 때 편집 워크플로 (편집기 플러그인 또는 Fava 확장을 통해 가능)에 통합되어 가능한 완성을 제안할 수 있습니다. 이는 코드 편집기가 AI를 사용하여 코드 완성을 제안하는 방법과 유사합니다. 일반 텍스트 회계에서 LLM은 기존 계정 이름과 과거 항목에서 가져와 다음 항목을 완료하는 방법을 권장할 수 있습니다. 예를 들어 수취인에 "Staples"가 나타날 때마다 Office Supplies를 자주 기록하는 경우 모델은 이 패턴을 학습할 수 있습니다. 일부 사용자는 몇 가지 예 후에 ChatGPT의 제안을 구체화하고 smart_importer와 같은 플러그인을 사용하여 향후 거래에 대해 일반화할 수 있다고 보고합니다.
요약하면 LLM은 Beancount의 복식 규칙을 준수하는 완료 및 수정을 제공하여 항목에 대한 “두 번째 쌍의 눈”을 제공합니다.
비정형 입력에서 Beancount 항목 생성
LLM의 가장 강력한 용도 중 하나는 비정형 금융 정보 (원시 텍스트, 영수증 또는 자연어 설명)를 구조화된 Beancount 항목으로 변환하는 것입니다. 이를 통해 사용자는 자유 형식 데이터를 말하거나 붙여넣고 유효한 원장 항목을 반환할 수 있습니다.
자연어에서 항목으로: 다음과 같은 문장으로 LLM에 프롬프트를 표시할 수 있습니다.
“2025년 7월 10일에 내 당좌 예금 계좌로 Office Depot에서 사무용품 (프린터 잉크)을 $45에 샀습니다.”
유능한 LLM은 이를 해석하고 다음과 같은 내용을 생성합니다.
2025-07-10 * "Office Depot" "printer ink"
Assets:Bank:Checking -45.00 USD
Expenses:Office:Supplies 45.00 USD
날짜, 수취인, 내레이션, 금액을 식별하고 적절한 계정을 추측했습니다 (은행 자산을 차변하고 사무용품 비용을 대변). 이는 기본적으로 일반 영어 비용 보고서를 적절하게 형식이 지정된 Beancount 분개 항목으로 바꿉니다. 최근 연구에서는 복식 부기에 대한 LLM의 이해를 평가하기 위해 Beancount를 목표 형식으로 사용했지만 결과는 혼합되었습니다 (LLM은 구문을 정확하게 맞추기 위해 신중한 프롬프트가 필요한 경우가 많습니다). 그러나 잘 만들어진 프롬프트 또는 소수의 예제를 통해 GPT-4와 같은 모델은 일반적으로 간단한 시나리오에 대한 올바른 항목을 생성할 수 있습니다.
OCR에서 원장으로: 비전 또는 OCR 기능이 있는 LLM (이미지 입력이 있는 GPT-4 또는 특수 도구와 같은)은 한 단계 더 나아가 영수증 이미지 또는 은행 명세서 PDF를 가져와 거래를 추출할 수 있습니다. 예를 들어 ChatGPT에 영수증 사진을 보여주고 Beancount 항목을 요청할 수 있습니다. 모델은 날짜, 총액, 공급업체 및 아마도 세금을 구문 분석한 다음 해당 세부 정보로 항목을 출력합니다. 한 가이드에서는 ChatGPT가 송장 또는 영수증의 데이터를 _“회계에 적합한 깨끗하고 형식이 지정된 테이블”_로 변환할 수 있다고 언급합니다. 그런 다음 Beancount 계정에 매핑할 수 있 습니다. 마찬가지로 CSV 또는 Excel 내보내기를 LLM에 제공하여 Beancount 거래를 출력하도록 지시할 수 있습니다. 실제로 사용자는 GPT에 _“CSV를 구문 분석하고 Beancount 항목을 출력하는 Python 스크립트를 작성”_하도록 요청하여 가져오기를 자동화했습니다.
다중 거래 처리: LLM은 배치 입력을 처리할 수도 있습니다. 원시 거래 목록 (날짜, 설명, 금액)을 붙여넣고 해당 Beancount 원장 라인을 생성하도록 모델에 요청할 수 있습니다. 커뮤니티의 예제 프롬프트는 GPT-4에 _“CSV 콘텐츠를 회계 원칙에 따라 Beancount 형식으로 변환”_하도록 자세한 지침을 사용합니다. 출력은 모든 거래를 다루는 완전한 .beancount 파일입니다. 이 접근 방식은 기본적으로 비 프로그래머가 자연어로 AI에 지시하여 사용자 정의 가져오기 스크립트가 수행할 작업을 달성할 수 있도록 합니다.
LLM은 텍스트를 구문 분석하고 생성하는 데 인상적이지만 유효성 검사가 중요하다는 점을 명심하십시오. 비정형 입력에서 생성된 항목을 항상 검토하십시오. 날짜, 금액 및 차변/대변 균형 (Beancount의 컴파일러는 불균형 오류를 잡음)을 확인하십시오. 한 연구에서 강조했듯이 신중한 지침이 없으면 LLM은 시간의 작은 부분에서만 완전히 올바른 복식 거래를 생성할 수 있습니다. 프롬프트에 템플릿 예제를 제공하고 Beancount 구문을 모델에 명시적으로 상기시키면 정확도가 크게 향상됩니다.