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

AI สำหรับผู้เริ่มต้นคู่มือ

ทำไมแชท AI ยาวๆ จึงมีค่าใช้จ่ายสูงขึ้น: API ส่งประวัติซ้ำ

ทุกข้อความใหม่ในแชท AI ส่งประวัติทั้งหมดซ้ำ ดังนั้น input จึงโตขึ้นทุกรอบ ดูการคำนวณและ 3 วิธีในการลดต้นทุน

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

หน้าปก: “ทำไมแชทยาวจึงมีค่าใช้จ่ายสูงขึ้นทุกข้อความ” — API ส่งประวัติทั้งหมดซ้ำทุกรอบ
ในหน้านี้
  1. คำตอบสั้นๆ
  2. ตัวอย่างพร้อมตัวเลขสมมติ
  3. ต้นทุนที่ราคาจริง
  4. สามวิธีในการลดต้นทุน
  5. 1. เริ่มแชทใหม่เมื่อหัวข้อเปลี่ยน
  6. 2. ตัดประวัติ
  7. 3. แทนรอบเก่าด้วยบทสรุป
  8. ดูมันในโค้ดของคุณเอง
  9. จะรันแชทยาวที่ไหน

ข้อความแรกๆ ของแชทมีราคาถูก ข้อความที่ห้าสิบมีราคาแพงกว่าข้อความที่สิบอย่างเห็นได้ชัด แม้ว่าคุณจะพิมพ์ปริมาณเท่ากันก็ตาม ไม่มีอะไรเสียหาย นี่คือวิธีการทำงานของ chat API

คำตอบสั้นๆ#

โมเดลไม่จดจำคำขอก่อนหน้าของคุณ เอกสารของ OpenAI ระบุไว้ตรงๆ ว่า "each text generation request is independent and stateless" และสำหรับบทสนทนาหลายรอบ คุณต้องใส่ข้อความก่อนหน้าและคำตอบก่อนหน้าของโมเดลลงในคำขอถัดไป Messages API ของ Anthropic อธิบายรูปแบบเดียวกัน: บทสนทนาหลายรอบแบบ stateless ซึ่งรอบก่อนหน้าจะถูกส่งผ่านในพารามิเตอร์ messages

ดังนั้นหน้าต่างแชทที่คุณเห็นในแอปจึงเป็นภาพลวงตาที่แอปสร้างขึ้น เบื้องหลังนั้น ข้อความใหม่ทุกข้อความเป็นคำขอใหม่ที่พาข้อสนทนาทั้งหมดมาจนถึงตอนนี้ คุณจ่ายค่า input tokens ในทุกคำขอ และประวัติก็เป็นส่วนหนึ่งของ input นั้น หากคุณเพิ่งเริ่มคุ้นกับคำศัพท์เหล่านี้ อ่าน What is a token และ Input vs output tokens ก่อน

OpenAI ระบุด้านการเรียกเก็บเงินไว้อย่างชัดเจนสำหรับ response chains: input tokens ก่อนหน้าทั้งหมดใน chain จะถูกคิดเงินเป็น input tokens หลักการเดียวกันนี้ใช้กับ API ใดก็ตามที่คุณส่งประวัติเอง: สิ่งที่คุณส่งคือสิ่งที่ถูกนับ

ตัวอย่างพร้อมตัวเลขสมมติ#

ตัวเลขด้านล่างเป็นตัวอย่างเพื่อการสอน ไม่ใช่การวัดจริง สมมติว่าข้อความแต่ละข้อความของคุณมีประมาณ 200 tokens และแต่ละคำตอบมีประมาณ 300 tokens หนึ่งรอบการแลกเปลี่ยนที่เสร็จสิ้นจะเพิ่ม 500 tokens เข้าไปในประวัติ

รอบ ประวัติก่อนหน้าที่ส่งซ้ำ ข้อความใหม่ Input ของคำขอนี้ Output
1 0 200 200 300
5 500 × 4 = 2,000 200 2,200 300
10 500 × 9 = 4,500 200 4,700 300
20 500 × 19 = 9,500 200 9,700 300

