إتقان وكلاء LangChain: دليل عملي شامل

١٨ فبراير ٢٠٢٦

Mastering LangChain Agents: A Complete Hands-On Tutorial

ملخص

  • تسمح وكلاء LangChain لنماذج LLMs باتخاذ القرارات واستدعاء الأدوات ديناميكيًا — فهي تعمل بمثابة "الأدمغة" لسير عمل الذكاء الاصطناعي.
  • ستتعلم كيفية بناء وتكوين واختبار وتوسيع وكلاء LangChain باستخدام Python.
  • سنستكشف أفضل الممارسات للأداء والأمان والمراقبة للاستخدام في بيئات الإنتاج.
  • يتضمن أمثلة أكواد قابلة للتشغيل، ومخططات هندسية، وحالات استخدام من العالم الحقيقي.
  • يغطي الأخطاء الشائعة، واستكشاف الأخطاء وإصلاحها، والخطوات التالية للمستخدمين المتقدمين.

ما ستتعلمه

  1. ما هي وكلاء LangChain وكيف تختلف عن السلاسل (chains).
  2. كيفية بناء وكيل بسيط يستخدم أدوات مثل APIs أو قواعد البيانات.
  3. كيفية إدارة الذاكرة، والتعامل مع الأخطاء، وتحسين الأداء.
  4. متى تستخدم الوكلاء — ومتى تكون السلسلة الثابتة أفضل.
  5. كيفية اختبار ومراقبة وتوسيع وكلاء LangChain لأحمال عمل الإنتاج.

المتطلبات الأساسية

قبل التعمق، يجب أن تكون مرتاحًا مع:

  • أساسيات Python 3.9+ (الدوال، البرمجة غير المتزامنة async، متغيرات البيئة)
  • فهم أساسي لنماذج LLMs (مثل نماذج GPT من OpenAI)
  • الإلمام بـ البيئات الافتراضية و إدارة الحزم (uv أو poetry)

ستحتاج أيضًا إلى:

# Create a virtual environment
python -m venv .venv
source .venv/bin/activate

# Install LangChain and OpenAI SDK
pip install langchain openai

مقدمة: لماذا تهم وكلاء LangChain

LangChain هو إطار عمل يبسط بناء التطبيقات المدعومة بنماذج اللغة الكبيرة (LLMs)1. أحد أقوى تجريداته هو الوكيل (Agent) — وهو مكون يسمح لنموذج LLM بتقرير ما هي الإجراءات التي يجب اتخاذها و أي الأدوات يجب استخدامها لتحقيق هدف ما.

فكر في الوكيل كـ منسق (orchestrator) ذكاء اصطناعي: يمكنه التفكير في طلب المستخدم، واختيار الأداة المناسبة (مثل محرك بحث API أو آلة حاسبة)، وتنفيذها، ثم دمج النتائج في إجابة متماسكة.

تُستخدم وكلاء LangChain بشكل شائع في:

  • بوتات دعم العملاء التي تبحث عن البيانات ديناميكيًا.
  • مساعدي الأبحاث الذين يستعلمون من واجهات البرمجيات APIs ويلخصون النتائج.
  • أدوات تحليل البيانات التي تجمع بين تفكير LLM والحسابات المنظمة.

فهم الوكلاء مقابل السلاسل (Chains)

تميز بنية LangChain بين السلاسل (chains) و الوكلاء (agents):

المفهوم الوصف مثال لحالة استخدام
السلسلة (Chain) تسلسل ثابت من الخطوات (مطالبات، استدعاءات نماذج، تحويلات) تلخيص نص أو تصنيف المشاعر
الوكيل (Agent) صانع قرار ديناميكي يختار الأدوات والإجراءات في وقت التشغيل مساعد محادثة يستعلم من واجهات البرمجيات APIs

باختصار: السلاسل هي مسارات عمل محددة مسبقًا؛ الوكلاء هم مسارات عمل تكيفية.


كيف يعمل وكلاء LangChain

في قلب الوكيل توجد حلقة تفكير LLM:

graph TD
  A[User Input] --> B[LLM Reasoning]
  B --> C{Select Tool?}
  C -->|Yes| D[Call Tool]
  D --> E[Return Observation]
  E --> B
  C -->|No| F[Generate Final Answer]
  F --> G[Output to User]

تستمر هذه الحلقة حتى يحدد الوكيل أن لديه معلومات كافية للرد.

المكونات الرئيسية

  • LLM: محرك التفكير (مثل GPT-4، Claude، Gemini)
  • الأدوات (Tools): الدوال التي يمكن للوكيل استدعاؤها (مثل مغلفات API، قواعد البيانات)
  • قالب المطالبة (Prompt Template): يوجه عملية تفكير LLM
  • الذاكرة (Memory): تخزن التفاعلات السابقة أو السياق
  • المنفذ (Executor): يدير حلقة التفكير واستدعاءات الأدوات

خطوة بخطوة: بناء أول وكيل LangChain لك

لنقم ببناء وكيل بسيط يمكنه الإجابة على الأسئلة وإجراء الحسابات.

1. الإعداد والتكوين

أنشئ ملف Python جديدًا باسم agent_demo.py:

from langchain.agents import initialize_agent, load_tools
from langchain.llms import OpenAI

# Initialize the LLM
llm = OpenAI(temperature=0)

# Load built-in tools
# 'serpapi' for search, 'llm-math' for math operations
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# Initialize the agent
agent = initialize_agent(
    tools, llm, agent="zero-shot-React-description", verbose=True
)

# Run an example query
response = agent.run(
    "Who is the CEO of OpenAI and what is 123 * 45?"
)
print(response)

2. تشغيل الوكيل

في الطرفية (terminal) الخاصة بك:

python agent_demo.py

مثال للمخرجات:

> Entering new AgentExecutor chain...
Thought: I need to find the CEO of OpenAI and calculate 123 * 45.
Action: Search
Action Input: "CEO of OpenAI"
Observation: Sam Altman
Thought: Now I can calculate 123 * 45.
Action: Calculator
Action Input: 123 * 45
Observation: 5535
Final Answer: The CEO of OpenAI is Sam Altman, and 123 * 45 = 5535.
> Finished chain.

هذا وكيل LangChain يعمل بكامل طاقته في أقل من 20 سطرًا من الكود.


متى تستخدم مقابل متى لا تستخدم وكلاء LangChain

حالة الاستخدام موصى به لماذا
مسارات عمل ديناميكية تتطلب تفكيرًا يمكن للوكلاء اختيار الأدوات بشكل تكيفي
مهام متعددة الخطوات (مثلاً: بحث ويب ← تلخيص ← حساب) يتفوق الوكلاء في ربط خطوات التفكير
مسارات عمل ثابتة (مثلاً: تلخيص نص) السلاسل الأبسط أسرع وأرخص
أنظمة إنتاج عالية الإنتاجية بمنطق يمكن التنبؤ به يضيف الوكلاء زمن انتقال بسبب عبء التفكير

يتألق الوكلاء عندما تحتاج إلى المرونة والتفكير، وليس عندما تحتاج إلى السرعة والحتمية.


مثال من العالم الحقيقي: وكيل مساعد أبحاث

تخيل بناء مساعد أبحاث يمكنه البحث عن المقالات الحديثة، وتلخيص النتائج، وتوليد الاستشهادات.

نظرة عامة على البنية

graph LR
  A[User Query] --> B[LangChain Agent]
  B --> C[Search API Tool]
  B --> D[Summarization Chain]
  D --> E[LLM Output]
  C --> D
  E --> F[Final Answer]

مثال للكود

from langchain.agents import initialize_agent, load_tools
from langchain.llms import OpenAI

llm = OpenAI(temperature=0.3)
tools = load_tools(["serpapi", "llm-math"], llm=llm)

research_agent = initialize_agent(
    tools, llm, agent="zero-shot-React-description", verbose=True
)

query = "Summarize recent developments in quantum computing."
response = research_agent.run(query)
print(response)

في بيئة الإنتاج، ستستبدل serpapi بأداة بحث مخصصة أو قاعدة معرفة داخلية API.


الأخطاء الشائعة والحلول

الخطأ السبب الحل
حلقات تفكير لا نهائية يستمر LLM في استدعاء الأدوات دون توقف قم بتعيين حد أقصى للتكرار باستخدام max_iterations
زمن انتقال عالٍ خطوات تفكير كثيرة جدًا أو استدعاءات API استخدم التخزين المؤقت (caching) أو النتائج المحسوبة مسبقًا
إجابات غير متسقة درجة الحرارة (temperature) مرتفعة جدًا اخفض درجة الحرارة (0–0.3 للحصول على نتائج حتمية)
إساءة استخدام الأدوات تعليمات مطالبة غامضة قدم أوصافًا أكثر وضوحًا للأدوات

مثال: تحديد تكرارات الوكيل

agent = initialize_agent(
    tools, llm, agent="zero-shot-React-description", verbose=True,
    max_iterations=3
)

هذا يمنع حلقات التفكير الجامحة.


اعتبارات الأداء

يمكن أن يستهلك وكلاء LangChain موارد كثيفة، خاصة عند التفكير بعمق أو استدعاء واجهات برمجة تطبيقات متعددة.

