AI Engineering Academy · درس

تعريف الأدوات لوكيلكم

أنشئوا أدوات مخصصة باستخدام الزخرفة @tool، واكتبوا أوصافًا واضحة يستخدمها LLM لتحديد وقت استدعاء كل أداة، وأضيفوا التحقق من الإدخال باستخدام Pydantic.

الدرس 2 من 413 خطوة

تعريف الأدوات لوكيلكم درس مجاني في AI Engineering Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Engineering Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

الأدوات تمنح الوكلاء قدرات خارقة

لا يستطيع الوكيل الذي لا يملك أدوات سوى الاستدلال بشأن ما يعرفه مسبقًا؛ فلا يمكنه البحث على الويب أو الاستعلام عن قاعدة بيانات أو إرسال بريد إلكتروني. الأدوات هي دوال Python توسّع قدرات الوكيل، إذ تتيح له تنفيذ إجراءات في العالم الحقيقي واسترجاع معلومات حديثة. ويُعد تعريف الأدوات بوضوح من أهم خطوات بناء وكيل موثوق.

المزيّن @tool في LangChain

يحوّل المزيّن @tool في LangChain أي دالة Python إلى أداة يستطيع الوكيل استدعاءها. ويصبح docstring الخاص بالدالة وصف الأداة الذي يستخدمه LLM لتحديد وقت استدعائها. ويؤدي الوصف الواضح والمحدد إلى تحسين دقة اختيار الوكيل للأداة بدرجة كبيرة.

from langchain_core.tools import tool

@tool
def get_weather(city: str) -> str:
    '''Get the current weather conditions for a given city.
    Use this tool when the user asks about weather in a specific location.
    Input should be just the city name, e.g. 'London' or 'New York'.
    '''
    # Real implementation would call a weather API
    return f'The weather in {city} is 18 degrees Celsius and partly cloudy.'

print(get_weather.name)         # 'get_weather'
print(get_weather.description)  # The docstring above

التعليقات التوضيحية للأنواع وإنشاء المخطط

ينشئ LangChain تلقائيًا JSON Schema لكل أداة من التعليقات التوضيحية لأنواع Python الخاصة بها. ويتلقى الوكيل هذا المخطط في مطالبة النظام، وبذلك يعرف الوسائط المطلوبة وأنواعها وأي قيود عليها. احرص دائمًا على تزويد دوال أدواتك بتعليقات توضيحية دقيقة للأنواع.

from langchain_core.tools import tool

@tool
def calculate_compound_interest(
    principal: float,
    annual_rate: float,
    years: int
) -> float:
    '''Calculate compound interest earned over a number of years.
    Args:
        principal: Initial investment amount in dollars.
        annual_rate: Annual interest rate as a decimal (e.g. 0.05 for 5%).
        years: Number of years to compound.
    Returns:
        Final amount after compounding.
    '''
    return principal * (1 + annual_rate) ** years

# Inspect the auto-generated schema
print(calculate_compound_interest.args_schema.schema())

التحقق من المدخلات باستخدام Pydantic

بالنسبة إلى الأدوات ذات المدخلات المعقدة، عرّف نموذج Pydantic على أنه args_schema. ويوفّر ذلك تحققًا تلقائيًا، وتحويلًا للأنواع، وتوثيقًا وصفيًا على مستوى الحقول يراه LLM عند تحديد كيفية استدعاء الأداة.

from langchain_core.tools import tool
from pydantic import BaseModel, Field

class SearchInput(BaseModel):
    query: str = Field(description='The search query to look up.')
    num_results: int = Field(default=5, ge=1, le=20, description='Number of results to return (1-20).')

@tool(args_schema=SearchInput)
def web_search(query: str, num_results: int = 5) -> str:
    '''Search the web for current information on any topic.
    Use this for facts that may have changed after the model training cutoff.
    '''
    return f'Searching for "{query}", returning {num_results} results...'

كتابة أوصاف فعّالة للأدوات

