Skip to main content
Orux AIOruxAI

Orux AI / 모델 노트

DeepSeek 전 청구서 검산: 합계가 맞아도 숨는 10달러

행사 청구서 합계가 맞아도 항목은 틀릴 수 있습니다. Python 정수 센트로 수량×단가를 검산해 234달러와 244달러 차이를 찾고, 정정 전 문안 작성을 차단합니다. 일곱 부정 테스트, DeepSeek 인계 범위와 Credits 예산까지 모델 호출 없이 재현하는 가이드입니다.

Orux AI게시 16 분 읽기
DeepSeek 전 청구서 검산: 합계가 맞아도 숨는 10달러 — 행사 청구서 합계가 맞아도 항목은 틀릴 수 있습니다.
목차

DeepSeek에 설명을 맡기기 전에 명세별 계산부터 확인하세요

행사 청구서는 합계가 딱 맞아도 틀릴 수 있습니다. 아래 예시에서 공급업체가 기재한 세 항목의 합은 $234.00으로 청구서 총액과 정확히 같습니다. 그런데 한 항목은 단가 $45.00인 서비스 2단위에 $80.00을 청구합니다. 수량과 단가를 곱하면 $90.00이고, 독립적으로 계산한 총액은 $244.00입니다. 복사해 적은 두 합계가 같다는 사실은 독립적인 검산이 아닙니다.

이 가이드는 행사 담당자가 DeepSeek V4.1 Flash에 보낼 요청을 준비하기 전에 불일치를 찾을 수 있는 실행 가능한 Python 검사기를 제공합니다. 결과물은 항목별 예외 보고서와, 계산을 통과할 때까지 프로그램이 생성을 거부하는 작은 문안 작성용 자료입니다. 사례는 모두 가상의 컨퍼런스 비용이며 결과는 로컬 프로그램을 실행해 얻었습니다. 모델이 여기서 청구서를 생성하거나 승인하지 않았습니다.

사람이 불일치를 해결한 뒤 DeepSeek를 선택적인 글쓰기 단계로 사용할 수 있습니다. 그러나 공급업체와 합의한 가격을 결정하거나, 지급을 승인하거나, 청구서를 조용히 바꾸는 역할은 맡기면 안 됩니다. 판단 근거는 원본 문서·계약·확인 기록입니다. 올바른 곱셈은 산술 관계를 증명할 뿐 서비스가 제공됐거나 비용이 승인됐음을 증명하지 않습니다.

가상 청구서 검산 도표: 기재 항목과 청구 총액은 USD234, 수량과 단가로 독립 계산한 총액은 USD244
가상 청구서 검산 도표: 기재 항목과 청구 총액은 USD234, 수량과 단가로 독립 계산한 총액은 USD244

일치하는 총액에 가려진 $10 차이

가상 내보내기 자료에는 명찰, 행사장 안내 표지, 자막 서비스가 있습니다. 모두 정수 단위의 서비스 수량입니다. 검사기는 모든 행에 같은 다섯 열을 적용하고 청구서 총액 하나를 별도로 받습니다. 이 별도 값이 중요합니다. 합산한 값을 자기 자신과 비교하면 안심시키기만 하는 무의미한 검사가 하나 더 생깁니다.

항목수량단가기재 항목 금액독립 계산 금액
L1: 명찰40USD 2.50USD 100.00USD 100.00
L2: 행사장 안내 표지3USD 18.00USD 54.00USD 54.00
L3: 자막 서비스2USD 45.00USD 80.00USD 90.00
합계——USD 234.00USD 244.00

좌우로 밀어 전체 표를 확인하세요.

그렇다고 자동으로 $10를 덜 지급했다는 뜻은 아닙니다. 공급업체가 할인된 항목 금액을 의도했거나, 수량 또는 단가가 잘못됐을 수 있습니다. 프로그램은 그 설명 중 하나를 선택할 수 없습니다. 더 좁고 유용한 결론은 L3가 제시된 수량×단가 규칙을 충족하지 않으므로, 이 흐름에서 일반적인 문안 작성용 자료를 만들기 전에 확인해야 한다는 것입니다.

