الذكاء الاصطناعي العام وذكاء المستقبل

بناء وكلاء LLM ل RAG من الصفر إلى ما وراء: دليل شامل

mm
أضف Unite.AI إلى مصادرك المفضلة على Google

النماذج مثل GPT-3 و GPT-4 ومكافئها المفتوح المصدر غالبًا ما يصعب عليها الحصول على معلومات حديثة ويمكن أن تولد أحيانًا معلومات غير صحيحة أو مخيلية.

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

في هذا المنشور على المدونة، سنستكشف كيفية بناء وكلاء LLM ل RAG من الصفر، ونغوص深ًا في الهندسة المعمارية والتفاصيل الفنية والتقنيات المتقدمة. سنغطي كل شيء من أساسيات RAG إلى إنشاء وكلاء متقدمين قادرون على التفكير المعقد وتنفيذ المهام.

قبل أن نبدأ في بناء وكيل LLM الخاص بنا، دعونا نفهم ما هو RAG ولماذا هو مهم.

RAG ، أو التوليد المعزز بالاسترجاع، هو نهج هجين يجمع بين استرجاع المعلومات وتوليد النص. في نظام RAG:

  • يستخدم استعلام لاسترجاع المستندات ذات الصلة من قاعدة المعرفة.
  • تُغذى هذه المستندات بعد ذلك إلى نموذج لغوي جنبًا إلى جنب مع الاستعلام الأصلي.
  • يولد النموذج استجابة بناءً على الاستعلام والمعلومات المسترجعة.
RAG

RAG

لهذا النهج عدة مزايا:

  • دقة محسنة: من خلال تأسيس الاستجابات في المعلومات المسترجعة، يقلل RAG من المخيلات ويحسن الدقة الواقعية.
  • معلومات حديثة: يمكن تحديث قاعدة المعرفة بانتظام، مما يسمح للنظام بالوصول إلى المعلومات الحالية.
  • الشفافية: يمكن للنظام تقديم مصادر لمعلوماته، مما يزيد من الثقة ويمكّن من التحقق من الحقائق.

فهم وكلاء LLM

 

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

ما هي وكلاء LLM؟

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

فكر في سؤال في مجال القانون مثل: “ما هي النتائج القانونية المحتملة لخرق عقد معين في كاليفورنيا؟” يمكن لنموذج LLM الأساسي مع نظام RAG استرجاع المعلومات الضرورية من قواعد بيانات قانونية.

لسيناريو أكثر تفصيلا: “في ضوء قوانين الخصوصية الجديدة، ما هي التحديات القانونية الشائعة التي تواجهها الشركات وكيف تعاملت المحاكم مع هذه القضايا؟” هذا السؤال يغوص أعمق من مجرد البحث عن حقائق. إنه حول فهم القواعد الجديدة وتأثيرها على الشركات المختلفة وآراء المحاكم. سيكون وكيل LLM يقسم هذه المهمة إلى مهام فرعية، مثل استرجاع أحدث القوانين وتحليل الحالات التاريخية و تلخيص الوثائق القانونية والتنبؤ بالاتجاهات بناءً على الأنماط.

مكونات وكلاء LLM

تتكون وكلاء LLM بشكل عام من أربعة مكونات:

  1. وكيل / دماغ: النموذج اللغوي الأساسي الذي يعالج ويفهم اللغة.
  2. التخطيط: القدرة على التفكير وتحليل المهام وتطوير خطط محددة.
  3. الذاكرة: يحافظ على سجلات للمحادثات السابقة ويتعلم منها.
  4. استخدام الأدوات: يدمج الموارد المختلفة لأداء المهام.

وكيل / دماغ

في قلب وكيل LLM يوجد نموذج لغوي يعالج ويفهم اللغة بناءً على كمية كبيرة من البيانات التي تم تدريبه عليها. تبدأ bằng إعطائه سؤالا محددًا، وتوجيه الوكيل حول كيفية الاستجابة وما الأدوات التي يجب استخدامها والأهداف التي يجب تحقيقها. يمكنك تخصيص الوكيل بشخصية مناسبة لمهام أو تفاعلات معينة، مما يعزز أداءه.

