تقدم العديد من شركات الذكاء الاصطناعي الآن أنظمة وكيل ذكاء اصطناعي يمكنها إجراء بحث عميق حول الموضوع المطلوب وإنتاج تقرير شامل، مثل Deep Research من OpenAI.
توفر أنظمة الوكيل الذكي مثل Deep Research من OpenAI مسارات آلية للمهام المعقدة مثل البحث متعدد الخطوات والتجميع. لكن معظم الحلول الحالية مفتوحة المصدر، ويصعب تخصيصها وتحد من سيطرتك على سلوك النموذج ومعالجة البيانات.
على سبيل المثال، قد ترغب في استخدام LLM مختلف، أو مزود بحث مخصص، أو تعديل كيفية تخطيط الوكيل وتصرفه لإنتاج مخرجات محددة.
وهذا يقودنا إلى سؤال مثير للاهتمام: هل يمكنك إنشاء وكيل بحث عميق خاص بك بمرونة كاملة، حيث يمكنك استخدام نموذج AI المفضل لديك، ودمج محرك البحث الذي تفضله، وتخصيص سلوك الوكيل؟ الإجابة هي نعم.
في هذه المقالة، ستتعلم كيفية بناء وكيل بحث عميق خاص بك باستخدام Novita AI وLangChain وTavily.
ما هو سير عمل وكيل البحث العميق؟
غالبًا ما يكون البحث التقليدي مستهلكًا للوقت، حيث يتضمن عادةً غربلة الكثير من المعلومات المتاحة عبر الإنترنت، وفي النهاية قد لا يؤدي إلى رؤى. سير عمل وكيل البحث العميق يحل هذه المشكلات من خلال وكلاء AI يمكنهم التفكير بشكل مستقل، واتخاذ القرارات، وتنسيق الأدوات الخارجية كجزء من سير العمل.
يتضمن هذا سير العمل عادةً:
-
هيكلة المهمة: يقوم وكيل AI بتقسيم الموضوع إلى مهام أصغر.
-
التخطيط: ينشئ الوكيل استراتيجيات لمعالجة كل مهمة، مما يساعد سير العمل في تحديد تسلسل تنفيذ المهام.
-
تكامل الأدوات: لجمع المعلومات، يستخدم الوكيل أدوات مختلفة، مثل قواعد البيانات ومحركات البحث على الويب. بدون هذه الأدوات، لا يستطيع الوكيل تنفيذ الإجراءات الأساسية في سير العمل.
-
التجميع: يحلل الوكيل المعلومات التي تم جمعها ويدمجها في بيانات متماسكة.
-
إنشاء التقرير: بعد تجميع البيانات، ينشئ الوكيل تقريرًا منظمًا يتضمن الملخصات والاستشهادات.
الأدوات التي ستحتاجها
قبل أن نبدأ في الجزء الخاص بالبناء من هذه المقالة، دعنا نجهز الأدوات اللازمة.
Novita AI
لبناء سير عمل الوكيل، سنحتاج إلى LLM، وتوفر Novita AI واجهة برمجة تطبيقات ميسورة التكلفة وعالية الأداء تمنحك الوصول إلى أحدث نماذج LLM ونماذج توليد الصور والمزيد.
سجل الدخول إلى Novita AI للبدء. بعد تسجيل الدخول، انتقل إلى الإعدادات > إدارة المفاتيح واتبع التعليمات لإنشاء مفتاح API.
لاحظ أنه إذا قمت بالتسجيل، ستوفر لك Novita AI أرصدة مجانية لتجربة نماذج مختلفة، لذلك لا داعي للقلق بشأن شراء الأرصدة قبل بدء البناء أو التجربة.

Tavily
Tavily هي واجهة برمجة تطبيقات بحث ويب متقدمة محسّنة لتطبيقات AI. باستخدام أداة محرك بحث Tavily، يمكننا منح وكيلنا إمكانية الوصول إلى الإنترنت للمساعدة في جمع معلومات دقيقة وغير متحيزة. توجه إلى Tavily وأنشئ مفتاح API.