공급업체가 내보낸 자료를 수정하면 두 버전을 모두 보관하세요. 뒤의 수정 테스트 데이터는 L3를 USD 90.00으로, 총액을 USD 244.00으로 함께 바꿉니다. 테스트를 위해 의도적으로 만든 수정이며 실제 공급업체의 의도를 주장하지 않습니다. 실제 청구서에는 실제로 승인된 정정이 필요합니다.

지역 표기를 추측하지 말고 금액 형식을 정하세요

코드는 소수점 이하 정확히 두 자리인 음이 아닌 USD 금액과 양의 정수 수량만 허용합니다. 금액 문자열을 정수 센트로 바꾼 뒤 정수 곱셈·덧셈을 사용합니다. 이진 부동소수점 비교나 1센트 차이를 감출 허용 오차가 없습니다. 의도적으로 좁게 정한 입력 규약이며 범용 청구서 파서는 아닙니다.

2.500, -2.50, 234,00, 지수 표기는 거부합니다. 숫자 필드의 앞뒤 공백도 거부합니다. 유럽식 내보내기 자료가 다른 표기법을 쓴다는 이유만으로 잘못된 것은 아닙니다. 이 검사기에 넣기 전에 별도로 검토한 정규화 단계가 필요합니다. 구분자가 소수점인지 천 단위 구분인지 추측하지 마세요.

Python CSV 문서는 구분자와 따옴표 관례가 다를 수 있다고 설명합니다. 프로그램은 쉼표로 행을 단순 분리하지 않고 CSV 파서를 쓰며, 문서의 개행 처리 방식으로 메모리 스트림을 엽니다. 따옴표로 감싼 설명에 쉼표가 있어도 한 필드로 유지할 수 있습니다. 예상하지 못한 열이나 중복 항목 ID는 조용히 무시하지 않고 거부합니다.

소수 수량, 세금, 할인, 배송비, 복수 통화, 크레디트 노트(차감 문서)는 이 규약 밖입니다. 그런 요소가 들어 있다면 중단하고 해당 산술 규칙부터 설계한 후 결과를 사용하세요. 통과시키기 위해 지원하지 않는 행을 삭제하면 대사의 목적이 사라집니다.

전체 검사기를 로컬에서 실행하세요

아래를 check_invoice.py로 저장하고 python3 check_invoice.py를 실행하세요. Python 표준 라이브러리만 쓰며 API Key나 네트워크 요청이 필요 없습니다. 테스트 데이터와 단언문도 결과물에 포함되므로 모델 호출을 구매하지 않고 숨은 불일치와 수정 사례를 모두 재현할 수 있습니다.

Python
"""Offline synthetic invoice check. No model/API request; USD integer cents only."""
import csv
import io
import json
import re

HEADER = ['line_id', 'description', 'qty', 'unit_usd', 'line_usd']
CSV = '''line_id,description,qty,unit_usd,line_usd
L1,Name badges,40,2.50,100.00
L2,Room signage,3,18.00,54.00
L3,Captioning service,2,45.00,80.00
'''

def cents(value):
    if not isinstance(value, str) or not re.fullmatch(r'[0-9]+\.[0-9]{2}', value):
        raise ValueError('Use unsigned USD amounts with exactly two decimals')
    whole, fraction = value.split('.')
    return int(whole) * 100 + int(fraction)

def check(text, invoice_total):
    reader = csv.reader(io.StringIO(text, newline=''), strict=True)
    if next(reader, None) != HEADER:
        raise ValueError('Unexpected CSV header')
    seen, rows, issues = set(), [], []
    for fields in reader:
        if len(fields) != len(HEADER):
            raise ValueError('Unexpected column count')
        ident, description, quantity, unit, quoted = fields
        if not ident or ident in seen or not description.strip():
            raise ValueError('Missing or duplicate line identity')
        if not re.fullmatch(r'[0-9]+', quantity) or int(quantity) < 1:
            raise ValueError('Quantity must be a positive whole number')
        seen.add(ident)
        expected, stated = int(quantity) * cents(unit), cents(quoted)
        rows.append(dict(line_id=ident, expected_cents=expected, stated_cents=stated))
        if expected != stated:
            issues.append(dict(line_id=ident, expected_cents=expected, stated_cents=stated))
    if not rows:
        raise ValueError('No invoice lines')
    declared = cents(invoice_total)
    expected_total = sum(x['expected_cents'] for x in rows)
    stated_sum = sum(x['stated_cents'] for x in rows)
    return dict(currency='USD', line_count=len(rows), line_issues=issues,
                expected_total_cents=expected_total, stated_line_sum_cents=stated_sum,
                declared_total_cents=declared, declared_matches_lines=declared == stated_sum,
                eligible_for_draft=not issues and declared == expected_total)

