กลับไปที่บล็อก

การลดต้นทุนคู่มือ

ประมาณการค่าใช้จ่าย API ของทัวร์นาเมนต์โมเดลก่อนที่คุณจะรัน

นับโทเค็นต่อที่นั่ง คูณด้วยจำนวนเกมและการสลับฝ่าย และตั้งเพดานแบบแข็งใน Python: การประมาณการที่คำนวณไว้สำหรับทัวร์นาเมนต์โมเดล 6 ที่นั่ง 60 เกม

โดย CheapTokens Teamเผยแพร่เมื่อ ใช้เวลาอ่าน 6 นาที

หน้าปก: ค่าใช้จ่ายของทัวร์นาเมนต์โมเดลก่อนรัน ตั้งแต่ที่นั่งและเทิร์นไปจนถึงประวัติที่โตขึ้นและเพดานงบประมาณ
ในหน้านี้
  1. พาดหัวข่าว $20,000 บอกอะไรคุณได้และบอกอะไรไม่ได้
  2. หนึ่งที่นั่ง: ทำไมอินพุตจึงโตขึ้นเรื่อยๆ
  3. จากหนึ่งที่นั่งสู่ทั้งทัวร์นาเมนต์
  4. ใส่เพดานแบบแข็งในโค้ด
  5. ลำดับที่ปลอดภัยสำหรับการรันครั้งแรก

คุณสามารถรู้ค่าใช้จ่ายของทัวร์นาเมนต์โมเดลได้ก่อนคำขอแรก: นับโทเค็นที่หนึ่งที่นั่งส่งตลอดทั้งเกม คูณด้วยจำนวนที่นั่งและจำนวนเกม แล้วใส่เพดานแบบแข็งในโค้ด สิ่งที่คนมักมองข้ามคือประวัติ ทุกเทิร์นจะส่งทุกอย่างที่พูดไปแล้วซ้ำใหม่ ดังนั้นอินพุตจึงโตเร็วกว่าจำนวนเทิร์นมาก

พาดหัวข่าว $20,000 บอกอะไรคุณได้และบอกอะไรไม่ได้#

เมื่อวันที่ 5 พฤศจิกายน 2026 พอดแคสเตอร์ Dwarkesh Patel ได้เผยแพร่ Clocktower Bench ซึ่งเป็นเบนช์มาร์กที่โมเดลเล่นเกมสังคมนิยมการไขปริศนา Blood on the Clocktower แข่งกัน เขากล่าวว่าเขาใช้เครดิต API ประมาณ $20,000 ในการสร้างฮาร์เนส และส่วนใหญ่หมดไปกับการวนปรับการออกแบบสภาพแวดล้อม มากกว่าโทเค็นที่เขาวางแผนไว้

README ของโปรเจกต์ (ตรวจสอบเมื่อ 8 พฤศจิกายน 2026) อธิบายการตั้งค่า: 11 โมเดล, 386 เกมสำหรับการจัดอันดับหลัก, โมเดลหนึ่งเล่นทุกที่นั่งฝ่ายดีและอีกโมเดลหนึ่งเล่นทุกที่นั่งฝ่ายร้าย, ผู้เล่น 10–12 คน, เกมที่ใช้เวลาหลายชั่วโมง แต่ละดีลจะเล่นซ้ำโดยสลับฝ่าย เพื่อไม่ให้โมเดลใดได้บทบาทที่ง่ายกว่า นอกจากนี้ยังมี dry run ฟรี (--model random), บันทึกค่าใช้จ่ายลง games/ledger.jsonl, และมีเพดาน --budget ที่ค่าเริ่มต้นคือ $1,000

สิ่งที่มันไม่ได้ให้คือจำนวนโทเค็นต่อเกม ดังนั้นจึงไม่มีอะไรให้คัดลอก คุณต้องสร้างการประมาณการเอง นั่นคือสิ่งที่ส่วนที่เหลือของบทความนี้ทำ โดยมีสมมติฐานที่ระบุไว้ซึ่งคุณสามารถเปลี่ยนเป็นของคุณเองได้

