الدرس 17 من 20

بناء وكيل بحث

إعداد المشروع

3 دقيقة للقراءة

لنبني وكيل بحث يمكنه البحث في الويب، وجمع المعلومات، وإنتاج تقارير منظمة. هذا المشروع الختامي يجمع كل ما تعلمته.

ما الذي نبنيه

وكيل بحث يمكنه:

  • أخذ موضوع بحث من المستخدم
  • البحث في مصادر متعددة للمعلومات
  • تجميع النتائج في تقرير متماسك
  • الاستشهاد بالمصادر بشكل صحيح

هيكل المشروع

research_agent/
├── agent.py           # منطق الوكيل الرئيسي
├── tools/
│   ├── __init__.py
│   ├── search.py      # أداة البحث على الويب
│   └── scraper.py     # استخراج المحتوى
├── memory/
│   ├── __init__.py
│   └── store.py       # ذاكرة البحث
├── prompts/
│   └── templates.py   # قوالب المطالبات
├── utils/
│   └── validators.py  # التحقق من المخرجات
├── config.py          # التكوين
├── requirements.txt
└── main.py            # نقطة الدخول

التبعيات

# requirements.txt
langchain>=0.1.0
langchain-openai>=0.0.5
duckduckgo-search>=4.0
beautifulsoup4>=4.12
pydantic>=2.0
python-dotenv>=1.0

التكوين

# config.py
import os
from dotenv import load_dotenv

load_dotenv()

class Config:
    # إعدادات LLM
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4o")
    TEMPERATURE = 0.3

    # إعدادات البحث
    MAX_SEARCH_RESULTS = 5
    MAX_CONTENT_LENGTH = 4000

    # إعدادات الوكيل
    MAX_ITERATIONS = 10
    TIMEOUT_SECONDS = 120

    # إعدادات المخرجات
    REPORT_MAX_LENGTH = 2000
    INCLUDE_SOURCES = True

هيكل الأداة الأساسية

# tools/__init__.py
from abc import ABC, abstractmethod

class BaseTool(ABC):
    name: str
    description: str

    @abstractmethod
    def run(self, query: str) -> dict:
        """تنفيذ الأداة وإرجاع النتائج"""
        pass

    def __call__(self, query: str) -> dict:
        return self.run(query)

تنفيذ أداة البحث

# tools/search.py
from duckduckgo_search import DDGS
from config import Config

class WebSearchTool(BaseTool):
    name = "web_search"
    description = "البحث في الويب عن معلومات حالية حول موضوع"

    def __init__(self):
        self.ddgs = DDGS()

    def run(self, query: str) -> dict:
        try:
            results = list(self.ddgs.text(
                query,
                max_results=Config.MAX_SEARCH_RESULTS
            ))

            return {
                "success": True,
                "results": [
                    {
                        "title": r["title"],
                        "url": r["href"],
                        "snippet": r["body"]
                    }
                    for r in results
                ]
            }
        except Exception as e:
            return {
                "success": False,
                "error": str(e),
                "results": []
            }

نقطة الدخول

# main.py
from agent import ResearchAgent
from config import Config

def main():
    agent = ResearchAgent(config=Config())

    topic = input("أدخل موضوع البحث: ")
    print(f"\nجاري البحث عن: {topic}\n")

    report = agent.research(topic)

    print("\n" + "="*50)
    print("تقرير البحث")
    print("="*50)
    print(report)

if __name__ == "__main__":
    main()

إعداد البيئة

# إنشاء بيئة افتراضية
python -m venv venv
source venv/bin/activate  # على Windows: venv\Scripts\activate

# تثبيت التبعيات
pip install -r requirements.txt

# إنشاء ملف .env
echo "OPENAI_API_KEY=your-key-here" > .env

التالي: تنفيذ منطق الوكيل الأساسي مع نمط ReAct. :::

اختبار

الوحدة 5: بناء وكيل بحث

خذ الاختبار