درک زمینه (context) برای ساخت برنامه‌های هوش مصنوعی که واقعاً کار می‌کنند ضروری است. این فصل همه چیزهایی را که باید درباره ارائه اطلاعات درست در زمان درست به هوش مصنوعی بدانید پوشش می‌دهد.

<Callout type="info" title="چرا زمینه مهم است">
مدل‌های هوش مصنوعی بدون حالت (stateless) هستند. آن‌ها مکالمات قبلی را به یاد نمی‌آورند. هر بار که پیامی ارسال می‌کنید، باید همه چیزهایی که هوش مصنوعی نیاز دارد بداند را شامل کنید. این «مهندسی زمینه» نامیده می‌شود.
</Callout>

## زمینه چیست؟

زمینه تمام اطلاعاتی است که در کنار سوال خود به هوش مصنوعی می‌دهید. به این شکل فکر کنید:

<Compare 
  before={{ label: "بدون زمینه", content: "وضعیت چیست؟" }}
  after={{ label: "با زمینه", content: "شما یک دستیار مدیر پروژه هستید. کاربر روی پروژه آلفا کار می‌کند که مهلت آن جمعه است. آخرین به‌روزرسانی این بود: 'بک‌اند کامل شده، فرانت‌اند ۸۰٪ انجام شده.'\n\nکاربر: وضعیت چیست؟" }}
/>

بدون زمینه، هوش مصنوعی نمی‌داند درباره چه «وضعیتی» می‌پرسید. با زمینه، می‌تواند پاسخ مفیدی بدهد.

### پنجره زمینه

از فصل‌های قبلی به یاد دارید: هوش مصنوعی یک «پنجره زمینه» محدود دارد - حداکثر مقدار متنی که می‌تواند همزمان ببیند. این شامل موارد زیر می‌شود:

<InfoGrid items={[
  { label: "پرامپت سیستم", description: "دستورالعمل‌هایی که رفتار هوش مصنوعی را تعریف می‌کنند", color: "purple" },
  { label: "تاریخچه مکالمه", description: "پیام‌های قبلی در این چت", color: "blue" },
  { label: "اطلاعات بازیابی شده", description: "اسناد، داده‌ها یا دانشی که برای این پرسش واکشی شده", color: "green" },
  { label: "پرسش فعلی", description: "سوال واقعی کاربر", color: "amber" },
  { label: "پاسخ هوش مصنوعی", description: "پاسخ (این هم جزو محدودیت حساب می‌شود!)", color: "rose" },
]} />

## هوش مصنوعی بدون حالت است

<Callout type="warning" title="مفهوم مهم">
هوش مصنوعی چیزی را بین مکالمات به یاد نمی‌آورد. هر فراخوانی API از صفر شروع می‌شود. اگر می‌خواهید هوش مصنوعی چیزی را «به یاد بیاورد»، شما باید هر بار آن را در زمینه قرار دهید.
</Callout>

به همین دلیل چت‌بات‌ها کل تاریخچه مکالمه شما را با هر پیام ارسال می‌کنند. این نیست که هوش مصنوعی به یاد می‌آورد - این است که برنامه همه چیز را دوباره ارسال می‌کند.

<TryIt compact prompt={`فرض کنید این یک مکالمه جدید بدون تاریخچه است.

همین الان درباره چه چیزی از شما پرسیدم؟`} />

هوش مصنوعی خواهد گفت که نمی‌داند زیرا واقعاً به هیچ زمینه قبلی دسترسی ندارد.

## RAG: تولید تقویت‌شده با بازیابی

RAG یک تکنیک برای دادن دسترسی به دانشی است که هوش مصنوعی روی آن آموزش ندیده. به جای تلاش برای گنجاندن همه چیز در آموزش هوش مصنوعی، شما:

1. **ذخیره** می‌کنید اسناد خود را در یک پایگاه داده قابل جستجو
2. **جستجو** می‌کنید برای اسناد مرتبط وقتی کاربر سوالی می‌پرسد
3. **بازیابی** می‌کنید مرتبط‌ترین قسمت‌ها را
4. **تقویت** می‌کنید پرامپت خود را با آن قسمت‌ها
5. **تولید** می‌کنید پاسخی با استفاده از آن زمینه

<div className="my-6 p-4 border rounded-lg bg-muted/30">
  <p className="font-semibold mb-3">RAG چگونه کار می‌کند:</p>
  <div className="flex flex-col gap-2 text-sm">
    <div className="flex items-center gap-3">
      <span className="w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900 flex items-center justify-center text-blue-600 font-bold">1</span>
      <span>کاربر می‌پرسد: «سیاست بازپرداخت ما چیست؟»</span>
    </div>
    <div className="flex items-center gap-3">
      <span className="w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900 flex items-center justify-center text-blue-600 font-bold">2</span>
      <span>سیستم اسناد شما را برای «سیاست بازپرداخت» جستجو می‌کند</span>
    </div>
    <div className="flex items-center gap-3">
      <span className="w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900 flex items-center justify-center text-blue-600 font-bold">3</span>
      <span>بخش مرتبط را از سند سیاست شما پیدا می‌کند</span>
    </div>
    <div className="flex items-center gap-3">
      <span className="w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900 flex items-center justify-center text-blue-600 font-bold">4</span>
      <span>به هوش مصنوعی ارسال می‌کند: «بر اساس این سیاست: [متن]، پاسخ بده: سیاست بازپرداخت ما چیست؟»</span>
    </div>
    <div className="flex items-center gap-3">
      <span className="w-8 h-8 rounded-full bg-green-100 dark:bg-green-900 flex items-center justify-center text-green-600 font-bold">5</span>
      <span>هوش مصنوعی پاسخ دقیقی با استفاده از سیاست واقعی شما تولید می‌کند</span>
    </div>
  </div>
</div>

### چرا RAG؟

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="p-4 border rounded-lg">
    <p className="font-semibold text-green-600 dark:text-green-400 mb-2 flex items-center gap-2"><IconCheck className="text-green-600" /> مزایای RAG</p>
    <ul className="text-sm space-y-1 text-muted-foreground">
      <li>از داده‌های واقعی و فعلی شما استفاده می‌کند</li>
      <li>توهمات را کاهش می‌دهد</li>
      <li>می‌تواند به منابع استناد کند</li>
      <li>به‌روزرسانی آسان (فقط اسناد را به‌روز کنید)</li>
      <li>نیازی به fine-tuning گران‌قیمت نیست</li>
    </ul>
  </div>
  <div className="p-4 border rounded-lg">
    <p className="font-semibold text-amber-600 dark:text-amber-400 mb-2 flex items-center gap-2"><IconLightbulb className="text-amber-600" /> چه زمانی از RAG استفاده کنیم</p>
    <ul className="text-sm space-y-1 text-muted-foreground">
      <li>ربات‌های پشتیبانی مشتری</li>
      <li>جستجوی مستندات</li>
      <li>پایگاه‌های دانش داخلی</li>
      <li>هر پرسش و پاسخ تخصصی دامنه</li>
      <li>وقتی دقت مهم است</li>
    </ul>
  </div>
</div>

## Embeddings: جستجو چگونه کار می‌کند

RAG چگونه می‌داند کدام اسناد «مرتبط» هستند؟ از **embeddings** استفاده می‌کند - روشی برای تبدیل متن به اعدادی که معنا را ضبط می‌کنند.

### Embeddings چیست؟

یک embedding فهرستی از اعداد (یک «بردار») است که معنای متن را نشان می‌دهد. معناهای مشابه = اعداد مشابه.

<EmbeddingsDemo />

### جستجوی معنایی

با embeddings، می‌توانید بر اساس معنا جستجو کنید، نه فقط کلمات کلیدی:

<Compare 
  before={{ label: "جستجوی کلمه کلیدی", content: "پرسش: 'سیاست بازگشت'\nپیدا می‌کند: اسنادی که شامل 'بازگشت' و 'سیاست' هستند\nاز دست می‌دهد: 'چگونه بازپرداخت بگیرم'" }}
  after={{ label: "جستجوی معنایی", content: "پرسش: 'سیاست بازگشت'\nپیدا می‌کند: همه اسناد مرتبط شامل:\n- 'راهنمای بازپرداخت'\n- 'چگونه کالاها را برگردانم'\n- 'ضمانت بازگشت پول'" }}
/>

به همین دلیل RAG بسیار قدرتمند است - اطلاعات مرتبط را حتی وقتی کلمات دقیق مطابقت ندارند پیدا می‌کند.

## فراخوانی تابع / استفاده از ابزار

فراخوانی تابع به هوش مصنوعی اجازه می‌دهد از ابزارهای خارجی استفاده کند - مانند جستجو در وب، بررسی پایگاه داده، یا فراخوانی یک API.

<Callout type="tip" title="نام‌های دیگر">
ارائه‌دهندگان مختلف هوش مصنوعی این را به نام‌های مختلف می‌خوانند: «function calling» (OpenAI)، «tool use» (Anthropic/Claude)، یا «tools» (اصطلاح عمومی). همه آن‌ها یک معنا دارند.
</Callout>

### چگونه کار می‌کند

1. شما به هوش مصنوعی می‌گویید چه ابزارهایی در دسترس هستند
2. هوش مصنوعی تصمیم می‌گیرد آیا برای پاسخ به ابزاری نیاز دارد
3. هوش مصنوعی یک درخواست ساختاریافته برای ابزار خروجی می‌دهد
4. کد شما ابزار را اجرا می‌کند و نتایج را برمی‌گرداند
5. هوش مصنوعی از نتایج برای شکل دادن پاسخ خود استفاده می‌کند

<TryIt 
  title="مثال فراخوانی تابع"
  description="این پرامپت نشان می‌دهد چگونه هوش مصنوعی تصمیم به استفاده از ابزار می‌گیرد:"
  prompt={`شما به این ابزارها دسترسی دارید:

1. get_weather(city: string) - دریافت آب و هوای فعلی برای یک شهر
2. search_web(query: string) - جستجو در اینترنت
3. calculate(expression: string) - انجام محاسبات ریاضی

کاربر: آب و هوای توکیو الان چطور است؟

قدم به قدم فکر کنید: آیا به ابزاری نیاز دارید؟ کدام یک؟ چه پارامترهایی؟`}
/>

## خلاصه‌سازی: مدیریت مکالمات طولانی

با طولانی‌تر شدن مکالمات، به محدودیت پنجره زمینه برخورد خواهید کرد. از آنجا که هوش مصنوعی بدون حالت است (چیزی به یاد نمی‌آورد)، مکالمات طولانی می‌توانند سرریز کنند. راه‌حل؟ **خلاصه‌سازی**.

### مشکل

<Compare 
  before={{ label: "بدون خلاصه‌سازی", content: "پیام ۱ (۵۰۰ توکن)\nپیام ۲ (۸۰۰ توکن)\nپیام ۳ (۶۰۰ توکن)\n... ۵۰ پیام دیگر ...\n────────────────────\n= بیش از ۴۰,۰۰۰ توکن\n= از محدودیت گذشت!" }}
  after={{ label: "با خلاصه‌سازی", content: "[خلاصه]: ۲۰۰ توکن\nپیام‌های اخیر: ۲,۰۰۰ توکن\nپرسش فعلی: ۱۰۰ توکن\n────────────────────\n= ۲,۳۰۰ توکن\n= کاملاً جا می‌شود!" }}
/>

### استراتژی‌های خلاصه‌سازی

