견적 메일 작성, 부가세·합계는 표 그대로 옮기게
품목표로 견적 안내 메일을 쓰게 하면 부가세 반올림 이야기까지 덧붙습니다. 금액은 표 그대로만 옮기게 하고, 파이썬으로 공급가·부가세·합계를 다시 계산해 대조합니다.
수량×단가 표는 있는데 견적 안내 메일이 없습니다. 문안은 AI 에게 맡겨도 부가세 1원이 표와 다르면 거래처가 먼저 알아봅니다. 금액은 표에서 계산을 끝내 두고, 메일에는 옮기기만 시킵니다.
[1] 입력은 가상 사무용품 6줄입니다. 부가세는 공급가액의 10%, 원 미만은 버립니다(시트 ROUNDDOWN(공급가액*0.1, 0)). 공급가액 569,825원의 10% 는 56,982.5 라서 절사하면 56,982원, 반올림하면 56,983원으로 1원이 갈리게 단가를 맞췄습니다.
품목 | 수량 | 단가(원) | 금액(원)A4 복사용지 (박스) | 12 | 23,400 | 280,800볼펜 검정 (갑) | 30 | 3,150 | 94,500서류 파일 | 20 | 1,870 | 37,400포스트잇 | 25 | 2,260 | 56,500스테이플러 심 | 40 | 890 | 35,600화이트보드 마커 | 15 | 4,335 | 65,025공급가액 | | | 569,825부가세(10%) | | | 56,982합계 | | | 626,807유효기간: 2026-11-13까지배송: 발주 후 3영업일, 배송비 없음[2] 먼저 짧게 시켰습니다. 금액 칸 없이 수량·단가만 주고 「공급가액, 부가세, 합계도 넣어 줘」 라고 했습니다. 본문 금액은 두 번 모두 맞았고, 문제는 메일 뒤에 붙은 설명입니다.
- 입력하신 단가를 부가세 별도 금액으로 보고 계산했습니다.- 부가세는 569,825원의 10%인 56,982.5원에서 원 단위 미만을 절사했습니다. 반올림 기준이면 부가세는 56,983원, 합계는 626,808원입니다.계산 규칙을 주지 않았으니 모델이 반올림 기준까지 다 적었습니다. 두 번째 실행도 같은 설명을 붙였습니다. 이 줄이 메일에 딸려 가면 거래처에 다른 금액이 보입니다.
[3] 프롬프트를 고칩니다. 계산은 표에서 끝냈으므로 메일은 숫자를 옮기기만 합니다. 계산과 문안을 나누라는 Gemini 가이드와, 필요한 규칙을 명시할수록 잘 따른다는 OpenAI 가이드를 따랐습니다. 표는 <quote> 로 감쌉니다.
아래 <quote> 의 품목표로 거래처에 보낼 견적 안내 메일을 써 줘. 규칙:- 금액은 표에 적힌 숫자만 그대로 옮긴다. 직접 계산하거나 고치거나 새 금액을 만들지 않는다. 표에 없는 금액은 쓰지 않는다.- 메일에는 품목표(품목·수량·단가·금액), 공급가액, 부가세, 합계를 표의 순서대로 넣는다.- 본문에 다음 세 가지를 각각 한 문장으로 쓴다: 견적 포함 범위, 유효기간, 다음 단계(발주 방법).- 회사명·담당자명·연락처는 [회사명] 처럼 대괄호로 비워 둔다.- 메일 본문만 출력한다. 설명·가정·확인 사항을 덧붙이지 않는다. <quote>{스프레드시트에서 복사한 표 · 유효기간 · 배송 조건}</quote>[4] 프롬프트에 quote.ko.txt 를 끼워 표준 입력으로 실행합니다. 첫 번째 실행의 끝부분입니다(품목 행은 줄였습니다).
$ claude -p --model claude-sonnet-5-5 --max-turns 1 --tools "" --setting-sources "" --strict-mcp-config < prompt.ko.txt > out.ko.txt| 공급가액 | | | 569,825 || 부가세(10%) | | | 56,982 || 합계 | | | 626,807 | 견적 포함 범위: 본 견적은 위 표의 6개 품목과 수량을 기준으로 하며, 배송비는 없습니다.유효기간: 본 견적은 2026-11-13까지 유효합니다.다음 단계: 발주를 원하시면 [담당자 연락처]로 품목과 수량을 회신해 주시기 바라며, 발주 후 3영업일 내에 배송해 드립니다.설명 줄이 사라졌습니다. 금액은 두 실행이 같았습니다. 첫 실행은 세 문장 앞에 「견적 포함 범위:」 같은 꼬리표를 붙였고, 두 번째는 포함 범위를 배송 문장에 합쳐 한 문장으로 썼습니다. 세 가지가 다 들어 있는지는 눈으로 봅니다.
[5] 사람이 다시 계산합니다. 시트에서 다시 계산해 눈으로 맞춰도 되고 아래 스크립트도 됩니다. 표에서 금액을 다시 계산한 뒤, 메일의 쉼표 숫자가 모두 그 안에 있는지 봅니다.
#!/usr/bin/env python3import re, sysrows = [l.split("|") for l in open(sys.argv[1], encoding="utf-8") if l.split("|")[1:2] and l.split("|")[1].strip().isdigit()]unit = {int(r[2].replace(",", "")) for r in rows}lines = [int(r[1]) * int(r[2].replace(",", "")) for r in rows]supply = sum(lines)vat = supply // 10 # ROUNDDOWN(supply * 0.1, 0)want = {"공급가액": supply, "부가세": vat, "합계": supply + vat}seen = {int(n.replace(",", "")) for n in re.findall(r"\d{1,3}(?:,\d{3})+", open(sys.argv[2], encoding="utf-8").read())}bad = 0for k, v in want.items(): bad += v not in seen print("OK " if v in seen else "MISS", k, f"{v:,}")for v in sorted(seen - set(lines) - set(want.values()) - unit): bad += 1 print("EXTRA", f"{v:,}")sys.exit(1 if bad else 0)$ python3 -I check.py quote.ko.txt out.ko.txt; echo "exit $?"OK 공급가액 569,825OK 부가세 56,982OK 합계 626,807exit 0[2]단계의 짧은 프롬프트 결과(out1.ko.1.txt)에는 EXTRA 56,983 · 626,808 이 나옵니다. 본문은 맞아도 설명 줄의 숫자가 걸립니다.
[6] 표 자체가 틀렸을 때는 어떻게 되는지도 봤습니다. 시트가 ROUND 로 계산해 부가세 56,983 · 합계 626,808 이 적힌 표를 같은 프롬프트에 넣었습니다. 모델은 규칙대로 그 숫자를 그대로 옮겼고(두 번 모두), 경고는 하지 않았습니다. 스크립트가 잡았습니다.
$ python3 -I check.py quote.ko.txt out2.sheet.ko.1.txt | grep -v OKMISS 부가세 56,982MISS 합계 626,807EXTRA 56,983EXTRA 626,808「표 그대로 옮겨라」 는 표가 맞을 때만 안전합니다. 반올림 기준은 거래처와 정한 사람이 압니다. 이 글의 ROUNDDOWN 은 가정입니다.