درس گام‌به‌گام

ساختمان DeepSeek Harness

نُه درس، از «harness اصلاً یعنی چه» تا «ایجنت داخلش دقیقاً چه می‌کند». هر درس چهار سؤال را جواب می‌دهد: چه شد، چطور کار می‌کند، چرا این راه، و چه سودی دارد.

۱ harness یعنی چه؟

این مهم‌ترین سؤال شما بود، و جوابش در یک جمله‌ی خود سایت رسمی هست:

Model+Harness=Agent

مدل، هوش را می‌دهد. harness، توانایی عمل‌کردن را.

پس نه، harness خودش ایجنت نیست. نصف ایجنت است. آن نصفی که هوش ندارد ولی دست و پا دارد.

یک مثال از دنیای واقعی

یک راننده‌ی حرفه‌ای را تصور کنید که در اتاقی خالی نشسته. مهارتش دست‌نخورده است، ولی هیچ کاری از دستش برنمی‌آید. نه ماشینی هست، نه فرمانی، نه جاده‌ای.

مدل همان راننده است. harness همان ماشین و فرمان و آینه و جاده است.

مدل، تنها مدل فقط فکر می‌کند به بیرون دسترسی ندارد فقط متن می‌دهد مدل + harness مدل همان مدل harness فایل دستور شبکه
مدل در هر دو طرف یکسان است. تنها چیزی که عوض شده، کادر نارنجی دور آن است، و همان کادر است که سه راه ارتباط با دنیای بیرون را باز می‌کند.
چرا این تفکیک به شما مربوط است

وقتی یک دستیار هوش مصنوعی جواب بدی می‌دهد، دو علت کاملاً متفاوت ممکن است داشته باشد: یا مدل خوب فکر نکرده، یا harness ابزار درست را در اختیارش نگذاشته. این دو تا راه‌حل کاملاً متفاوتی دارند. عوض‌کردن مدل، مشکل دوم را حل نمی‌کند.

چه شد
ایجنت به دو نیمه‌ی مستقل شکسته شد: مغز، و بدن.
چطور کار می‌کند
مدل می‌گوید چه باید کرد. harness آن را انجام می‌دهد و نتیجه را برمی‌گرداند.
چرا این راه
چون مدل‌ها هر چند ماه عوض می‌شوند، ولی «چطور فایل بخوان» عوض نمی‌شود.
سودش
می‌شود مدل را با نسخه‌ی بهتر عوض کرد بدون اینکه چیز دیگری دست بخورد.

۲ چه فرقی با بقیه دارد؟

این هم سؤال دوم شما بود. جوابش یک جمله‌ی دیگر از همان سایت است:

«هر قابلیتی یک افزونه است که می‌شود عوضش کرد یا از نو چیدش.»

و بعد فهرست می‌کند که منظورش از «هر قابلیتی» دقیقاً چیست.

مدل‌هاکدام هوش مصنوعی
ابزارهاچه کارهایی بلد است
مهارت‌هادانش تخصصی
گفتگوهاحافظه و تاریخچه
محیط امنکجا کد اجرا شود
ذخیره‌سازیداده کجا بماند
حلقهچطور تصمیم بگیرد
زمان‌بندیکِی کاری انجام شود
ظاهرشما چه می‌بینید

نُه چیز. در بیشتر ابزارهای مشابه، شش هفت‌تای اینها ثابت است و فقط دو سه‌تایش قابل تغییر. اینجا هر نُه‌تا.

آن مورد «حلقه» غیرعادی است

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

مثل خودرویی که بگویند موتورش هم قابل تعویض است.

ولی این آزادی رایگان نیست

وقتی همه‌چیز قابل تعویض باشد، تعداد تصمیم‌هایی که باید بگیرید هم بیشتر می‌شود. ابزاری که فقط دو گزینه دارد، سریع‌تر راه می‌افتد. این یکی وقتی می‌درخشد که واقعاً بخواهید چیزی غیرمعمول بسازید. سایت رسمی هم خودش می‌گوید هنوز در مرحله‌ی «پیش‌نمایش توسعه‌دهندگان» است.