نصائح التحسين

  1. تقليل عدد الأدوات: قم بتسجيل الأدوات التي تحتاجها فعليًا فقط.
  2. استخدام التنفيذ غير المتزامن (Async): للمهام المرتبطة بالإدخال/الإخراج (I/O)، استخدم أدوات async لتنفيذ الاستدعاءات بالتوازي.
  3. تخزين النتائج مؤقتًا: استخدم langchain.cache لتجنب استدعاءات API المتكررة.
  4. معالجة المدخلات على دفعات (Batching): قم بمعالجة استعلامات متعددة في تشغيل واحد للوكيل عندما يكون ذلك ممكنًا.

مثال: تنفيذ الوكيل بشكل غير متزامن (Async)

from langchain.agents import AgentExecutor
import asyncio

async def run_agent():
    result = await agent.arun("Get the latest AI research headlines.")
    print(result)

asyncio.run(run_agent())

يمكن أن يؤدي التنفيذ غير المتزامن إلى تحسين الإنتاجية بشكل كبير في السيناريوهات التي تعتمد بكثافة على الإدخال/الإخراج2.


اعتبارات الأمان

يمكن لعملاء LangChain تنفيذ أكواد عشوائية عبر الأدوات — لذا فإن حدود الأمان مهمة.

أفضل الممارسات

  • لا تعرض أبدًا أوامر على مستوى النظام لعملاء غير موثوق بهم.
  • قم بتنقية المدخلات (Sanitize inputs) قبل تمريرها إلى واجهات البرمجيات APIs.
  • استخدم إدارة مفاتيح API عبر متغيرات البيئة.
  • تحقق من المخرجات عندما يتفاعل العملاء مع أنظمة خارجية.

اتبع توصيات OWASP لأمان API3.


اختبار عملاء LangChain

اختبار العملاء أصعب من اختبار السلاسل (chains) الثابتة بسبب طبيعتها الديناميكية.

  1. محاكاة استدعاءات الأدوات (Mock Tool Calls): استبدل واجهات البرمجيات APIs الحقيقية بمحاكاة (mocks) أثناء الاختبارات.
  2. اختبار اللقطة (Snapshot Testing): التقاط مسارات التفكير المتوقعة.
  3. المعاملات الحتمية (Deterministic Parameters): استخدم temperature=0 لضمان قابلية التكرار.

مثال: محاكاة أداة

from unittest.mock import Mock

mock_tool = Mock(return_value="Mocked response")
agent.tools = [mock_tool]

response = agent.run("Test the mock tool")
assert "Mocked" in response

هذا النهج يحافظ على سرعة الاختبارات وقابليتها للتنبؤ.


أنماط معالجة الأخطاء

يمكن أن يفشل العملاء بسبب أخطاء في الأدوات، أو انتهاء مهلة API، أو مشاكل في التفكير المنطقي.

الاستراتيجيات الشائعة

  • منطق إعادة المحاولة (Retry logic) للأخطاء العابرة.
  • التراجع التدريجي (Graceful degradation) عندما تكون الأداة غير متاحة.
  • استجابات احتياطية (Fallback responses) عندما يفشل التفكير المنطقي.

مثال: مزخرف إعادة المحاولة (Retry Decorator)

import time

def retry(max_retries=3, delay=2):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for attempt in range(max_retries):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"Attempt {attempt+1} failed: {e}")
                    time.sleep(delay)
            raise RuntimeError("All retries failed")
        return wrapper
    return decorator

يمكنك تغليف استدعاءات الأدوات بهذا المزخرف للتعامل مع مشاكل API العابرة بسلاسة.


المراقبة والقابلية للملاحظة

تساعد مراقبة العملاء في اكتشاف اختناقات الأداء وشذوذ التفكير المنطقي.

  • LangSmith (أداة التتبع الرسمية لـ LangChain)
  • Prometheus + Grafana للمقاييس
  • التسجيل المهيكل (Structured logging) عبر logging.config.dictConfig() الخاص بـ Python4

مثال على تكوين التسجيل

import logging.config

logging.config.dictConfig({
    'version': 1,
    'formatters': {'default': {'format': '[%(asctime)s] %(levelname)s: %(message)s'}},
    'handlers': {'console': {'class': 'logging.StreamHandler', 'formatter': 'default'}},
'root': {'handlers': ['console'], 'level': 'INFO'},
})

هذا يضمن أن خطوات تفكير العميل واستدعاءات الأدوات قابلة للتتبع.


رؤى حول القابلية للتوسع