คำตอบยังคงมีความยาวเท่าเดิม แต่ input ของรอบที่ 20 เกือบห้าสิบเท่าของ input ของรอบที่ 1 Output ไม่โต แต่ input โต

ตอนนี้มาดูยอดรวมสำหรับแชท 20 รอบ ประวัติถูกส่งซ้ำ 0, 1, 2 ... 19 ครั้งตามจำนวนการแลกเปลี่ยน ซึ่งเป็นการบวกแบบง่าย:

  • การแลกเปลี่ยนเก่าที่ส่งซ้ำ: 500 × 190 = 95,000 tokens (190 คือ 0 + 1 + 2 + ... + 19)
  • ข้อความใหม่: 200 × 20 = 4,000 tokens
  • Input รวมสำหรับแชท: 95,000 + 4,000 = 99,000 tokens
  • Output รวม: 300 × 20 = 6,000 tokens

หากโมเดลจดจำทุกอย่างได้ฟรี input จะมีเพียง 200 × 20 = 4,000 tokens ส่วนที่เหลือคือประวัติที่ถูกส่งซ้ำ การเพิ่มจำนวนรอบเป็นสองเท่าไม่ได้ทำให้ต้นทุนของประวัติเป็นสองเท่า แต่จะประมาณสี่เท่า เพราะผลรวมเติบโตตามกำลังสองของจำนวนรอบ

ต้นทุนที่ราคาจริง#

นี่คือแชท 20 รอบเดียวกัน (input 99,000, output 6,000) ที่ราคาปัจจุบัน ตารางเป็นแบบสดและอัปเดตเมื่ออัตราเปลี่ยนแปลง คอลัมน์สุดท้ายคือราคาอ้างอิงของ OpenRouter เพื่อเปรียบเทียบ

โมเดล ค่าใช้จ่าย OpenRouter
GLM-5.3-Flash $0.0022 $0.0045
DeepSeek-V4-Flash $0.0021 $0.0056
MiniMax-M2.7 $0.0059 $0.0369

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

สำหรับการตรวจสอบอย่างรวดเร็วในข้อความ: บน MiniMax-M2.7 บทสนทนาทั้งหมดนี้มีค่าใช้จ่าย $0.0059 สำหรับแชทแบบนี้ที่ input ครอบงำ ราคา input จึงสำคัญที่สุด: บน MiniMax-M2.7 ถูกกว่าราคาอ้างอิงของ OpenRouter ต่อ 1M tokens MiniMax-M2.7 อยู่ที่ $0.05 สำหรับ input และ $0.15 สำหรับ output

สามวิธีในการลดต้นทุน#

1. เริ่มแชทใหม่เมื่อหัวข้อเปลี่ยน#

ประวัติที่ถูกที่สุดคือประวัติว่าง หากคุณแก้บั๊กฟังก์ชันเสร็จแล้วและตอนนี้ต้องการสูตรอาหาร แชทใหม่จะส่ง 200 tokens แทนที่จะเป็น 9,700 ในแอปนี่คือปุ่มเดียว ในโค้ดคือ history = [] ทำเช่นนี้ทุกครั้งที่บริบทก่อนหน้าไม่ช่วยคำถามถัดไปอีกต่อไป

2. ตัดประวัติ#

เก็บเฉพาะข้อความล่าสุดไม่กี่ข้อความและทิ้งที่เหลือ สมมติว่าคุณเก็บการแลกเปลี่ยนล่าสุดสามครั้ง ประวัติจึงไม่เกิน 500 × 3 = 1,500 tokens:

  • รอบที่ 1-3 โตตามปกติ: 0 + 500 + 1,000 = 1,500 tokens ของประวัติ
  • รอบที่ 4-20 แต่ละรอบพา 1,500 ที่ถูกจำกัด: 1,500 × 17 = 25,500 tokens
  • ประวัติรวม: 1,500 + 25,500 = 27,000 tokens บวก 4,000 ของข้อความใหม่ = 31,000 tokens ของ input

