손글씨 데이터 입력, 매번 '눈으로만' 하던 일
우리 팀이 맞닥뜨린 문제는 의외로 단순했습니다. 해외 바이어들이 보내온 주문 양식 중 일부가 손으로 작성된 PDF나 스캔 이미지였거든요. 배송지 주소, 특수 요청사항 같은 정보들이 인쇄된 폼에 펜으로 끄적여져 있었습니다.
처음엔 누군가 그 이미지들을 열어서 '읽고' 직접 구글 시트에 타이핑했습니다. 월 200~300장 정도 되니까, 시간이 꽤 걸렸죠.
「이걸 봇이 읽을 수 있지 않을까?」
Claude Code로 '눈'을 줄 수 있을까?
Claude Code의 강점 중 하나는 이미지를 이해할 수 있다는 점입니다. 단순한 글자 인식(OCR)이 아니라, 이미지 전체의 맥락을 파악할 수 있죠.
우리의 접근 방식은 이랬습니다:
1. **이미지 업로드 폴더 감시**: 윈도우 디바이스의 특정 폴더에 스캔 이미지가 들어오면 자동 감지
2. **Claude Code 호출**: 이미지를 Claude API로 전송
3. **맥락 기반 추출**: 단순 글자뿐 아니라 "이 필드는 배송지", "이건 특수 요청" 같은 의미 파악
4. **구글 시트 자동 입력**: 추출한 데이터를 올바른 열에 자동 배치
실제 구현 단계 (따라 하기)
Step 1: Claude API 키 준비
먼저 [Claude API 콘솔](https://console.anthropic.com)에서 API 키를 발급받으세요.
Step 2: Python 환경 세팅
pip install anthropic google-auth-oauthlib google-auth-httplib2 google-api-python-client pillow
Step 3: 기본 스크립트 (이미지 읽기)
import anthropic
import base64
from pathlib import Path
def read_handwriting_image(image_path):
"""이미지에서 손글씨 데이터 추출"""
# 이미지를 Base64로 인코딩
with open(image_path, "rb") as img:
image_data = base64.standard_b64encode(img.read()).decode("utf-8")
client = anthropic.Anthropic(api_key="YOUR_API_KEY")
# Claude에 이미지와 함께 질문
message = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data,
},
},
{
"type": "text",
"text": """이 이미지에서 다음 정보를 추출해주세요.
- 배송지 주소
- 수령인 이름
- 연락처
- 특수 요청사항
JSON 형식으로 반환하세요."""
}
],
}
],
)
return message.content[0].text
# 사용 예시
result = read_handwriting_image("order_scan.jpg")
print(result)
Step 4: 구글 시트 자동 입력까지
위 스크립트의 결과를 파싱해서 구글 시트에 추가하면 끝입니다. (구글 시트 API 연동은 별도 튜토리얼 참고)
실제로 달라진 점
• **시간**: 월 6~8시간 절약
• **정확도**: 손글씨 인식률 92% 수준 (완벽하지 않지만, 검수만 필요)
• **휴먼에러 감소**: 수작업 입력 시 발생하던 오타, 빠진 정보 대폭 감소
한계와 배운 점
모든 손글씨가 읽혀지진 않습니다. 특히:
• 필기가 매우 흐릿하거나 작을 때
• 여러 언어가 섞여 있을 때
이런 경우는 봇이 불확실성을 표시하고, 팀이 수동 확인하는 '하이브리드' 방식으로 운영 중입니다.
완벽한 자동화보다는 「충분히 좋은 자동화」가 현실적일 때가 많습니다.
다음 실험: 필기 스타일 학습
Claude Code를 조금 더 미세조정하면, 특정 바이어의 필기 패턴을 학습해서 정확도를 더 높일 수 있을 것 같습니다. 그건 다음 편에서 공유하겠습니다.