چه شد
مرز بین «هسته‌ی محصول» و «چیزهای قابل تنظیم» تقریباً حذف شد.
چطور کار می‌کند
هر نُه بخش، افزونه‌ای است که با یک فایل تنظیمات جایگزین می‌شود.
چرا این راه
چون سازندگان نمی‌دانستند مردم دقیقاً چه می‌خواهند بسازند، پس همه‌چیز را باز گذاشتند.
سودش
کاری که سازنده پیش‌بینی نکرده هم قابل ساختن است، بدون تغییر کد اصلی.

۳ چرا اصلاً افزونه‌ای؟

راه ساده‌تر این بود که همه‌چیز در یک برنامه‌ی بزرگ نوشته شود. ببینیم چرا نشد.

برنامه‌ی یکپارچه هسته و همه‌ی قابلیت‌ها فایل · دستور · شبکه · مدل همه در یک تن واحد قابلیت جدید، خودِ هسته را جابه‌جا می‌کند روش افزونه‌ای هسته فایل دستور مدل قابلیت جدید، فقط یک جعبه‌ی تازه است هسته دست‌نخورده می‌ماند
تفاوت در یک خط است: پیکان زیر هسته. در سمت راست به داخل هسته می‌رود، در سمت چپ فقط از کنارش وصل می‌شود.
چه شد
هسته تا حد ممکن کوچک نگه داشته شد و بقیه از بیرون وصل شدند.
چطور کار می‌کند
هسته فقط یک میز کار فراهم می‌کند. هر قابلیت، فایل جدایی است که خودش را روی آن میز ثبت می‌کند.
چرا این راه
چون قابلیت‌ها مدام عوض می‌شوند ولی میز کار ثابت می‌ماند.
سودش
افزودن یا حذف یک قابلیت، بقیه را نمی‌شکند.

۴ آن میز کار: Cordis

پایه‌ای که همه‌چیز رویش سوار است. سه چیز فراهم می‌کند و بس.

نام اصلیبه فارسیکارش
contextبستر مشترکفضایی که همه‌ی افزونه‌ها در آن زندگی می‌کنند
serviceقابلیت قرضیچیزی که یک افزونه می‌سازد و بقیه قرض می‌گیرند
eventخبرپیامی که یکی پخش می‌کند و هر که خواست می‌شنود
بستر مشترک قابلیت‌ها و خبرها اینجا نگه داشته می‌شوند افزونه‌ی ابزارها افزونه‌ی مدل افزونه‌ی فایل افزونه‌ی ظاهر می‌سپارد می‌سپارد قرض می‌گیرد خبر می‌شنود
خط پیوسته یعنی قابلیت داده یا گرفته می‌شود. خط‌چین یعنی فقط خبر شنیده می‌شود، و گیرنده لازم نیست بداند فرستنده کیست.
چه شد
به‌جای اینکه افزونه‌ها مستقیم همدیگر را صدا بزنند، همه با یک واسطه حرف می‌زنند.
چطور کار می‌کند
هر افزونه قابلیتش را در بستر می‌گذارد و هر که لازم داشت از همان‌جا برمی‌دارد.
چرا این راه
اگر افزونه‌ها مستقیم به هم وصل بودند، حذف یکی باعث خطا در بقیه می‌شد.
سودش
می‌شود یک افزونه را با نسخه‌ی بهترش عوض کرد بدون اینکه بقیه بفهمند.

۵ یک افزونه دقیقاً چیست؟

یک فایل، با سه چیز داخلش. همین.

// یک افزونه‌ی کامل
export const name = 'my-plugin'      // ۱. اسم من
export const inject = ['tools']     // ۲. به این نیاز دارم

export function apply(ctx) {        // ۳. کارم این است
  // قابلیتم را اینجا ثبت می‌کنم
}
فایل افزونه خوانده می‌شود اعلام نیاز «به ابزارها نیاز دارم» هنوز آماده نیست، صبر روشن می‌شود تابع apply اجرا می‌شود آماده شد هیچ‌کس ترتیب را دستی تعیین نمی‌کند
حلقه‌ی خط‌چین بالا همان چیزی است که ترتیب را خودکار می‌کند: تا وقتی نیاز برآورده نشده، افزونه روشن نمی‌شود.
نکته‌ی ظریف در «اعلام نیاز»

