تخصيص الوكلاء باستخدام البرمجيات الوسيطة
تعلم كيفية الربط بحلقة create_agent باستخدام البرامج الوسيطة، وإضافة عمليات إعادة المحاولة، والتلخيص، والموافقة البشرية دون التخلي عن الوكيل المكون من سطر واحد.
سنغطي ما يلي...
create_agentيُنشئ حلقة النموذج والأدوات التي نفذناها يدويًا سابقًا: استدعاء النموذج، وتنفيذ أي أدوات مطلوبة، والاستمرار حتى لا يُعيد النموذج أي استدعاءات أخرى للأدوات. بشكل افتراضي، يتبع الوكيل هذه الحلقة القياسية. تُمكّننا البرمجيات الوسيطة من توسيعها لتسجيل استدعاءات النموذج، وإعادة محاولة حالات فشل الأدوات العابرة تلقائيًا، وتلخيص سجل الرسائل أو حذفه قبل تجاوزه حدود السياق، وإيقاف استدعاءات الأدوات المُكوّنة مؤقتًا للمراجعة البشرية.StateGraph يمكننا أيضًا تطبيق هذه السلوكيات، لكن البرمجيات الوسيطة تسمح لنا بإضافتها مباشرةً إلى الوكيل الذي تم إنشاؤه بواسطةcreate_agent .
لماذا البرمجيات الوسيطة؟
تُتيح البرمجيات الوسيطة إمكانية الوصول إلى نقاط الربط في مراحل محددة من دورة الوكيل، مما يسمح لنا بفحص أو تعديل أو تغليف تنفيذ النموذج والأداة. كما أنها توفر بديلاً عن استخدام السلوك الافتراضي دون تغيير أو تنفيذ سلوك مخصص.StateGraph يمكننا الاحتفاظcreate_agent مع إضافة السلوك المطلوب من خلال برامج وسيطة قابلة لإعادة الاستخدام.
نقوم بتمرير البرمجيات الوسيطة إلىcreate_agent على شكل قائمة:
graph = create_agent(model="openai:gpt-5",tools=[get_weather],middleware=[SomeMiddleware()],)
تدعم البرامج الوسيطة المخصصة نمطين من الخطافات: خطافات نمط العقدة التي تعمل في نقاط محددة من دورة الحياة، مثل قبل أو بعد الوكيل أو النموذج، وخطافات نمط التغليف التي تعمل حول كل استدعاء نموذج أو أداة وتتحكم في كيفية تنفيذ المعالج الأساسي.
خطافات على نمط العقدة:before_model و after_model
before_model يتم تشغيله مباشرة قبل استدعاء النموذج؛after_model يتم تشغيلها مباشرة بعد ذلك. وأبسط طريقة لكتابة واحدة هي باستخدام مُزخرف:
from langchain.agents.middleware import before_model@before_modeldef log_before_model(state, runtime):print(f"About to call the model with {len(state['messages'])} messages")
السطر 1: نستورد
before_modelمصمم ديكور منlangchain.agents.middleware.الأسطر 3-5: تستقبل الدالة المزخرفة التيار
state(نفس الحالة الشبيهة بالقاموس التي استقبلتها العقد التي قمنا ببنائها يدويًا) وruntimeالكائن، ويتم تشغيله قبل كل استدعاء للنموذج. إرجاع ...