def draft_brief(report):
    if not report['eligible_for_draft']:
        raise ValueError('Resolve arithmetic before creating a drafting brief')
    return {k: report[k] for k in ['currency', 'line_count', 'expected_total_cents']}

def planned_microcredits(inputs, outputs, rate_in, rate_out):
    if any(type(x) is not int or x < 0 for x in [inputs, outputs, rate_in, rate_out]):
        raise ValueError('Planning quantities and rates must be nonnegative integers')
    numerator = inputs * rate_in + outputs * rate_out
    return (numerator + 999999) // 1000000

if __name__ == '__main__':
    bad = check(CSV, '234.00')
    assert bad['declared_matches_lines'] and not bad['eligible_for_draft']
    assert bad['expected_total_cents'] - bad['declared_total_cents'] == 1000
    try:
        draft_brief(bad)
    except ValueError:
        pass
    else:
        raise AssertionError('Bad invoice became a drafting brief')
    fixed = check(CSV.replace('45.00,80.00', '45.00,90.00'), '244.00')
    assert draft_brief(fixed) == dict(currency='USD', line_count=3, expected_total_cents=24400)
    rejected = 0
    for text, total in [
        (CSV.replace('L2,', 'L1,'), '234.00'),
        (CSV.replace(',40,', ',0,'), '234.00'),
        (CSV.replace(',40,', ',1e2,'), '234.00'),
        (CSV.replace('2.50', '2.500'), '234.00'),
        (CSV.replace('2.50', '-2.50'), '234.00'),
        (CSV.replace('L1,Name badges,', 'L1,Name badges,EXTRA,'), '234.00'),
        (CSV, '234,00'),
    ]:
        try:
            check(text, total)
        except ValueError:
            rejected += 1
        else:
            raise AssertionError('Invalid fixture accepted')
    rates = {'catalog_low': (18333360, 73333440), 'catalog_high': (36666720, 146666880)}
    plans = {key: planned_microcredits(1000, 300, *value) for key, value in rates.items()}
    assert plans == {'catalog_low': 40334, 'catalog_high': 80667}
    print(json.dumps(dict(bad=bad, corrected_brief=draft_brief(fixed),
                         negative_fixtures_rejected=rejected, planned_microcredits=plans), indent=2))

스크립트는 산술 불일치에는 보고서를 반환하지만 형식이 잘못된 입력에는 오류를 발생시킵니다. 두 상황은 다릅니다. 이해할 수 있는 청구서에는 조사할 불일치가 있을 수 있지만 형식이 깨진 행은 정해진 규약 아래에서 신뢰성 있게 해석할 수 없습니다. 운영 환경의 가져오기에는 파일 크기 제한, 접근 제어, 회계 처리 관례, 해당 환경에 맞는 운영 검토도 필요합니다.

보고서를 지급 결정으로 바꾸지 마세요

실행 결과는 declared_matches_lines: true, eligible_for_draft: false입니다. 예상 총액은 24,400센트인 반면 청구 총액과 기재 항목 합계는 모두 23,400센트입니다. 예외는 L3의 기재 8,000센트와 예상 9,000센트를 가리킵니다. 일반적인 경고 대신 이런 정확한 값이 있어야 겉보기로 일치한 합계가 차단된 이유를 설명할 수 있습니다.

프로그램은 불합격 보고서로 문안용 자료를 만들려는 시도도 했고 함수가 거부함을 확인했습니다. 명시적으로 수정한 테스트 데이터에서는 {"currency":"USD","line_count":3,"expected_total_cents":24400}을 반환했습니다. 이 작은 객체가 성공한 로컬 인계 결과입니다. 모델 응답, 세무 적합성 증명, USD 244.00의 지급 승인은 아닙니다.

