العودة إلى المدونة

الذكاء الاصطناعي للمبتدئيندليل

لماذا تتوقف إجابة الذكاء الاصطناعي في منتصف الجملة؟ شرح max_tokens ونافذة السياق وfinish_reason

إجابة الذكاء الاصطناعي التي تتوقف في منتصف الجملة بلغت حدًّا. اقرأ 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 هو سقف تحدده في الطلب. عندما تبلغ الإجابة هذا السقف، يتوقف التوليد، حتى في منتصف كلمة. يعرّفه مرجع واجهة DeepSeek بأنه الحد الأقصى لعدد الرموز المولّدة في الإكمال.
  • حد مخرجات النموذج هو السقف لإجابة واحدة من ذلك النموذج. إنه خاص بالنموذج، لذا أبقِ max_tokens عند هذا الحد أو أقل. أرقام نماذجنا موجودة في الجدول أدناه.
  • نافذة السياق هي المساحة المتاحة للتبادل بأكمله: مدخلاتك والإجابة معًا. يقول مرجع DeepSeek إن الرموز المدخلة والمولّدة معًا محدودة بطول سياق النموذج.

إذا كانت الرموز لا تزال فكرة غامضة، فابدأ بـ What is a token in AI?. تفترض هذه الصفحة أنك تعرف ما هو الرمز.

اقرأ finish_reason أولًا#

كل خيار في استجابة الدردشة يحمل 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، فالإجابة مكتملة. اختار النموذج أن ينتهي، أو بلغ تسلسل توقف حددته أنت. وإذا كان 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 في بعض الواجهات) نافذة السياق ممتلئة اختصر المدخلات أو السجل، أو اختر نموذجًا بنافذة أكبر
مكتملة لكن أقصر مما أردت stop انتهى النموذج، أو أُطلق تسلسل توقف اطلب تفاصيل أكثر؛ تحقق من معامل 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:

النموذج معرّف النموذج الحد الأقصى للمخرجات لكل إجابة السياق
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

ينشر المطورون حدودهم الخاصة لواجهاتهم الخاصة. على سبيل المثال، تسرد 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 رمز إخراج إجمالًا. الأسعار لكل مليون رمز حالية وتتغير مع تعريفاتنا؛ يعرض عمود OpenRouter أسعارًا مرجعية لنفس حجم العمل.

عندما يكون finish_reason هو stop#

تعني stop أن النموذج أنهى الإجابة. إذا انتهى قبل ما أردت، فليست هذه مشكلة حد، ولن يغيّر max_tokens الأكبر شيئًا. قل ما تريد: الطول، والأقسام، ومستوى التفصيل. تحقق أيضًا مما إذا كان الطلب يضبط معامل stop؛ فتسلسل توقف يظهر في الإجابة ينهيها في الحال.

اختيار نموذج حسب طول الإجابة#

ابدأ من الإجابة التي تحتاجها. إذا كانت تتسع في 8,192 رمزًا، فـ MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7) يتولاها على CheapTokens. مخرجاته أرخص من سعر OpenRouter المرجعي، ويُحتسب بسعر $0.15 (لكل 1M رمز مخرجات). السعر نفسه في أي ساعة، ولا توجد ساعات ذروة، والواجهة متوافقة مع OpenAI وAnthropic.

إليك قائمة الأسعار الحالية لكل نموذج:

النموذج السياق الإدخال $/1M الإخراج $/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

الأسعار بالدولار الأمريكي لكل مليون رمز (token). أرقام OpenRouter معروضة للمقارنة وقد تتغير.

إذا لم ترسل طلبًا بعد، فـ Your first API request with CheapTokens يشرح ذلك خطوة بخطوة. ولمعرفة ما هو الرمز ولماذا تُحتسب المدخلات والمخرجات بشكل منفصل، راجع What is a token in AI?.

نقاط النهاية ومعرّفات النماذج والحدود لكل نموذج موجودة في CheapTokens docs.