Excel·Python으로 AI 초안 검산: 합계 26 뒤의 채널 교환 거르기
AI 초안에 계획 30, 완료 26이 적혔다고 해서 채널별 설명까지 맞는 것은 아닙니다. 온라인의 완료 8과 매장의 완료 12를 뒤바꿔도 전체 합계는 26입니다. 이 실습에서는 합계 세 칸을 확인하는 Excel 파일과 채널별 행·입력 버전을 확인하는 Python 검사를 나눠, 서로 다른 오류를 실제로 거부합니다.
준비: 원본 세 행을 고정하기
첨부 ZIP의 source.csv와 numeric-review.xlsx는 같은 합성 입력을 담습니다. 실제 기업 성과나 모델 응답 자료가 아닙니다. XLSX는 원본·검산기록 두 시트이며, 원본 A2:C4에 아래 값이 있습니다. 계획과 완료는 이 예제의 가상 건수입니다.
| 채널 | 계획 | 완료 | 완료-계획 |
|---|---|---|---|
| 온라인 채널 | 10 | 8 | -2 |
| 매장 채널 | 12 | 12 | 0 |
| 파트너 채널 | 8 | 6 | -2 |
| 합계 | 30 | 26 | -4 |
완료-계획을 쓰므로 부족분은 음수입니다. 4건 부족이라는 말과 차이 -4는 같은 방향을 표현하지만, JSON의 difference 필드에는 -4를 넣는 계약으로 고정합니다. 비교 도중 부호의 정의를 바꾸지 않습니다.

합계 검사와 행 검사를 분리한 이유
원본 B5는 =SUM(B2:B4), C5는 =SUM(C2:C4), D5는 =C5-B5입니다. SUM은 값·셀 참조·범위를 더하는 함수입니다. SUM function | Microsoft Support 검산기록의 두 합성 후보는 30/26/-4와 30/25/-5입니다. 저장값을 재계산하면 앞 후보는 일치, 뒤 후보는 폐기가 됩니다. B4:D4의 직접 입력 칸은 비어 있으므로 입력 필요입니다.
이 시트는 합계 세 값만 봅니다. 모든 결과를 일치 하나로 표현하지 않기 위해 채널별 검사는 review.py에서 따로 합니다. JSON에는 source_sha256, rows, totals만 들어가며 rows에는 채널·계획·완료·차이가 모두 있어야 합니다. 원본과 같은 순서의 세 행을 요구합니다.
{"channel":"온라인 채널","planned":10,"completed":8,"difference":-2}
합계만 필요하다고 이 행을 생략하거나, 이름 없이 8·12·6 숫자만 보내면 어느 채널의 값인지 검산할 수 없습니다. 스크립트는 필드를 추가한 응답도 같은 계약으로 보지 않습니다. 자유로운 해설이 필요하다면 검산용 JSON과 별도 문서로 보관합니다.
세 후보를 차례로 실행하기
-
ZIP을 빈 연습 폴더에 풀고 source.csv를 열어 세 입력 행을 확인합니다. 원본은 수정하지 않고 사본에서 연습합니다.
-
터미널에서
python3 review.py source.csv synthetic-correct.json을 실행합니다. accepted가 true이고 totals가 30·26·-4인지 확인합니다. -
마지막 파일명만 synthetic-wrong-total.json, synthetic-wrong-channel.json으로 바꿔 실행합니다. 두 경우 모두 accepted false와 종료 코드 1이 나오는지 확인합니다.
세 JSON은 직접 만든 합성 응답입니다. 실제 AI를 호출하지 않았습니다. 정상 파일을 모델이 생성했다고 표시하거나 검사 성공을 AI 성능 비교에 사용하지 않습니다. Python 표준 라이브러리만 사용하며 네트워크 연결과 원본 파일 쓰기 기능이 없습니다.
합계가 같아도 버려야 하는 반례
synthetic-wrong-channel.json은 온라인 완료를 12, 매장 완료를 8로 뒤바꿉니다. 차이도 각각 +2, -4로 바꾸었으므로 행의 산술 자체는 맞고 합계도 26과 -4를 유지합니다. 하지만 source.csv의 온라인 완료는 8이고 매장은 12입니다. review.py는 원본에서 계산한 채널별 행·합계·파일 해시를 응답 전체와 대조하므로 이 후보를 거부합니다.
| 후보 | 합계 | 행 값 | 처리 |
|---|---|---|---|
| synthetic-correct | 30/26/-4 | 원본과 같음 | 계약 일치 |
| synthetic-wrong-total | 30/25/-5 | 원본 행은 보존 | 합계 불일치로 거부 |
| synthetic-wrong-channel | 30/26/-4 | 온라인·매장 완료 교환 | 행 불일치로 거부 |
오류 후보를 복구할 때 원본을 후보에 맞춰 바꾸지 않습니다. 잘못된 후보를 보존하고, 원본을 다시 읽어 새 후보를 다른 이름으로 저장한 뒤 검사합니다. 무엇이 바뀌었는지 남기지 않고 응답 숫자만 덮어쓰면 검토 이력을 잃습니다.

