![]()
الدرس السابق قام بتوسيع الوكلاء للعمل في السحابة. هذا الدرس ينقلهم إلى الأسفل إلى جهاز واحد فقط. في النهاية سيكون لديك مساعد هندسي يعمل يفكر، يستدعي الأدوات، يقرأ ملفاتك، ويبحث في وثائقك — بدون أي استدعاء استنتاج من السحابة.
لماذا قد ترغب في ذلك؟ هناك ثلاثة أسباب تتكرر باستمرار في العمل الهندسي الحقيقي:
المشكلة هي أنك تتبادل نموذج سحابي متقدم مقابل نموذج لغة صغير (SLM) يعمل على وحدة المعالجة المركزية، أو وحدة معالجة الرسومات، أو وحدة المعالجة العصبية الخاصة بك. هذا الدرس يتعلق ببناء وكلاء يكونون جيدين ضمن هذا القيد بدلاً من التظاهر بعدم وجود القيد.
هذا الدرس سيغطي:
بعد إكمال هذا الدرس، ستعرف كيف:
هذا الدرس يفترض أنك أنجزت الدروس السابقة وترتاح في:
ستحتاج أيضًا إلى:
requirements.txt، بالإضافة إلى foundry-local-sdk، و openai، و chromadb لهذا الدرس.نموذج سحابي متقدم به مئات المليارات من المعاملات ومركز بيانات خلفه. نموذج اللغة الصغيرة لديه فقط بضعة مليارات من المعاملات ويجب أن يتناسب مع ذاكرة اللابتوب الخاص بك. هذا الاختلاف يحدد توقعات واضحة.
نماذج اللغة الصغيرة جيدة في:
نماذج اللغة الصغيرة أضعف في:
الاستراتيجية الرابحة للوكلاء المحليين هي: دع النموذج الصغير يقوم بالتنسيق، ودع الأدوات تقوم بالعمل الشاق. النموذج لا يحتاج لأن يعرف قاعدة الكود الخاصة بك — يحتاج فقط إلى معرفة متى يستدعي read_file و search_docs. هذا يلعب مباشرة إلى نقاط قوة النموذج الصغير.
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 في إطار عمل الـ Microsoft Agent يعملان عبرها مع تغيير واحد فقط في base_url. كل شيء تعلمته عن بناء الوكلاء ينتقل مباشرة؛ فقط نقطة النهاية تنتقل من السحابة إلى localhost.
Foundry Local يختار أفضل إصدار للنموذج يناسب جهازك تلقائيًا — إصدار لوحدة المعالجة المركزية، أو إصدار لوحدة معالجة الرسومات CUDA/GPU، أو إصدار وحدة المعالجة العصبية NPU — بحيث لا تحتاج إلى تحسين يدوي لكل جهاز.
قم بتثبيت Foundry Local (اطلع على الوثائق الخاصة بنظام التشغيل الخاص بك هنا)، ثم تأكد من أنه يعمل:
# تثبيت (مثال؛ اتبع الوثائق لمنصتك)
winget install Microsoft.FoundryLocal # ويندوز
# brew install microsoft/foundrylocal/foundrylocal # ماك أو إس
# قم بتنزيل نموذج 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: شرح
البحث في الوثائق هو المكان الذي يكسب فيه الوكلاء المحليين قيمتهم. بدلاً من الأمل في أن النموذج الصغير قد حفظ مستندات الإطار الخاص بك، تقوم بتضمين تلك المستندات في قاعدة بيانات متجهات محلية وتسمح للوكيل باسترجاع الأجزاء ذات الصلة عند الطلب.
نستخدم Chroma، مخزن متجهات مضمّن يعمل في نفس العملية بدون خادم لإدارته. الخط الكامل محلي: نموذج التضمين المحلي → المتجهات المحلية → الاسترجاع المحلي → النموذج الصغير المحلي.
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 المحلي لا يزال يعمل بأذونات المستخدم الخاص بك، لذا قم بتحديد نطاق ما يمكنه الوصول إليه (مثل مجلد مشروع، وليس كل مجلد المنزل) وتعامل مع مخرجاته كمدخلات تتحقق منها.
الأولوية للمحلي لا تعني فقط محلي. الأنظمة الناضجة توجه بناءً على الحساسية والصعوبة:
| الحالة | مكان التشغيل |
|---|---|
| كود/بيانات حساسة، أو بدون اتصال | نموذج لغة صغير محلي |
| مهمة بسيطة ومحدودة | نموذج لغة صغير محلي (رخيص وسريع) |
| استدلال معقد متعدد الخطوات على بيانات غير حساسة | نموذج سحابي |
| كل شيء، أثناء انقطاع الخدمة | نموذج لغة صغير محلي (تدرج تدهور انسيابي) |
هذا يعكس فكرة توجيه النموذج من الدرس 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 واعمل عليه. ستبني مساعدًا هندسيًا محليًا يعمل كليًا على محطة عملك ويمكنه:
لا يتم استخدام استنتاج من السحابة في أي نقطة.
يتصل المساعد بـ Foundry Local عبر نقطة نهاية متوافقة مع OpenAI، لذا يبدو رمز الوكيل شبه مطابق لدروس السحابة — يتغير فقط العميل:
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\")
لاحظ فحص الحماية — حتى محليًا، الأداة التي تقرأ المسارات العشوائية تشكل مخاطرة. الدفتر يحافظ على كل أداة مقتصرة على جذر مشروع واحد.
اختبر فهمك قبل الانتقال إلى المهمة.
1. اذكر سببين ملموسين لتشغيل وكيل محلي بدلاً من تشغيله في السحابة.
2. ما هو التقسيم الموصى به للعمل بين نموذج اللغة الصغيرة والأدوات في وكيل محلي، ولماذا؟
3. ما الذي يجعل من الممكن إعادة استخدام رمز الوكيل السحابي مع Foundry Local؟
4. لماذا نستخدم تحديدًا نموذج استدعاء الوظائف Qwen بدلاً من أي نموذج لغة صغيرة؟
5. في خط أنابيب البحث المستند إلى المحتوى المحلي، أي المكونات تعمل على الجهاز؟
6. خادم MCP محلي يعمل على جهازك. هل هذا يجعله آمنًا تلقائيًا؟ ما الاحتياطيات التي يجب أن تأخذها؟
7. صِف قاعدة توجيه هجينة منطقية تشمل نموذجًا محليًا.
8. ما هو رقم ذاكرة RAM الحد الأدنى الواقعي لتشغيل الوكيل المحلي في هذا الدرس، وما الذي توفره زيادة الذاكرة؟
قم بتوسيع المساعد الهندسي المحلي ليصبح مراجع وثائق محلي لمشروع صغير من اختيارك (يمكنك استخدام أحد مجلدات الدروس في هذا المستودع إذا رغبت).
يجب أن يشمل تقديمك:
إضافة أداة find_todos تفحص المشروع بحثًا عن تعليقات TODO/FIXME وتعيدها مع اسم الملف ورقم السطر — مع الحفاظ على نفس فحص الحماية كما في read_file.
ثم اكتب فقرة قصيرة عن ما الذي ستنقله إلى السحابة وما الذي ستحتفظ به محليًا لهذا المراجع، ولماذا. سيتم تقييمك بناءً على ما إذا كانت المكونات المحلية متصلة بشكل صحيح وما إذا كان تفكيرك المختلط منطقيًا — وليس على جودة النموذج.
في هذا الدرس قمت ببناء وكيل يعمل بالكامل على جهازك الخاص:
وهذا يكمل قوس النشر: الدرس 16 قام بتوسيع الوكلاء ليشمل Microsoft Foundry، وهذا الدرس قام بتقليصهم ليعملوا على محطة عمل واحدة. الدرس التالي يتناول الحفاظ على أمان الوكلاء المنشورين.
تنويه: تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي Co-op Translator. بينما نسعى للدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي والمعتمد. للمعلومات الهامة، يُنصح بالاستعانة بترجمة بشرية محترفة. نحن غير مسؤولين عن أي سوء فهم أو تفسير ناتج عن استخدام هذه الترجمة.