Retrieval-Augmented Generation (RAG)

الـ RAG الوكيل: تنفيذ وكلاء استرجاع ذاتيين لحل الاستعلامات الديناميكية

أصبح الاسترجاع المعزز بالتوليد (RAG) البنية القياسية لتأصيل نماذج اللغات الكبيرة (LLMs) في البيانات الخاصة. ومع ذلك، غالباً ما تعاني خطوط أنابيب RAG التقليدية من قيد حرج: فهي ثابتة. يفشل البحث البسيط في التضمين يليه حقن السياق عندما يكون استعلام المستخدم غامضاً، أو يتطلب استدلالاً متعدد الخطوات، أو يتطلب مزيجاً من الأدوات بدلاً من مجرد البحث الدلالي. هنا يأتي دور الـ RAG الوكيل.

يُدخل الـ RAG الوكيل طبقة استدلال ذاتي—عادةً ما تعمل بواسطة نموذج لغوي كبير يعمل كوكيل—يقرر كيفية استرجاع المعلومات. بدلاً من استرجاع متجهات الـ k الأعلى بشكل أعمى، يخطط الوكيل لإجراءاته، وينفذ استدعاءات الأدوات، ويقيم النتائج، ويتكرر حتى يحصل على أدلة كافية للإجابة على سؤال المستخدم.

من الخطوط الأنابيب الخطية إلى الحلقات الذاتية

في نظام RAG التقليدي، يكون التدفق خطياً: استعلام المستخدم -> التضمين -> البحث في المتجهات -> إكمال النموذج اللغوي. إذا فشل البحث الأولي، يفشل النظام. على النقيض من ذلك، يعمل نظام الـ RAG الوكيل في حلقة. يتم إعطاء الوكيل مجموعة من "الأدوات" (الدوال التي يمكنه استدعاؤها) وهدفاً. يستخدم قدراته الاستدلالية ل quyết أي أداة يستخدم ومع أي معلمات.

لنفترض أن المستخدم يسأل: "ما كان سعر سهم منافسي عند إصدارنا لتحديثنا الأخير؟". قد يواجه نظام RAG الثابت صعوبة في ربط "التحديث الأخير" بتاريخ محدد دون تعليمات صريحة. ومع ذلك، يمكن للوكيل تفكيك هذا الطلب:

  1. تحديد تاريخ "التحديث الأخير" من الوثائق الداخلية.
  2. تحديد "المنافس" من السياق.
  3. الاستعلام عن API مالي أو قاعدة بيانات للحصول على سعر السهم في ذلك التاريخ المحدد.
  4. توليف الإجابة النهائية.

التنفيذ باستخدام LangChain ونمط ReAct

أصبح تنفيذ نظام RAG الوكيل أسهل بكثير اليوم بفضل أطر عمل مثل LangChain. يعتمد المفهوم الأساسي على نمط ReAct (الاستدلال والعمل)، حيث يتناوب النموذج اللغوي الكبير بين الاستدلال حول المشكلة واتخاذ الإجراءات.

فيما يلي مثال عملي لتحديد الأدوات وتغليفها للوكيل. هنا، نحدد أداة للبحث في قاعدة بيانات متجهة وأخرى لجلب بيانات الطقس المباشرة، مما يوضح الطبيعة الهجينة للاسترجاع الوكيل.

from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI

# Define custom tools for the agent
@tool
def search_knowledge_base(query: str) -> str:
    """Search the internal vector database for relevant documents."""
    # Logic to connect to FAISS or Pinecone would go here
    return f"Search results for '{query}'..."

@tool
def get_stock_price(ticker: str, date: str) -> str:
    """Retrieve stock price data for a specific ticker and date."""
    # Logic to connect to Yahoo Finance API or SQL DB
    return f"{ticker} was $150.00 on {date}"

# Initialize the LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)

# Combine tools
tools = [search_knowledge_base, get_stock_price]

# Create the agent
agent = create_openai_tools_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# Run the query
response = agent_executor.invoke({
    "input": "What was the price of AAPL on the day we released V2.0?"
})
print(response['output'])

الفوائد والتحديات الرئيسية

الفائدة الرئيسية للـ RAG الوكيل هي المرونة. إذا لم ينتج خطوة الاسترجاع الأولى سياقاً كافياً، يمكن للوكيل إصدار استعلامات متابعة، أو تجربة كلمات مفتاحية مختلفة، أو حتى أن يقرر عدم وجود معلومات ذات صلة. هذا يقلل من الهلوسة لأن الوكيل يتحقق من المعلومات قبل الرد.

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

الخاتمة

مع انتقالنا نحو تطبيقات ذكاء اصطناعي أكثر تعقيداً، ستحل الوكلاء الذاتية محل خطوط أنابيب RAG الثابتة القادرة على الاسترجاع الديناميكي. بالنسبة للمطورين، هذا يعني تحويل التركيز من مجرد ضبط مؤشرات المتجهات إلى تصميم تعريفات أدوات قوية وتقييم مسارات استدلال الوكيل. بينما يقدم ذلك تعقيداً، فإن قدرة الـ RAG الوكيل على التعامل مع الاستعلامات متعددة الخطوات والغامضة تجعله أداة لا غنى عنها للجيل القادم من الذكاء الاصطناعي المؤسسي.

Share: