النقاط الرئيسية
- LlamaIndex: يتخصص في استيعاب البيانات وهيكلتها والاستفادة من البيانات الخاصة أو المخصصة للمجال في مهام مثل الإجابة المتقدمة على الأسئلة وفهم المستندات.
- LangChain: يقدم إطار عمل شامل مفتوح المصدر لتطوير ونشر وتوسيع نطاق التطبيقات باستخدام LLMs، ويدعم حالات استخدام متنوعة بما في ذلك الوكلاء المحادثة والترجمة وسير العمل المعقدة.
- تكامل LLM المخصص: يقدم دليلاً شاملاً للكود خطوة بخطوة لتنفيذ LLMs مخصصة مع إطاري LlamaIndex و LangChain، مع عرض نهج كل منهما في دمج واستخدام واجهات برمجة التطبيقات الخارجية مثل Novita AI.
مقدمة
في المشهد سريع التطور للذكاء الاصطناعي ومعالجة اللغة الطبيعية، ظهر إطاران كأدوات قوية للمطورين الذين يعملون مع نماذج اللغة الكبيرة (LLMs): LlamaIndex و LangChain. تهدف مشاركة المدونة هذه إلى تقديم مقارنة شاملة بين LlamaIndex و LangChain، واستكشاف ميزاتها الرئيسية وحالات الاستخدام والتطبيقات العملية. من خلال التعمق في الوظائف الأساسية ونماذج التسعير وقدرات التكامل لكل إطار، سنزودك بالمعرفة اللازمة لاتخاذ قرار مستنير بشأن الأداة التي تناسب احتياجاتك الخاصة على أفضل وجه.
ما هو LlamaIndex؟
LlamaIndex هو إطار عمل بيانات متطور مصمم لتمكين نماذج اللغة الكبيرة (LLMs) من خلال تزويدها ببيانات ذات صلة بالسياق ومخصصة للمستخدم. على عكس LLMs ذات الأغراض العامة التي تم تدريبها مسبقًا على البيانات العامة، يتيح LlamaIndex لهذه النماذج الوصول إلى البيانات الخاصة أو المخصصة للمجال أو المركزة على المشكلة والاستفادة منها، والتي غالبًا ما تكون معزولة خلف واجهات برمجة التطبيقات (APIs) أو داخل قواعد البيانات أو محاصرة في تنسيقات غير منظمة مثل PDF.

الميزات والإمكانيات الرئيسية
- استيعاب البيانات: يقدم LlamaIndex موصلات بيانات تستوعب البيانات بسلاسة من مجموعة متنوعة من المصادر، بما في ذلك على سبيل المثال لا الحصر واجهات برمجة التطبيقات وملفات PDF وقواعد بيانات SQL، بتنسيقاتها الأصلية.
- هيكلة البيانات: يقوم بهيكلة البيانات المستوعبة إلى تمثيلات وسيطة محسنة للاستهلاك الفعال بواسطة LLMs، مما يضمن أداءً عاليًا.
- الوصول باللغة الطبيعية: يوفر LlamaIndex محركات تمنح وصولاً بلغة طبيعية إلى البيانات، مما يسهل الإجابة على الأسئلة من خلال محركات الاستعلام وتمكين التفاعلات المحادثة عبر محركات الدردشة.
- العاملون المعرفيون: يتضمن الإطار عوامل تعمل كعاملين معرفيين مدعومين بـ LLM، معززين بمجموعة من الأدوات التي تتراوح من المساعدات البسيطة إلى تكاملات واجهات برمجة التطبيقات المعقدة.
- المراقبة والتقييم: يتكامل مع أدوات للتجريب والتقييم والمراقبة الصارمة، مما يضمن دورة تحسين مستمر للتطبيقات.
حالات الاستخدام
يدعم LlamaIndex مجموعة متنوعة من حالات الاستخدام، مثل:
- التوليد المعزز بالاسترجاع (RAG) لأنظمة الإجابة المتقدمة على الأسئلة.
- روبوتات الدردشة التي يمكنها إجراء محادثات هادفة وواعية بالسياق.
- فهم المستندات واستخراج البيانات من المستندات غير المنظمة.
- العوامل المستقلة القادرة على إجراء البحوث وتنفيذ الإجراءات.
- التطبيقات متعددة الوسائط التي تدمج النصوص مع الصور وأنواع البيانات الأخرى.
- الضبط الدقيق للنماذج على بيانات محددة لتعزيز الأداء.
ما هو LangChain؟
LangChain هو إطار عمل متطور مصمم خصيصًا لتبسيط تطوير ونشر وتطبيقات الطاقة التي تعمل بنماذج اللغة الكبيرة (LLMs). يقدم مجموعة شاملة من الأدوات والمكتبات التي تلبي كل مرحلة من دورة حياة تطبيق LLM، مما يضمن عملية تطوير سلسة وفعالة.

