본문으로 건너뛰기

bea로 AI 에이전트에게 Beancount 원장 제공하기

bea로 AI 에이전트에게 두 가지 부기 작업을 맡겨보세요: 미리보기 우선 검토로 은행 CSV를 가져오고, BQL과 보고서 출력으로 잔액 질문에 답하는 작업입니다.

외부 AI 에이전트에게 두 가지 부기 작업을 맡기고 모든 원장 변경을 검토하세요: 미리보기 우선 확인으로 은행 CSV를 가져온 다음, 쿼리와 리포트 출력으로 잔액 질문에 답합니다.

CLI 빠른 시작으로 bea를 설치하세요. 로컬 가져오기, 쿼리, 리포트 명령은 Beancount.io 계정이 필요 없습니다. 채팅 에이전트는 자체 구독 또는 API 키만 있으면 됩니다. 내장된 bea ask 도우미만 호스팅 자격 증명이 필요하며, 이 레시피에서는 사용하지 않습니다.

도구를 고르고 계신가요? AI 에이전트용 회계 도구 5가지에서 Beancount.io, hledger, Xero, QuickBooks Online, Puzzle을 동일한 에이전트 작업 기준으로 날짜가 표시된 출처와 함께 비교합니다.

에이전트가 하는 일과 bea가 하는 일​

에이전트는 카테고리를 제안하고 쿼리를 초안합니다. Bea는 원장 구조를 검증하고 합계를 계산합니다. 아래 모든 명령은 직접 실행합니다. 에이전트는 원장을 직접 수정하지 않습니다.

레시피 1: 에이전트가 제안한 카테고리로 명세서 가져오기​

은행 내역을 검증된 항목으로 변환합니다. 에이전트는 분류 규칙을 제안합니다. 미리보기와 중복 검토가 무엇이 기록될지 결정합니다.

사전 요구 사항​

bea와 새 데모 디렉토리가 필요합니다. 계정도 Python 임포터도 필요 없습니다.

입력 준비​

디렉토리와 원장을 만듭니다. 명시적인 --file 대상은 모든 명령이 데모 원장을 가리키도록 합니다.

mkdir ai-agent-demo && cd ai-agent-demo
bea --no-input init books --currency USD --date 2026-08-01 --opening-balance "Assets:Checking 1000"
bea --file books/main.bean add open --date 2026-08-01 --account Expenses:Transport:Fuel -c USD

이 샘플을 statement.csv로 저장하세요:

Date,Payee,Narration,Amount
2026-08-02,Whole Foods,groceries,-20.00
2026-08-03,Shell,gas,-40.00
2026-08-04,Unknown Shop,mystery,-9.99

이 분류 규칙을 rules.toml로 저장하세요:

[[rule]]
match = "whole foods|trader joe|corner market"
account = "Expenses:Groceries"
 
[[rule]]
match = "shell|chevron|exxon"
account = "Expenses:Transport:Fuel"

작업 프롬프트 복사​

이 프롬프트를 CSV 내용과 함께 외부 에이전트에 붙여넣으세요:

Propose Beancount categorization rules for my bank CSV rows.
Suggest one TOML rule per merchant with a match pattern and a
destination expense account. Never change dates, payees, or amounts.
Leave rows you cannot categorize confidently unmatched: they post to
Expenses:Uncategorized with flag ! for my review. I run bea import
preview and apply locally. You do not write my ledger.

CLI 동등 명령 실행​

먼저 미리보기를 보고, 검토된 항목을 적용한 다음 결과를 검증하세요:

bea --file books/main.bean import statement.csv --csv date=Date,amount=Amount,payee=Payee,narration=Narration --account Assets:Checking --rules rules.toml
bea --file books/main.bean import statement.csv --apply
bea --file books/main.bean check
bea --file books/main.bean list transaction --flag '!'
bea --file books/main.bean query "SELECT account, sum(position) WHERE account = 'Assets:Checking' GROUP BY account"

예상 출력 확인​

미리보기는 3 ready, 0 exact duplicates, 0 possible duplicates을 보고하고 종료 코드 0으로 끝납니다. 아무것도 기록하지 않습니다. 적용 실행은 Wrote 3 entries을 보고합니다. 검사는 오류를 보고하지 않습니다. ! 큐는 Unknown Shop의 매칭되지 않은 행 하나를 -9.99 USD로 나열합니다. 잔액 쿼리는 checking에서 930.01 USD를 보고합니다. 적용을 반복하면 0 ready, 3 exact duplicates이 보고되고 0개 항목이 기록됩니다.