입력 버전이 다르면 같은 답으로 합치지 않기
source_sha256은 전달한 CSV 바이트에서 계산합니다. hashlib의 hexdigest는 해시 요약을 16진수 문자열로 반환합니다. hashlib — Secure hashes and message digests 응답에 적힌 요약과 읽은 원본의 요약이 다르면 예전 입력에 대한 답일 수 있어 거부합니다. 행별 값이 같더라도 파일의 줄바꿈 등 바이트가 달라지면 다시 검토하는 엄격한 예제입니다.
이 표시는 작성자 서명이나 사실 확인 인증이 아닙니다. 누군가 원본과 응답을 함께 바꾸면 두 파일끼리 맞도록 만들 수 있습니다. 신뢰할 원본을 별도 보관하는 책임은 남습니다. 정상적인 입력 변경이라면 원본의 새 사본과 새 응답을 한 쌍으로 만들어 검토하고, 이전 기록을 지우지 않습니다.
문자·빈칸·중복 행의 실패와 복구
검산기록 B4:D4에서 26을 문자로 입력하면 숫자 세 개 조건을 만족하지 않아 입력 필요입니다. 원본이나 결과 수식을 지우고 빈칸을 0으로 해석하지 마세요. 직접 입력 칸을 숫자로 고친 뒤 다시 비교합니다. CSV에서 채널명이 두 번 나타나면 Python 검사는 중복 채널 오류로 중단합니다. 누락 채널을 추측해서 채우지 않습니다.
원본 온라인 완료를 9로 바꾼 검산 사본에서는 완료 합계 27, 차이 -3이 됩니다. 예전 30/26/-4 후보가 폐기로 바뀌는 것도 확인했습니다. 이 결과는 값이 바뀌었을 때 계산이 따라가는지에 대한 검사이며, 실제 사업 실적이 9라는 근거가 아닙니다.
검증 범위와 다음 판단
Microsoft Excel 앱이나 AI 서비스는 실행하지 않았습니다. XLSX는 캐시 제거 사본을 LibreOffice로 재계산했고 Python에서는 입력·응답 파일을 읽어 양성·음성 사례를 검사했습니다. 저장된 수식·결과가 일치한다는 사실과 특정 Excel 화면에서 사용자가 입력을 마쳤다는 사실은 구별됩니다.
숫자가 모두 맞아도 온라인 개선은 광고 덕분 같은 원인 설명은 이 세 행으로 검증할 수 없습니다. 기간 비교·표본·업무 정의도 입력에 없습니다. 숫자 검산을 마친 뒤 출처·의미·공개 범위를 따로 검토해야 하며, accepted는 정해진 데이터 계약이 맞았다는 뜻으로만 읽습니다.

공식 출처와 확인일
SUM function | Microsoft Support
hashlib — Secure hashes and message digests
출처 원문 수집일: S1 2026-09-24; S2 2026-09-24.