رویکردهای مختلف برای موارد استفاده مختلف کار می‌کنند. روی هر استراتژی کلیک کنید تا ببینید چگونه همان مکالمه را پردازش می‌کند:

<SummarizationDemo />

### چه چیزی را در خلاصه‌ها ثبت کنیم

یک خلاصه مکالمه خوب آنچه مهم است را حفظ می‌کند:

<Checklist 
  title="چک‌لیست خلاصه"
  items={[
    { text: "تصمیمات کلیدی گرفته شده" },
    { text: "حقایق مهم ذکر شده" },
    { text: "ترجیحات کاربر که کشف شده" },
    { text: "وظیفه یا هدف فعلی" },
    { text: "هر سوال معلق" },
    { text: "لحن و سطح رسمیت" }
  ]}
/>

### امتحان کنید: یک خلاصه بسازید

<TryIt 
  title="خلاصه‌ساز مکالمه"
  description="ساخت یک خلاصه حفظ‌کننده زمینه از این مکالمه را تمرین کنید:"
  prompt={`این مکالمه را برای مدیریت زمینه خلاصه کنید. خلاصه جایگزین کل مکالمه در حافظه هوش مصنوعی خواهد شد.

مکالمه:
کاربر: سلام، دارم Python را برای تحلیل داده یاد می‌گیرم
دستیار: خوش آمدید! Python برای تحلیل داده عالی است. سطح تجربه فعلی شما چیست؟
کاربر: Excel پایه بلدم. مبتدی کامل در برنامه‌نویسی هستم.
دستیار: نقطه شروع عالی! بیایید با متغیرها شروع کنیم - آن‌ها مثل سلول‌های Excel هستند که داده ذخیره می‌کنند.
کاربر: می‌توانید متغیرها را توضیح دهید؟
دستیار: متغیرها ظرف‌هایی برای ذخیره داده هستند. در Python: name = "Alice" یا age = 25
کاربر: لیست‌ها چطور؟ باید چندین مقدار را مدیریت کنم.
دستیار: لیست‌ها مثل ستون‌های Excel هستند! یکی بسازید مثل: prices = [10, 20, 30]. به آیتم‌ها با prices[0] دسترسی پیدا کنید.
کاربر: می‌توانم روی لیست‌ها محاسبه انجام دهم؟
دستیار: بله! از sum(prices)، len(prices)، یا max(prices) استفاده کنید. برای تحلیل پیچیده، بعداً pandas را استفاده خواهیم کرد.
کاربر: pandas چیست؟
دستیار: Pandas یک کتابخانه برای تحلیل داده است - به آن «Excel روی استروئید» فکر کنید. دارای DataFrames است (مثل صفحات گسترده).

یک خلاصه بسازید که شامل موارد زیر باشد:
1. هدف و پیش‌زمینه کاربر (۱ جمله)
2. موضوعات پوشش داده شده تا کنون (۱ جمله)  
3. سبک/ترجیحات یادگیری کاربر (۱ جمله)
4. چه چیزی را بعداً پوشش دهیم (۱ جمله)`}
/>

### چه زمانی خلاصه‌سازی کنیم

<TryIt compact prompt={`شما در حال مدیریت پنجره زمینه یک مکالمه هستید. با توجه به این شرایط، تصمیم بگیرید چه زمانی خلاصه‌سازی را فعال کنید:

پنجره زمینه: حداکثر ۸,۰۰۰ توکن
استفاده فعلی:
- پرامپت سیستم: ۵۰۰ توکن
- تاریخچه مکالمه: ۶,۲۰۰ توکن  
- بافر برای پاسخ: ۱,۵۰۰ توکن

قوانین:
- وقتی تاریخچه از ۷۰٪ فضای موجود بیشتر شد خلاصه‌سازی کنید
- ۵ پیام آخر را دست‌نخورده نگه دارید
- همه ترجیحات و تصمیمات کاربر را حفظ کنید

آیا الان باید خلاصه‌سازی کنید؟ اگر بله، کدام پیام‌ها باید خلاصه شوند در مقابل دست‌نخورده بمانند؟`} />