شما نمی‌گویید «فلان افزونه را بیاور». می‌گویید «به قابلیت ابزارها نیاز دارم». اینکه کدام افزونه آن قابلیت را فراهم می‌کند به شما ربطی ندارد، و فردا می‌تواند عوض شود.

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

۶ دروازه‌ی تنظیمات

هر افزونه می‌تواند تنظیمات بگیرد. ولی قبل از اینکه حتی روشن شود، تنظیماتش بررسی می‌شود.

تنظیمات در فایل cordis.yml دروازه درست است؟ افزونه روشن با تنظیمات کامل خطا، همین‌جا اصلاً روشن نمی‌شود بله نه
نکته‌ی کل نمودار همان لوزی است: هیچ مسیری وجود ندارد که افزونه با تنظیمات ناقص روشن شود.

مثال واقعی از راهنمای رسمی

export const Config = Schema.object({
  greeting: Schema.string().default('Hello'),
  targets:  Schema.array(String).default(['world']),
})

export function apply(ctx, config) {
  // config همیشه کامل و بررسی‌شده است
  for (const target of config.targets) {
    console.log(`${config.greeting}, ${target}!`)
  }
}

اگر greeting را ننویسید، خودش Hello می‌گذارد. اگر چیز نامعتبری بنویسید، افزونه خراب اعلام می‌شود و برنامه با خطا می‌ایستد.

چرا اسمش «بلند شکست بخور» است

راه دیگر این بود که تنظیمات بد را نادیده بگیرد و ادامه دهد. آن‌وقت برنامه کار می‌کرد ولی اشتباه، و شما هفته‌ها بعد می‌فهمیدید. اینجا همان لحظه‌ی اول داد می‌زند.

چه شد
بررسی تنظیمات از داخل کد بیرون کشیده شد و به دروازه‌ای پیش از شروع تبدیل شد.
چطور کار می‌کند
هر افزونه شکل تنظیمات مجازش را اعلام می‌کند و سیستم پیش از روشن‌کردن می‌سنجد.
چرا این راه
تا هیچ‌وقت افزونه‌ای نیمه‌روشن نماند.
سودش
خطا در ثانیه‌ی اول پیدا می‌شود، با پیام دقیق.

۷ قلب ایجنت: حلقه

حالا می‌رسیم به آنچه پرسیدید. ایجنت یک حلقه است، یعنی کاری که تکرار می‌شود تا تمام شود.

قلبش در این فایل است: packages/core/agent-loop/src/agent.ts

درخواست شما قدم بعدی چیست؟ requestProposal اجرای یک ابزار خواندن، نوشتن، جستجو دیدن نتیجه چه به دست آمد کار تمام انجام بده نتیجه برمی‌گردد دوباره بپرس اگر چیزی نمانده
خط‌چین برگشتی همان چیزی است که این را حلقه می‌کند: بعد از دیدن هر نتیجه، دوباره از اول می‌پرسد، نه اینکه از قبل کل نقشه را کشیده باشد.

سه لایه‌ی زمانی

نام اصلیبه فارسییعنی
sessionنشستکل گفتگوی شما، از اول تا آخر
turnنوبتیک درخواست شما و کل کاری که برایش انجام می‌شود
stepگامیک دور از حلقه‌ی بالا

یک نشست چند نوبت دارد. یک نوبت می‌تواند ده‌ها گام داشته باشد.

چه شد
به‌جای اینکه ایجنت از اول کل نقشه را بکشد، هر بار فقط قدم بعدی را تصمیم می‌گیرد.
چطور کار می‌کند
می‌پرسد قدم بعدی چیست، ابزاری اجرا می‌کند، نتیجه را می‌بیند، دوباره می‌پرسد.
چرا این راه
چون نتیجه‌ی هر قدم می‌تواند غافلگیرکننده باشد و نقشه‌ی از پیش‌کشیده را بی‌ارزش کند.
سودش
ایجنت می‌تواند وسط کار مسیرش را عوض کند.

۸ ابزارها

در تحلیل کد این پروژه، ۱۸۹ فایل مربوط به ابزارها بود. بیشترین سهم از کل.