الذاكرة

يساعد مكون الذاكرة وكلاء LLM على التعامل مع المهام المعقدة من خلال الحفاظ على سجل للمهام السابقة. هناك نوعان رئيسيان من الذاكرة:

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

من خلال مزج هذه الأنواع من الذاكرة، يمكن للوكيل تقديم استجابات أكثر تخصيصًا وتذكر تفضيلات المستخدم مع مرور الوقت، مما يخلق تفاعلًا أكثر اتصالاً وملاءمة.

التخطيط

يسمح التخطيط لوكلاء LLM بالتفكير وتحليل المهام إلى أجزاء قابلة للتحكم وتعديل الخطط مع تطور المهام. يتضمن التخطيط مرحلتين رئيسيتين:

  • صياغة الخطة: تقسيم مهمة إلى مهام فرعية.
  • تعكس الخطة: مراجعة وتقييم فعالية الخطة، وتضمين التغذية الراجعة لتعديل الاستراتيجيات.

الأساليب مثل سلسلة الفكر (CoT) و شجرة الفكر (ToT) تساعد في عملية التحليل هذه، مما يسمح للوكلاء باستكشاف مسارات مختلفة لحل مشكلة.

إعداد البيئة

لإنشاء وكيل RAG، سنحتاج إلى إعداد بيئتنا التطويرية. سنستخدم Python وعددًا من المكتبات الرئيسية:

  • LangChain: لتنسيق مكونات LLM و الاسترجاع.
  • Chroma: كمخزن متجهات لترميز المستندات.
  • نماذج GPT من OpenAI: كنموذج LLM الأساسي (يمكن استبداله بنموذج مفتوح المصدر إذا كان مفضلاً).
  • FastAPI: لإنشاء واجهة برمجة تطبيقات بسيطة للتفاعل مع وكيلنا.

دعونا نبدأ bằng إعداد بيئتنا:


<p># إنشاء بيئة افتراضية جديدة
python -m venv rag_agent_env
source rag_agent_env/bin/activate # على نظام Windows، استخدم `rag_agent_env\Scripts\activate`</p>

<p># تثبيت الحزم المطلوبة
pip install langchain chromadb openai fastapi uvicorn

الآن، دعونا ننشئ ملف Python جديد يسمى rag_agent.py و نستورد المكتبات الضرورية:


<p>from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
from langchain.document_loaders import TextLoader
import os</p>

<p># تعيين مفتاح API OpenAI
os.environ["OPENAI_API_KEY"] = "your-api-key-here"</p>

بناء نظام RAG البسيط

الآن بعد أن قمنا بإعداد بيئتنا، دعونا ننشئ نظام RAG بسيط. سنبدأ bằng إنشاء قاعدة معرفة من مجموعة من المستندات، ثم نستخدمها للاستجابة على الاستفسارات.

الخطوة 1: إعداد المستندات

أولاً، نحتاج إلى تحميل وتهيئة مستنداتنا. في هذا المثال، دعونا نفترض أن لدينا ملف نصي يسمى knowledge_base.txt يحتوي على بعض المعلومات حول الذكاء الاصطناعي و تعلم الآلة.


<p># تحميل المستند
loader = TextLoader("knowledge_base.txt")
documents = loader.load()</p>

<p># تقسيم المستندات إلى قطع
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)</p>

<p># إنشاء ترميزات
embeddings = OpenAIEmbeddings()</p>

<p># إنشاء مخزن متجهات
vectorstore = Chroma.from_documents(texts, embeddings)</p>

الخطوة 2: إنشاء سلسلة استفسار استرجاع

الآن بعد أن قمنا بإنشاء مخزن المتجهات، يمكننا إنشاء سلسلة استفسار استرجاع:


<p># إنشاء سلسلة استفسار استرجاع
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())</p>

الخطوة 3: الاستفسار عن النظام

يمكننا الآن الاستفسار عن نظام RAG الخاص بنا:


<p>query = "ما هي التطبيقات الرئيسية لتعلم الآلة؟"
result = qa.run(query)
print(result)

الخطوة 4: إنشاء وكيل LLM

بينما نظام RAG البسيط مفيد، إلا أنه محدود للغاية. دعونا نطوره bằng إنشاء وكيل LLM يمكنه أداء مهام أكثر تعقيدًا والتفكير في المعلومات التي يسترجعها.

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

أولاً، دعونا نحدد بعض الأدوات لوكيلنا:


<p>from langchain.agents import Tool
from langchain.tools import DuckDuckGoSearchRun
from langchain.tools import BaseTool
from langchain.agents import initialize_agent
from langchain.agents import AgentType</p>

<p># تعريف أداة حاسبة
class CalculatorTool(BaseTool):
name = "Calculator"
description = "مفيد للاستفسارات الرياضية"</p>

<p>def _run(self, query: str)
try:
return str(eval(query))
except:
return "لا أستطيع حساب ذلك. يرجى التأكد من أن إدخالك هو تعبير رياضي صحيح."</p>

<p># إنشاء مثيلات الأدوات
search = DuckDuckGoSearchRun()
calculator = CalculatorTool()</p>

<p># تعريف الأدوات
tools = [Tool(name="Search", func=search.run, description="مفيد للاستفسارات حول الأحداث الحالية"),
Tool(name="RAG-QA", func=qa.run, description="مفيد للاستفسارات حول الذكاء الاصطناعي و تعلم الآلة"),
Tool(name="Calculator", func=calculator._run, description="مفيد لعمليات الحساب")]
</p>

<p># 초기화 الوكيل
agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)</p>

الآن لدينا وكيلًا يمكنه استخدام نظام RAG الخاص بنا، وإجراء عمليات بحث على الويب وعمليات حسابية. دعونا نختبره:


<p>result = agent.run("ما هو الفرق بين التعلم الإشرافي و التعلم غير الإشرافي؟ كما ما هو 15% من 80؟")
print(result)</p>

يظهر هذا الوكيل ميزة رئيسية لوكلاء LLM: يمكنهم الجمع بين أدوات متعددة وخطوات التفكير للاستجابة على استفسارات معقدة.

تعزيز الوكيل بتقنيات RAG المتقدمة

بينما نظام RAG الحالي يعمل جيدًا، هناك عدة تقنيات متقدمة يمكننا استخدامها لتحسين أدائه:

أ) البحث الدلالي بالاسترجاع الكثيف للممر (DPR)

بدلاً من استخدام استرجاع الترميز البسيط، يمكننا تنفيذ DPR للحصول على بحث دلالي أكثر دقة:


<p>from transformers import DPRQuestionEncoder, DPRContextEncoder</p>

<p>question_encoder = DPRQuestionEncoder.from_pretrained("facebook/dpr-question_encoder-single-nq-base")
context_encoder = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")</p>

<p># دالة لترميز الممرات
def encode_passages(passages):
return context_encoder(passages, max_length=512, return_tensors="pt").pooler_output</p>

<p># دالة لترميز الاستفسار
def encode_query(query):
return question_encoder(query, max_length=512, return_tensors="pt").pooler_output</p>

ب) توسيع الاستفسار

يمكننا استخدام توسيع الاستفسار لتحسين أداء الاسترجاع:


<p>from transformers import T5ForConditionalGeneration, T5Tokenizer</p>

<p>model = T5ForConditionalGeneration.from_pretrained("t5-small")
tokenizer = T5Tokenizer.from_pretrained("t5-small")</p>

<p>def expand_query(query):
input_text = f"expand query: {query}"
input_ids = tokenizer.encode(input_text, return_tensors="pt")
outputs = model.generate(input_ids, max_length=50, num_return_sequences=3)
expanded_queries = [tokenizer.decode(output, skip_special_tokens=True) for output in outputs]
return expanded_queries</p>

ج) التحسين التكراري

يمكننا تنفيذ عملية تحسين تكرارية حيث يمكن للوكيل أن يطرح أسئلة متابعة لتوضيح أو توسيع استرجاعه الأولي:


<p>def iterative_retrieval(initial_query, max_iterations=3):
query = initial_query
for _ in range(max_iterations):
result = qa.run(query)
clarification = agent.run(f"Based on this result: '{result}', what follow-up question should I ask to get more specific information?")
if clarification.lower().strip() == "none":
break
query = clarification
return result</p>