로컬 테스트 결과: 불일치 청구서는 문안용 자료 생성이 차단되고 수정 데이터는 통과하며 잘못된 입력 일곱 개는 거부됨
로컬 테스트 결과: 불일치 청구서는 문안용 자료 생성이 차단되고 수정 데이터는 통과하며 잘못된 입력 일곱 개는 거부됨

실제로 거부한 부정 테스트는 일곱 개입니다. 중복 ID, 수량 0, 지수 표기 수량, 과도한 금액 소수 자릿수, 음수 단가, 여분 열, 소수점에 쉼표를 쓴 총액입니다. 예시 규약에 초점을 맞춘 검사이지 모든 공급업체 자료가 안전하다는 증명은 아닙니다. CSV 구문 오류도 파싱을 중단시킬 수 있습니다. 임의로 손상된 파일을 자동 복구한다고 주장하지 않습니다.

DeepSeek에는 해결된 작업과 명확한 경계를 주세요

공급업체나 책임 있는 검토자가 불일치를 해결한 후 담당자는 승인된 사실만 사용해 중립적인 접수 확인 문안을 써달라고 DeepSeek에 요청할 수 있습니다. 예를 들면 “대사가 끝난 총액 244.00의 수정된 3항목 USD 청구서를 받았다는 짧은 확인 문안을 작성하세요. 지급이 승인되거나 예정됐다고 쓰지 마세요. 발송 전에 검토자에게 참조 번호 확인을 요청하세요”라고 지시할 수 있습니다. 이 요청은 여기서 실행하지 않았습니다.

현재 Orux 모델 폼은 deepseek-v4.1-flash에 messages, max_tokens, JSON 객체 응답 옵션을 제공합니다. 이는 사용 가능한 조작 항목을 확인한 것이지 이 청구서 문안 작업을 성공적으로 실행했다는 증거가 아닙니다. 모델 페이지의 정확한 Orux alias를 쓰세요. DeepSeek 자체 서비스의 모델명은 별도 서비스 식별자이므로 Orux alias라고 가정해 복사하면 안 됩니다.

DeepSeek Chat Completions 레퍼런스에는 usage 보고가 설명되어 있습니다. 요청을 실행했다면 실제 반환된 사용량을 계산하세요. CSV 글자 수나 청구 항목 수가 token 사용량을 정하지 않습니다. JSON 객체 응답이 필요하다면 반환된 필드와 값을 검증하세요. 폼 옵션이나 공손해 보이는 답변은 그 검사를 대체하지 못합니다.

관련 박물관 JSON 사례(영어)는 출력 검증을, 고객지원 요약 가이드(영어)는 다른 종류의 제한된 입력을 다룹니다. 이 청구서 흐름은 추출·개인정보 검사를 반복하는 대신 산술 대사를 더합니다.

공개된 Orux 요금 두 행을 비교하세요

2026년 11월 2일 공개 카탈로그에는 이 alias에 두 dailytimeband 행이 있습니다. 표는 캐시를 쓰지 않은 입력과 출력 단가만 사용합니다. 반복 청구서가 캐시 요금을 받는다고 가정하지 않으며 시계로 계정에 적용될 구간을 추론하지도 않습니다. 요청을 승인하기 전에 현재 견적과 적용 조건을 확인하세요.

공개 조건입력 Credits/100만 tokens출력 Credits/100만 tokens입력 1,000+출력 300의 계획값
dailytimeband=offpeak18.3333673.333440.040334 Credits
dailytimeband=peak36.66672146.666880.080667 Credits

좌우로 밀어 전체 표를 확인하세요.

마지막 열은 계획 계산이지 실제 측정한 token 사용량이나 확정 청구액이 아닙니다. 프로그램은 계획한 요청마다 정수 micro-Credit으로 올림합니다. 정확히 같은 계획 수량의 1,000회라면 이 방식으로 40.334 또는 80.667 Credits를 예산으로 잡습니다. 실제 사용량, 조건, 추가 시도에 따라 결과가 바뀝니다. 이 글에서는 계정의 실제 과금을 측정하지 않았습니다.