Langchain
LangChain هو إطار عمل مفتوح المصدر مصمم لبناء التطبيقات باستخدام LLMs. باستخدام LangChain، يمكنك إنشاء سير عمل وكيل يفكر خطوة بخطوة، ويستخدم الأدوات، ويتفاعل مع واجهات برمجة التطبيقات. بالنسبة لوكيل البحث العميق الخاص بنا، سنستخدم LangChain لهيكلة عملية البحث، واستخدام أدوات مثل البحث على الويب، وتجميع كل شيء في تقرير منظم.

Google Colab
في هذا البرنامج التعليمي، سنقوم ببناء واختبار وكيل البحث العميق باستخدام Google Colab. تتيح لك Colab كتابة وتشغيل كود Python في متصفحك دون الحاجة إلى إعداد، مما يجعل البرنامج التعليمي بسيطًا للمتابعة.
نظرة عامة على سير العمل
البحث العميق الوكيل هو مزيج من مراحل سير عمل مختلفة، من تخطيط مهمة البحث إلى تقديم تقرير البحث النهائي. دعنا نستعرض كل خطوة من سير العمل لفهم كيفية عمل التطبيق.

التخطيط للبحث
هذه هي الخطوة الأولى من سير العمل. هنا، يحلل الوكيل الموضوع وينشئ خطة بحث منظمة بناءً على سياق الموضوع. يقوم بتقسيم الموضوع الواسع إلى مواضيع فرعية مستهدفة مثل التاريخ، التفاصيل التقنية، الإيجابيات والسلبيات، حالات الاستخدام، والمزيد. يمكنك اعتبار هذا الجزء الأكثر أهمية في سير العمل لأنه بدونه، قد يقوم الوكيل بعمليات بحث عامة ويعيد نتائج غير ذات صلة.
البحث المتعمق
LLMs محدودة ببيانات التدريب الخاصة بها ولا يمكنها الوصول إلى الاتجاهات الحالية. على سبيل المثال، إذا وجهت الوكيل دون قدرة على البحث لسرد اللاعبين الحاليين في فريق كرة قدم، فسيعيد نتائج بناءً على البيانات التي تم تدريبه عليها. ومع ذلك، لأن هذه النتائج لا تحتوي على أحدث التحديثات، قد لا تكون صحيحة من الناحية الواقعية بعد الآن. استخدام Tavily لإجراء عمليات بحث ويب متقدمة يمنح الوكيل إمكانية الوصول إلى أحدث مصادر الويب وأكثرها صلة.
إدارة المصادر
لضمان أن كل جزء من المعلومات التي ينتجها الوكيل يمكن ربطه بمصدر موثوق، من المهم تتبع جميع المصادر. هذا الجزء من سير العمل يبني الثقة مع المستخدمين الذين يرغبون في التحقق من الادعاءات أو البيانات في التقرير النهائي.
التجميع
لربط النقاط بين جميع المعلومات التي تم جمعها، يجمع الوكيل الرؤى من جميع الجوانب التي تم بحثها لتكوين تقرير متماسك. بدون هذه المرحلة من سير العمل، قد يكون ناتج البحث مجرد تقرير غير مترابط.
التنسيق النهائي
حتى إذا كان التقرير دقيقًا من الناحية الواقعية وجيد البحث، فإن التنسيق السيئ يمكن أن يجعله صعب القراءة. هناك حاجة إلى خطوة إضافية لضمان هيكل نظيف، وعناوين متسقة، ونقاط تعداد، ومسافات، والمزيد.
تنفيذ وكيل البحث العميق
حتى الآن، لقد فهمت ما يدور حوله سير عمل وكيل البحث العميق. حان الوقت الآن لتنفيذه في Google Colab.
للبدء، سنقوم بعدة خطوات رئيسية:
الخطوة 1: تثبيت التبعيات
-q langchain langchain-openai tavily-python
الخطوة 2: استيراد المكتبات اللازمة
# استيراد مكتبات Python القياسية
import os # للتفاعل مع متغيرات البيئة
import re # للتعبير العادي
import ast # لتحليل تعبيرات Python بأمان من السلاسل النصية
# نماذج وأدوات LangChain
from langchain_openai import ChatOpenAI # واجهة للتفاعل مع نماذج الدردشة من OpenAI
from langchain_community.utilities.tavily_search import TavilySearchAPIWrapper # يتيح البحث عبر واجهة برمجة تطبيقات Tavily
# مخطط رسالة LangChain
from langchain.schema import SystemMessage, HumanMessage # يحدد أنواع الرسائل المستخدمة في المحادثات
# مكونات وكيل LangChain
from langchain.agents import Tool, AgentExecutor, create_react_agent # لبناء وتشغيل سير عمل وكيل باستخدام الأدوات
# قوالب برمجية للـ LangChain
from langchain.prompts import PromptTemplate # يسمح بإنشاء قوالب برمجية قابلة لإعادة الاستخدام
# ذاكرة LangChain
from langchain.memory import ConversationBufferMemory # يساعد في الحفاظ على حالة المحادثة عبر المنعطفات
الخطوة 3: إعداد متغيرات البيئة
# ضبط واسترجاع متغيرات البيئة
os.environ["NOVITA_API_KEY"] = "" # استبدل بمفتاح API الفعلي لـ Novita
os.environ["TAVILY_API_KEY"] = "" # استبدل بمفتاح API الفعلي لـ Tavily
# تحميل مفاتيح API إلى المتغيرات
novita_api_key = os.getenv("NOVITA_API_KEY")
tavily_api_key = os.getenv("TAVILY_API_KEY")
الخطوة 4: تعريف دالة مساعدة LLM
Novita AI متوافقة مع OpenAI؛ لذلك سنستخدم وحدة ChatOpenAI من LangChain لدمج Novita AI مع LangChain. هذا يعني أنه يمكننا التواصل مع Novita بنفس الطريقة التي نتواصل بها مع نماذج OpenAI.
ومع ذلك، هناك شيء مهم يجب ملاحظته وهو أننا نحتاج إلى تعيين base_url للإشارة إلى نقطة نهاية واجهة برمجة تطبيقات Novita: https://api.novita.ai/v3/openai.
في هذا سير العمل، سنستخدم النموذج llama-4-maverick-17b-128e-instruct-fp8، وهو متغير قوي من LLaMA 4 مضبوط بدقة لمهام متابعة التعليمات.
# دالة مساعدة LLM
def llm(api_key,
model="meta-llama/llama-4-maverick-17b-128e-instruct-fp8",
temperature=0.7):
"""إنشاء مثيل ChatOpenAI LLM مع المعلمات المحددة."""
return ChatOpenAI(
model=model,
openai_api_key=api_key,
base_url="https://api.novita.ai/v3/openai",
temperature=temperature,
)
بناء الباحث الوكيل (Agentic Researcher)
يتم تغليف سير عمل البحث العميق بالكامل في فئة معيارية تسمى AgenticResearcher. ستقوم هذه الفئة بإدارة عملية إنشاء خطط البحث، وإجراء عمليات البحث على الويب، وتجميع النتائج، وتنسيق التقرير النهائي، وتشغيل حلقة البحث الكاملة.
سنقوم بتهيئة وكيل البحث بإمكانية الوصول إلى LLM عبر واجهة برمجة تطبيقات Novita وأداة بحث على الويب عبر واجهة برمجة تطبيقات Tavily. ثم نحدد طريقة تقوم بإجراء بحث ويب متقدم على استعلام معين باستخدام Tavily. يتم تنسيق النتائج لسهولة القراءة، ويتم تخزين البيانات الأولية لاستخدامها لاحقًا.
class AgenticResearcher:
def __init__(self, novita_api_key, tavily_api_key, num_researchers=3, temperature=0.3):
"""تهيئة وكيل البحث بمفاتيح API والمعلمات اللازمة."""
self.llm = llm(api_key=novita_api_key, temperature=temperature)
self.tavily_search =
TavilySearchAPIWrapper(tavily_api_key=tavily_api_key)
self.num_researchers = num_researchers
self.raw_search_results = []
def search(self, query):
"""البحث في الويب عن معلومات حول استعلام معين."""
try:
results = self.tavily_search.results(
query, max_results=7,
search_depth="advanced"
)
# تخزين النتائج الأولية لمعالجة الاستشهادات
self.raw_search_results.extend(results)
formatted = []
for r in results:
formatted += [
f"TITLE: {r.get('title','')}",
f"URL: {r.get('url','')}",
f"CONTENT:\
{r.get('content','')}",
"---"
]
return "\
".join(formatted) if formatted else "No results found"
except Exception as e:
return f"Search error: {str(e)}"
إنشاء خطط بحث متعددة الجوانب
لا يزال جزءًا من فئة AgenticResearcher، دعنا ننشئ طريقة تقوم بإنشاء خطة بحث منظمة عن طريق تقسيم الموضوع إلى عدة جوانب مميزة باستخدام LLM. يتضمن كل جانب عنوانًا واستعلام بحث محدد. الهدف هو استكشاف الموضوع من زوايا متعددة لضمان العمق والاتساع.
def create_research_plan(self, topic):
"""إنشاء خطة بحث منظمة مع جوانب متعددة للتحقيق."""
sys = "You are a planner that outputs Python lists of dicts."
hum = f"""
قم بإنشاء خطة بحث شاملة لـ: {topic}
حدد {self.num_researchers} جوانب مميزة للتحقيق فيها بدقة.
حلل الموضوع وحدد الجوانب الأكثر صلة بالبحث بناءً على طبيعته ونطاقه.
أخرج بالضبط:
ASPECT {{'title': '...', 'search_query': '...'}}
"""
try:
resp = self.llm.invoke([SystemMessage(content=sys), HumanMessage(content=hum)])
aspects = []
for line in resp.content.splitlines():
if line.strip().startswith("ASPECT"):
m = re.search(r"\{.*\}", line)
if m:
try:
aspects.append(ast.literal_eval(m.group(0)))
except Exception as e:
print(f"Error parsing aspect: {e}")
if not aspects:
# جوانب افتراضية عامة تعمل عبر نطاقات مختلفة
default_aspects = [
{"title": "Overview and Key Information", "search_query": f"{topic} overview key facts"},
{"title": "Background and Context", "search_query": f"{topic} background history context"},
{"title": "Details and Specifications", "search_query": f"{topic} details specifics data"},
{"title": "Analysis and Significance", "search_query": f"{topic} analysis importance implications"}
]
aspects = default_aspects[:self.num_researchers]
return aspects
except Exception as e:
print(f"Error creating research plan: {e}")
return [{"title": f"{topic} research", "search_query": topic}]
إدارة المصادر والاستشهادات
بعد ذلك، نحتاج إلى معالجة كيفية إنشاء سير العمل لتقارير موثوقة. سنفعل ذلك عن طريق إنشاء طريقة تستخرج المصادر الفريدة من نتائج البحث الأولية، مع التأكد من الاستشهاد بكل مصدر.
def extract_sources(self):
"""استخراج المصادر الفريدة من نتائج البحث الأولية للاستشهادات."""
unique_sources = {}
for result in self.raw_search_results:
url = result.get('url', '')
if url and 'http' in url:
domain = url.split('/')[2] if len(url.split('/')) > 2 else url
if domain not in unique_sources:
unique_sources[domain] = url
return unique_sources
تجميع التقرير
الآن بعد أن جمعنا المعلومات الأولية من مصادر متعددة، الخطوة التالية هي تحويل هذا الإدخال الفوضوي إلى تقرير بحثي مفصل. سنكتب طرقًا تقوم بتجميع النص الأولي إلى تقرير مقروء ومنظم مع عناوين وعناوين فرعية ونتائج رئيسية واستشهادات مصادر.
def synthesize(self, text):
"""تجميع النص الأولي إلى نتائج مفصلة ومنظمة مع استشهادات."""
sources = self.extract_sources()
sources_list = list(sources.keys())
sys = """You are an expert research synthesizer that creates detailed, structured reports.
For each claim or fact you include, add a citation to the source domain.
Use the exact domain names provided without modification.
Adapt your report structure to the topic's domain and nature."""
hum = f"""
المعلومات المطلوب تجميعها:
{text}
نطاقات المصادر المتاحة (استخدم هذه الأسماء بالضبط للاستشهادات):
{sources_list}
قم بإنشاء تقرير بحثي شامل ومفصل يتضمن:
1. النتائج الرئيسية مع حقائق وأرقام محددة
2. معلومات منظمة مع عناوين وعناوين فرعية مناسبة للموضوع
3. استشهادات باستخدام أسماء نطاقات المصادر بالضبط بين قوسين مربعين [like.this]
4. بيانات ذات صلة معروضة بشكل واضح ومهني
5. تنسيق يتكيف مع الطبيعة المحددة للموضوع (تقني، تاريخي، حدث إخباري، إلخ)
قم بتنسيق التقرير بشكل مهني وشامل دون افتراض أي نطاق معين.
"""
try:
return self.llm.invoke([SystemMessage(content=sys), HumanMessage(content=hum)]).content
except Exception as e:
return f"Synthesis error: {str(e)}"
إنشاء أدوات للوكيل
لجعل سير عمل وكيل البحث العميق وظيفيًا، نحتاج إلى تعريف الأدوات. الأدوات تمنح الوكيل القدرات اللازمة لتنفيذ إجراءات معينة.
الأدوات الأساسية المطلوبة لسير العمل هذا هي “plan” لمساعدة الوكيل على تحليل الموضوع وإنشاء خطة بحث منظمة، و"search" للسماح للوكيل بإجراء بحث ويب متعمق، و"synthesize" للسماح للوكيل بتحويل جميع النتائج الأولية إلى تقرير منظم.
def get_tools(self):
"""إنشاء وإرجاع قائمة الأدوات المتاحة للوكيل."""
return [
Tool(
name="plan",
func=lambda t: str(self.create_research_plan(t)),
description="Create a detailed research plan with multiple aspects to investigate."
),
Tool(
name="search",
func=self.search,
description="Search the web thoroughly for a query and return comprehensive results."
),
Tool(
name="synthesize",
func=self.synthesize,
description="Transform raw text into detailed, structured findings with citations."
),
]
بناء منفذ الوكيل (Agent Executor)
الآن بعد أن أصبحت أدواتنا جاهزة، نحتاج إلى ربط كل شيء معًا في وكيل AI باستخدام أسلوب ReAct. يساعد ذلك الوكيل على التخطيط، واتخاذ الإجراءات باستخدام الأدوات المحددة، ومراقبة النتائج، والتكرار حتى يحصل على بيانات كافية لإنتاج تقرير بحثي نهائي.
def get_agent_executor(self):
"""إنشاء وإرجاع منفذ الوكيل مع الأدوات والذاكرة."""
tools = self.get_tools()
template = """You are an autonomous research agent specialized in producing comprehensive, detailed reports on any topic.
{tool_names}
TOOLS:
{tools}
PREVIOUS CONVERSATIONS:
{chat_history}
When given a research topic (as {input}), follow this process:
1. Analyze the type of topic and create a research plan tailored to its domain
2. Search for comprehensive information on each aspect of the topic
3. Collect detailed, relevant information with sources
4. Synthesize everything into a professional, detailed report formatted appropriately for the topic
Follow exactly this format:
Question: {input}
Thought: (your reasoning here)
Action: the name of the tool to call, must be one of [{tool_names}]
Action Input: the input to the tool
Observation: (the tool's output)
... (repeat Thought/Action/Action Input/Observation as needed)
When you have gathered comprehensive information, output:
Final Answer: (your final, detailed research report with structured sections, appropriate formatting, specific details, and citations)
BEGIN WITH A THOROUGH PLAN!
{agent_scratchpad}
"""
prompt = PromptTemplate(
template=template,
input_variables=["input", "agent_scratchpad", "tools", "tool_names", "chat_history"]
)
# إنشاء الوكيل الأساسي
agent = create_react_agent(
llm=self.llm,
tools=tools,
prompt=prompt
)
# تغليفه في منفذ مع ذاكرة
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
verbose=True,
memory=memory,
max_iterations=18,
early_stopping_method="generate",
handle_parsing_errors=True
)
return agent_executor
تنسيق التقرير النهائي
بعد أن يكمل وكيل البحث بحثه العميق، قد يكون المخرج مفيدًا ولكنه غير قابل للعرض. هذه الخطوة الإضافية تساعد في جعل التقرير النهائي أكثر احترافية. لتحقيق ذلك، سنطلب من LLM العمل كمحرر خبير لتحسين التقرير النهائي.
def format_final_report(self, raw_report):
"""إضافة تنسيق نهائي للتقرير لجعله أكثر احترافية."""
sys = """You are an expert editor that improves research reports.
Keep all the factual content, citations, and structure intact.
Just improve the formatting, organization, and readability."""
hum = f"""
فيما يلي تقرير بحثي يحتاج إلى تحسينات تنسيقية نهائية:
{raw_report}
يرجى تحسين التنسيق والعرض مع الحفاظ على جميع:
1. الحقائق والأرقام
2. الاستشهادات
3. تنظيم المحتوى
4. البيانات الإحصائية
اجعله يبدو احترافيًا مع عناوين مناسبة وتباعد وتخطيط.
"""
try:
improved = self.llm.invoke([SystemMessage(content=sys), HumanMessage(content=hum)]).content
return improved
except Exception as e:
# في حالة فشل التنسيق، إرجاع التقرير الأصلي
return raw_report
تجميع كل شيء معًا
دعنا نربط سير العمل بأكمله في مسار واحد ينسق تدفق البحث بأكمله. سيكون هذا بمثابة نقطة الدخول التي تسمح للوكيل بتنفيذ عملية البحث الكاملة ثم تنسيق التقرير النهائي.
def run(self, topic):
"""تشغيل عملية البحث حول الموضوع المعطى."""
try:
# إعادة تعيين نتائج البحث المخزنة
self.raw_search_results = []
# تشغيل الوكيل
executor = self.get_agent_executor()
raw_report = executor.invoke({"input": topic})["output"]
# تنسيق التقرير النهائي
final_report = self.format_final_report(raw_report)
return final_report
except Exception as e:
return f"Research failed: {str(e)}"
تشغيل وكيل البحث
الآن بعد أن بنينا سير عمل وكيل البحث العميق، دعنا نختبره ونرى مدى أدائه في مهمة بحث واقعية.
سننشئ مثيلًا من وكيل البحث ونطلب منه إنشاء تقرير مفصل حول موضوع حالي.
# إنشاء كائن الباحث
researcher = AgenticResearcher(novita_api_key, tavily_api_key, num_researchers=3)
# تشغيل بحث تجريبي
topic = "What are the most promising climate tech startups in 2025?"
report = researcher.run(topic)
# عرض تقرير البحث
print("\
" + "="*60)
print(f"📝 DETAILED RESEARCH REPORT: {topic}")
print("="*60)
print(report)
print("="*60 + "\
")
النتيجة:
قام سير عمل الوكيل العميق بتقسيم الموضوع وإنشاء خطة بحث، وإجراء بحث عبر الإنترنت لاسترجاع المعلومات ذات الصلة، وتجميع البيانات التي تم جمعها، وأخيرًا إرجاع تقرير منظم بناءً على استعلام البحث.
الاستنتاج
تهانينا على بناء سير عمل وكيل البحث العميق الخاص بك! يمكنك الآن البحث في أي موضوع والحصول على تقرير مفصل عن استفسارك.
دعنا نلخص سريعًا ما حققته:
في هذه المقالة، تعلمت كيفية بناء وكيل بحث عميق يمكنه تحليل الموضوعات المعقدة، وإنشاء خطة بحث، وإجراء عمليات بحث على الإنترنت، وتجميع جميع النتائج في تقرير منظم.
تم تشغيل هذا سير العمل بأكمله بواسطة:
- Novita AI كمزود LLM
- LangChain للإطار العملي للوكيل
- Tavily كمحرك بحث في الوقت الفعلي
لا تتردد في تجربة الوكيل على مواضيع مختلفة لاختبار قدراته!
هذا مجرد واحد من العديد من تطبيقات AI المثيرة الممكنة مع النماذج القوية الحالية. قم بزيارة Novita LLM Playground لتجربة نماذج AI أخرى حديثة ورائعة؛ قد تبدأ فكرة AI الرائعة التالية من هناك.
Novita AI هي منصة سحابية AI تقدم للمطورين طريقة سهلة لنشر نماذج AI باستخدام واجهة برمجة التطبيقات البسيطة لدينا، مع توفير GPU سحابي موثوق وبأسعار معقولة للبناء والتوسع.
