بناء وكيل ذكاء اصطناعي متعدد الأدوات قابل للتخصيص باستخدام LangGraph و Claude

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

تثبيت الحزم المطلوبة

يبدأ البرنامج التعليمي بتبسيط عملية تثبيت التبعيات لضمان سهولة الإعداد، حتى للمبتدئين. نستخدم subprocess و pip لتثبيت الحزم التالية بشكل آلي:

import subprocess
import sys

def install_packages():
    packages = [
        "langgraph", "langchain", "langchain-anthropic", "langchain-community",
        "requests", "python-dotenv", "duckduckgo-search"
    ]
    for package in packages:
        try:
            subprocess.check_call([sys.executable, "-m", "pip", "install", package, "-q"])
            print(f"✓ Installed {package}")
        except subprocess.CalledProcessError:
            print(f"✗ Failed to install {package}")

print("Installing required packages...")
install_packages()
print("Installation complete!n")

هذا يضمن تثبيت جميع المكونات اللازمة لبناء وكيل ذكاء اصطناعي متعدد الأدوات قائم على LangGraph بسلاسة.

استيراد المكتبات والوحدات

نقوم باستيراد جميع المكتبات والوحدات اللازمة لبناء وكيل الذكاء الاصطناعي متعدد الأدوات:

import os
import json
import math
import requests
from typing import Dict, List, Any, Annotated, TypedDict
from datetime import datetime
import operator
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, ToolMessage
from langchain_core.tools import tool
from langchain_anthropic import ChatAnthropic
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
from langgraph.checkpoint.memory import MemorySaver
from duckduckgo_search import DDGS

تشمل هذه المكتبات requests لإجراء مكالمات HTTP، و duckduckgo_search لتنفيذ عمليات البحث على الويب، بالإضافة إلى مكتبات LangChain و LangGraph.

تعيين مفتاح واجهة برمجة التطبيقات (API Key)

يجب تعيين مفتاح API الخاص بـ Anthropic للوصول إلى نماذج Claude:

os.environ["ANTHROPIC_API_KEY"] = "Use Your API Key Here"
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")

يُرجى استبدال "Use Your API Key Here" بمفتاح API الخاص بك.

تعريف حالة الوكيل وأدواته

تعريف حالة الوكيل

from typing import TypedDict
class AgentState(TypedDict):
    messages: Annotated[List[BaseMessage], operator.add]

هذا يحدد بنية بيانات لحفظ حالة المحادثة.

أداة الحاسبة

@tool
def calculator(expression: str) -> str:
    """أداء العمليات الحسابية. يدعم العمليات الحسابية الأساسية، والمثلثات، وأكثر."""
    try:
        allowed_names = {
            'abs': abs, 'round': round, 'min': min, 'max': max, 'sum': sum, 'pow': pow,
            'sqrt': math.sqrt, 'sin': math.sin, 'cos': math.cos, 'tan': math.tan,
            'log': math.log, 'log10': math.log10, 'exp': math.exp, 'pi': math.pi, 'e': math.e
        }
        expression = expression.replace('^', '**')
        result = eval(expression, {"__builtins__": {}}, allowed_names)
        return f"Result: {result}"
    except Exception as e:
        return f"Error in calculation: {str(e)}"

تُستخدم الديكوراتور @tool لتسجيل هذه الدالة كأداة قابلة للاستخدام من قبل وكيل الذكاء الاصطناعي.

أداة البحث على الويب

@tool
def web_search(query: str, num_results: int = 3) -> str:
    """البحث على الويب عن المعلومات باستخدام DuckDuckGo."""
    try:
        num_results = min(max(num_results, 1), 10)
        with DDGS() as ddgs:
            results = list(ddgs.text(query, max_results=num_results))
            if not results:
                return f"No search results found for: {query}"
            formatted_results = f"Search results for '{query}':nn"
            for i, result in enumerate(results, 1):
                formatted_results += f"{i}. **{result['title']}**n"
                formatted_results += f" {result['body']}n"
                formatted_results += f" Source: {result['href']}nn"
            return formatted_results
    except Exception as e:
        return f"Error performing web search: {str(e)}"

هذه الأداة تستخدم DuckDuckGo للبحث على الويب.

أداة معلومات الطقس (نسخة تجريبية)

@tool
def weather_info(city: str) -> str:
    """الحصول على معلومات الطقس الحالية لمدينة ما."""
    # تنفيذ تجريبي فقط
    mock_weather = {
        "new york": {"temp": 22, "condition": "Partly Cloudy", "humidity": 65},
        "london": {"temp": 15, "condition": "Rainy", "humidity": 80},
        # ...
    }
    city_lower = city.lower()
    if city_lower in mock_weather:
        weather = mock_weather[city_lower]
        return f"Weather in {city}:nTemperature: {weather['temp']}°CnCondition: {weather['condition']}nHumidity: {weather['humidity']}%"
    else:
        return f"Weather data not available for {city}."

هذه نسخة تجريبية وتحتاج إلى ربطها بواجهة برمجة تطبيقات حقيقية للطقس.

أداة تحليل النص

@tool
def text_analyzer(text: str) -> str:
    """تحليل النص وتقديم إحصائيات مثل عدد الكلمات، وعدد الأحرف، وما إلى ذلك."""
    if not text.strip():
        return "Please provide text to analyze."
    words = text.split()
    sentences = text.split('.') + text.split('!') + text.split('?')
    sentences = [s.strip() for s in sentences if s.strip()]
    analysis = f"Text Analysis Results:n"
    analysis += f"• Characters (with spaces): {len(text)}n"
    analysis += f"• Words: {len(words)}n"
    analysis += f"• Sentences: {len(sentences)}n"
    # ...
    return analysis

تحليل نصي بسيط.

أداة الوقت الحالي

@tool
def current_time() -> str:
    """الحصول على التاريخ والوقت الحاليين."""
    now = datetime.now()
    return f"Current date and time: {now.strftime('%Y-%m-%d %H:%M:%S')}"

الحصول على التاريخ والوقت الحالي.

إنشاء نموذج اللغة (LLM)

tools = [calculator, web_search, weather_info, text_analyzer, current_time]

def create_llm():
    if ANTHROPIC_API_KEY:
        return ChatAnthropic(model="claude-3-haiku-20240307", temperature=0.1, max_tokens=1024)
    else:
        # ... (MockLLM)

هذا الجزء ينشئ نموذج لغة، إما باستخدام Claude أو نموذج وهمي للاختبار.

إنشاء رسم بياني LangGraph

def create_agent_graph():
    tool_node = ToolNode(tools)
    workflow = StateGraph(AgentState)
    workflow.add_node("agent", agent_node)
    workflow.add_node("tools", tool_node)
    # ...
    return app

print("Creating LangGraph Multi-Tool Agent...")
agent = create_agent_graph()
print("✓ Agent created successfully!n")

هذا الجزء ينشئ رسم بياني LangGraph لربط الأدوات معًا.

اختبار الوكيل والدردشة التفاعلية

يوجد في البرنامج التعليمي أيضاً دوال لاختبار الوكيل (test_agent) والدردشة التفاعلية معه (chat_with_agent)، مع شرح مفصل لها.

الخاتمة

يوفر هذا البرنامج التعليمي خطوات مفصلة لبناء وكيل ذكاء اصطناعي متعدد الأدوات باستخدام LangGraph و Claude. يُمكنك تخصيص هذا الوكيل وإضافة المزيد من الأدوات حسب الحاجة.

المصدر: MarkTechPost