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

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

ทำไมคำตอบ AI หยุดกลางประโยค? อธิบาย max_tokens, หน้าต่างบริบท และ finish_reason

คำตอบ AI ที่หยุดกลางประโยคชนขีดจำกัด อ่าน finish_reason แยก max_tokens จากหน้าต่างบริบทที่เต็ม และตรวจขีดจำกัดเอาต์พุตของแต่ละโมเดล

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

ปกสีเข้มพร้อมโลโก้ cheaptokens: คำว่า max_tokens, finish_reason และ length ในกรอบ พร้อมพาดหัว “Answer cut off mid-sentence?”
ในหน้านี้
  1. สามขีดจำกัดที่ตัดคำตอบ
  2. อ่าน finish_reason ก่อน
  3. วิธีแก้ 1: เพิ่ม max_tokens
  4. วิธีแก้ 2: เมื่อหน้าต่างบริบทเต็ม
  5. วิธีแก้ 3: ขอคำตอบยาวเป็นส่วน ๆ
  6. เมื่อ finish_reason เป็น stop
  7. เลือกโมเดลตามความยาวคำตอบ

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

มีสามปัจจัยที่กำหนดความยาวของคำตอบได้ เมื่อรู้ว่าตัวไหนเป็นตัวตัด ปัญหาก็แก้ได้ในไม่กี่นาที

สามขีดจำกัดที่ตัดคำตอบ#

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

หากโทเค็นยังเป็นแนวคิดที่คลุมเครือ เริ่มจาก What is a token in AI? หน้านี้ถือว่าคุณรู้แล้วว่าโทเค็นคืออะไร

อ่าน finish_reason ก่อน#

ทุก choice ในคำตอบแชตมี finish_reason อยู่ข้าง ๆ usage บอกว่ามีโทเค็นเข้าและออกกี่ตัว

นี่คือหน้าตาของคำตอบที่ถูกตัดเทียบกับคำตอบที่จบแล้ว คำขอถามว่า "In one short sentence, what is a token?" ครั้งแรกตั้ง max_tokens เป็น 16 จากนั้นเป็น 200

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

json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usu" },
      "finish_reason": "length"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 16, "total_tokens": 37 }
}
json
{
  "choices": [
    {
      "message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usually a word or part of a word." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 21, "completion_tokens": 24, "total_tokens": 45 }
}

ในคำตอบแรก completion_tokens คือ 16 เท่ากับเพดานพอดี และข้อความจบที่ "usu" ในคำตอบที่สองโมเดลหยุดที่ 24 โทเค็น ต่ำกว่าเพดาน 200 มาก เพราะมันจบแล้ว

หากต้องการหาว่าเกิดอะไรขึ้น ให้ไล่ตามลำดับนี้:

  1. ดู finish_reason ถ้าเป็น stop คำตอบสมบูรณ์ โมเดลเลือกจบเอง หรือชน stop sequence ที่คุณตั้งไว้ ถ้าเป็น length แสดงว่ามีขีดจำกัดตัดคำตอบ และขั้นถัดไปจะบอกว่าเป็นตัวไหน ค่าอื่นก็มี เช่น content_filter และ tool_calls ซึ่งไม่ใช่ปัญหาความยาว
  2. เทียบ completion_tokens กับ max_tokens ที่คุณส่งไป ถ้าเท่ากันหรือใกล้เคียง แสดงว่าคุณชน max_tokens
  3. ถ้า completion_tokens ต่ำกว่า max_tokens มาก และ prompt_tokens มีขนาดใหญ่ หน้าต่างบริบทอาจเต็ม เอกสารอ้างอิงของ DeepSeek ใช้ length ทั้งสองกรณี ดังนั้นฟิลด์เดียวแยกไม่ได้ การเทียบในขั้นที่ 2 คือวิธีแยก เอกสารของ Anthropic และ Z.ai เรียกกรณีที่สองแยกออกมาเป็น model_context_window_exceeded ดูฟิลด์ในคำตอบของคุณเองว่าได้ชื่อไหน

คำอธิบายทั้งสามมาจากเอกสารของนักพัฒนา ตรวจสอบเมื่อ 20 ตุลาคม 2026: DeepSeek, Anthropic และ Z.ai

สิ่งที่เห็น finish_reason สาเหตุ สิ่งที่ต้องทำ
ถูกตัด, completion_tokens เท่ากับ max_tokens length ถึง max_tokens แล้ว เพิ่ม max_tokens หรือขอคำตอบเป็นส่วน ๆ
ถูกตัด, completion_tokens ต่ำกว่า max_tokens มาก, อินพุตยาว length (หรือ model_context_window_exceeded ในบาง API) หน้าต่างบริบทเต็ม ย่ออินพุตหรือประวัติ หรือเลือกโมเดลที่มีหน้าต่างใหญ่กว่า
สมบูรณ์แต่สั้นกว่าที่ต้องการ stop โมเดลจบเอง หรือ stop sequence ทำงาน ขอรายละเอียดเพิ่ม ตรวจพารามิเตอร์ stop
ไม่มีข้อความ หรือถูกปฏิเสธ content_filter คำตอบถูกกรอง เขียนคำขอใหม่
ไม่มีข้อความ แต่มีคำขอเรียกเครื่องมือ tool_calls โมเดลต้องการเรียกเครื่องมือ รันเครื่องมือแล้วส่งผลกลับ

วิธีแก้ 1: เพิ่ม max_tokens#

สาเหตุที่พบบ่อยที่สุดก็แก้ได้ง่ายที่สุด ตั้ง max_tokens เอง เพื่อให้รู้ว่าเพดานไหนมีผล อย่าพึ่งค่าเริ่มต้น

python
from openai import OpenAI

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

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Write a detailed guide to setting up a home network."}],
    max_tokens=16000,  # example value: stay at or below the model's output limit
)

