
생성 AI 발주 후보를 확정하기 전에 중복 검출하는 Python
요약
생성 AI가 생성한 발주 데이터의 중복을 방지하기 위해 Python을 활용하여 CSV 데이터를 검증하는 방법을 소개합니다. 전각/반각 문자 정규화와 금액 오차 범위를 고려한 로직을 통해 중복 후보를 추출하는 실무적인 가이드를 제공합니다.
핵심 포인트
- unicodedata를 활용한 품목명 전각/반각 정규화
- Decimal 타입을 사용한 금액 비교 오차 방지
- 자동 삭제 대신 사람이 확인하도록 후보를 나열하는 방식 권장
- AI 프롬프트 지시와 사후 데이터 검증의 분리 필요성
발주 후보의 중복은 생성 AI (Generative AI)의 정밀도만을 탓한다고 해서 없어지지 않습니다. 접수 입구에 대조 작업이 없다면, 동일 품목의 초안이 두 개 만들어진 시점에서 담당자가 이를 간과하게 됩니다.
그래서 발주를 확정하기 전의 CSV를 한 번만 검사하여, 같은 날짜·같은 거래처·같은 품목이면서 금액이 5% 이내인 조합을 「중복 후보」로 출력하도록 했습니다. 여기서 삭제까지 자동화하지 않는 것이 포인트입니다. 후보를 사람이 확인하는 것만으로도 이중 발주는 상당히 막기 쉬워집니다.
전각(Full-width)과 반각(Half-width)이 섞인 품목명은 보기보다 까다롭습니다.
이번 CSV는 다음 5개 열로 구성됩니다. requested_on은 발주 예정일입니다. 매달 구매하는 소모품까지 후보에 나오면 방해가 되므로, 같은 날짜의 것만 비교합니다.
request_id,vendor,item,amount,requested_on
RQ-101,北星文具,A4コピー用紙 500枚,"4,980",2026-07-31
RQ-102,北星文具,A4コピー用紙 500枚,4980,2026-07-31
...
RQ-101과 RQ-102는 AI가 서로 다른 의뢰문으로부터 만들었더라도 실질적으로는 동일한 발주입니다. RQ-103은 날짜가 다르므로 후보로 삼지 않습니다. 이 부분을 품목명만으로 기계적으로 묶어버리면 정기 발주까지 중단시켜 버리게 됩니다.
아래 코드를 check_orders.py로, CSV를 orders.csv로 하여 같은 폴더에 둡니다. 외부 라이브러리는 사용하지 않습니다.
import csv
import itertools
import unicodedata
...
이 대조 작업은 발주 확정 버튼을 누르기 직전에 배치하는 것이 가장 다루기 쉽습니다.
python3 check_orders.py를 실행하면 위 CSV의 경우 다음과 같이 됩니다. 제 환경에서는 전각인 A4와 전각 공백을 포함한 RQ-102를 중복 후보로 만들었고, 금액이 미정인 행만 입력 에러로 분류되었습니다.
중복 후보 1건
RQ-101 / RQ-102 | 北星文具 | A4コピー用紙 500枚 | 4980 / 4980 | 2026-07-31
에러 1건
...
품목명은 unicodedata.normalize("NFKC", ...)를 사용하여 전각 영숫자를 반각으로 통일하고 공백도 제거하고 있습니다. 금액을 float이 아닌 Decimal로 다루는 것도 은근히 효과적입니다. 소수를 포함하는 단가를 비교할 때 이진수의 반올림 오차(Rounding error)를 가져오지 않습니다.
5%라는 수치에는 업무상의 정답이 없습니다. 동일한 모델 번호라도 수량이 하나 다르면 금액이 변하는 회사라면 2%로 낮추는 것이 좋습니다. 배송비가 포함된 견적서가 섞여 있다면 10%로 설정해도 후보를 모두 찾아내지 못할 수도 있습니다.
여기서 흔히 하는 실수가 후보가 된 쪽 중 하나를 자동으로 삭제하는 것입니다. 발주 중복처럼 보여도 실제로는 거점 차이·부서 차이로 인한 올바른 의뢰인 경우가 있기 때문입니다. 스크립트의 역할은 「막는 것」보다 「먼저 나열하는 것」입니다. 확인하는 사람이 두 개의 의뢰를 열 수 있는 상태로 만드는 것만으로 충분합니다.
AI에 대한 의뢰문에도 발주 후보를 만드는 단계에서 다음 문장을 추가하고 있습니다.
같은 거래처·품목·발주 예정일의 후보가 이미 있는 경우에는 신규 행을 만들지 말고, 기존의 request_id를 제시해 주세요.
하지만 이 문장 하나에만 맡기는 것은 위험합니다. AI는 입력이 나누어져 있으면 별개의 건으로 취급할 수 있고, 표기 불일치(Typo/Variation)까지는 보장하지 않습니다. 생성 시의 지시와 확정 전의 대조를 분리해야 운용이 안정됩니다.
발주 후보 CSV에는 의뢰 ID를 반드시 남깁니다. 후보가 나왔을 때 「어느 것을 삭제할 것인가」가 아니라 「누구에게 확인할 것인가」까지 추적할 수 있기 때문입니다.
처음에는 동일 날짜·동일 거래처·동일 품목만으로도 충분합니다. 후보가 너무 많다면 금액 범위를 좁히고, 너무 적다면 거래처의 표기 불일치를 사전(Dictionary)으로 맞춥니다. 생성 AI로 인해 초안이 늘어날수록, 확인의 입구를 하나 두는 작업이 효과를 발휘합니다. 이 부분이 은근히 중요합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기