مقدمة
لقد أحدثت نماذج اللغة الكبيرة (LLMs) ثورة في طريقة تفاعلنا مع البرمجيات، إلا أن بنية الوكلاء الأحادية غالباً ما تواجه صعوبة في التعامل مع سير العمل المعقد متعدد الخطوات. عندما تتطلب المهمة مهارات متميزة—مثل استرجاع السوابق القانونية، وإجراء حسابات رياضية، ثم تجميع تقرير متماسك—قد تصبح نموذج اللغة الكبيرة العام عرضةً للهلوسة أو فقدان السياق.
هنا يبرز دور LangGraph. كإطار عمل قوي مبني فوق LangChain، يتيح LangGraph للمطورين تحديد تطبيقات متعددة الوكلاء ذات الحالة كمخططات. من خلال تنسيق وكلاء LLM متخصصين، يمكننا إنشاء أنظمة أكثر متانة ودقة وقابلية للصيانة. في هذا الدليل، سنستكشف بنية الأنظمة متعددة الوكلاء ونقدم تطبيقاً عملياً لسيناريو دعم عملاء معقد.
لماذا بنية متعددة الوكلاء؟
تعامل أساليب سلسلة الأفكار التقليدية مع نموذج اللغة الكبيرة كصندوق أسود واحد. على النقيض من ذلك، تقوم بنية متعددة الوكلاء بتفكيك المشكلات إلى مهام فرعية أصغر، يتولى كل منها وكيلاً مزوداً بأدوات وتعليمات محددة. تشمل الفوائد الرئيسية ما يلي:
- التخصص: يركز كل وكيل على مجال ضيق، مما يحسن الدقة.
- قابلية التصحيح: يمكنك تتبع مكان حدوث الخطأ في سير العمل بدقة.
- قابلية التوسع: يمكن إضافة قدرات جديدة كعقد جديدة في المخطط دون إعادة كتابة المنطق الأساسي.
التصميم المعماري: مخطط الحالة
في قلب LangGraph يوجد StateGraph. الحالة هي قاموس (dictionary) يستمر عبر جميع العقد (الوكلاء) في المخطط. لحالتنا الاستخدامية، دعنا نصمم روبوت دعم بثلاثة وكلاء:
- وكيل الفرز (Triage Agent): يصنف نية المستخدم (مثلاً، الفواتير، تقني، الحساب).
- وكيل المتخصص (Specialist Agent): عقدة ديناميكية توجه إلى الأداة المتخصصة الصحيحة أو موجه LLM.
- وكيل التجميع (Synthesizer Agent): يجمع نتائج المتخصص في رد نهائي سهل الفهم للمستخدم.
التطبيق: بناء الوكلاء
أولاً، نحتاج إلى تحديد مخطط الحالة والوكلاء الأفراد. سنستخدم Python ومكتبة langgraph.
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
from langchain_openai import ChatOpenAI
import operator
# 1. Define the State
class SupportState(TypedDict):
user_query: str
intent: str
specialist_response: str
final_response: str
# 2. Initialize LLMs
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 3. Define Agent Functions
def triage_agent(state: SupportState) -> dict:
"""Classifies the user's intent."""
prompt = f"Classify the following query into 'billing', 'technical', or 'other': {state['user_query']}"
intent = llm.invoke(prompt).content.strip().lower()
return {"intent": intent}
def specialist_agent(state: SupportState) -> dict:
"""Handles the specific domain logic."""
if state["intent"] == "billing":
# In a real app, you'd call an API or RAG here
response = "I have checked your billing status. Your account is in good standing."
elif state["intent"] == "technical":
response = "Please try restarting your device. If issues persist, check your firewall settings."
else:
response = "I'm not sure how to handle that specific request."
return {"specialist_response": response}
def synthesizer_agent(state: SupportState) -> dict:
"""Combines the specialist's output into a friendly response."""
prompt = f"""
User Query: {state['user_query']}
Specialist Info: {state['specialist_response']}
Write a polite, professional response to the user based on the specialist info.
"""
final_response = llm.invoke(prompt).content
return {"final_response": final_response}
تنسيق سير العمل
الآن، نربط هذه الدوال في مخطط. يستخدم LangGraph العقد لتمثيل الوكلاء والحواف لتحديد تدفق البيانات.
# 4. Build the Graph
workflow = StateGraph(SupportState)
# Add nodes
workflow.add_node("triage", triage_agent)
workflow.add_node("specialist", specialist_agent)
workflow.add_node("synthesizer", synthesizer_agent)
# Define the flow
workflow.set_entry_point("triage")
workflow.add_edge("triage", "specialist")
workflow.add_edge("specialist", "synthesizer")
workflow.add_edge("synthesizer", END)
# Compile the graph
app = workflow.compile()
اختبار النظام
لاختبار روبوت المحادثة متعدد الوكلاء لدينا، ما علينا سوى استدعاء التطبيق المُجمَّع باستعلام من المستخدم. لاحظ كيف تتدفق الحالة من الفرز، إلى المتخصص، وأخيراً إلى التجميع.
# 5. Run the Application
query = "I was double charged for my last subscription renewal."
result = app.invoke({
"user_query": query,
"intent": "",
"specialist_response": "",
"final_response": ""
})
print(f"Detected Intent: {result['intent']}")
print(f"Final Response: {result['final_response']}")
خاتمة
بناء روبوتات محادثة ذكاء اصطناعي متعددة الوكلاء باستخدام LangGraph يغير طريقة تعاملنا مع مهام الذكاء الاصطناعي المعقدة. من خلال تفكيك المشكلات إلى عقد متخصصة، نكتسب تحكماً أفضل في عملية الاستدلال ويمكننا دمج أدوات متنوعة بسلاسة. على الرغم من أن المثال أعلاه خطي، إلا أن LangGraph يدعم أيضاً التفرع الشرطي والدورات، مما يتيح تفاعلات وكلاء أكثر تعقيداً، مثل وكيل يطلب توضيحاً قبل المتابعة. عند استمرارك في البناء، فكّر في إضافة التسجيل (logging) والموافقات البشرية في الحلقة (human-in-the-loop) لضمان السلامة والموثوقية في بيئات الإنتاج.