검토 및 수정​

읽은 후 ! 행을 원장에서 의도적으로 재분류하세요. 검사 통과는 단지 원장이 균형을 이룬다는 것만 증명합니다. Expenses:Uncategorized가 올바른 계정인지에 대해서는 아무것도 말하지 않습니다. 중복 정책, 충돌 처리, 고급 Python 경로에 대해서는 은행 CSV 워크스루를 따르세요.

레시피 2: 기록 없이 잔액 질문에 답하기​

데모 원장에서 한 가지 질문에 답하세요: 2026년 8월에 식료품과 연료에 얼마를 썼나요? 에이전트가 쿼리를 작성합니다. 읽기 전용 명령으로 답을 얻습니다.

사전 요구 사항​

레시피 1의 데모 원장 또는 직접 만든 원장이 필요합니다. 아래 모든 명령은 읽기 전용입니다.

작업 프롬프트 복사​

이 프롬프트를 외부 에이전트에 붙여넣으세요:

Draft a Beancount query (BQL) that answers: how much did I spend on
groceries and fuel in August 2026. Use my account names exactly as
listed by bea list open. Propose read-only commands only: bea query
or bea report with an explicit --file target. Do not propose ledger
edits to fix a surprising total. A surprising total means the query
or the books need review, not a compensating entry.

CLI 동등 명령 실행​

작성된 쿼리를 명시적 원장 대상으로 실행한 다음, 리포트로 교차 확인하세요:

bea --file books/main.bean query "SELECT account, sum(position) WHERE account ~ 'Expenses' GROUP BY account"
bea --file books/main.bean report income-statement --time 2026-08

머신 소비자는 하위 명령 앞에 전역 --json 플래그를 추가합니다:

bea --file books/main.bean --json query "SELECT account, sum(position) WHERE account ~ 'Expenses' GROUP BY account"

JSON 봉투, 종료 코드, 전역 플래그 위치는 CLI 참조를 따릅니다. 쿼리 언어 가이드는 전체 BQL 표면을 문서화합니다.

예상 출력 확인​

쿼리는 Expenses:Groceries에 대해 20.00 USD, Expenses:Transport:Fuel에 대해 40.00 USD, Expenses:Uncategorized에 대해 9.99 USD를 보고합니다. 식료품 더하기 연료는 60.00 USD입니다. 손익계산서도 일치합니다: 8월 비용 69.99 USD에 순이익 -69.99 USD. JSON 변형은 data.columns의 열 메타데이터와 함께 data.rows 안에 동일한 행을 반환합니다.

검토 및 수정​

잘못된 계정 이름에 대한 쿼리는 stderr에 (no rows)를 출력하고 여전히 종료 코드 0으로 끝납니다. bea list open 출력과 이름을 비교하고 쿼리를 다시 실행하세요. 놀라운 합계를 수정하려고 원장을 답에 맞게 편집하지 마세요. 쿼리나 원장을 수정한 다음 bea check를 다시 실행하세요.

첫 번째 과제: 합성 행 3개 균형 맞추기​

명시적 입력과 독립적으로 도출된 답이 있는 휴대용 첫 과제입니다. 아래 세 파일을 다운로드하고, 가져오기를 실행하고, 두 합계를 확인하세요. 계정도 제품 체크아웃도 필요 없습니다.

2026-09-01에 USD로 원장을 열고 checking에 1000 USD를 둡니다. 9월 행 3개를 게시하세요: 2000.00 USD 고객 결제, 29.00 USD 호스팅 청구서, 12.50 USD 카페 방문. checking은 1000 + 2000 - 29 - 12.50에서 2958.50 USD로 끝납니다. 9월 이익은 2000 - 29 - 12.50에서 1958.50 USD입니다. 두 기대치는 리포트 출력이 아닌 그 산술에서 나옵니다.

입력 준비​

디렉토리를 만들고 템플릿에 없는 두 계정을 엽니다. Expenses:Dining은 이미 CLI 템플릿에서 제공됩니다.

