
وقت القراءة: ~ 10 دقائق
بناء art deco chatbot باستخدام pulsejet github repo: https://github.com/jet-engine/art-deco-chatbot
يمكن قراءة هذا المدونة من الروابط التالية:
تطورت نماذج اللغة الكبيرة (LLMS) بشكل كبير ، مما أدى إلى تحسين قدرتها على الإجابة على مجموعة واسعة من الأسئلة. ومع ذلك ، ما زالوا يواجهون تحديات ، خاصة مع معلومات محددة أو حديثة ، مما يؤدي غالبًا إلى عدم الدقة أو "الهلوسة". لمعالجة هذه القضايا ، يدمج نهج الجيل المعزز للاسترجاع (RAG) خطوة استرجاع المستند في عملية توليد الاستجابة. يستخدم هذا النهج مجموعة من المستندات ويستخدم قواعد بيانات المتجهات لاسترجاعها الفعال ، وتعزيز دقة وموثوقية استجابات LLM من خلال ثلاث خطوات رئيسية:
تسهل قواعد بيانات المتجهات عمليات البحث السريع في التشابه وإدارة البيانات الفعالة ، مما يجعل RAT حلاً قويًا لتعزيز إمكانيات LLM.
ترك عصر آرت ديكو ، الذي امتد في عشرينيات القرن العشرين إلى الأربعينيات ، إرثًا رائعًا في الهندسة المعمارية. على الرغم من قدرات نماذج مثل Meta's LAMA3.1 ، يمكن أن تكون ردودها غير موثوقة ، خاصة بالنسبة للاستعلامات الدقيقة أو التفصيلية الخاصة بـ Art Deco. هدفنا مع Art Deco chatbot هو استخدام Rag لتحسين جودة الاستجابات حول Art Deco Architecture ، ومقارنةها مع تلك التي تم إنشاؤها بواسطة LLMs التقليدية في كل من الجودة والكفاءة الزمنية.
من خلال تصميم Art Deco chatbot ، فإننا نهدف أيضًا إلى إظهار كيف يمكن بناء نظام خرقة معقد. يمكنك الوصول إلى الرمز الكامل في مستودع Art Deco chatbot github. من خلال فحص الكود وقراءة هذا ReadMe ، سوف تتعلم:
Ollama هو برنامج يسهل تشغيل نماذج LLM بسهولة على الآلات المحلية.
ollama pull llama3.1 (LLM التي سيتم استخدامها للخرقة)ollama pull nomic-embed-text (نموذج التضمين الذي سيتم استخدامه للخرقة) في هذا المشروع ، لا نهدف فقط إلى كتابة التعليمات البرمجية لإظهار كيف يمكن القيام بالخرقة ولكن أيضًا لمقارنة ونتائج نتائج RAT مع الاستعلامات إلى LLMs المختلفة. لا يمكن تشغيل بعض هذه LLMS محليًا (مثل GPT-4o ) ، في حين أن البعض الآخر يثقل بحساب ويتم تشغيله على الخدمات السحابية (مثل Llama3.1:70b على GROQ).
يوفر Litellm واجهة موحدة للاستعلام عن LLMs مختلفة ، مما يجعل نظافة الكود لدينا وأكثر قابلية للقراءة. يوصى بالتحقق من مكتبة Litellm Python ولكن غير مطلوب لهذا المشروع.
احصل على مفاتيح API الخاصة بك من Openai و Groq لاستخدامها في المشروع. كن على دراية بأنك قد تُعرف عن استخدام هذه الخدمات. على الرغم من أنه يمكن استخدام Groq API مجانًا في وقت كتابة هذا التقرير ، فإن OpenAI API ليس مجانيًا.
Pulsejet هي قاعدة بيانات متجه عالية الأداء تتيح التخزين والاسترجاع الفعال لتضمينات المستندات. لإعداد Pulsejet:
pip install pulsejetdocker run --name pulsejet_container -p 47044-47045:47044-47045 jetngine/pulsejet ملاحظة: يمكنك تخطي الخطوة الأولى لأن PulseJet تم تضمينه بالفعل في ملف requirements.txt .
تحقق من مستندات Pulsejet للحصول على تفاصيل حول تشغيل صور Docker Pulsejet واستخدام مكتبة Pulsejet Python لعمليات قاعدة بيانات المتجهات.
تثبيت جميع التبعيات اللازمة عن طريق التشغيل:
pip install -r requirements.txt
تم تطوير هذا المشروع باستخدام بيئة
condaمعPython 3.11.
نظرًا لأننا لم نختبر المشروع في بيئات مختلفة ، فإننا نوصي بالالتزام بهذا التكوين للأداء الأمثل والتوافق.
يستخدم Art Deco chatbot ملفين yaml للتكوين: config.template.yaml و secrets.yaml . إليك انهيار مفصل لكل قسم:
قم بإنشاء ملف secrets.yaml باستخدام مفاتيح API الخاصة بك:
# api_keys:
openai_key : " your_openai_key_here "
groq_key : " your_groq_key_here " # models:
main_model : " llama3.1 "
embed_model : " nomic-embed-text "
# vector_db:
vector_db : " pulsejet "
# pulsejet:
pulsejet_location : " remote "
pulsejet_collection_name : " art-deco "
# paths:
rag_files_path : " rag_files/ "
questions_file_path : " evaluation/questions.csv "
evaluation_path : " evaluation/ "
rag_prompt_path : " evaluation/rag_prompt.txt "
metrics_file_path : " evaluation/metrics.json "
# embeddings:
embeddings_file_path : " embeddings_data/all_embeddings_HSNW.h5 "
use_precalculated_embeddings : true
# llm_models:
all_models :
gpt-4o : " gpt-4o "
groq-llama3.1-8b : " groq/llama-3.1-8b-instant "
groq-llama3.1-70b : " groq/llama-3.1-70b-versatile "
ollama-llama3.1 : " ollama/llama3.1 "
ollama-llama3.1-70b : " ollama/llama3.1:70b "
selected_models :
- " gpt-4o "
- " groq-llama3.1-70b "
- " ollama-llama3.1 "
# rag_parameters:
sentences_per_chunk : 10
chunk_overlap : 2
file_extension : " .txt "إليك شرح مفصل لكل قسم:
true ، سيتم تحميل النظام التضمين من الملف المحدد. عندما يكون false ، فإنه سيولد تضمينات جديدة وحفظها في هذا الملف. تأكد من تحديث ملفات التكوين هذه مع إعداداتك المحددة قبل تشغيل المشروع. يمكن أن يؤثر ضبط معلمات RAG بشكل كبير على أداء ودقة نظام الخرقة. قد تكون التجربة مع قيم مختلفة ضرورية للعثور على التكوين الأمثل لحالة الاستخدام المحددة ومجموعة المستندات.
wiki-bot.pyهذه الخطوة اختيارية نظرًا لأن ملفات المحتوى لجميع المقالات المكثفة من Wikipedia متوفرة في https://huggingface.co/Datasets/jetengine/art_deco_usa_ds.
يمكنك تنزيل مجموعة البيانات هذه ونسخ جميع الملفات النصية منها إلى دليل RAG_FILES. إذا كنت تخطط لاستخدام التضمينات المحسوبة مسبقًا ، والتي سيتم شرحها في القسم التالي ، فلن تحتاج فعليًا إلى تنزيل مجموعة البيانات هذه.
ليست هناك حاجة لتكرار عملية التجريف. يمكنك تخطي قراءة بقية هذا القسم إذا لم تكن مهتمًا بعملية تجريف البيانات.
خطوتنا الأولية تنطوي على جمع المعرفة حول الهندسة المعمارية للفن. نحن نركز على الهياكل الأمريكية ، بالنظر إلى بروزها في حركة الفن-ديكو. يقوم برنامج Wiki-Bot.py بأتمتة مجموعة مقالات ويكيبيديا ذات الصلة ، وتنظيمها في دليل منظم لسهولة الوصول.
قم بتشغيل الروبوت باستخدام:
python wiki-bot.py
عندما تقوم بتشغيل wiki-bot.py باستخدام دليل rag_files فارغ ، فإنه يحفظ محتويات مقالات ويكيبيديا المكسورة في مجلد فرعي يسمى text تحت RAG_FILES. يقوم الروبوت أيضًا بإنشاء مختلف اللاعبين الفرعيين لتنظيم أنواع مختلفة من البيانات مثل عناوين URL ، والمراجع ، وما إلى ذلك ، نظرًا لأن تركيزنا الحالي هو فقط على محتويات مقالات ويكيبيديا ، لتقليل الفوضى ، قمنا فقط بنقل المحتويات من المجلد الفرعي text إلى مجموعة بيانات الزئبق الخاصة بنا وإزالة جميع الأزهار الفرعية الأخرى.
وبالتالي ، إذا كنت ترغب في تشغيل الروبوت بنفسك ، وهو أمر اختياري نظرًا لأن المستندات المكسورة متوفرة بالفعل في وجه المعانقة ، فستحتاج إما إلى نسخ جميع الملفات من مجلد النص الفرعي إلى دليل rag_files ثم حذف جميع المرحلين الفرعيين داخل rag_files ، أو ببساطة تغيير rag_files_path في config.yaml إلى rag_files/text .
indexing.pyفهرس المستندات عن طريق التشغيل:
python indexing.py
يقوم هذا البرنامج النصي بمعالجة المستندات ، ويولد التضمينات ، ويخزنها في Pulsejet. إذا كنت لا ترغب في فقدان الوقت لتوليد التضمينات ، فيمكنك تنزيل التضمينات المسبقة مسبقًا من https://huggingface.co/jetengine/rag_art_deco_embeddings وتعيين use_precalculated_embeddings: true في التكوين.
يستغرق توليد الإعداد من التضمينات حوالي 15 دقيقة لإكماله ويستغرق إدراج المتجهات إلى Pulsejet حوالي 4 ثوان .
يقوم البرنامج النصي بإخراج معلومات توقيت:
chat.pyتأكد من أن التكوين الخاص بك صحيح ، ثم قم بتشغيله:
python chat.py
يستفسر هذا البرنامج النصي LLMs ونظام الخرقة ، ينتج عن تنسيقات HTML و JSON و CSV للمقارنة.
يتم استخدام Pulsejet في هذا المشروع لتخزين واسترجاع المتجهات الفعال. فيما يلي نظرة عامة مفصلة على كيفية دمج Pulsejet في مشروع Art Deco chatbot:
تهيئة عميل Pulsejet :
client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ]) هذا يخلق عميل النبض. في مشروعنا ، نستخدم مثيل Pulsejet عن بُعد ، بحيث يتم تعيين location على "Remote". يتصل هذا بخادم PulseJet الذي يعمل في حاوية Docker.
إنشاء مجموعة :
client . create_collection ( collection_name , vector_config ) هذا يخلق مجموعة جديدة في Pulsejet لتخزين وثيقة التضمينات لدينا. تحدد معلمة vector_config التكوين لتخزين المتجه ، مثل حجم المتجه ونوع الفهرس (على سبيل المثال ، HNSW للبحث الفعال عن التشابه).
المتجهات المدونة : في مشروعنا ، نستخدم النمط التالي لإدراج المتجهات:
collection [ 0 ]. insert_single ( collection [ 1 ], embed , meta )قد يبدو هذا مربكًا في البداية ، ولكن هذا ما يعنيه:
collection[0] هي في الواقع مثيل عميل PulseJet لدينا.collection[1] هو اسم المجموعة التي نؤدي إليها.embed هو المتجه الذي نؤديه.meta هو بيانات تعريف إضافية مرتبطة بالمتجه.هذا يعادل الاتصال:
client . insert_single ( collection_name , vector , meta )للإدراج بالجملة ، نستخدم:
client . insert_multi ( collection_name , embeds )هذا يدرج العديد من التضمين في وقت واحد ، وهو أكثر كفاءة لمجموعات البيانات الكبيرة.
المتجهات البحث :
results = client [ 'db' ]. search_single ( collection , query_embed , limit = 5 , filter = None ) يؤدي هذا بحثًا عن التشابه في مجموعة PulseJet المحددة للعثور على المستندات الأكثر صلة بموجه استعلام معين. تحدد المعلمة limit الأقصى لعدد النتائج المراد إرجاعها.
في مشروعنا ، يتم استخدام client['db'] للوصول إلى طرق قاعدة البيانات الخاصة بعميل PulseJet. هذا يعادل استخدام العميل مباشرة:
results = client . search_single ( collection_name , query_vector , limit = 5 , filter = None )إغلاق الاتصال :
client . close ()هذا يغلق الاتصال بقاعدة بيانات PulseJet عندما لم تعد هناك حاجة إليها.
يتم تعريف فئة PulsejetRagClient في pulsejet_rag_client.py وتوفر واجهة عالية المستوى للتفاعل مع pulsejet في سياق نظام الخرقة لدينا. إليك تفاصيل عن مكوناتها الرئيسية:
التهيئة :
class PulsejetRagClient :
def __init__ ( self , config ):
self . config = config
self . collection_name = config [ 'pulsejet_collection_name' ]
self . main_model = config [ 'main_model' ]
self . embed_model = config [ 'embed_model' ]
self . client = pj . PulsejetClient ( location = config [ 'pulsejet_location' ])تتم تهيئة العميل باستخدام معلمات التكوين ، وإعداد عميل PulseJet وتخزين قيم التكوين ذات الصلة.
إنشاء مجموعة :
def create_collection ( self ):
vector_size = get_vector_size ( self . config [ 'embed_model' ])
vector_params = pj . VectorParams ( size = vector_size , index_type = pj . IndexType . HNSW )
try :
self . client . create_collection ( self . collection_name , vector_params )
logger . info ( f"Created new collection: { self . collection_name } " )
except Exception as e :
logger . info ( f"Collection ' { self . collection_name } ' already exists or error occurred: { str ( e ) } " ) تنشئ هذه الطريقة مجموعة جديدة في PulseJet مع المعلمات المحددة. يستخدم وظيفة get_vector_size لتحديد حجم المتجه المناسب للتضمينات.
المتجهات المدور :
def insert_vector ( self , vector , metadata = None ):
try :
self . client . insert_single ( self . collection_name , vector , metadata )
logger . debug ( f"Inserted vector with metadata: { metadata } " )
except Exception as e :
logger . error ( f"Error inserting vector: { str ( e ) } " )
def insert_vectors ( self , vectors , metadatas = None ):
try :
self . client . insert_multi ( self . collection_name , vectors , metadatas )
logger . debug ( f"Inserted { len ( vectors ) } vectors" )
except Exception as e :
logger . error ( f"Error inserting multiple vectors: { str ( e ) } " )تتعامل هذه الطرق مع إدخال متجهات واحدة ومتعددة في مجموعة Pulsejet ، إلى جانب البيانات الوصفية المرتبطة بها.
المتجهات البحث :
def search_similar_vectors ( self , query_vector , limit = 5 ):
try :
results = self . client . search_single ( self . collection_name , query_vector , limit = limit , filter = None )
return results
except Exception as e :
logger . error ( f"Error searching for similar vectors: { str ( e ) } " )
return []تؤدي هذه الطريقة بحثًا عن التشابه في مجموعة PulseJet للعثور على المستندات الأكثر صلة بمتجه استعلام معين.
إغلاق الاتصال :
def close ( self ):
try :
self . client . close ()
logger . info ( "Closed Pulsejet client connection" )
except Exception as e :
logger . error ( f"Error closing Pulsejet client connection: { str ( e ) } " )تغلق هذه الطريقة الاتصال بقاعدة بيانات PulseJet عندما لم تعد هناك حاجة إليها.
يتم استخدام PulsejetRagClient في جميع أنحاء المشروع للتفاعل مع pulsejet. إليكم كيف يتم إنشاء مثيل له واستخدامه:
الخلق :
from pulsejet_rag_client import create_pulsejet_rag_client
config = get_config ()
rag_client = create_pulsejet_rag_client ( config )مستندات الفهرسة :
في indexing.py ، نستخدم العميل لإنشاء متجهات المجموعة وإدراجها:
rag_client . create_collection ()
for file_name , file_embeddings in embeddings_data . items ():
for chunk_id , content , embed in file_embeddings :
metadata = { "filename" : file_name , "chunk_id" : chunk_id , "content" : content }
rag_client . insert_vector ( embed , metadata ) في rag.py ، نستخدم العميل للبحث عن متجهات مماثلة أثناء عملية RAG:
results = rag_client . search_similar_vectors ( query_embed , limit = 5 )بعد اكتمال العمليات ، نغلق الاتصال:
rag_client . close ()يوفر هذا التنفيذ واجهة نظيفة مغلفة لجميع عمليات Pulsejet في نظام الخرقة لدينا.
LLama3.1 وقتًا أطول من الإجابة على أسئلة بسيطة بسبب زيادة طول الاستعلام.يوضح Art Deco chatbot كيف يمكن استخدام LLMs بشكل أفضل مع RAC. يوفر مشروعنا استكشافًا شاملاً لتنفيذ خرقة ، ويغطي كل خطوة من تجريف البيانات وتجميع المستندات لتضمين إنشاء وتكامل قواعد بيانات المتجهات.
نظرًا لأن قاعدة المستندات لنظام الخرقة تزداد حجمها ، يصبح أداء عمليات الإدراج والبحث أمرًا بالغ الأهمية بشكل متزايد. من خلال تعلم كيفية دمج قاعدة بيانات Vector Pulsejet في نظام خرقة كامل ، يمكن للمرء أن يستفيد بشكل كبير من قدراته ، لا سيما عند التعامل مع تطبيقات RAG على قواعد المستندات الكبيرة.
يمكن أن تكون ردودنا بالخرس أكثر دقة. لتعزيز أداء Art Deco chatbot ، نحن نفكر في العديد من الأساليب التجريبية:
نخطط لتوسيع هذا المشروع من خلال المبادرات التالية:
نحن نشجعك على تجربة Art Deco chatbot ، وتعديل معلماتها ، وتكييفها مع مجالات الاهتمام الخاصة بك.
المؤلف: Güvenç Usanmaz