فرض کنید برای صفحهٔ یک کافه، یک گفتوگوی بلند با مدل ساختهاید؛ اول لحن برند را توضیح دادهاید، بعد ۳۰ ایدهٔ پست گرفتهاید، بعد کپشنها را ویرایش کردهاید. پیام پنجاهم که میرسد، مدل همان قانونی را فراموش میکند که اول کار گفته بودید: «از شوخیهای کلیشهای استفاده نکنید». همزمان هزینهٔ هر پاسخ هم بیشتر میشود. ریشهٔ هر دو اتفاق، پنجرهٔ زمینه است؛ این راهنما نشان میدهد پشت پرده چه چیزی بزرگ میشود و چطور مهارش کنید.
پنجرهٔ زمینه همان بستهٔ ورودی هر پاسخ است
مدل، حافظهٔ شخصی و پنهانی بین دو پیام ندارد. هر بار که شما پیام تازهای میفرستید، سامانه یک بستهٔ ورودی میسازد و آن را به مدل میدهد: دستور سیستمی (System Prompt)، پیامهای قبلی، پیام جدید، و متن استخراجشده از فایلهایی که فرستادهاید. مدل فقط همان بسته را میبیند و بر اساس همان پاسخ میدهد.
به این بسته، زمینه میگوییم. پنجرهٔ زمینه (Context Window) سقف همان بسته است؛ یعنی بیشترین مقدار متنی که مدل میتواند در یک نوبت ببیند. اگر میپرسید context window چیست، پاسخ کوتاه همین است: ظرفیت دیدن گذشتهٔ گفتوگو، نه حافظهٔ واقعی.
این نکته سوءتفاهم مهمی را روشن میکند. وقتی میگوییم حافظهٔ مدل هوش مصنوعی ضعیف شده، معمولاً منظورمان حافظه به معنای انسانی نیست. مدل یا آن بخش را دیگر در ورودی نمیبیند، یا در میان حجم زیادی متن کمتر به آن توجه میکند. در گفتوگوی خیلی بلندِ چت گیسو، قدیمیتر از ۶۰ پیام آخر دیگر فرستاده نمیشود و خلاصه هم نمیشود؛ دستور سیستمی پروژه اما همراه همهٔ پیامها میرود. حافظهٔ خودکار بین چتها هم وجود ندارد؛ بخش «دربارهٔ شما» و «پاسخها چطور باشد» در تنظیمات خوانده میشود، اما مدل خودش جزئیات چتهای قبلی را به چت تازه منتقل نمیکند.
اگر یک قانون ثابت دارید، آن را در ابتدای هر پیام تکرار نکنید. راه درستتر این است که آن را در دستور سیستمی پروژه بگذارید. برای نوشتن این بخش، راهنمای دستور سیستمی کاربردی کمک میکند.
اندازهٔ پنجره در مدلها فرق دارد
ظرفیت زمینه با توکن سنجیده میشود. توکن، تکهٔ خردشدهٔ متن برای مدل است. یک واژهٔ فارسی گاهی یک توکن است و اغلب به دو یا چند توکن میشکند، پس «۱۲۸ هزار توکن» را نباید با «۱۲۸ هزار کلمهٔ فارسی» یکی گرفت. عدد دقیق به متن، فاصلهها، نشانهگذاری و ترکیب فارسی و انگلیسی بستگی دارد.
در فهرست مدلهای گیسو، اندازهٔ پنجرهها بسیار متفاوت است. چند نمونهٔ کاربردی را ببینید:
| مدل | پنجرهٔ زمینه | کاربرد معمول |
|---|---|---|
gpt-4o-mini | ۱۲۸ هزار توکن | چت روزمره، متنهای متوسط، فایلهای کوتاه |
gpt-5-mini و gpt-5 | ۴۰۰ هزار توکن | تحلیل طولانیتر، چند سند، گفتوگوی کاری بلند |
gpt-5.5، gemini-3.8-flash، openrouter/anthropic/claude-sonnet-5 و deepseek-v4-pro | حدود ۱ میلیون توکن | پروندههای بزرگ، کد زیاد، یا پروژههایی که واقعاً به زمینهٔ بلند نیاز دارند |
فهرست کامل مدلها و قیمت هرکدام را از کتابخانهٔ مدلها ببینید. یک نکته را جدا نگه دارید: پاسخ مدل هم سقف خودش را دارد. حتی اگر مدل بتواند ورودی بسیار بزرگی بخواند، خروجی با تنظیم «حداکثر توکن خروجی» محدود میشود. پس پنجرهٔ بزرگ یعنی مدل متن بیشتری را میبیند، نه اینکه هر بار متن بسیار طولانی تحویل بدهد.
چت بلند پیش از پر شدن پنجره هم افت میکند
پر نشدن سقف، به معنی کیفیت ثابت نیست. مدلها در متنهای بسیار بلند معمولاً به ابتدا و انتهای ورودی بهتر توجه میکنند و بخشهای میانی بیشتر گم میشود. پژوهشگران به این رفتار «گمشدن در میانه (lost in the middle)» میگویند. برای کار روزمره، معنیاش ساده است: قانونی که ۴۰ پیام پیش، وسط گفتوگو نوشتهاید، ممکن است ضعیفتر از آخرین جملهٔ شما اثر بگذارد.
مشکل دوم، انباشت دستورهای متناقض است. شما اول مینویسید «لحن رسمی باشد»، بعد در پیام دهم میگویید «صمیمیتر بنویسید»، بعد در پیام بیستوپنجم میخواهید «مثل متن سایت حقوقی باشد». مدل همهٔ اینها را میبیند و باید حدس بزند کدام مهمتر است. اگر پیام آخر شفاف نباشد، خروجی نوسان پیدا میکند.
مشکل سوم، رقابت جزئیات است. در یک گفتوگوی طولانی دربارهٔ فروشگاه، ممکن است نام برند، مخاطب، محدودیتهای محصول، تقویم محتوا، لحن، و چند فایل اکسل کنار هم قرار بگیرند. وقتی سؤال آخر شما فقط میگوید «این را بهتر کنید»، مدل باید بفهمد «این» دقیقاً به کدام بخش برمیگردد. هرچه زمینه شلوغتر باشد، احتمال برداشت اشتباه بالاتر میرود.
در چتهای طولانی، پیام آخر را مستقلتر بنویسید. به جای «ادامه بدهید»، بنویسید: «با همان لحن رسمی، فقط برای مخاطب دانشجو، ۳ کپشن کوتاه برای پست معرفی دوره بنویسید.»
طول گفتوگو و هزینه با هر پیام رشد میکند
هزینهٔ چت فقط به پیام تازهٔ شما مربوط نیست. چون هر پاسخ تازه با ارسال دوبارهٔ تاریخچهٔ قابلمشاهده ساخته میشود، پیام پنجاهم معمولاً ورودی بسیار بزرگتری از پیام پنجم دارد. اگر اندازهٔ سؤال و پاسخ ثابت بماند، همین رشد تاریخچه باعث افزایش هزینه میشود.
جدول زیر همین اثر را نشان میدهد. آن را اینطور بخوانید: سؤال و اندازهٔ پاسخ یکسان فرض شده، مدل هم همان است؛ تنها چیزی که تغییر میکند شمارهٔ پیام و مقدار تاریخچهای است که دوباره فرستاده میشود.
| مدل | پیام شمارهٔ ۱ | پیام شمارهٔ ۱۰ | پیام شمارهٔ ۲۰ | پیام شمارهٔ ۳۰ |
|---|---|---|---|---|
| GPT-5 nano OpenAI | ۷۴ سکه | ۱۷۱ سکه | ۲۸۰ سکه | ۳۸۸ سکه |
| GPT-5 mini OpenAI | ۳۶۶ سکه | ۸۵۴ سکه | ۱,۳۹۵ سکه | ۱,۹۳۷ سکه |
| DeepSeek Flash DeepSeek | ۲۴۴ سکه | ۸۲۹ سکه | ۱,۴۷۹ سکه | ۲,۱۲۹ سکه |
| Gemini 3.8 Flash Google Gemini | ۷۳۲ سکه | ۲,۱۹۴ سکه | ۳,۸۱۹ سکه | ۵,۴۴۴ سکه |
| توکن ورودی همان پیام | ۴۵۰ | ۵,۸۵۰ | ۱۱,۸۵۰ | ۱۷,۸۵۰ |
فرض جدول: دستور سیستمی ۳۰۰ توکن، هر پرسش ۱۵۰ توکن و هر جواب ۴۵۰ توکن؛ همهٔ پیامهای قبلی در هر نوبت دوباره فرستاده میشوند. عدد هر خانه هزینهٔ همان یک پیام است، نه جمع گفتوگو.
چت گیسو از ۶۰ پیام آخر (حدود ۳۰ نوبت) قدیمیتر را دیگر نمیفرستد؛ در وبسرویس (API) هر چه خودتان بفرستید حساب میشود.
بهروزرسانی: ۱۴۰۵/۰۷/۰۹ ۰۳:۲۵ مبلغها به سکه، با قیمت امروز همان مدل در گیسو
فایلها هم همین رفتار را دارند. در چت گیسو، متن فایلهای PDF، Word، Excel، PowerPoint، فایلهای متنی و کد استخراج میشود تا مدل بتواند آنها را بخواند. این متن جزو ورودی حساب میشود. اگر یک PDF بلند را در ابتدای چت فرستاده باشید و بعد ۲۰ بار دربارهٔ آن سؤال کنید، متن استخراجشده هم در زمینه اثر میگذارد. برای کار با سندها، راهنمای خلاصهکردن PDF با هوش مصنوعی مسیر بهتری پیشنهاد میکند.
برای کوتاه نگه داشتن زمینه این کارها را انجام دهید
- برای هر موضوع یک چت تازه بسازید. تقویم محتوای کافه، ویرایش صفحهٔ دربارهٔ ما، و تحلیل فایل فروش را در یک گفتوگو نگه ندارید. جدا کردن موضوعها، هم زمینه را سبک میکند و هم ارجاعها را دقیقتر نگه میدارد.
- قبل از جابهجایی، خلاصهٔ کوتاه بگیرید. وقتی میخواهید از چت قدیمی به چت تازه بروید، از مدل بخواهید خلاصهای قابل انتقال بسازد. نمونهٔ قابل کپی: «از این گفتوگو یک خلاصهٔ ۱۰ بندی بسازید؛ فقط تصمیمهای نهایی، لحن برند، محدودیتها و کارهای ناتمام را بنویسید. جزئیات ردشده را حذف کنید.»
- قانونهای ثابت را در پروژه بگذارید. در گیسو، هر پروژه دستور سیستمی، مدل پیشفرض و تنظیمات خودش را دارد. اگر برای برندتان همیشه باید لحن آرام، جملههای کوتاه و پرهیز از اغراق رعایت شود، آن را در پروژه بنویسید؛ نه اینکه هر بار وسط چت تکرارش کنید.
- فقط صفحههای لازم را پیوست کنید. اگر از یک قرارداد ۸۰ صفحهای فقط بندهای فسخ را میخواهید، همان صفحهها را جدا کنید. فایل بزرگتر یعنی ورودی سنگینتر. PDF اسکنشده متن قابل استخراج ندارد؛ صفحههای لازم را بهصورت تصویر برای مدلهای بینایی بفرستید.
- مدل بزرگپنجره را برای نیاز واقعی انتخاب کنید. پنجرهٔ بزرگ برای پروندهٔ حجیم یا کد زیاد ارزش دارد. برای کپشن، ایمیل، ایدهٔ پست یا ویرایش متن کوتاه، مدل کوچکتر معمولاً کافی است. اگر کار شما استدلال پیچیده میخواهد، راهنمای مدلهای استدلالی را هم بخوانید؛ توکنهای فکرکردن در این مدلها بخشی از خروجی حساب میشوند.
برای توسعهدهندهها زمینه را آگاهانه بستهبندی کنید
در وبسرویس (API)، کنترل تاریخچه با شما است. اگر هر بار همهٔ پیامهای قدیمی را بیکموکاست بفرستید، هزینه و تأخیر بالا میرود و کیفیت هم لزوماً بهتر نمیشود. پاسخ هر درخواست، فیلد usage دارد و prompt_tokens مقدار ورودی مصرفشده را نشان میدهد. این عدد را لاگ کنید و بر اساس آن تصمیم بگیرید چه زمانی خلاصه بسازید یا پیامهای قدیمی را حذف کنید.
الگوی ساده این است: پیام سیستمی را نگه دارید، یک خلاصهٔ جاری از تصمیمهای قبلی داشته باشید، و فقط چند نوبت آخر را بفرستید. برای سندهای بلند، همهٔ متن را در هر درخواست نریزید؛ بخشهای مرتبط را پیدا کنید و همانها را بفرستید. برای پاسخ هم max_tokens بگذارید تا خروجی از حد نیاز بزرگتر نشود؛ در مدل استدلالی مثل gpt-5-mini فکر کردن هم از همین سقف خرج میکند، پس آن را خیلی تنگ نگیرید. جزئیات پارامترهای چت در مستندات چت API آمده است.
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["GISOO_API_KEY"],
base_url="https://gisoo.pro/api/v1",
)
def rough_tokens(text: str) -> int:
# Approximation only; use real tokenizer in production.
return max(1, len(text) // 3)
def pack_messages(system_prompt, summary, turns, budget_tokens=12000, last_n=12):
messages = [{"role": "system", "content": system_prompt}]
if summary:
messages.append({
"role": "user",
"content": "خلاصهٔ گفتوگوی قبلی:\n" + summary,
})
total = sum(rough_tokens(m["content"]) for m in messages)
kept = []
for msg in reversed(turns[-last_n:]):
cost = rough_tokens(msg["content"])
if total + cost > budget_tokens:
break
kept.append(msg)
total += cost
messages.extend(reversed(kept))
return messages
system_prompt = "شما یک دستیار فارسینویس دقیق هستید. کوتاه و روشن پاسخ بدهید."
summary = "کاربر فروشگاه قهوه دارد. لحن برند آرام، دقیق و بدون اغراق است."
turns = [
{"role": "user", "content": "برای معرفی قهوه کلمبیا کپشن بنویسید."},
{"role": "assistant", "content": "سه نسخهٔ کوتاه پیشنهاد شد."},
{"role": "user", "content": "حالا نسخهٔ رسمیتر برای لینکدین بسازید."},
]
messages = pack_messages(system_prompt, summary, turns)
response = client.chat.completions.create(
model="gpt-5-mini",
messages=messages,
reasoning_effort="low",
max_tokens=2000, # reasoning tokens count toward this cap
)
print(response.choices[0].message.content)
print("prompt_tokens:", response.usage.prompt_tokens)این کد شمارش توکن را تقریبی انجام میدهد. برای سامانهٔ جدی، از شمارندهٔ سازگار با مدل خودتان استفاده کنید یا با پایش usage.prompt_tokens سقفهای عملی بسازید.
خلاصهٔ خوب، حافظهٔ بهتر از تاریخچهٔ خام میسازد
تاریخچهٔ خام همیشه بهترین خوراک برای مدل نیست. خلاصهٔ خوب، تصمیمهای مهم را بالا میآورد و حاشیهها را حذف میکند. اگر یک چت تولید محتوا ۶۰ پیام دارد، مدل لازم نیست همهٔ نسخههای ردشدهٔ کپشن را دوباره ببیند. کافی است بداند کدام لحن انتخاب شد، چه کلمههایی ممنوعاند، مخاطب کیست و خروجی بعدی چه قالبی دارد.
این نمونه را میتوانید آخر چتهای بلند استفاده کنید:
ساختار خروجی:
۱. هدف پروژه
۲. تصمیمهای قطعی
۳. لحن و محدودیتها
۴. دادههای مهم عددی یا نامها
۵. کارهای ناتمام
موارد آزمایشی، نسخههای ردشده و بحثهای تکراری را حذف کنید.
بعد، چت تازه را با همان خلاصه شروع کنید و درخواست جدید را شفاف بنویسید. این کار اغلب از ادامه دادن یک گفتوگوی بسیار بلند بهتر جواب میدهد، چون مدل به جای جستوجو در انبوه متن، نسخهٔ فشردهٔ تصمیمها را جلو چشم دارد.
اولین اصلاح را از همین چت فعلی شروع کنید
اگر چت شما طولانی شده، ادامه ندهید و از مدل یک خلاصهٔ قابل انتقال بگیرید. سپس یک چت تازه بسازید، خلاصه را اول آن بگذارید، و درخواست بعدی را با هدف، قالب خروجی و محدودیتها بنویسید. همین تغییر کوچک، هم کیفیت پاسخ را قابل پیشبینیتر میکند و هم رشد پنهان ورودی را جلوی چشم شما میآورد.