mkdir agent-challenge && cd agent-challenge
bea --no-input init books --currency USD --date 2026-09-01 --opening-balance "Assets:Checking 1000"
bea --file books/main.bean add open --date 2026-09-01 --account Income:Consulting -c USD
bea --file books/main.bean add open --date 2026-09-01 --account Expenses:Software -c USD

이 세 명령은 아래 원장을 생성합니다. 직접 입력하는 대신 main.bean으로 다운로드하세요.

option "title" "Personal ledger"
option "operating_currency" "USD"
 
; Add more accounts with bea add open. Amounts on credit accounts are negative.
; bea import books rows it cannot categorize to Expenses:Uncategorized with flag '!'.
2026-09-01 open Assets:Checking USD
2026-09-01 open Assets:Savings USD
2026-09-01 open Assets:Cash USD
2026-09-01 open Liabilities:CreditCard USD
2026-09-01 open Income:Salary USD
2026-09-01 open Income:Interest USD
2026-09-01 open Expenses:Groceries USD
2026-09-01 open Expenses:Dining USD
2026-09-01 open Expenses:Rent USD
2026-09-01 open Expenses:Transport USD
2026-09-01 open Expenses:Utilities USD
2026-09-01 open Expenses:Fees USD
2026-09-01 open Expenses:Uncategorized USD
2026-09-01 open Equity:OpeningBalances USD
 
2026-09-01 * "Opening balances"
  Assets:Checking          1000 USD
  Equity:OpeningBalances  -1000 USD
 
2026-09-01 open Income:Consulting USD
 
2026-09-01 open Expenses:Software USD

이 명세서를 statement.csv로 저장하거나 statement.csv로 다운로드하세요:

Date,Payee,Amount
2026-09-02,Client,2000.00
2026-09-03,Hosting,-29.00
2026-09-04,Cafe,-12.50

이 규칙을 rules.toml로 저장하거나 rules.toml로 다운로드하세요. 각 규칙은 시작 원장이 여는 계정을 지정합니다.

[[rule]]
match = "client"
account = "Income:Consulting"
 
[[rule]]
match = "hosting"
account = "Expenses:Software"
 
[[rule]]
match = "cafe"
account = "Expenses:Dining"

과제 실행​

먼저 미리보기를 보고, 적용한 다음 검증하세요. 금액, 날짜, 필드 이름, 계정 이름은 모든 로케일에서 동일합니다. 주변 산문만 번역됩니다.

bea --file books/main.bean import statement.csv --csv date=Date,amount=Amount,payee=Payee --account Assets:Checking --rules rules.toml
bea --file books/main.bean import statement.csv --csv date=Date,amount=Amount,payee=Payee --account Assets:Checking --rules rules.toml --apply
bea --file books/main.bean check
bea --file books/main.bean query "SELECT account, sum(position) WHERE account = 'Assets:Checking' GROUP BY account"
bea --file books/main.bean report income-statement --time 2026-09

예상 출력 확인​

미리보기는 3 ready, 0 exact duplicates, 0 possible duplicates을 보고하고 종료 코드 0으로 끝납니다. 적용 실행은 Wrote 3 entries을 보고합니다. 검사는 오류를 보고하지 않습니다. 잔액 쿼리는 checking에서 2958.50 USD를 유지합니다. 손익계산서는 비용 41.50 USD에 대해 Consulting 수입 2000.00 USD를 보여주며 순이익은 1958.50 USD입니다. 적용을 반복하면 0 ready, 3 exact duplicates이 보고되고 0개 항목이 기록됩니다.

레시피가 반복 작업이 될 때​

위 프롬프트는 손으로 실행하는 일회성 작업에 적합합니다. 매주 반복하는 작업은 제품 저장소의 버전 관리 스킬에 적합합니다. 아래 각 링크는 스킬의 현재 소스를 열며, 각각 자체 설정 및 트리거 지침을 담고 있습니다. 이 CMS는 이러한 파일의 사본을 보관하지 않습니다.

  • beancount-init으로 빈 디렉토리에서 새 원장을 시작하세요. 원장 파일, Fava 실행기, Python 프로젝트를 생성합니다.
  • beancount-import로 은행 내역을 분류된 항목으로 변환하세요. 모든 행을 스테이징하고, 원장 기록에서 카테고리를 제안하며, 이미 가져온 행을 건너뛰고, 확인 후에만 기록합니다. 위 레시피 1은 이 작업의 수동 형태입니다.
  • beancount-reconcile로 한 계정이 명세서와 일치함을 증명하세요. 원장과 명세서를 비교하고 확인 후 기간 말 잔액 검증을 기록합니다.
  • beancount-ask로 원장에서 질문에 답하세요. 읽기 전용 쿼리를 실행하고 각 쿼리를 수치 옆에 표시합니다. 위 레시피 2는 이 작업의 수동 형태입니다.
  • beancount-close로 한 달을 마감하세요. 모든 활성 계정을 조정하고, 반복 항목과 검토 플래그를 확인하며, 마감을 커밋으로 기록합니다.