الميزات والإمكانيات الرئيسية
- التطوير: يوفر LangChain لبنات بناء مفتوحة المصدر ومكونات وتكاملات خارجية تبسط إنشاء تطبيقات LLM. LangGraph، وهو مكون رئيسي، يتيح بناء عوامل وكلاء ذات حالة مع دعم قوي لتدفق البيانات وسير العمل الذي يتضمن التدخل البشري.
- الإنتاجية: LangSmith هي أداة قوية لفحص ومراقبة وتقييم أداء سلاسل LLM الخاصة بك. تضمن التحسين المستمر والنشر الواثق من خلال تقديم رؤى عميقة حول أداء التطبيق.
- النشر: يسهل LangGraph Cloud تحويل تطبيقات LangGraph إلى واجهات برمجة تطبيقات ومساعدين جاهزين للإنتاج، مما يجعل من السهل توسيع نطاق تطبيقات LLM وتكاملها في أنظمة مختلفة.
- التنظيم الهرمي: يتم تنظيم الإطار بشكل هرمي، مع أجزاء مترابطة عبر طبقات متعددة، مما يضمن نمطية ومرونة في تطوير التطبيقات.
المكتبات مفتوحة المصدر
- langchain-core: يقدم التجريدات الأساسية ولغة تعبير LangChain، ويعمل كأساس للإطار.
- langchain-community: يدمج خدمات الطرف الثالث ويوسع قدرات LangChain.
- الحزم الشريكة: حزم خفيفة الوزن مثل langchain-openai و langchain-anthropic التي توفر تكاملات محددة، مما يعزز تنوع الإطار.
- langchain: يتكون من سلاسل وعوامل واستراتيجيات استرجاع تشكل البنية المعرفية للتطبيق.
- LangGraph: أداة قوية لبناء تطبيقات متعددة العوامل ذات حالة باستخدام LLMs، باستخدام نموذج قائم على الرسم البياني للخطوات، ويمكن دمجه مع LangChain أو استخدامه بشكل مستقل.
- LangServe: ينشر سلاسل LangChain كواجهات برمجة تطبيقات REST، مما يسهل التكامل مع خدمات الويب.
- LangSmith: منصة مطور توفر مجموعة شاملة من الأدوات لتصحيح الأخطاء والاختبار والتقييم والمراقبة لتطبيقات LLM.
الجمهور وحالات الاستخدام
تم تصميم LangChain للمطورين على جميع المستويات، من المبتدئين إلى الخبراء، الذين يتطلعون إلى تسخير قوة LLMs في تطبيقاتهم. هندسته المعيارية والقابلة للتوسع تجعله مناسبًا لمجموعة واسعة من حالات الاستخدام، بما في ذلك على سبيل المثال لا الحصر:
- بناء عوامل المحادثة وروبوتات الدردشة.
- تطوير أدوات الترجمة والتلخيص اللغوي.
- إنشاء أنظمة لتوليد المحتوى وتصنيفه.
- تنفيذ سير عمل معقدة باستخدام LLMs.
LlamaIndex مقابل LangChain: الاختلافات الرئيسية
الوظيفة الأساسية:
- LangChain هو إطار عمل شامل مصمم لتبسيط إنشاء التطبيقات الواعية بالبيانات والعوامل باستخدام نماذج اللغة الكبيرة (LLMs). يقدم مجموعة واسعة من الأدوات لتطبيقات LLM المختلفة، مع التركيز على المرونة وقدرات الذكاء الاصطناعي المتقدمة.
- LlamaIndex (المعروف سابقًا باسم GPT Index) هو إطار عمل بيانات يركز بشكل محدد على استيعاب وهيكلة والوصول إلى البيانات الخاصة أو المخصصة للمجال لـ LLMs. يبسط فهرسة واسترجاع المعلومات، مما يجعله مثالياً للبحث المستند إلى النص وتوليد استجابات دقيقة.
حالات الاستخدام:
- LangChain متعدد الاستخدامات ويمكن استخدامه لمجموعة متنوعة من التطبيقات مثل توليد النصوص، والترجمة اللغوية، وتلخيص النصوص، وتصنيف النصوص. إنه مناسب بشكل خاص للحفاظ على محادثات طويلة وذات صلة بالسياق بفضل إدارة الذاكرة الممتازة وقدرات السلسلة.
- LlamaIndex يتفوق في السيناريوهات التي يكون فيها البحث النصي والاستجابات عالية الجودة هي الأولويات القصوى. تشمل حالات الاستخدام الشائعة توليد المحتوى، والبحث عن المستندات واسترجاعها، وتعزيز LLM لروبوتات الدردشة والمساعدين الافتراضيين.
التسعير والتوفر:
- LangChain هو أداة مفتوحة المصدر ومجانية، مع توفر شفرة المصدر للتحميل على منصات مثل GitHub، مما يجعله في متناول أي شخص لاستخدامه.
- LlamaIndex هو منتج تجاري، ويتم تحديد تسعيره بناءً على الاستخدام، مما يعني أنه قد ينطوي على تكاليف بناءً على مدى استخدامه داخل التطبيقات.
التخصيص والمرونة:
- LangChain يقدم خيارات تخصيص متقدمة، مما يجعله مناسبًا للمطورين الذين يحتاجون إلى ضبط تطبيقاتهم بدقة وفقًا لمتطلبات محددة.
- LlamaIndex يوفر ميزات وأدوات سهلة الاستخدام تسهل التكامل السلس للبيانات الخاصة أو المخصصة للمجال في LLMs، مع التركيز على سهولة الاستخدام وإدارة البيانات المباشرة.
معالجة البيانات:
- LangChain مصمم للعمل مع مجموعة متنوعة من أنواع البيانات والمصادر، ويقدم مكونات مثل Schema لتنظيم البيانات و Indexes لاسترجاع المعلومات بكفاءة.
- LlamaIndex يؤكد على القدرة على تكوين فهرس من فهارس أخرى، مما يجعله فعالاً للغاية للاستعلامات المعقدة وسير العمل التي تتضمن مصادر بيانات متعددة.
التكامل:
- LangChain يوفر تكاملات مع خدمات الطرف الثالث ويمكن توسيعه بحزم شريكة لمزودي LLM محددين.
- LlamaIndex يقدم موصلات بيانات للتكامل السلس لمصادر البيانات المختلفة، مما يعزز جودة البيانات والأداء.
LlamaIndex مقابل LangChain: مقارنة أمثلة عملية
بالرجوع إلى Ming على Medium، إليك بعض الأمثلة العملية التي تقارن LlamaIndex مع LangChain.
إنشاء روبوت محادثة مع LLM محلي
توضح أمثلة الكود كيفية تهيئة LLM مع كلا الإطارين وكيفية طباعة مخرجات تفاعل المحادثة.
كود LlamaIndex:
from llama_index.llms import ChatMessage, OpenAILike
llm = OpenAILike(
api_base="http://localhost:1234/v1",
timeout=600,
api_key="loremIpsum",
is_chat_model=True,
context_window=32768,
)
chat_history = [
ChatMessage(role="system", content="You are a bartender."),
ChatMessage(role="user", content="What do I enjoy drinking?"),
]
output = llm.chat(chat_history)
print(output)
كود LangChain:
from langchain.schema import HumanMessage, SystemMessage
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
openai_api_base="http://localhost:1234/v1",
request_timeout=600,
openai_api_key="loremIpsum",
max_tokens=32768,
)
chat_history = [
SystemMessage(content="You are a bartender."),
HumanMessage(content="What do I enjoy drinking?"),
]
print(llm(chat_history))
بناء نظام RAG للملفات المحلية
توضح مقتطفات الكود كيفية تحميل البيانات وإنشاء فهرس وتنفيذ استعلام.
كود LlamaIndex:
from llama_index import ServiceContext, SimpleDirectoryReader, VectorStoreIndex
service_context = ServiceContext.from_defaults(
embed_model="local",
llm=llm, # يجب أن يكون هذا هو LLM الذي تمت تهيئته في المهمة أعلاه.
)
documents = SimpleDirectoryReader(
input_dir="mock_notebook/",
).load_data()
index = VectorStoreIndex.from_documents(
documents=documents,
service_context=service_context,
)
engine = index.as_query_engine(
service_context=service_context,
)
output = engine.query("What do I like to drink?")
print(output)
كود LangChain:
from langchain_community.document_loaders import DirectoryLoader
# pip install "unstructured[md]"
loader = DirectoryLoader("mock_notebook/", glob="*.md")
docs = loader.load()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
from langchain_community.embeddings.fastembed import FastEmbedEmbeddings
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_documents(documents=splits, embedding=FastEmbedEmbeddings())
retriever = vectorstore.as_retriever()
from langchain import hub
# pip install langchainhub
prompt = hub.pull("rlm/rag-prompt")
def format_docs(docs):
return "\
\
".join(doc.page_content for doc in docs)
from langchain_core.runnables import RunnablePassthrough
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm # يجب أن يكون هذا هو LLM الذي تمت تهيئته في المهمة أعلاه.
)
print(rag_chain.invoke("What do I like to drink?"))
من المقارنة، يبدو أن LlamaIndex، مع التركيز على أنظمة RAG، يوفر نهجًا أبسط بينما يقدم LangChain طريقة أكثر تجريدًا وعالية المستوى.
LlamaIndex مقابل LangChain: كيفية استخدام LLM مخصص مع LlamaIndex؟
لتكامل واجهة برمجة تطبيقات Novita AI LLM مع LlamaIndex، ستحتاج إلى إنشاء محول مخصص يغلف استدعاءات واجهة برمجة تطبيقات Novita AI داخل إطار LlamaIndex. أدناه مثال توضيحي لكيفية تحقيق ذلك. يرجى ملاحظة أن هذا المثال يفترض أن لديك فهمًا أساسيًا لكيفية العمل مع واجهات برمجة التطبيقات وإطار LlamaIndex.
الخطوة 1: تعريف محول مخصص لـ Novita AI LLM
أولاً، دعنا نحدد محولاً مخصصًا لـ Novita AI LLM:
class NovitaAILLM:
def __init__(self, api_key):
from openai import OpenAI
self.client = OpenAI(api_key=api_key, base_url="https://api.novita.ai/v3/openai")
def complete_chat(self, messages, stream=False, max_tokens=512):
response = self.client.chat.completions.create(
model="Nous-Hermes-2-Mixtral-8x7B-DPO",
messages=messages,
stream=stream,
max_tokens=max_tokens
)
return response
الخطوة 2: التكامل مع سياق خدمة LlamaIndex
بعد ذلك، ستحتاج إلى دمج هذا المحول في سياق خدمة LlamaIndex. إليك مثال توضيحي لكيفية القيام بذلك:
from llama_index import (
KeywordTableIndex,
SimpleDirectoryReader,
ServiceContext,
)
from llama_index.llms import LLM
class NovitaAILLMAdapter(LLM):
def __init__(self, api_key):
self.novitailm = NovitaAILLM(api_key)
def generate_text(self, prompt, stop_sequences=None, **kwargs):
# إعداد الرسائل لإكمال المحادثة
messages = [
{"role": "system", "content": prompt}
]
# استدعاء Novita AI LLM لإكمال المحادثة
response = self.novitailm.complete_chat(messages)
if isinstance(response, list): # إذا كان التدفق، جمع كل الأجزاء
return "".join([chunk.choices[0].delta.content for chunk in response])
else:
return response.choices[0].message.content
# تهيئة محول Novita AI LLM مع مفتاح API الخاص بك
novitailm_adapter = NovitaAILLMAdapter(api_key="<YOUR Novita AI API Key>")
# إنشاء سياق الخدمة مع محول LLM المخصص
service_context = ServiceContext.from_defaults(llm=novitailm_adapter)
# تحميل المستندات وبناء الفهرس كما كان من قبل
documents = SimpleDirectoryReader("data").load_data()
index = KeywordTableIndex.from_documents(documents, service_context=service_context)
# الآن يمكنك استخدام الفهرس مع LLM المخصص للاستعلامات
query_engine = index.as_query_engine()
response = query_engine.query("What did the author do after his time at Y Combinator?")
print(response)
يوضح هذا المثال كيفية إنشاء محول مخصص لـ Novita AI LLM ودمجه في إطار LlamaIndex. ستحتاج إلى استبدال
يرجى ملاحظة أن هذا مثال توضيحي وقد يتطلب تعديلات لتناسب الإصدارات المحددة للمكتبات التي تستخدمها وتفاصيل واجهة برمجة التطبيقات الدقيقة لـ Novita AI LLM. راجع دائمًا الوثائق الرسمية للحصول على أحدث المعلومات وأكثرها دقة.
LlamaIndex مقابل LangChain: كيفية استخدام LLM مخصص مع LangChain؟
لتكامل واجهة برمجة تطبيقات Novita AI LLM مع LangChain باستخدام LLM مخصص، ستحتاج إلى إنشاء فئة مخصصة تمدد فئة LLM الخاصة بـ LangChain وتستخدم واجهة برمجة تطبيقات Novita AI لمنطقها.
إليك دليل خطوة بخطوة حول كيفية القيام بذلك:
الخطوة 1: تثبيت مكتبة OpenAI Python
أولاً، تأكد من تثبيت مكتبة OpenAI، والتي ستستخدم للتفاعل مع واجهة برمجة تطبيقات Novita AI.
pip install 'openai>=1.0.0'
الخطوة 2: استيراد المكتبات المطلوبة
استيراد الوحدات الضرورية من LangChain ومكتبة OpenAI.
from typing import Any, Dict, Iterator, List, Optional
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM
from langchain_core.outputs import GenerationChunk
from openai import OpenAI
الخطوة 3: تعريف فئة LLM المخصصة
مدد فئة LLM لإنشاء LLM مخصص يستخدم واجهة برمجة تطبيقات Novita AI.
class NovitaAILLM(LLM):
def __init__(self, api_key: str, model_name: str = "Nous-Hermes-2-Mixtral-8x7B-DPO"):
self.api_key = api_key
self.model_name = model_name
self.client = OpenAI(api_key=api_key, base_url="https://api.novita.ai/v3/openai")
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> str:
"""تشغيل LLM على الإدخال المحدد."""
response = self.client.chat.completions.create(
model=self.model_name,
messages=[{"role": "user", "content": prompt}],
stream=False,
max_tokens=512,
)
return response.choices[0].message.content
def _stream(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
**kwargs: Any,
) -> Iterator[GenerationChunk]:
"""تدفق LLM على الموجه المحدد."""
response = self.client.chat.completions.create(
model=self.model_name,
messages=[{"role": "user", "content": prompt}],
stream=True,
max_tokens=512,
)
for chunk in response:
chunk_text = chunk.choices[0].delta.content or ""
yield GenerationChunk(text=chunk_text)
@property
def _identifying_params(self) -> Dict[str, Any]:
"""إرجاع قاموس بمعلمات التعريف."""
return {
"model_name": self.model_name,
}
@property
def _llm_type(self) -> str:
"""الحصول على نوع نموذج اللغة المستخدم من قبل نموذج المحادثة هذا. يستخدم لأغراض التسجيل فقط."""
return "NovitaAILLM"
الخطوة 4: تهيئة واستخدام LLM المخصص
أنشئ مثيلاً من LLM المخصص الخاص بك باستخدام مفتاح API الخاص بـ Novita AI واستخدمه لتوليد النص.
# استبدل بمفتاح API الفعلي لـ Novita AI
novita_api_key = "<YOUR Novita AI API Key>"
# تهيئة LLM المخصص
novita_llm = NovitaAILLM(api_key=novita_api_key)
# توليد النص
prompt = "Hi there!"
response = novita_llm._call(prompt=prompt)
print(response)
# أو تدفق الاستجابة
for chunk in novita_llm._stream(prompt=prompt):
print(chunk.text, end="")
يقوم هذا الكود بإعداد LLM مخصص يستخدم واجهة برمجة تطبيقات Novita AI لتوليد النص بناءً على موجه معين. يتم استخدام طريقة _call للاستجابات غير المتدفقة، ويتم استخدام طريقة _stream للاستجابات المتدفقة. قم بضبط model_name والمعلمات الأخرى حسب الحاجة بناءً على وثائق واجهة برمجة تطبيقات Novita AI ومتطلباتك الخاصة.
الخاتمة
في الختام، كل من LlamaIndex و LangChain هما أداتان قيمتان للعمل مع نماذج اللغة الكبيرة، ولكل منهما نقاط قوة مميزة. يتفوق LlamaIndex في استيعاب البيانات واسترجاعها، مما يجعله مثاليًا للمشاريع التي تتطلب معالجة فعالة لبيانات محددة وأنظمة متقدمة للإجابة على الأسئلة. يقدم LangChain إطار عمل أكثر شمولاً لتطوير ونشر تطبيقات LLM، وذلك بفضل هندسته المعيارية وتكاملاته الواسعة. يعتمد الاختيار بينهما على الاحتياجات المحددة لمشروعك.
الأسئلة الشائعة
هل يمكن استخدام LangChain و LlamaIndex معًا؟
نعم. يعتمد ذلك على الاحتياجات المحددة لمشروع LLM الخاص بك.
هل LangChain جيد للإنتاج؟
نعم، LangChain 0.1 والإصدارات الأحدث جاهزة للإنتاج.
أيهما أفضل لـ RAG، LlamaIndex أم LangChain؟
يوصى باستخدام LlamaIndex إذا كان تركيزك الأساسي على قدرات استرجاع البيانات والبحث. يعتبر LangChain أكثر ملاءمة للسيناريوهات التي تحتاج فيها إلى إطار عمل مرن يمكنه التعامل مع سير العمل المعقدة.
Novita AI هي المنصة السحابية الشاملة التي تمكن طموحاتك في الذكاء الاصطناعي. واجهات برمجة تطبيقات متكاملة، بدون خادم، مثيل GPU - الأدوات الفعالة من حيث التكلفة التي تحتاجها. تخلص من البنية التحتية، ابدأ مجانًا، وحقق رؤيتك في الذكاء الاصطناعي.
قراءة موصى بها
كيفية إنشاء LLM الخاص بك باستخدام LangChain: دليل خطوة بخطوة