يُعد وصف الأداة الجزء الأهم من تعريفها؛ إذ يقرأه LLM ليقرر متى وكيف يستدعي الأداة. يجيب الوصف الجيد عن الأسئلة التالية: ماذا تفعل هذه الأداة؟ متى ينبغي استخدامها؟ كيف يجب أن تبدو المدخلات؟ وما شكل المخرجات؟

  • سيئ: "أداة بحث."
  • جيد: "ابحث على الويب عن الأخبار أو الحقائق أو البيانات الحالية. استخدمها عندما يسأل المستخدم عن أحداث حديثة أو حقائق غير موجودة في بيانات التدريب. المدخل: استعلام بحث موجز."

أنواع القيم التي تُرجعها الأدوات

يمكن للأدوات إرجاع سلاسل نصية أو قواميس أو كائنات Pydantic منظمة. ومع ذلك، يحتاج الوكيل في النهاية إلى النتيجة بصيغة نصية لإدراجها في المحادثة. إذا أرجعت قاموسًا، فسيحوّله LangChain إلى سلسلة نصية. وبالنسبة إلى البيانات المتداخلة المعقدة، نسّقها في صورة ملخص سهل القراءة بدلًا من JSON خام، لمساعدة النموذج على الاستدلال بشأنها.

from langchain_core.tools import tool
import json

@tool
def get_stock_price(ticker: str) -> str:
    '''Look up the current stock price for a given ticker symbol.
    Input should be the stock ticker symbol in uppercase, e.g. AAPL or MSFT.
    '''
    # Stub — real implementation calls a financial API
    data = {'ticker': ticker, 'price': 182.50, 'currency': 'USD', 'change': '+1.2%'}
    return f'{ticker}: ${data["price"]} ({data["change"]})'

التعامل مع أخطاء الأدوات بسلاسة

قد تفشل الأدوات؛ فقد تتعطل واجهات API، أو تحدث مهلات في الشبكة، أو يقدّم المستخدمون مدخلات غير صالحة. بدلًا من السماح للاستثناءات بتعطيل حلقة الوكيل، غلّف منطق الأداة في try/except وأرجع سلسلة خطأ وصفية. عندئذ يستطيع الوكيل الاستدلال بشأن الفشل وتحديد ما إذا كان سيعيد المحاولة أو يستخدم نهجًا مختلفًا.

from langchain_core.tools import tool
import requests

@tool
def fetch_url(url: str) -> str:
    '''Fetch the text content of a web page given its URL.
    Use for accessing specific documents or web pages the user references.
    '''
    try:
        resp = requests.get(url, timeout=10)
        resp.raise_for_status()
        return resp.text[:2000]  # Return first 2000 chars
    except requests.Timeout:
        return 'Error: Request timed out after 10 seconds.'
    except requests.HTTPError as e:
        return f'Error: HTTP {e.response.status_code}'
    except Exception as e:
        return f'Error fetching URL: {str(e)}'

الأدوات غير المتزامنة

عندما ينفّذ وكيلك العديد من استدعاءات الأدوات، أو تجري أدواتك طلبات شبكة تعتمد على عمليات الإدخال والإخراج، عرّف دوال أدوات غير متزامنة لتجنب حظر حلقة الأحداث. يدعم منفّذ وكلاء LangChain الأدوات غير المتزامنة بشكل أصلي؛ ما عليك سوى استخدام async def في دالة الأداة.

from langchain_core.tools import tool
import httpx

@tool
async def async_fetch(url: str) -> str:
    '''Asynchronously fetch content from a URL.
    Preferred over fetch_url when making multiple concurrent requests.
    '''
    async with httpx.AsyncClient(timeout=10) as client:
        try:
            resp = await client.get(url)
            resp.raise_for_status()
            return resp.text[:2000]
        except Exception as e:
            return f'Error: {str(e)}'

تنظيم الأدوات في مجموعة أدوات

عندما تمتلك العديد من الأدوات المرتبطة، اجمعها في مجموعة أدوات؛ وهي فئة تُرجع قائمة من الأدوات. تتبع مجموعات أدوات LangChain نمطًا شائعًا: تقبل إعدادات مثل مفاتيح API في الباني، وتوفّر طريقة get_tools(). وهذا يجعل إدارة الأدوات نظيفة وقابلة لإعادة الاستخدام عبر وكلاء مختلفين.