choice = resp.choices[0]
print(choice.finish_reason, resp.usage.completion_tokens)

นี่แสดงรูปร่างของการเรียก คีย์ใส่เป็น YOUR_API_KEY ที่นี่ อย่าเก็บคีย์จริงไว้ในโค้ดที่แชร์

การเพิ่มตัวเลขช่วยได้เพียงถึงขีดจำกัดของโมเดลเอง นี่คือขีดจำกัดบน CheapTokens ตรวจสอบเมื่อ 20 ตุลาคม 2026 เทียบกับรายการโมเดลของ CheapTokens:

โมเดล Model ID เอาต์พุตสูงสุดต่อคำตอบ บริบท
DeepSeek-V4-Flash (0731) deepseek-ai/DeepSeek-V4-Flash-0731 32,768 โทเค็น 380K
GLM-5.3-Flash zai-org/GLM-5.3-Flash 8,192 โทเค็น 390K
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 8,192 โทเค็น 200K

นักพัฒนาเผยแพร่ขีดจำกัดของ API ตัวเอง ตัวอย่างเช่น Z.ai ระบุเอาต์พุตสูงสุดถึง 128K สำหรับซีรีส์ GLM-5 ซึ่งไม่ใช่ขีดจำกัดของ GLM-5.3-Flash บน CheapTokens ที่ 8,192 โทเค็นต่อคำตอบ สำหรับสิ่งที่คุณสร้างบน CheapTokens ให้ใช้ตารางด้านบน

วิธีแก้ 2: เมื่อหน้าต่างบริบทเต็ม#

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

หน้าต่างเหล่านี้ใหญ่ และคำถามสั้น ๆ ข้อเดียวไม่ทำให้เต็ม แต่แชตยาว ๆ และเอกสารที่วางเข้ามาทำได้ สิ่งที่ช่วยได้:

  • เริ่มแชตใหม่สำหรับงานใหม่ แทนการต่อจากของเก่า
  • ขอให้โมเดลสรุปบทสนทนาที่ผ่านมา แล้วพาไปต่อแค่สรุป
  • ตัดข้อความเก่าและไฟล์แนบที่ไม่ต้องการแล้ว
  • ถ้าอินพุตเองใหญ่โต ให้เลือกโมเดลที่หน้าต่างใหญ่ที่สุด ในบรรดาของเรา นั่นคือ GLM-5.3-Flash ที่ 390K ขีดจำกัดเอาต์พุตคือ 8,192 โทเค็น ดังนั้นขอผลลัพธ์ยาว ๆ เป็นส่วน ๆ

วิธีแก้ 3: ขอคำตอบยาวเป็นส่วน ๆ#

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

python
messages = [{"role": "user", "content": "Write a detailed guide to setting up a home network."}]
parts = []

for _ in range(4):  # example limit: at most 4 rounds
    resp = client.chat.completions.create(
        model="zai-org/GLM-5.3-Flash",
        messages=messages,
        max_tokens=8000,  # example value: below this model's output limit
    )
    choice = resp.choices[0]
    parts.append(choice.message.content)
    if choice.finish_reason != "length":
        break
    messages.append({"role": "assistant", "content": choice.message.content})
    messages.append({"role": "user", "content": "Continue exactly where you stopped. Don't repeat anything."})

text = "".join(parts)

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

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

โมเดล ค่าใช้จ่าย OpenRouter
GLM-5.3-Flash $0.00036 $0.00069
DeepSeek-V4-Flash $0.00083 $0.0013
MiniMax-M2.7 $0.0013 $0.0102

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

เมื่อ finish_reason เป็น stop#

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

เลือกโมเดลตามความยาวคำตอบ#

เริ่มจากคำตอบที่คุณต้องการ ถ้าพอดีใน 8,192 โทเค็น MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7) รองรับได้บน CheapTokens เอาต์พุตถูกกว่าราคาอ้างอิงของ OpenRouter และคิดราคาที่ $0.15 (ต่อ 1M โทเค็นเอาต์พุต) ราคาเท่ากันทุกชั่วโมง ไม่มีช่วงพีค และ API เข้ากันได้กับ OpenAI และ Anthropic

นี่คือรายการราคาปัจจุบันของทุกโมเดล:

โมเดล บริบท Input $/1M Output $/1M OpenRouter เข้า OpenRouter ออก
GLM-5.3-Flash reasoning 390K $0.02 $0.04 $0.0413 $0.0758
DeepSeek-V4-Flash 380K $0.015 $0.10 $0.0475 $0.1568
MiniMax-M2.7 180K $0.05 $0.15 $0.30 $1.20

ราคาเป็น USD ต่อ 1 ล้านโทเค็น ตัวเลขของ OpenRouter แสดงไว้เพื่อเปรียบเทียบและอาจมีการเปลี่ยนแปลง

ถ้ายังไม่ได้ส่งคำขอ Your first API request with CheapTokens อธิบายขั้นตอนไว้ สำหรับโทเค็นคืออะไรและทำไมอินพุตและเอาต์พุตนับแยกกัน ดู What is a token in AI?

Endpoint, model id และขีดจำกัดของทุกโมเดลอยู่ใน CheapTokens docs