หนึ่งที่นั่ง: ทำไมอินพุตจึงโตขึ้นเรื่อยๆ#

สมมติว่าคุณเล่นเกมเล็กกว่า: 6 ที่นั่ง, ทุกที่นั่งเป็นโมเดลที่มีบทสนทนาของตัวเอง, 20 เทิร์นต่อที่นั่ง สมมติว่า system prompt 2,000 โทเค็น (กฎและบทบาทของที่นั่ง), บทสนทนาโต๊ะใหม่ 600 โทเค็นที่มาถึงก่อนแต่ละเทิร์น, และคำตอบ 300 โทเค็น API ไม่มีความจำ ดังนั้นแต่ละคำขอจึงพาบทสนทนาทั้งหมดไปอีกครั้ง (ทำไมแชทยาวจึงมีค่าใช้จ่ายสูงขึ้น)

เทิร์น 1 ส่ง 2,000 + 600 = 2,600 โทเค็น เทิร์น 20 ส่ง 2,000 + 600 × 20 + 300 × 19 = 19,700 ลองคำนวณตัวเลขสุดท้ายด้วยตัวเอง:

ทายตัวเลข

ที่นั่งหนึ่งส่งอินพุตกี่โทเค็นในเทิร์นที่ 20 ของมัน?

แสดงคำตอบ

คำตอบ: 19,700

19,700: system prompt 2,000 โทเค็น, บทสนทนาใหม่ 20 × 600, และคำตอบก่อนหน้า 19 ครั้งๆ ละ 300 ทุกคำตอบเก่าและทุกข้อความเก่าถูกส่งกลับไปทั้งหมด

รวมทั้ง 20 เทิร์นสำหรับหนึ่งที่นั่ง: 2,000 × 20 + 600 × 210 + 300 × 190 = 40,000 + 126,000 + 57,000 = 223,000 โทเค็นอินพุต เอาต์พุตมีเพียง 20 × 300 = 6,000 ถ้าคุณนับแต่ละข้อความเพียงครั้งเดียว คุณจะได้ 2,000 + 20 × 600 = 14,000 และคลาดเคลื่อนไปถึงสิบหกเท่า

การนับครั้งเดียวเทียบกับการส่งประวัติซ้ำสำหรับหนึ่งที่นั่งตลอด 20 เทิร์น
หนึ่งที่นั่ง 20 เทิร์น: การนับข้อความครั้งเดียวให้ 14,000 โทเค็นอินพุต การส่งประวัติซ้ำให้ 223,000 สมมติฐานของบทความนี้

ฝั่งเอาต์พุตแทบไม่ขยับ อินพุตคือที่ที่เงินไป และนั่นคือฝั่งที่แย่ลงเมื่อเกมยาวขึ้น

จากหนึ่งที่นั่งสู่ทั้งทัวร์นาเมนต์#

ตอนนี้ขยายด้วยตัวคูณสามตัว

  • ที่นั่ง 6 ที่นั่ง × 223,000 = 1,338,000 โทเค็นอินพุต และ 6 × 6,000 = 36,000 โทเค็นเอาต์พุตต่อเกม
  • การสลับฝ่าย ใช้ 3 โมเดลใน round robin: 3 คู่ เล่น 10 ดีลต่อคู่ แต่ละดีลเล่นสองครั้งโดยสลับฝ่าย: 3 × 10 × 2 = 60 เกม
  • เกม 60 × 1,338,000 = 80,280,000 อินพุต และ 60 × 36,000 = 2,160,000 โทเค็นเอาต์พุตสำหรับทัวร์นาเมนต์
จากหนึ่งที่นั่งถึง 60 เกม: ตัวคูณ
สมมติฐานของบทความนี้: 6 ที่นั่ง, 3 คู่ × 10 ดีล × 2 ฝ่าย = 60 เกม