from langchain_core.tools import BaseTool
from typing import List

class WeatherToolkit:
    def __init__(self, api_key: str):
        self.api_key = api_key

    def get_tools(self) -> List[BaseTool]:
        return [
            get_weather,          # defined earlier with @tool
            get_weather_forecast,  # another tool
            get_weather_alert      # another tool
        ]

# Usage
toolkit = WeatherToolkit(api_key='your_weather_api_key')
tools = toolkit.get_tools()
print(f'Loaded {len(tools)} weather tools')

تقييد الوصول إلى الأدوات حسب دور المستخدم

لا ينبغي أن يتمتع كل مستخدم بإمكانية الوصول إلى كل أداة. فلا ينبغي لمستخدم يملك صلاحية القراءة فقط أن يستدعي أداة send_email أو delete_record. طبّق التحكم في الوصول إلى الأدوات استنادًا إلى الأدوار، وذلك باختيار الأدوات التي تمررها إلى الوكيل بناءً على صلاحيات المستخدم المُصادَق عليه.

def get_tools_for_user(user_role: str) -> list:
    read_tools = [web_search, get_weather, calculate_compound_interest]
    write_tools = [send_email, create_calendar_event, update_record]

    if user_role == 'admin':
        return read_tools + write_tools
    elif user_role == 'member':
        return read_tools
    else:
        return [web_search]  # Guest: only public search

أفضل ممارسات توثيق الأدوات

تقلّل الأدوات الموثقة جيدًا أخطاء الوكيل بدرجة كبيرة. اتبع أفضل الممارسات التالية: استخدم اسمًا واضحًا يبدأ بفعل (search_web بدلًا من websearch)، واشرح صراحةً تنسيق الإدخال المتوقع، واذكر متى لا ينبغي استخدام الأداة لتجنب النتائج الإيجابية الكاذبة، واشرح شكل المخرجات حتى يتمكن النموذج من تحليلها بشكل صحيح.

اختبار سريع

اختبر مدى فهمك لتعريف الأدوات لوكلاء LangChain.

مراجعة الدرس

تعلمت في هذا الدرس أن: المُزخرف @tool يحوّل دوال Python إلى أدوات يمكن للوكيل استدعاؤها، مستخدمًا سلاسل التوثيق الخاصة بها كأوصاف، وأن مخططات Pydantic تضيف مدخلات ذات أنواع يتم التحقق من صحتها، وأن الأدوات ينبغي أن تتعامل مع الأخطاء بسلاسة عبر إرجاع سلاسل نصية وصفية للأخطاء. بعد ذلك سنجمع وكيل ReAct كاملًا باستخدام LangChain ونتتبع خطوات استدلاله.

البدء مجانًا

تعلم Python مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
30
الدروس
120

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

هل درس «تعريف الأدوات لوكيلكم» مجاني؟

نعم — نص درس «تعريف الأدوات لوكيلكم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Engineering Academy، انتقل إلى CoddyKit PRO. تتضمن دورة AI Engineering Academy 4 دروس في المجموع.

ماذا ستتعلم في «تعريف الأدوات لوكيلكم»؟

أنشئوا أدوات مخصصة باستخدام الزخرفة @tool، واكتبوا أوصافًا واضحة يستخدمها LLM لتحديد وقت استدعاء كل أداة، وأضيفوا التحقق من الإدخال باستخدام Pydantic. تتمرن على AI Engineering Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Engineering Academy؟

لا تُشترط خبرة سابقة. AI Engineering Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «تعريف الأدوات لوكيلكم»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Engineering Academy هذا؟

نعم. كل درس في AI Engineering Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إطار ReAct: فكّر وتصرّف ولاحظ
  2. تعريف الأدوات لوكيلكم
  3. بناء وكيل ReAct باستخدام LangChain
  4. التعامل مع إخفاقات الوكلاء والحلقات
← العودة إلى AI Engineering Academy