![]()
در درس قبلی نمایندگان را به سمت ابر مقیاس کردیم. این یکی آنها را روی یک دستگاه واحد پایین میآورد. در پایان شما یک دستیار مهندسی کاری خواهید داشت که استدلال میکند، ابزارها را فراخوانی میکند، پروندههای شما را میخواند و مستندات شما را جستجو میکند — بدون هیچ تماس استنتاج ابری.
چرا این را میخواهید؟ سه دلیل که به طور مکرر در کار مهندسی واقعی مطرح میشوند:
نکته این است که شما یک مدل ابری پیشرفته را با یک مدل زبان کوچک (SLM) که روی CPU، GPU یا NPU شما اجرا میشود، معاوضه میکنید. این درس درباره ساخت نمایندگانی است که در آن محدودیت خوب عمل میکنند، نه ادای نبود محدودیت را در بیاورند.
این درس شامل موارد زیر است:
پس از پایان این درس، شما خواهید دانست چگونه:
این درس فرض میکند که درسهای قبلی را پشت سر گذاشتهاید و با موارد زیر راحت هستید:
همچنین به موارد زیر نیاز دارید:
requirements.txt، بهعلاوه foundry-local-sdk، openai و chromadb برای این درس.یک مدل ابری پیشرفته صدها میلیارد پارامتر و یک مرکز داده پشت خود دارد. یک SLM چند میلیارد پارامتر دارد و باید در رم لپتاپ شما جا بگیرد. این تفاوت انتظارات روشنی را تعیین میکند.
SLMها در این موارد خوب هستند:
SLMها در این موارد ضعیفترند:
استراتژی برنده برای نمایندگان محلی بنابراین این است: بگذارید SLM هماهنگ کند و بگذارید ابزارها بار سنگین را بر دوش بکشند. مدل نیازی ندارد کد پایه شما را بداند — نیاز دارد بداند کی read_file و search_docs را فراخوانی کند. این دقیقاً به نقاط قوت SLM میپردازد.
flowchart LR
U[توسعهدهنده] --> A[عامل محلی SLM]
A -->|تصمیم میگیرد کدام ابزار| T1[خواندن_فایل]
A -->|تصمیم میگیرد کدام ابزار| T2[جستجوی اسناد RAG]
A -->|تصمیم میگیرد کدام ابزار| T3[تحلیل_کد]
T1 --> A
T2 --> A
T3 --> A
A --> R[پاسخ، کاملاً در دستگاه]
Microsoft Foundry Local یک زماناجرای سبک است که مدلها را کاملاً روی دستگاه شما دانلود، مدیریت و ارائه میدهد. ویژگی مهم برای ما این است که یک نقطه پایانی HTTP سازگار با OpenAI فراهم میکند — به این معنی که SDK OpenAI و کلاینت OpenAI چارچوب عامل مایکروسافت با تنها تغییر base_url علیه آن کار میکنند. همه چیزهایی که درباره ساخت نمایندهها یاد گرفتهاید مستقیماً منتقل میشود؛ فقط نقطه پایانی از ابر به localhost منتقل میشود.
Foundry Local همچنین بهترین نسخه یک مدل را به طور خودکار برای سختافزار شما انتخاب میکند — نسخه CPU، نسخه CUDA/GPU یا نسخه NPU — بنابراین بهینهسازی دستی برای هر دستگاه لازم نیست.
Foundry Local را نصب کنید (مستندات آن را برای سیستمعامل خود ببینید) سپس تأیید کنید که کار میکند:
# نصب (مثال؛ مستندات مربوط به پلتفرم خود را دنبال کنید)
winget install Microsoft.FoundryLocal # ویندوز
# brew install microsoft/foundrylocal/foundrylocal # macOS
# دانلود و اجرای مدل Qwen، سپس راهاندازی سرویس محلی
foundry model run qwen2.5-7b-instruct
foundry service status
زمانی که سرویس اجرا شود، یک نقطه پایانی محلی سازگار با OpenAI خواهید داشت (معمولاً http://localhost:PORT/v1). نوتبوک با استفاده از foundry-local-sdk به طور خودکار نقطه پایانی را کشف میکند، پس نیازی به کدگذاری سختافزار پورت نیست.
یک نماینده فقط وقتی نماینده است که بتواند ابزارها را فراخوانی کند. بسیاری از SLMها میتوانند گفتگو کنند اما فراخوانی ابزار نامطمئن و اشتباه تولید میکنند. مدلهای Qwen برای فراخوانی تابع آموزش دیدهاند و ساختار فراخوانی ابزار خوبفرمگیریشدهای تولید میکنند — که دقیقاً همان چیزی است که یک مدل گفتگوی محلی را به یک نماینده محلی تبدیل میکند.
جریان همان حلقه استاندارد فراخوانی ابزار است که قبلاً میشناسید، فقط روی دستگاه اجرا میشود:
sequenceDiagram
participant U as کاربر
participant A as عامل Qwen (محلی)
participant T as ابزار محلی
U->>A: "auth.py چه کاری انجام میدهد؟"
A->>A: تصمیمگیری: فراخوانی read_file
A->>T: read_file("auth.py")
T-->>A: محتوای فایل
A->>A: بررسی محتوا
A-->>U: توضیح
جستجوی مستندات جایی است که نمایندگان محلی ارزش خود را نشان میدهند. به جای این که امیدوار باشید SLM مستندات چارچوب شما را به خاطر سپرده باشد، این مستندات را در یک پایگاه داده برداری محلی جاسازی میکنید و اجازه میدهید نماینده قطعات مرتبط را به درخواست بازیابی کند.
ما از Chroma استفاده میکنیم، یک فروشگاه برداری جاسازیشده که به صورت درونفرآیندی اجرا میشود و نیازی به مدیریت سرور ندارد. فرآیند کاملاً محلی است: مدل جاسازی محلی → بردارهای محلی → بازیابی محلی → SLM محلی.
flowchart TB
D[اسناد / کد شما] --> E[مدل تعبیه محلی]
E --> V[(پایگاه داده برداری Chroma - روی دیسک)]
Q[پرسش عامل] --> QE[تعبیه پرسش بهصورت محلی]
QE --> V
V -->|بهترین قطعههای kتایی| A[عامل Qwen]
A --> Ans[پاسخ مبتنی بر واقعیت]
این همان الگوی Agentic RAG از درس 5 است—تنها تغییر این است که همه مؤلفهها روی دستگاه شما اجرا میشود.
MCP یک پروتکل حمل و نقل است، نه یک سرویس ابری. یک سرور MCP میتواند به عنوان یک فرآیند محلی روی stdio اجرا شود و ابزارها را به نماینده شما از طریق پروتکل استاندارد ارائه دهد. این امکان استفاده مجدد از اکوسیستم در حال رشد سرورهای MCP — دسترسی به سیستم فایل، عملیات git، پرس و جوهای پایگاه داده — را کاملاً به صورت آفلاین فراهم میکند.
موضع امنیتی با ابر متفاوت است، ولی غایب نیست: یک سرور MCP محلی هنوز با مجوزهای کاربر شما اجرا میشود، بنابراین باید محدوده دسترسی آن را کنترل کنید (یک دایرکتوری پروژه، نه کل پوشه خانگی شما) و خروجیهای آن را به عنوان ورودی برای اعتبارسنجی در نظر بگیرید.
محلیاول به معنای فقط محلی نیست. سیستمهای بالغ بر اساس حساسیت و سختی مسیردهی میکنند:
| وضعیت | محل اجرا |
|---|---|
| کد / داده حساس، یا آفلاین | SLM محلی |
| کار ساده و محدود | SLM محلی (ارزان، سریع) |
| استدلال چند قفله سخت روی داده غیر حساس | مدل ابری |
| همه چیز در زمان قطعی | SLM محلی (تخریب تدریجی) |
این الگوی مسیردهی مدل از درس 16 را منعکس می کند — جز اینکه یکی از “مدلها” اکنون دستگاه خود شما است. یک طراحی مقاوم وقتی ابر در دسترس نیست به مدل محلی بازمیگردد، بنابراین کیفیت نماینده کاهش مییابد به جای شکست کامل.
flowchart LR
Q[درخواست] --> S{حساس یا آفلاین؟}
S -->|بله| L[SLM محلی]
S -->|خیر| C{نیاز به استدلال عمیق دارد؟}
C -->|خیر| L
C -->|بله| Cloud[مدل ابری]
L --> Out[پاسخ]
Cloud --> Out
فایل code_samples/17-local-agent-foundry-local.ipynb را باز کرده و آن را اجرا کنید. شما یک دستیار مهندسی محلی خواهید ساخت که روی ایستگاه کاری شما کاملاً اجرا میشود و میتواند:
۱. فراخوانی ابزارها — از طریق فراخوانی تابع Qwen از طریق Foundry Local. ۲. انجام عملیات پرونده محلی — فهرست و خواندن پروندهها در یک دایرکتوری پروژه. ۳. تحلیل کد — گزارش معیارهای پایه روی یک فایل منبع. ۴. جستجوی مستندات — RAG محلی روی یک پوشه مستندات با Chroma. ۵. استفاده از MCP — اتصال به سرور MCP محلی (با رد ملایم اگر سرور پیکربندی نشده باشد).
در هیچ مرحلهای از استنتاج ابری استفاده نمیشود.
دستیار از طریق نقطه پایانی سازگار با OpenAI به Foundry Local متصل میشود، بنابراین کد نماینده تقریباً شبیه درسهای ابری است — تنها کلاینت تغییر میکند:
from foundry_local import FoundryLocalManager
from openai import OpenAI
# فاندری لوکال مدل را پیدا میکند/دانلود میکند و یک نقطه انتهایی محلی به ما میدهد.
manager = FoundryLocalManager(\"qwen2.5-7b-instruct\")
client = OpenAI(base_url=manager.endpoint, api_key=manager.api_key) # api_key یک مکاننگهدار محلی است
ابزارها توابع عادی پایتون هستند که به یک دایرکتوری پروژه محدود شدهاند:
def read_file(path: str) -> str:
\"\"\"Read a file, but only inside the sandboxed project directory.\"\"\"
full = (PROJECT_ROOT / path).resolve()
if PROJECT_ROOT not in full.parents and full != PROJECT_ROOT:
return \"Access denied: path is outside the project directory.\"
return full.read_text(encoding=\"utf-8\")
توجه به بررسی محیط محافظتی — حتی محلی هم، ابزاری که مسیرهای دلخواه میخواند خطرناک است. نوتبوک هر ابزار را محدود به یک ریشه پروژه نگه میدارد.
قبل از رفتن به تمرین، دانش خود را آزمایش کنید.
۱. دو دلیل ملموس برای اجرای یک نماینده به صورت محلی به جای ابری بیان کنید.
۲. تقسیم کار توصیهشده بین یک SLM و ابزارهای آن در یک نماینده محلی چیست و چرا؟
۳. چه چیزی امکان استفاده مجدد از کد نماینده ابری با Foundry Local را فراهم میکند؟
۴. چرا ما به طور خاص از مدل فراخوانی تابع Qwen استفاده میکنیم به جای هر SLM دیگری؟
۵. در خط لوله RAG محلی، کدام مؤلفهها روی دستگاه اجرا میشوند؟
۶. یک سرور MCP محلی روی دستگاه شما اجرا میشود. آیا این به طور خودکار آن را ایمن میکند؟ چه احتیاطی هنوز باید بکنید؟
۷. یک قانون مسیردهی هیبریدی معقول که مدل محلی را در بر میگیرد، توصیف کنید.
۸. کمینه رم واقعبینانه برای اجرای نماینده محلی در این درس چقدر است و رم بیشتر چه مزیتی دارد؟
دستیار مهندسی محلی را به یک بازبین مستندات محلی برای یک پروژه کوچک انتخابی توسعه دهید (میتوانید از یکی از پوشههای درس این مخزن استفاده کنید).
ارسال شما باید:
۱. یک پوشه واقعی مستندات/کد را به Chroma شاخصگذاری کند (حداقل پنج فایل).
۲. یک ابزار find_todos اضافه کند که پروژه را برای کامنتهای TODO/FIXME اسکن کرده و آنها را با فایل و شماره خط برگرداند — با همان بررسی محیط محافظتی مثل read_file.
سپس یک پاراگراف کوتاه بنویسید در مورد اینکه چه چیزهایی را به فضای ابری منتقل میکنید و چه چیزهایی را به صورت محلی نگه میدارید برای این بررسیکننده، و چرا. ارزیابی شما بر این اساس است که آیا اجزای محلی به درستی به هم متصل شدهاند و آیا استدلال ترکیبی شما منطقی است — نه بر کیفیت مدل.
در این درس شما یک عامل ساختید که کاملاً روی دستگاه خود شما اجرا میشود:
این فصل کاملکننده چرخه استقرار است: درس ۱۶ عاملها را در Microsoft Foundry مقیاسدهی کرد، و این درس آنها را روی یک ایستگاه کاری واحد مقیاسدهی کرد. درس بعدی به حفظ امنیت عاملهای مستقر شده میپردازد.
سلب مسئولیت: این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما در تلاش برای دقت هستیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیهایی باشند. سند اصلی به زبان مادری خود باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حیاتی، ترجمه حرفهای انسانی توصیه میشود. ما در قبال هرگونه سوء تفاهم یا برداشت نادرست ناشی از استفاده از این ترجمه مسئولیتی نداریم.