BillG는 OpenAI GPT-4o의 멀티모달 처리 기능을 활용하여 영수증 이미지에서 데이터를 자동으로 추출하고 Excel 스프레드시트에 직접 삽입하는 Microsoft Excel 추가 기능입니다. 전통적인 OCR보다 뛰어난 정확도로 경비 추적, 회계 처리, 데이터 입력 자동화를 지원합니다.
Excel로 영수증을 하나하나 수동으로 입력하는 반복적이고 지루한 작업을 보며, "이걸 자동화할 수 없을까?"라는 단순한 질문에서 시작된 사이드 프로젝트입니다.
오픈소스 OCR의 한계
- 여러 오픈소스 OCR 모델을 테스트했지만 한국어 인식률이 낮음
- 영수증의 구분선, 테이블 구조 처리에 취약
- 폰트 변형이나 기울어진 텍스트 인식 실패
상용 API의 높은 비용
- 네이버 클로바 OCR, 업스테이지 Document AI 등 검토
- 높은 정확도를 제공하지만 개인 프로젝트에는 비용 부담이 과도함
- 소규모 사용에도 최소 비용이 발생
GPT-4o: 실용적인 해결책
- 멀티모달 AI의 강력한 이미지 이해 능력 활용
- 한국어 영수증도 높은 정확도로 처리
- 구조화된 데이터 추출이 가능
- Temperature 0 설정에서도 간혹 일관성 문제가 있지만, 실용적 수준의 정확도 달성
- 사용자가 익숙한 Excel 환경에서 직접 작동
- 별도 프로그램 설치 없이 간편하게 사용
- 기존 업무 플로우를 그대로 유지하면서 자동화 혜택
demo.mp4
주요 시연 내용:
- Excel에서 열 머리글 선택
- 영수증 이미지 업로드 (드래그 앤 드롭)
- AI 기반 데이터 추출 및 자동 입력
- 다중 영수증 일괄 처리
- 🤖 GPT-4o AI - 최신 멀티모달 LLM으로 높은 정확도의 텍스트 추출
- 📸 스마트 영수증 스캔 - 여러 영수증 이미지를 업로드하고 자동으로 데이터 추출
- 📊 Excel 직접 연동 - 선택한 Excel 테이블로 데이터가 바로 입력
- 🌏 한국어 지원 - 완벽한 한국어 UI 제공
- 🎨 모던 UI - Fluent UI로 Office와 완벽하게 통합
- 🔒 보안 처리 - HTTPS 암호화 및 파일 검증
- ⚡ 일괄 처리 - 최대 50개의 영수증을 한 번에 처리
영수증 처리를 위한 백엔드 API 서버입니다.
- 저장소: https://github.com/hbjs97/billg-server
- 기술 스택: FastAPI, Python 3.12, OpenAI GPT-4o API
- 주요 기능:
- 멀티모달 AI 기반 영수증 데이터 추출
- 이미지 전처리 및 최적화
- IP 기반 요청 제한 (60초당 10개 요청)
- 비동기 처리 및 배치 처리 지원
자세한 설정 및 사용법은 BillG Server 문서를 참조하세요.
- Node.js 20.11 이상
- npm 9.0 이상
- Microsoft Excel 2016 이상 (데스크톱 또는 온라인)
- SSL 인증서 (로컬 개발용)
-
저장소 복제
git clone https://github.com/hbjs97/billg.git cd billg -
의존성 설치
npm install
-
환경 변수 설정
# 루트 디렉토리에 .env 파일 생성 echo "API_ORIGIN=https://your-billg-server.com" > .env
-
개발 서버 시작
npm run dev-server
추가 기능은
https://localhost:3000에서 사용할 수 있습니다
-
개발 서버 시작
npm run dev-server
-
추가 기능 사이드로드
npm start
Excel이 자동으로 열리고 추가 기능이 로드됩니다
- Excel 열기
- 삽입 → 추가 기능 → 내 추가 기능 이동
- 내 추가 기능 업로드 클릭
- 프로젝트 루트에서
manifest.xml선택 - 업로드 클릭
-
Excel 테이블 준비
- 추출할 데이터에 대한 열 머리글 생성
- 예시:
날짜 | 상점명 | 금액 | 세금 | 총액 - 클릭 및 드래그로 머리글 행 선택
-
영수증 이미지 업로드
- 업로드 영역 클릭 또는 이미지 드래그 앤 드롭
- 지원 형식: PNG, JPG, JPEG
- 최대 파일 크기: 이미지당 20MB
- 최대 파일 수: 한 번에 50개
-
스캔 및 추출
- 스캔 버튼 클릭
- 처리 대기 (보통 5-30초)
- 데이터가 자동으로 머리글 아래에 표시됨
-
검토 및 편집
- 추출된 데이터의 정확성 확인
- Excel에서 직접 셀 편집 가능
- 프로세스를 반복하여 더 많은 영수증 추가
| 명령어 | 설명 |
|---|---|
npm run dev-server |
핫 리로드가 있는 개발 서버 시작 |
npm run build |
프로덕션 빌드 생성 |
npm run build:dev |
개발 빌드 생성 |
npm run lint |
ESLint 검사 실행 |
npm run lint:fix |
린팅 문제 자동 수정 |
npm run prettier |
Prettier로 코드 포맷팅 |
npm run validate |
manifest.xml 검증 |
npm start |
Office 디버깅 세션 시작 |
npm stop |
Office 디버깅 세션 중지 |
billg/
├── src/
│ ├── commands/ # Office 추가 기능 명령 핸들러
│ └── taskpane/
│ ├── components/ # React 컴포넌트
│ │ ├── App.tsx # 메인 애플리케이션
│ │ ├── BillScanner.tsx # 핵심 스캔 로직
│ │ ├── FileUpload.tsx # 파일 처리
│ │ ├── Header.tsx # 앱 헤더
│ │ └── InstructionList.tsx # 사용자 안내
│ └── index.tsx # React 진입점
├── assets/ # 아이콘 및 이미지
├── manifest.xml # 추가 기능 구성
├── webpack.config.js # 빌드 구성
├── Dockerfile # 컨테이너 설정
└── nginx.conf # 웹 서버 구성
다른 기기에서 테스트하거나 다른 사람과 공유하려면:
-
ngrok 설치
npm install -g ngrok # 또는 https://ngrok.com에서 다운로드 -
로컬 서버 시작
npm run dev-server
-
공개 터널 생성
ngrok http https://localhost:3000
-
manifest.xml 업데이트
- 모든
https://localhost:3000을 ngrok URL로 교체 - 예시:
https://abc123.ngrok.io
- 모든
-
Excel에서 추가 기능 다시 로드
| 변수 | 설명 | 기본값 | 필수 |
|---|---|---|---|
API_ORIGIN |
BillG Server API 엔드포인트 URL | - | 예 |
NODE_ENV |
환경 모드 | development |
아니오 |
manifest.xml의 주요 설정:
<!-- 프로덕션용으로 이 URL들을 업데이트 -->
<SourceLocation DefaultValue="https://your-domain.com/index.html"/>
<IconUrl DefaultValue="https://your-domain.com/assets/icon-32.png"/>
<HighResolutionIconUrl DefaultValue="https://your-domain.com/assets/icon-64.png"/>GPT-4o 기반 영수증 처리 API:
- Content-Type:
multipart/form-data - 요청 제한: IP당 60초당 10개 요청
- 이미지 처리: 자동 크기 조정 및 전처리
| 매개변수 | 타입 | 필수 | 설명 |
|---|---|---|---|
files |
File[] | 예 | 영수증 이미지 (JPEG, PNG, 최대 20MB) |
columns |
String | 예 | 쉼표로 구분된 추출 필드 |
- 날짜/시간:
date,time,datetime,purchase_date - 금액:
total_amount,subtotal,tax,discount,금액,세금,총액 - 텍스트:
vendor_name,store_address,receipt_number,상점명,주소 - 항목 목록:
items,products,상품목록
{
"results": [
{
"날짜": "2024-01-15",
"상점명": "커피숍",
"금액": "4500",
"세금": "450",
"총액": "4950",
"상품목록": ["아메리카노", "크로와상"]
}
]
}| 상태 코드 | 설명 |
|---|---|
| 400 | 잘못된 요청 - 유효하지 않은 입력 |
| 429 | 너무 많은 요청 - 요청 제한 초과 |
| 500 | 내부 서버 오류 |
---
## 🐛 문제 해결
### 일반적인 문제
#### 추가 기능이 로드되지 않음
- **HTTPS 인증서 확인**: 유효한 SSL 인증서 확인
- **manifest URL 확인**: 모든 URL이 HTTPS여야 함
- **Office 캐시 지우기**:
```bash
# Windows
%LOCALAPPDATA%\Microsoft\Office\16.0\Wef\
# Mac
~/Library/Containers/com.microsoft.Excel/Data/Documents/wef
- API 연결 확인:
API_ORIGIN이 올바른지 확인 - 이미지 형식 검증: PNG, JPG, JPEG만 지원
- 파일 크기 확인: 파일당 최대 20MB
- 콘솔 로그 검토: Excel에서 F12를 눌러 개발자 도구 확인
- 단일 행 선택: 하나의 머리글 행만 선택해야 함
- 권한 확인: Excel에 편집 권한이 있어야 함
- 열 머리글 확인: 머리글이 비어있으면 안 됨
상세 로깅 활성화:
// src/taskpane/index.tsx에서
if (process.env.NODE_ENV === "development") {
console.log("디버그 모드 활성화");
// 추가 로깅
}이 프로젝트는 MIT 라이선스 하에 있습니다 - 자세한 내용은 LICENSE 파일을 참조하세요.
- 이슈: GitHub Issues