제조사 가격 페이지는 자체 모델 버전과 시간표를 설명합니다. 그 조건이 Orux 시간표나 계정 견적을 결정하지는 않습니다. 이 흐름이 다른 모델의 청구서 정확도보다 뛰어나다거나 어떤 서비스가 모든 조건에서 더 저렴하다고 주장하지 않습니다. 계산기는 선택적 요청 전에 명시적인 계획을 검토할 수 있게 만들기 위한 도구입니다.

대사·문안 작성·승인을 별도 기록으로 보관하세요

원본 CSV, 기재 총액, 예외 보고서, 승인된 정정을 보관하세요. 수정 자료로 검사기를 다시 실행하고 선택적인 모델 단계에 전달한 정확한 문안용 자료도 기록하세요. 그래야 공급업체가 적은 것, 프로그램이 계산한 것, 사람이 승인한 것을 구분할 수 있습니다. 생성한 접수 확인 문안으로 그 기록을 덮어쓰면 안 됩니다.

문안 단계가 승인되지 않은 지급일·은행 정보·참조 번호·승인을 추가하면 그 내용을 거부하고 책임 있는 검토자에게 확인하세요. 이 가이드는 생성 결과를 제시하지 않으며 특정 프롬프트가 그런 추가를 방지한다고 주장하지도 않습니다. 완성한 결과물은 로컬 산술 차단 장치와 재현 가능한 증거이며, 별도로 검토할 커뮤니케이션 단계로 넘길 준비를 갖춘 것입니다.

가격·폼 확인일: 2026-11-02. 출처: Orux 모델, 공개 카탈로그, Python CSV, Python 숫자형, DeepSeek 레퍼런스, DeepSeek 가격.

FAQ

청구서 합계가 맞으면 모든 항목도 맞는 건가요?

아닙니다. 예시에서는 L3의 수량×단가가 틀려도 기재 항목과 총액이 같습니다. 독립 계산한 항목 금액과 전체 합계를 함께 비교하세요. 프로그램은 정확한 모순을 표시하지만 어떤 원본 값을 정정할지는 사람이 결정해야 합니다.

USD 10 차이를 DeepSeek가 찾았나요?

아닙니다. 로컬 Python 프로그램이 찾았으며 모델을 호출하지 않았습니다. DeepSeek는 이후 선택적인 문안 작성 단계이고, 현재 Orux 조작 항목과 날짜가 명시된 계획 단가만 확인했습니다. 청구서 정확도·품질·지연·신뢰성을 평가하지 않습니다.

세금이나 여러 통화에도 쓸 수 있나요?

현재 규약에서는 안 됩니다. 양의 정수 수량과 부호 없는 소수 두 자리 USD만 다루며 세금·할인·환산 로직이 없습니다. 불편한 행을 지우거나 지역 형식을 추측하지 말고 관련 승인된 회계 규격에 따라 규칙을 명시적으로 확장해 테스트하세요.

Credits는 이 CSV를 검사하는 가격인가요?

아닙니다. 로컬 검사기는 Orux 요청을 만들지 않아 사이트 Credits를 쓰지 않습니다. 표는 가정한 token 수로 나중에 선택적으로 할 요청을 추정합니다. 실제 모델 사용량과 적용되는 현재 견적이 요금을 정하며 CSV 행 수가 정하지 않습니다.

생성한 접수 확인 문안을 보내기 전에 무엇을 검토해야 하나요?

승인된 정정과 실제 커뮤니케이션 권한에 맞춰 검토하세요. 대사가 끝난 합계가 지급이나 지급일을 승인하지는 않습니다. 원본 보고서를 별도로 두고 근거 없는 세부 내용을 거부하며, 어떤 메시지든 보내기 전에 참조 번호와 수신자를 확인하세요.

Orux AI에서 DeepSeek V4.1 Flash 사용해 보기모델 페이지에서 온라인으로 실행하고 가격과 API 예시를 확인하세요.모델 열기

하나의 API로 이 모델들을 사용하세요

채팅·이미지·비디오·오디오 모델을 지원하는 OpenAI 호환 API이며 Credits로 과금됩니다.