Skip to main content
Orux AIOruxAI

Orux AI / モデルノート

DeepSeekに渡す前に請求書を検算:合計一致でも隠れる10ドル

イベント請求書の総額が一致しても明細は正しいとは限りません。Pythonで数量×単価を整数セントで検算し、234米ドルと244米ドルの差を特定。修正前の文案用データを止める実行結果、7件の拒否テスト、DeepSeekへ渡す範囲とCreditsの予算計算まで、モデルを呼ばずに再現できる手順を解説します。

Orux AI公開 11 分で読めます
DeepSeekに渡す前に請求書を検算:合計一致でも隠れる10ドル — イベント請求書の総額が一致しても明細は正しいとは限りません。
目次

DeepSeekに説明させる前に、明細の計算を確かめる

イベントの請求書は、合計が一致していても間違っていることがあります。今回の例では、仕入先が記載した3明細の合計は234.00米ドルで、請求書の記載総額とぴったり一致します。それでも1行は、単価45.00米ドルのサービス2単位に対し80.00米ドルと記載されています。数量と単価を掛ければ90.00米ドルとなり、独立して計算した総額は244.00米ドルです。転記された二つの合計が一致しても、独立した検算にはなりません。

このガイドでは、イベント担当者がDeepSeek V4.1 Flashへの依頼を準備する前に、不一致を発見できるPythonプログラムを提供します。得られるのは明細ごとの例外レポートと、計算が合うまでプログラムが作成を拒む小さな文案作成用データです。例はすべて架空の会議費用で、結果はローカルプログラムの実行によるものです。モデルが請求書を生成・承認したわけではありません。

人が不一致を解消した後なら、DeepSeekを任意の文章作成工程に使えます。ただし、仕入先との合意価格を決めたり、支払いを承認したり、請求書を黙って差し替えたりする役割は与えません。判断の根拠は原本、契約、確認の記録です。掛け算が正しいことは計算関係を示すだけで、サービスの実施や請求の承認を証明しません。

架空請求書の検算図:記載明細と請求総額はUSD234、数量と単価から独立計算するとUSD244
架空請求書の検算図:記載明細と請求総額はUSD234、数量と単価から独立計算するとUSD244

合計一致の裏に隠れた10米ドルの不一致

架空のエクスポートには、名札、会場の案内表示、字幕サービスがあります。数量はいずれもサービスの整数単位です。全行で同じ5列を使い、それとは別に請求書の総額を渡します。この別入力が大切です。足した値をその値自身と比べても、安心できそうに見えるだけの役に立たない確認が増えるだけです。

明細数量単価記載明細金額独立した計算金額
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を90.00米ドル、総額を244.00米ドルへ同時に変更します。検証用に作った修正であり、実在の仕入先の意図を示すものではありません。実際の請求には、承認された本当の修正を確認する必要があります。

地域形式を推測せず、金額の入力仕様を定める

コードが受け付けるのは、ちょうど小数2桁の非負USD金額と、正の整数数量です。金額文字列を整数セントへ変え、整数の掛け算と足し算を行います。2進浮動小数点の比較も、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}を返します。この小さなオブジェクトがローカル処理の成功した受け渡しです。モデルの回答でも、税務適合の証明でも、244.00米ドルの支払承認でもありません。

ローカルテスト結果:不一致のある請求書は文案用データを作れず、修正データは合格し、不正形式7例を拒否
ローカルテスト結果:不一致のある請求書は文案用データを作れず、修正データは合格し、不正形式7例を拒否

実際に拒否された負例は7件です。IDの重複、数量ゼロ、数量の指数表記、金額の過剰な小数桁、負の単価、余分な列、小数点にカンマを使った総額です。例の入力仕様を狙ったテストであり、あらゆる仕入先データの安全性を証明しません。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の報告を説明しています。実行したリクエストでは、返された実際のusageを数えます。CSVの文字数も明細数もtoken用量を決めません。JSONオブジェクトを返してほしければ、応答後にフィールドと値を検証してください。フォームの選択肢や丁寧な文面は、その検証に代わりません。

関連する博物館JSON事例(英語)は出力検証、サポート要約ガイド(英語)は別種の制約付き入力を扱います。本稿の追加価値は算術照合であり、同じ抽出やプライバシー検査の繰り返しではありません。

公開されているOruxの2料金行を比べる

2026年11月2日の公開カタログには、このaliasに2行の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の数量×単価が合わなくても記載明細と総額が一致します。明細の独立計算額と総額の両方を比べてください。プログラムはその矛盾を示しますが、どの元データを修正すべきかは人が判断します。

10米ドルの不一致を発見したのはDeepSeekですか?

いいえ。ローカルPythonが発見し、モデルは呼び出していません。DeepSeekは後段の任意の文案作成で、現行Orux操作項目と日付付き予算料金のみ確認済みです。本稿は請求書処理の精度、品質、速度、信頼性を評価していません。

税や複数通貨にも使えますか?

現行仕様では使えません。正の整数数量と符号なし小数2桁USDだけで、税、割引、通貨換算は扱いません。該当する承認済み会計仕様に従い、規則を明示的に拡張してテストしてください。不都合な行の削除や地域形式の推測で対応してはいけません。

Creditsの数字はこのCSVを調べる料金ですか?

いいえ。ローカルチェッカーはOruxへ要求せず、サイトのCreditsを消費しません。表は仮のtoken量による後段の任意リクエストの見積もりです。課金を決めるのは実際のモデルusageと適用される現行見積もりで、CSV行数ではありません。

生成した受領文を送る前に何を確認しますか?

承認済み修正と実際の連絡権限に照らして確認します。照合済み総額は支払いや支払日の承認ではありません。元レポートを別に保ち、根拠のない詳細を拒否し、送信前に参照番号と宛先を確認してください。

Orux AI で DeepSeek V4.1 Flash を試すモデルページでオンライン試用し、料金と API の例を確認できます。モデルを開く

1 つの API でこれらのモデルを利用

チャット・画像・動画・音声モデルに対応した OpenAI 互換 API。Credits で従量課金です。