## MCP: پروتکل زمینه مدل

MCP (Model Context Protocol) یک روش استاندارد برای اتصال هوش مصنوعی به داده‌ها و ابزارهای خارجی است. به جای ساخت یکپارچه‌سازی‌های سفارشی برای هر ارائه‌دهنده هوش مصنوعی، MCP یک رابط جهانی فراهم می‌کند.

### چرا MCP؟

<InfoGrid columns={2} items={[
  { label: "بدون MCP", description: "یکپارچه‌سازی‌های جداگانه برای ChatGPT، Claude، Gemini بسازید... چندین کدبیس را نگهداری کنید. وقتی APIها تغییر کنند خراب شود.", color: "red" },
  { label: "با MCP", description: "یک بار بسازید، همه جا کار می‌کند. پروتکل استاندارد. هوش مصنوعی می‌تواند به طور خودکار ابزارهای شما را کشف و استفاده کند.", color: "green" },
]} />

### MCP فراهم می‌کند

- **Resources**: داده‌هایی که هوش مصنوعی می‌تواند بخواند (فایل‌ها، رکوردهای پایگاه داده، پاسخ‌های API)
- **Tools**: اقداماتی که هوش مصنوعی می‌تواند انجام دهد (جستجو، ایجاد، به‌روزرسانی، حذف)
- **Prompts**: قالب‌های پرامپت از پیش ساخته شده

<Callout type="info" title="prompts.chat از MCP استفاده می‌کند">
این پلتفرم یک سرور MCP دارد! می‌توانید آن را به Claude Desktop یا سایر کلاینت‌های سازگار با MCP متصل کنید تا مستقیماً از دستیار هوش مصنوعی خود پرامپت‌ها را جستجو و استفاده کنید.
</Callout>

## ساخت زمینه: تصویر کامل

<ContextPlayground />

## بهترین شیوه‌ها

<Checklist 
  title="چک‌لیست مهندسی زمینه"
  items={[
    { text: "پرامپت‌های سیستم را مختصر اما کامل نگه دارید" },
    { text: "فقط زمینه مرتبط را شامل کنید (نه همه چیز)" },
    { text: "مکالمات طولانی را خلاصه کنید" },
    { text: "از RAG برای دانش تخصصی دامنه استفاده کنید" },
    { text: "به هوش مصنوعی ابزارهایی برای داده‌های بلادرنگ بدهید" },
    { text: "استفاده از توکن را نظارت کنید تا در محدودیت‌ها بمانید" },
    { text: "با موارد لبه تست کنید (ورودی‌های خیلی طولانی و غیره)" }
  ]}
/>

## خلاصه

مهندسی زمینه درباره دادن اطلاعات درست به هوش مصنوعی است:

- **هوش مصنوعی بدون حالت است** - هر بار همه چیزهایی که نیاز دارد را شامل کنید
- **RAG** اسناد مرتبط را برای تقویت پرامپت‌ها بازیابی می‌کند
- **Embeddings** جستجوی معنایی را ممکن می‌سازند (معنا، نه فقط کلمات کلیدی)
- **فراخوانی تابع** به هوش مصنوعی اجازه استفاده از ابزارهای خارجی را می‌دهد
- **خلاصه‌سازی** مکالمات طولانی را مدیریت می‌کند
- **MCP** نحوه اتصال هوش مصنوعی به داده‌ها و ابزارها را استانداردسازی می‌کند

<Callout type="tip" title="به یاد داشته باشید">
کیفیت خروجی هوش مصنوعی به کیفیت زمینه‌ای که ارائه می‌دهید بستگی دارد. زمینه بهتر = پاسخ‌های بهتر.
</Callout>