تنفيذ نظام متعدد الوكلاء

للمهام أكثر تعقيدًا، يمكننا تنفيذ نظام متعدد الوكلاء حيث يختص كل وكيل في مجال معين. هنا مثال بسيط:


<p>class SpecialistAgent:
def __init__(self, name, tools):
self.name = name
self.agent = initialize_agent(tools, OpenAI(temperature=0), agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)</p>

<p>def run(self, query):
return self.agent.run(query)</p>

<p># إنشاء وكلاء متخصصين
research_agent = SpecialistAgent("Research", [Tool(name="RAG-QA", func=qa.run, description="للاستفسارات حول الذكاء الاصطناعي و تعلم الآلة")])
math_agent = SpecialistAgent("Math", [Tool(name="Calculator", func=calculator._run, description="لعمليات الحساب")])
general_agent = SpecialistAgent("General", [Tool(name="Search", func=search.run, description="للاستفسارات العامة")])</p>

<p>class Coordinator:
def __init__(self, agents):
self.agents = agents</p>

<p>def run(self, query):
# تحديد الوكيل الذي يجب استخدامه
if "calculate" in query.lower() or any(op in query for op in ['+', '-', '*', '/']):
return self.agents['Math'].run(query)
elif any(term in query.lower() for term in ['ai', 'machine learning', 'deep learning']):
return self.agents['Research'].run(query)
else:
return self.agents['General'].run(query)</p>

<p>coordinator = Coordinator({'Research': research_agent, 'Math': math_agent, 'General': general_agent})</p>

<p># اختبار نظام متعدد الوكلاء
result = coordinator.run("ما هو الفرق بين الشبكات العصبية و الرNN؟ كما ما هو 25% من 120؟")
print(result)</p>

يسمح نظام متعدد الوكلاء هذا بالتخصص ويمكنه التعامل مع مجموعة أوسع من الاستفسارات بشكل أكثر فعالية.

تقييم وتنظيم وكلاء RAG

لضمان أداء وكيل RAG الخاص بنا جيدًا، نحتاج إلى تنفيذ مقاييس التقييم و تقنيات التحسين:

أ) تقييم الأهمية

يمكننا استخدام مقاييس مثل BLEU و ROUGE و BERTScore لتقييم أهمية المستندات المسترجعة:


<p>from bert_score import score</p>

<p>def evaluate_relevance(query, retrieved_doc, generated_answer):
P, R, F1 = score([generated_answer], [retrieved_doc], lang="en")
return F1.mean().item()</p>

ب) تقييم جودة الإجابة

يمكننا استخدام التقييم البشري أو المقاييس الآلية لتقييم جودة الإجابة:


<p>from nltk.translate.bleu_score import sentence_bleu</p>

<p>def evaluate_answer_quality(reference_answer, generated_answer):
return sentence_bleu([reference_answer.split()], generated_answer.split())</p>

<p># استخدم هذا لتقييم استجابات وكيلك

التوجهات المستقبلية والتحديات

بينما ننظر إلى مستقبل وكلاء RAG، تظهر عدة توجهات وتحديات مثيرة:

أ) الاسترجاع المتعدد: توسيع RAG لدمج البيانات الصوتية و الصور و الفيديو.

ب) الاسترجاع الفيدرالي: تنفيذ RAG عبر قواعد معرفة موزعة و محمية للخصوصية.

ج) التعلم المستمر: تطوير أساليب لوكلاء RAG لتحديث قواعد المعرفة و النماذج مع مرور الوقت.

د) الconsiderations الأخلاقية: معالجة الانحياز و العدالة و الشفافية في أنظمة RAG.

ه) التنظيم: تحسين RAG للتطبيقات الكبيرة و الوقت الحقيقي.

الخاتمة

بناء وكلاء LLM ل RAG من الصفر هو عملية معقدة ولكنها مجزية. لقد غطينا أساسيات RAG و تنفيذ نظام بسيط و إنشاء وكيل LLM و تعزيزه بتقنيات متقدمة و استكشاف أنظمة متعددة الوكلاء و مناقشة استراتيجيات التقييم و التحسين.

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