นั่นคือ 31,000 แทนที่จะเป็น 99,000 สำหรับ 20 รอบเดียวกัน และบน MiniMax-M2.7 คิดเป็น $0.0025 ราคาของการตัดคือโมเดลลืมส่วนต้นของแชท ดังนั้นเก็บ system prompt และข้อเท็จจริงใดๆ ที่ต้องไม่สูญหายไว้นอกส่วนที่ถูกตัด

3. แทนรอบเก่าด้วยบทสรุป#

เมื่อประวัติยาวขึ้น ให้ขอให้โมเดลสรุปมันหนึ่งครั้ง แล้วดำเนินการต่อด้วยบทสรุปแทนข้อความเต็ม ในตัวอย่างข้างต้น การแลกเปลี่ยนเก้าครั้งคือ 4,500 tokens บทสรุปประมาณ 300 tokens พาจุดสำคัญต่อไป คุณจ่ายสำหรับคำขอพิเศษหนึ่งครั้งเพื่อเขียนบทสรุป และทุกคำขอหลังจากนั้นจะเบาลง วิธีนี้รักษาความหมายได้มากกว่าการตัดแบบธรรมดา โดยแลกกับรายละเอียดเล็กน้อย

Context window เป็นขีดจำกัดแยกต่างหาก: มันจำกัดจำนวน tokens ที่คำขอหนึ่งๆ อาจบรรจุได้ รวมถึงคำตอบ ประวัติจะชนเพดานนั้นในที่สุด Why does an AI answer stop mid-sentence? อธิบายไว้

ดูมันในโค้ดของคุณเอง#

คำตอบมีออบเจกต์ usage ดังนั้นคุณสามารถเฝ้าดูการเติบโตได้ด้วยตัวเอง นี่คือตัวอย่าง: แทนที่คีย์และนำ model id จากเอกสาร CheapTokens เพราะ id แตกต่างกันระหว่างผู้ให้บริการ

python
from openai import OpenAI

client = OpenAI(base_url='https://api.cheaptokens.dev/v1', api_key='YOUR_KEY')

system = {'role': 'system', 'content': 'You are a helpful assistant.'}
history = []
KEEP = 7  # new message + last 3 exchanges (6 messages); None keeps everything

def ask(text):
    history.append({'role': 'user', 'content': text})
    r = client.chat.completions.create(
        model='MODEL_ID_FROM_DOCS',
        messages=[system] + (history[-KEEP:] if KEEP else history),
    )
    answer = r.choices[0].message.content
    history.append({'role': 'assistant', 'content': answer})
    print(r.usage.prompt_tokens, r.usage.completion_tokens)
    return answer

เรียก ask() หลายครั้งติดกันและพิมพ์ prompt_tokens: ด้วย KEEP = None มันจะเพิ่มขึ้นทุกรอบ ด้วย KEEP = 7 มันจะคงที่ สำหรับ agent ที่วนผ่านหลายขั้นตอน ผลเดียวกันนี้ใช้กับทุกขั้นตอน How to estimate the cost of an AI agent แสดงวิธีจัดงบประมาณสำหรับมัน

จะรันแชทยาวที่ไหน#

บทสนทนายาวและลูปของ agent คือเวิร์กโหลดที่ปริมาณ input ครอบงำพอดี ดังนั้นทั้ง context window ขนาดใหญ่และพื้นที่สำหรับคำตอบยาวจึงสำคัญ:

  • MiniMax-M2.7: context 180K สูงสุด 8,192 tokens ต่อคำตอบ ทั้ง input และ output ถูกกว่าราคาอ้างอิงของ OpenRouter
  • DeepSeek-V4-Flash: context 380K สูงสุด 32,768 tokens ต่อคำตอบ output ถูกกว่าราคาอ้างอิงของ OpenRouter

CheapTokens มี баланเดียวสำหรับทุกโมเดล ราคาคงที่ต่อโมเดลโดยไม่มีช่วงเวลาเร่งด่วน และ API ที่เข้ากันได้กับ OpenAI Chat Completions และ Anthropic Messages ดังนั้นโค้ดข้างต้นจึงใช้งานได้โดยเปลี่ยน base URL เติมเงินใน баланและส่งคำขอแรกของคุณโดยทำตาม Your first API request with CheapTokens