ctx.tools.register(defineTool({
  name: 'greet',                        // ۱. اسم
  description: 'Greet someone by name', // ۲. کِی به کار می‌آید
  // ۳. خودِ کار
}))
«فایل را می‌خواند» «در اینترنت جستجو می‌کند» «دستور اجرا می‌کند» فهرست ابزارها، فقط توضیحشان ایجنت «قیمت طلا چند است؟» این یکی می‌خورد کدِ ابزار دیده نمی‌شود
جعبه‌ی خط‌چین سمت چپ نکته‌ی اصلی است: ایجنت هیچ‌وقت کد ابزار را نمی‌بیند، و انتخابش فقط بر پایه‌ی همان یک جمله توضیح است.
چرا آن «توضیح» مهم‌ترین قسمت است

توضیح مبهم یعنی ابزاری که هیچ‌وقت استفاده نمی‌شود، یا بدتر، جای اشتباه استفاده می‌شود. کدی که پشتش هست هر چقدر هم خوب باشد، فرقی نمی‌کند.

چه شد
قابلیت‌ها به قطعات کوچک مستقل شکسته شد، هر کدام با توضیحی به زبان آدمیزاد.
چطور کار می‌کند
همه‌ی ابزارها با توضیحشان به ایجنت نشان داده می‌شوند و او از روی توضیح انتخاب می‌کند.
چرا این راه
تا افزودن قابلیت جدید نیاز به آموزش دوباره‌ی ایجنت نداشته باشد.
سودش
ایجنت بدون هیچ تغییری در خودش، قابلیت جدید یاد می‌گیرد.

۹ زیر-ایجنت‌ها

در تحلیل کد ۸۳ فایل درباره‌ی زیر-ایجنت پیدا شد، یعنی جدی گرفته شده.

ایجنت اصلی بخش اول بخش دوم بخش سوم می‌سپارد هر کدام جدا کار می‌کند و فقط خلاصه را برمی‌گرداند
هر زیر-ایجنت حافظه‌ی خودش را دارد. ایجنت اصلی فقط خلاصه‌ی نتیجه را می‌گیرد، نه همه‌ی جزئیات راه.
چه شد
کارهای بزرگ به چند کار کوچک مستقل شکسته می‌شوند.
چطور کار می‌کند
هر زیر-ایجنت حلقه‌ی خودش را دارد و در حافظه‌ی خودش کار می‌کند.
چرا این راه
چون حافظه‌ی هر ایجنت محدود است و جزئیات ده کار در یک حافظه جا نمی‌شود.
سودش
کارهای بزرگ‌تر از ظرفیت یک ایجنت هم قابل انجام می‌شوند.

نُه درس در یک نگاه

درسمسئلهراه‌حل
۱ · harness چیستایجنت یک توده‌ی درهم بودمغز از بدن جدا شد
۲ · فرقش با بقیهبیشتر بخش‌ها دست‌نزدنی بودندهر نُه بخش قابل تعویض شد
۳ · افزونه‌ای بودنافزودن قابلیت هسته را می‌شکستهسته کوچک، بقیه از بیرون
۴ · بستر مشترکوابستگی مستقیم افزونه‌ها به همهمه با یک واسطه حرف می‌زنند
۵ · شکل افزونهترتیب روشن‌شدن پیچیده بوداعلام نیاز، نه اعلام ترتیب
۶ · دروازه‌ی تنظیماتخطای تنظیمات دیر پیدا می‌شدبررسی پیش از شروع
۷ · حلقه‌ی ایجنتنقشه‌ی از پیش‌کشیده بی‌فایده بودهر بار فقط قدم بعدی
۸ · ابزارهاقابلیت جدید یعنی آموزش دوبارهثبت ابزار با توضیح آدمیزاد
۹ · زیر-ایجنتحافظه برای کار بزرگ کم می‌آمدتقسیم کار، بازگشت خلاصه
یک الگوی واحد، نُه بار

هر بار جواب یکی بود: چیزها را از هم جدا کن، و بگذار از راه یک واسطه‌ی روشن با هم حرف بزنند. مغز از بدن، هسته از قابلیت‌ها، افزونه از افزونه، تصمیم از اجرا، کار بزرگ از کار کوچک.