ব্লগে ফিরে যান

শিক্ষানবিসদের জন্য AIগাইড

কেন একটি AI উত্তর বাক্যের মাঝখানে থামে? max_tokens, কনটেক্সট উইন্ডো এবং finish_reason ব্যাখ্যা করা হলো

একটি AI উত্তর যা বাক্যের মাঝখানে থামে তা একটি সীমায় পৌঁছেছে। finish_reason পড়ুন, max_tokens কে পূর্ণ কনটেক্সট উইন্ডো থেকে আলাদা করুন এবং প্রতিটি মডেলের আউটপুট সীমা পরীক্ষা করুন।

CheapTokens Team দ্বারাপ্রকাশিত হয়েছে আপডেট করা হয়েছে 12 মিনিট পড়ার সময়

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-এর API রেফারেন্স এটিকে কমপ্লিশনে জেনারেট করা টোকেনের সর্বোচ্চ সংখ্যা হিসেবে সংজ্ঞায়িত করে।
  • মডেলের আউটপুট সীমা হলো সেই মডেল থেকে একটি একক উত্তরের জন্য সর্বোচ্চ সীমা। এটি মডেলেরই অন্তর্গত, তাই 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 (বা কিছু API-তে 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

ডেভেলপাররা তাদের নিজস্ব API-এর জন্য নিজেদের সীমা প্রকাশ করে। উদাহরণস্বরূপ, Z.ai GLM-5 সিরিজের জন্য 128K আউটপুট পর্যন্ত তালিকাভুক্ত করে। এগুলো CheapTokens-এ GLM-5.3-Flash-এর সীমা নয়, যা প্রতি উত্তরে 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

মোট ২,০০০ ইনপুট এবং ৮,০০০ আউটপুট টোকেন। প্রতি 1M টোকেনের দাম বর্তমান এবং আমাদের ট্যারিফের সাথে পরিবর্তিত হয়; OpenRouter কলামটি একই ওয়ার্কলোডের জন্য রেফারেন্স মূল্য দেখায়।

যখন finish_reason হলো stop#

stop মানে মডেল উত্তরটি শেষ করেছে। যদি এটি আপনার চাওয়ার চেয়ে আগে শেষ হয়, সেটি সীমার সমস্যা নয় এবং বড় max_tokens কিছুই পরিবর্তন করে না। আপনি কী চান তা বলুন: দৈর্ঘ্য, বিভাগগুলো, বিস্তারের মাত্রা। এছাড়াও পরীক্ষা করুন অনুরোধে stop প্যারামিটার সেট করা আছে কিনা; উত্তরে উপস্থিত একটি স্টপ সিকোয়েন্স সেখানেই এটি শেষ করে দেয়।

উত্তর দৈর্ঘ্য অনুযায়ী মডেল বাছাই#

আপনার প্রয়োজনীয় উত্তর থেকে শুরু করুন। যদি এটি 8,192 টোকেনে ফিট করে, MiniMax-M2.7 (MiniMaxAI/MiniMax-M2.7) CheapTokens-এ এটি সামলায়। এর আউটপুট OpenRouter রেফারেন্স মূল্যের চেয়ে সস্তা, এবং এটি $0.15 (প্রতি 1M আউটপুট টোকেন) হারে বিল হয়। মূল্য যেকোনো সময় একই, কোনো পিক আওয়ার নেই, এবং API OpenAI এবং Anthropic-সামঞ্জস্যপূর্ণ।

এখানে প্রতিটি মডেলের জন্য বর্তমান মূল্য তালিকা:

মডেল কনটেক্সট ইনপুট $/১ মিলিয়ন আউটপুট $/১ মিলিয়ন 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-তে মূল্য। OpenRouter-এর পরিসংখ্যান তুলনার জন্য দেখানো হয়েছে এবং তা পরিবর্তিত হতে পারে।

যদি আপনি এখনও একটি অনুরোধ না পাঠিয়ে থাকেন, Your first API request with CheapTokens এর মধ্য দিয়ে যায়। টোকেন কী এবং কেন ইনপুট এবং আউটপুট আলাদাভাবে গণনা করা হয়, দেখুন What is a token in AI?।

প্রতিটি মডেলের এন্ডপয়েন্ট, মডেল আইডি এবং সীমা CheapTokens docs-এ আছে।