หนึ่งเกมบน DeepSeek-V4-Flash คิดเป็น $0.0237 ตารางด้านล่างคิดราคาทัวร์นาเมนต์ 60 เกมทั้งหมดราวกับว่าโมเดลนั้นเล่นทุกที่นั่ง เพื่อให้คุณเปรียบเทียบสามโมเดลที่ CheapTokens เสนอสำหรับงานบทสนทนายาวแบบนี้ โดยรวมแล้ว เมื่อนับอินพุตและเอาต์พุตรวมกัน แต่ละตัวถูกกว่าค่าอ้างอิง OpenRouter ในคอลัมน์สุดท้าย

โมเดล ต่อคำขอ 60 คำขอ OpenRouter, 60 คำขอ
GLM-5.3-Flash $0.0282 $1.69 $2.87
DeepSeek-V4-Flash $0.0237 $1.42 $5.92
MiniMax-M2.7 $0.0723 $4.34 $52.06

1,338,000 โทเค็นอินพุตและ 36,000 โทเค็นเอาต์พุตต่อคำขอ ราคาต่อ 1M โทเค็นเป็นราคาปัจจุบันและเปลี่ยนแปลงไปพร้อมกับอัตราค่าบริการของเรา คอลัมน์ OpenRouter แสดงราคาอ้างอิงสำหรับปริมาณงานเดียวกัน

ในแง่งบประมาณ นี่คือกลเม็ดทั้งหมด: คุณไม่ต้องมีรายการ $20,000 เพื่อรู้ว่าสามโมเดลใดเล่นเกมเจรจาได้ดีกว่า คุณต้องมีการประมาณการข้างต้น แล้วจึงทำไพล็อตจริงเพื่อตรวจสอบ

เช็กด่วน

เกม 6 ที่นั่งของคุณเพิ่มจาก 20 เป็น 40 เทิร์นต่อที่นั่ง เกิดอะไรขึ้นกับค่าใช้จ่ายอินพุต?

แสดงคำตอบ

คำตอบ: โตประมาณ 3.6 เท่า

สำหรับ 40 เทิร์น สูตรเดิมให้ 2,000 × 40 + 600 × 820 + 300 × 780 = 806,000 โทเค็นอินพุต เทียบกับ 223,000 สำหรับ 20 เทิร์น พจน์ประวัติโตตามกำลังสองของจำนวนเทิร์น

มีการตรวจสอบสองอย่างก่อนที่คุณจะเชื่อตัวเลขใดๆ เช่นนี้ อย่างแรก คำขอที่ใหญ่ที่สุดต้องพอดีกับหน้าต่างของโมเดล ที่ 20 เทิร์น คำขอที่ใหญ่ที่สุดคือ 19,700 โทเค็น ไม่มีปัญหา เกมหลายชั่วโมงที่มี 200 เทิร์นต่อที่นั่งจะไปถึง 2,000 + 600 × 200 + 300 × 199 = 181,700 ประมาณ 182K ดังนั้นอ่านขนาดคอนเท็กซ์บนหน้าโมเดลก่อนออกแบบเกม DeepSeek-V4-Flash มีหน้าต่าง 380K และเอาต์พุตสูงสุด 32,768 โทเค็น ดูหน้าโมเดล อย่างที่สอง หากโมเดลสร้าง reasoning ยาว เอาต์พุต 300 โทเค็นของคุณจะมากขึ้น (โทเค็นการคิดในงานจำนวนมาก)

ใส่เพดานแบบแข็งในโค้ด#

แฟล็ก --budget ใน README เป็นแนวคิดที่ถูกต้อง และใช้เวลาเพียงสิบคัดลอกลงในฮาร์เนสของคุณเอง สคริปต์ด้านล่างประมาณการก่อนรัน ปฏิเสธที่จะส่งคำขอที่อาจทำให้ยอดรวมเกินเพดาน และบันทึกทุกการเรียกไปยังไฟล์ ledger ราคาในนั้นเป็นตัวอย่าง: แทนที่ด้วยราคาปัจจุบันจากตารางราคา

python
import json, os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
PRICE_IN, PRICE_OUT = 0.10, 0.40  # per 1M tokens: example, substitute current
CAP_USD = 5.00
spent = 0.0


def cost(tin, tout):
    return (tin * PRICE_IN + tout * PRICE_OUT) / 1_000_000


def estimate(seats, turns, system=2000, new_in=600, out=300):
    tin = sum(system + new_in * k + out * (k - 1) for k in range(1, turns + 1))
    return seats * tin, seats * turns * out


def ask(seat, history, max_out=400):
    global spent
    rough_in = sum(len(m['content']) for m in history) // 3  # pessimistic
    if spent + cost(rough_in, max_out) > CAP_USD:
        raise SystemExit(f'cap reached: ${spent:.4f} spent')
    r = client.chat.completions.create(
        model=MODEL, messages=history, max_tokens=max_out)
    u = r.usage
    spent += cost(u.prompt_tokens, u.completion_tokens)
    with open('ledger.jsonl', 'a') as f:
        f.write(json.dumps({'seat': seat, 'in': u.prompt_tokens,
                            'out': u.completion_tokens,
                            'spent': round(spent, 6)}) + '\n')
    return r.choices[0].message.content


print(estimate(6, 20))  # (1338000, 36000) per game

estimate(6, 20) พิมพ์ (1338000, 36000) ซึ่งเป็นตัวเลขต่อเกมเดียวกันกับข้างต้น ดังนั้นโค้ดและการคำนวณตรวจสอบซึ่งกันและกัน usage.prompt_tokens และ usage.completion_tokens มาจากการตอบกลับและเป็นสิ่งที่คุณถูกเรียกเก็บเงิน การตรวจสอบล่วงหน้าใช้การนับอักขระแบบ pessimistic เพราะจำนวนจริงจะรู้ได้หลังการเรียกเท่านั้น เพิ่มเติมเกี่ยวกับ ledger ต่อโปรเจกต์ในการติดตามค่าใช้จ่ายโทเค็นของเอเจนต์ใน Python

ลำดับที่ปลอดภัยสำหรับการรันครั้งแรก#

ลำดับของรีโปเองเป็นแบบอย่างที่ดี: ฟรีก่อน, ถูกเป็นอันดับสอง, แพงเป็นอันดับสุดท้าย วางขั้นตอนเหล่านี้ตามลำดับ:

เรียงลำดับ

วางขั้นตอนของการรันครั้งแรกที่ปลอดภัยตามลำดับ

  1. Dry run ด้วยผู้เล่นสุ่ม ไม่มีการเรียก API
  2. รัน estimate() และเปรียบเทียบกับเพดานของคุณ
  3. เล่นหนึ่งเกมจริงและอ่าน ledger
  4. แก้ไขสมมติฐานด้วยจำนวนโทเค็นจริง
  5. เปิดทัวร์นาเมนต์เต็มรูปแบบโดยเปิดเพดาน

README กล่าวว่าเกมสาธิตบนโมเดลราคาถูกมีค่าใช้จ่ายประมาณ $2–5 นั่นเป็นคำกล่าวของผู้เขียนและไม่ได้ระบุชื่อโมเดล ดังนั้นให้ถือเป็นช่วงที่สมเหตุสมผล ไม่ใช่ใบเสนอราคาสำหรับการตั้งค่าของคุณ เกมไพล็อตของคุณเองให้ตัวเลขที่สำคัญ: หาก ledger ของมันแสดง 1,500,000 โทเค็นอินพุตในขณะที่คุณสมมติไว้ 1,338,000 คุณได้เรียนรู้อะไรบางอย่างด้วยค่าใช้จ่ายไม่กี่เซนต์แทนที่จะเป็นตอนเกมที่ 40

สำหรับการทดลองที่ยาวขึ้น คันโยกตามปกติอยู่ในการตัดทอนประวัติแชท: ตัดสิ่งที่แต่ละที่นั่งต้องอ่านซ้ำ และพจน์กำลังสองจะหดตัวตามไปด้วย เมื่อคุณพร้อมที่จะรัน เอกสาร มี endpoint และ model id