نُه درس، از «harness اصلاً یعنی چه» تا «ایجنت داخلش دقیقاً چه میکند». هر درس چهار سؤال را جواب میدهد: چه شد، چطور کار میکند، چرا این راه، و چه سودی دارد.
این مهمترین سؤال شما بود، و جوابش در یک جملهی خود سایت رسمی هست:
مدل، هوش را میدهد. harness، توانایی عملکردن را.
پس نه، harness خودش ایجنت نیست. نصف ایجنت است. آن نصفی که هوش ندارد ولی دست و پا دارد.
یک رانندهی حرفهای را تصور کنید که در اتاقی خالی نشسته. مهارتش دستنخورده است، ولی هیچ کاری از دستش برنمیآید. نه ماشینی هست، نه فرمانی، نه جادهای.
مدل همان راننده است. harness همان ماشین و فرمان و آینه و جاده است.
وقتی یک دستیار هوش مصنوعی جواب بدی میدهد، دو علت کاملاً متفاوت ممکن است داشته باشد: یا مدل خوب فکر نکرده، یا harness ابزار درست را در اختیارش نگذاشته. این دو تا راهحل کاملاً متفاوتی دارند. عوضکردن مدل، مشکل دوم را حل نمیکند.
این هم سؤال دوم شما بود. جوابش یک جملهی دیگر از همان سایت است:
و بعد فهرست میکند که منظورش از «هر قابلیتی» دقیقاً چیست.
نُه چیز. در بیشتر ابزارهای مشابه، شش هفتتای اینها ثابت است و فقط دو سهتایش قابل تغییر. اینجا هر نُهتا.
حلقه یعنی روش تصمیمگیری ایجنت. در تقریباً هر ابزار دیگری، این خود محصول است و دستنزدنی. اینجا هم یک افزونه است.
مثل خودرویی که بگویند موتورش هم قابل تعویض است.
وقتی همهچیز قابل تعویض باشد، تعداد تصمیمهایی که باید بگیرید هم بیشتر میشود. ابزاری که فقط دو گزینه دارد، سریعتر راه میافتد. این یکی وقتی میدرخشد که واقعاً بخواهید چیزی غیرمعمول بسازید. سایت رسمی هم خودش میگوید هنوز در مرحلهی «پیشنمایش توسعهدهندگان» است.
راه سادهتر این بود که همهچیز در یک برنامهی بزرگ نوشته شود. ببینیم چرا نشد.
پایهای که همهچیز رویش سوار است. سه چیز فراهم میکند و بس.
| نام اصلی | به فارسی | کارش |
|---|---|---|
| context | بستر مشترک | فضایی که همهی افزونهها در آن زندگی میکنند |
| service | قابلیت قرضی | چیزی که یک افزونه میسازد و بقیه قرض میگیرند |
| event | خبر | پیامی که یکی پخش میکند و هر که خواست میشنود |
یک فایل، با سه چیز داخلش. همین.
// یک افزونهی کامل export const name = 'my-plugin' // ۱. اسم من export const inject = ['tools'] // ۲. به این نیاز دارم export function apply(ctx) { // ۳. کارم این است // قابلیتم را اینجا ثبت میکنم }
شما نمیگویید «فلان افزونه را بیاور». میگویید «به قابلیت ابزارها نیاز دارم». اینکه کدام افزونه آن قابلیت را فراهم میکند به شما ربطی ندارد، و فردا میتواند عوض شود.
هر افزونه میتواند تنظیمات بگیرد. ولی قبل از اینکه حتی روشن شود، تنظیماتش بررسی میشود.
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
| نام اصلی | به فارسی | یعنی |
|---|---|---|
| session | نشست | کل گفتگوی شما، از اول تا آخر |
| turn | نوبت | یک درخواست شما و کل کاری که برایش انجام میشود |
| step | گام | یک دور از حلقهی بالا |
یک نشست چند نوبت دارد. یک نوبت میتواند دهها گام داشته باشد.
در تحلیل کد این پروژه، ۱۸۹ فایل مربوط به ابزارها بود. بیشترین سهم از کل.
ctx.tools.register(defineTool({
name: 'greet', // ۱. اسم
description: 'Greet someone by name', // ۲. کِی به کار میآید
// ۳. خودِ کار
}))
توضیح مبهم یعنی ابزاری که هیچوقت استفاده نمیشود، یا بدتر، جای اشتباه استفاده میشود. کدی که پشتش هست هر چقدر هم خوب باشد، فرقی نمیکند.
در تحلیل کد ۸۳ فایل دربارهی زیر-ایجنت پیدا شد، یعنی جدی گرفته شده.
| درس | مسئله | راهحل |
|---|---|---|
| ۱ · harness چیست | ایجنت یک تودهی درهم بود | مغز از بدن جدا شد |
| ۲ · فرقش با بقیه | بیشتر بخشها دستنزدنی بودند | هر نُه بخش قابل تعویض شد |
| ۳ · افزونهای بودن | افزودن قابلیت هسته را میشکست | هسته کوچک، بقیه از بیرون |
| ۴ · بستر مشترک | وابستگی مستقیم افزونهها به هم | همه با یک واسطه حرف میزنند |
| ۵ · شکل افزونه | ترتیب روشنشدن پیچیده بود | اعلام نیاز، نه اعلام ترتیب |
| ۶ · دروازهی تنظیمات | خطای تنظیمات دیر پیدا میشد | بررسی پیش از شروع |
| ۷ · حلقهی ایجنت | نقشهی از پیشکشیده بیفایده بود | هر بار فقط قدم بعدی |
| ۸ · ابزارها | قابلیت جدید یعنی آموزش دوباره | ثبت ابزار با توضیح آدمیزاد |
| ۹ · زیر-ایجنت | حافظه برای کار بزرگ کم میآمد | تقسیم کار، بازگشت خلاصه |
هر بار جواب یکی بود: چیزها را از هم جدا کن، و بگذار از راه یک واسطهی روشن با هم حرف بزنند. مغز از بدن، هسته از قابلیتها، افزونه از افزونه، تصمیم از اجرا، کار بزرگ از کار کوچک.