يعتمد توسيع عملاء LangChain على نوع عبء العمل:

  • التوسع الأفقي (Horizontal scaling): تشغيل مثيلات متعددة من العميل خلف طابور (queue).
  • المعالجة غير المتزامنة (Async processing): استخدام البنيات القائمة على الأحداث للمهام المتزامنة.
  • طبقة التخزين المؤقت (Caching layer): تخزين النتائج المتوسطة لتقليل التفكير المنطقي المتكرر.

غالبًا ما تجمع الخدمات واسعة النطاق بين هذه الأساليب للحفاظ على زمن انتقال منخفض5.

مثال: التوسع القائم على الطابور

graph TD
  A[User Request] --> B[Message Queue]
  B --> C[Agent Worker 1]
  B --> D[Agent Worker 2]
  C --> E[Results DB]
  D --> E

الأخطاء الشائعة

  1. تعقيد العميل بشكل مفرط — ابدأ ببساطة؛ وأضف الأدوات تدريجيًا.
  2. تجاهل التكلفة — كل خطوة تفكير هي استدعاء لـ API.
  3. تخطي هندسة الأوامر (Prompt engineering) — الأوامر غير الواضحة تؤدي إلى اختيار أدوات سيئ.
  4. عدم اختبار الحالات الحدية (Edge cases) — يمكن للعملاء التصرف بشكل غير متوقع مع المدخلات الغامضة.

تحدي "جربها بنفسك"

قم بتعديل عميلك لـ:

  1. إضافة أداة طقس API.
  2. اجعل العميل يجيب على: "ما هي حالة الطقس في طوكيو وترجمها إلى الإسبانية؟"
  3. سجل مسار التفكير المنطقي.

سيختبر هذا التفكير المنطقي متعدد الأدوات وقدرات الترجمة.


دليل استكشاف الأخطاء وإصلاحها

الخطأ السبب المحتمل الحل
ToolNotFoundError خطأ إملائي في اسم الأداة تحقق من تسجيل الأداة
RateLimitError استدعاءات API كثيرة جدًا أضف منطق إعادة المحاولة/التراجع
InvalidResponseError أعادت الأداة تنسيقًا غير متوقع تحقق من مخرجات الأداة
TimeoutError بطء في API زد المهلة أو استخدم التنفيذ غير المتزامن

النقاط الرئيسية

عملاء LangChain يتيحون تفكيرًا منطقيًا ديناميكيًا مدفوعًا بالأدوات.

✅ استخدمهم عندما تكون المرونة أهم من السرعة الخام.

✅ اجعل الأدوات في حدها الأدنى، والأوامر واضحة، والتكرارات محدودة.

✅ اختبر وراقب العملاء تمامًا مثل أي نظام إنتاج آخر.

✅ ابدأ صغيرًا — ثم توسع باستخدام التخزين المؤقت، والعمليات غير المتزامنة، والقابلية للملاحظة.


الأسئلة الشائعة

س1: ما الفرق بين سلسلة (chain) LangChain والعميل (agent)؟

  • السلسلة ثابتة؛ بينما يقرر العميل الإجراءات ديناميكيًا في وقت التشغيل.

س2: هل يمكن للعملاء استخدام أدوات متعددة في جلسة واحدة؟

  • نعم، يمكنهم استدعاء أدوات متعددة بالتتابع أو بشكل متكرر.

س3: هل تشغيل العملاء مكلف؟

  • يمكن أن يكون كذلك، لأن كل خطوة تفكير تستدعي LLM. استخدم التخزين المؤقت وحدود التكرار.

س4: كيف يمكنني تصحيح أخطاء تفكير العميل؟

  • قم بتمكين verbose=True أو استخدم LangSmith للحصول على تتبعات مفصلة.

س5: هل يمكنني نشر العملاء في بيئة الإنتاج؟

  • بالتأكيد — فقط اتبع أفضل الممارسات للأمان والمراقبة والتوسع.

الخطوات التالية

  1. جرب العميل الحواري (Conversational Agent) مع الذاكرة.
  2. قم بدمج أدوات مخصصة (مثل استعلامات قاعدة البيانات أو واجهات البرمجيات الداخلية).
  3. اختبر LangGraph لتنسيق المهام بين عملاء متعددين.

Footnotes

  1. LangChain Documentation – https://python.langchain.com/docs/

  2. Python AsyncIO Documentation – https://docs.python.org/3/library/asyncio.html

  3. OWASP API Security Top 10 – https://owasp.org/www-project-API-security/

  4. Python Logging Configuration – https://docs.python.org/3/library/logging.config.html

  5. Python Concurrency and Scaling Patterns – https://docs.python.org/3/library/concurrent.futures.html


نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.