전체 컬렉션은 정식 스킬 트리에 있습니다.

셸 사용 가능 에이전트에 bea 제공 또는 클라이언트에 스킬 로드​

이는 두 가지 별개의 단계입니다. bea를 설치해도 스킬이 설치되거나 구성되지 않습니다.

셸 사용 가능 에이전트는 경로에 명령이 필요합니다. CLI 빠른 시작으로 설치하면 에이전트가 레시피에 표시된 것과 동일한 bea 명령을 실행합니다. 에이전트가 제안하고, 검토하며, bea가 검증합니다.

스킬은 해당 클라이언트의 자체 스킬 메커니즘을 통해 에이전트 클라이언트 자체에 로드됩니다. 제품 저장소는 두 지원 클라이언트 모두에게 하나의 정식 트리를 노출합니다: Claude Code는 .claude/skills 아래에서, Codex는 .agents/skills 아래에서 동일한 소스에 연결된 디렉토리로 읽습니다. 클라이언트의 스킬 위치를 필요한 스킬 폴더로 지정하고, 트리거 문구와 업데이트를 위해 현재 소스를 계속 읽으세요.

bea ask는 원장 옆의 SKILL.md에서 자체 스킬을 별도로 로드합니다 — bea ask 스킬 확장을 참조하세요.

bea ask 없이 ask 유형 질문하기​

레시피 2는 외부 에이전트와 읽기 전용 bea query 및 bea report 명령으로 원장 질문에 답합니다. 그 경로는 로컬입니다. 계정도 추가 설치도 필요 없습니다.

bea ask는 별도의 내장 도우미입니다. 위 레시피도 beancount-ask 스킬도 아닙니다. 호스팅 AI 서비스를 통해 질문을 라우팅하므로 CLI 참조에 문서화된 대로 ask 추가 기능과 호스팅 자격 증명이 필요합니다. 기본 CLI를 먼저 설치한 다음, 호스팅 답변을 원할 때만 추가 기능을 설치하세요.

인용 출력과 CLI 검증​

위의 모든 명령은 새 디렉토리에서 게시된 bea 0.1.0 패키지로 실행되었습니다. 인용된 수치, 잔액, 메시지는 CLI 검증입니다.

한 클라이언트가 사전 제공 규칙 없이 새 복사본의 다운로드로 첫 번째 과제를 완료했습니다. Muse Code 1.1.1(모델 muse-spark-1.3-contributor)은 자체 분류를 도출하고, 아무것도 기록하지 않은 채 3개 준비 항목을 미리보기하고, 3개 항목을 적용했으며, 위 기대치와 일치하는 2958.50 USD checking과 1958.50 USD 9월 이익을 보고했습니다. 실패한 적용 한 건(샌드박스 캐시 잠금, XDG_CACHE_HOME으로 복구)은 기록에 보존됩니다. 전체 프롬프트, 도구 시퀀스, 검증은 실행 기록에서 읽거나, 데모 스크립트와 캡처된 출력으로 작동 경로를 재생할 수 있습니다.

그 실행은 모델 벤치마크가 아닌 단일 실행의 CLI 출력 검증입니다. 다른 클라이언트, 일반적인 회계 정확성, 또는 무인 프로덕션 사용에 대해 주장하지 않습니다.

전체 증명 스토리 — 입력, 방법론, 관찰된 결과, 실패, 한계, 다운로드 — 는 당신의 에이전트가 이 원장의 균형을 맞출 수 있나요?로 게시되어 있습니다.

이 워크플로우背后的 광범위한 연구는 Beancount.io의 회계 자동화 연구 허브인 Bean Labs에서 살펴보세요.

출처: https://beancount.io/ko/docs/Solutions/accounting-with-ai-agents