يهدف هذا المشروع الصغير إلى دمج إدخالات مدونة WordPress في قاعدة معرفية تستخدم تقنيات الاسترجاع المعزز (RAG).
فرضية هذا المشروع بسيطة - سلسلة من البرامج النصية ستنفذ إجراءات محددة عبر سطر الأوامر. كل نص مستقل بذاته، مما يساعد على توضيح كل إجراء ضمن سياقه الخاص، بشكل بسيط نسبيًا.
افتراضيًا، تستخدم البرامج النصية المضمنة مكتبات ونماذج مجانية ومفتوحة المصدر، على الرغم من توفر خيار استخدام LLMs الخاص بـ OpenAI إذا كان لديك حق الوصول. يجب أن يكون هذا المثال قادرًا على التشغيل على وحدة المعالجة المركزية إذا لم يكن لديك وحدة معالجة رسومات متوافقة، ولكن YMMV.
يستخدم RAG مكونين: نظام الاسترجاع ونموذج اللغة التوليدية. يقوم نظام الاسترجاع بالاستعلام عن المستندات ذات الصلة بالاستعلام من مخزن البيانات/قاعدة المعرفة (على سبيل المثال، مجموعة من منشورات المدونة). يتم بعد ذلك إدخال المستندات المستردة في نموذج اللغة، مما ينتج عنه استجابات مستنيرة للمستخدم. إحدى الفوائد الأساسية لاستخدام RAG هي أنه يسمح لنظام الذكاء الاصطناعي بالتوسع إلى ما هو أبعد من بيانات التدريب دون الحاجة إلى الضبط الدقيق أو إعادة التدريب - حيث يمكن إضافة البيانات وتحديثها في مخزن البيانات ديناميكيًا. يمكن أن تتضمن نتائج الاستعلام ليس فقط النص المقدم من نموذج اللغة، ولكن أيضًا مجموعة من المستندات أو المصادر ذات الصلة. يمكنك قراءة المزيد عن RAG في مدونة أبحاث IBM.
هذا مشروع سهل إلى حد ما للبدء والتشغيل ...
قم أولاً بإعداد البيئة الافتراضية للمشروع وتنشيطها
python3 -m venv virtualenv
source ./virtualenv/bin/activate
يمكنك تثبيت كافة التبعيات لهذا المشروع باستخدام ملف requirements.txt
. إذا قمت بذلك، ليست هناك حاجة لتثبيت الحزم الأخرى يدويًا عبر pip
في هذا المستند.
pip install -r requirements.txt
قم بإنشاء ملف .env
باستخدام env.example
كدليل.
cp env.example .env
سيكون هذا مهمًا لتنزيل بيانات WordPress الخاصة بك. تأكد من نسخ اسم مستخدم Wordpress وكلمة مرور التطبيق ومجال المدونة إلى ملف .env
. ملاحظة: يفترض هذا أن المدونة موجودة في المسار الجذر.
pip install --upgrade python-dotenv requests pandas langchain langchain_community html2text sentence_transformers
قم بتنزيل محتوى WordPress إلى دليل ./data
(وهذا يفترض أن مدونتك موجودة في جذر النطاق، في الوقت الحالي):
python3 wordpress-dl.py
يتم استخدام PGVector لتخزين تضمينات النص (المتجهات) والاستعلام عنها في قاعدة بيانات Postgresql. إحدى فوائد PGVector هي أنه يمكن إضافتها إلى أنظمة قواعد البيانات الموجودة ولا تتطلب منتجات خاصة لجهات خارجية.
لدعم تضمين pgvector:
pip install pgvector psycopg2-binary
تأكد من أن لديك قيم .env
المناسبة. على الرغم من أن الإعدادات الافتراضية مناسبة للتطوير المحلي، إلا أنه من المحتمل أن يكون لديك شيء مختلف إذا كنت تستخدم قاعدة بيانات Postgres موجودة (على سبيل المثال، عدم تشغيل صورة عامل الإرساء). هنا، نستخدم صورة Docker لإبقاء الإعداد بسيطًا، ولكن يمكنك بسهولة استخدام مثيل PostgreSQL آخر إذا كنت قادرًا على إضافة وتحميل ملحق pgvector بنفسك.
لتشغيل صورة عامل الإرساء في ./postgres
:
docker compose up
قم بتشغيل البرنامج النصي للتضمينات لتنزيل WordPress وحفظ التضمينات في قاعدة بيانات postgres. قد يستغرق هذا بعض الوقت. _إذا كنت تريد إدراج بيانات في قاعدة البيانات، أي مسح البيانات النظيفة والبدء بها، فمرر وسيطة --embed
CLI:
python3 embed.py --embed
افتراضيًا، يتم إدراج سجل واحد فقط للاختبار (على سبيل المثال، من خلال عدم تحديد --limit
ثم بعض الأعداد الصحيحة > 1، سيؤدي ذلك فقط إلى إنشاء تضمين المتجهات للسجل الأول) - حتى تتمكن من الاختبار بشكل أسهل دون إنفاق الكثير من وقت الحساب الإضافي.
إذا كنت ترغب في الحصول على معلومات إضافية، قم بتمرير --verbose
يمكن أن يبدو نموذج الاستدعاء كما يلي:
python3 embed.py --verbose --embed --limit 100
...ولكن قم بزيادة الحد الخاص بك بالحجم المناسب لمدونة WordPress الخاصة بك. لا توجد مشكلة إذا كان الرقم أكبر من عدد الإدخالات - إنه ذكي بما يكفي لاستيراد ما يصل إلى الحد الأقصى لعدد السجلات.
يوضح هذا الريبو حالات الاستخدام المحلية والمستندة إلى واجهة برمجة التطبيقات. إحدى فوائد النموذج الذي يتم تشغيله محليًا هو أن بياناتك تظل خاصة ولن يتم استخدامها لتدريب نماذج الآخرين. علاوة على ذلك، يمكن أن يكون هناك بعض المكاسب في الأداء من خلال الاحتفاظ بالاستعلامات المحلية على خادم أو شبكة، إلا أنها لا تتحمل تكاليف استخدام واجهة برمجة التطبيقات (API) على الأنظمة ذاتية الاستضافة. من ناحية أخرى، قد يكون استخدام واجهة برمجة التطبيقات (API) مرغوبًا، نظرًا لأن OpenAI يحتوي على نوافذ سياق أكبر بكثير من النموذج المستخدم في هذا المشروع، ويمكن أن تكون نماذج OpenAI جيدة جدًا.
سيحتاج استخدام نموذج اللغة المحلية إلى حزمة trsnformers
python وpytorch ( torch
)
pip install transformers torch llama-cpp-python
بعد ذلك، قم بتنزيل النموذج المستخدم في هذا النهج غير المتصل بالإنترنت. نظرًا لأن نماذج اللغة يمكن أن تكون كبيرة (عدة غيغابايت)، فقد اخترت نموذجًا أصغر من اللاما يوضح ذلك. يمكن استخدام نماذج أصغر، ولكن في كثير من الأحيان في حدود نوافذ السياق، والتي يمكن تخفيفها، ولكن خارج نطاق هذا المشروع. يستخدم هذا المشروع TheBloke/Llama-2-7b-Chat-GGUF
( Q4_K_M
)
(إذا لم يكن huggingface-cli
مثبتًا لديك، فيمكنك العثور على التفاصيل هنا).
huggingface-cli download TheBloke/Llama-2-7b-Chat-GGUF llama-2-7b-chat.Q4_K_M.gguf --local-dir ./models/ --local-dir-use-symlinks True
سيقوم هذا الأمر بتنزيل النموذج إلى مدير ذاكرة التخزين المؤقت لحساب المستخدم، وسيتم ربطه من دليل النماذج.
بمجرد تنزيل النموذج، يمكنك تشغيل الاستدلال المحلي، وهو الخيار الافتراضي. راجع القسم التالي، الاستعلام عن التعليمات.
التثبيت مطلوب لاستخدام OpenAI API
pip install langchain_openai
تأكد من حفظ مفتاح OpenAI API في ملف .env
الخاص بك. يمكنك تكوينه في علامة التبويب مفتاح OpenAI Platform API: OPENAI_API_KEY="...
الوثائق (المضمنة والمسترجعة، راجع للشغل) لها الهيكل العام التالي في هذا المشروع.
## document
## page_content
## metadata
## id
## link
## title
## categories
## tags
غالبًا ما يتم إرجاع النتائج List
من المجموعات (idx، Document)، لذلك من المناسب التعداد في القائمة:
for ( idx , doc ) in enumerate ( results [" docs ]):
print ( f" { doc . metadata [ 'title' ] } " )
سيتم تضمين معظم البيانات المفيدة لزيادة استجابات LLM في خاصية metadata
، وهو قاموس للبيانات التي يتم إدخالها أثناء التضمين.
يعد تشغيل الاستعلامات من CLI أمرًا بسيطًا.
...النموذج المحلي:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? "
...باستخدام OpenAI:
python3 query.py --query " Does RaspberryPi have GPIO that swift can use? " --use-api
بعد لحظات قليلة، توقع رؤية رد مثل هذا،
❓ 'Does RaspberryPi have GPIO that swift can use?'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yes, RasbperryPi has GPIO that swift can use as per the context given.
- - Supporing Docs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
? Accessing Raspberry Pi GPIO Pins (With Swift) ? https://archive.mistercameron.com/2016/06/accessing-raspberry-pi-gpio-pins-with-swift/
? Currently, Swift on Raspberry Pi3 ? https://archive.mistercameron.com/2016/04/currently-swift-on-raspberry-pi3/
? Compile Swift 3.0 on Your ARM computers (Raspberry Pi, BeagleBone Black, etc) ? https://archive.mistercameron.com/2016/06/compile-swift-3-0-on-your-arm-computer/
? Ready Your Raspberry Pi for Swift ? https://archive.mistercameron.com/2016/05/ready-your-raspberry-pi-for-swift/
~ ~ ~ ~ ~ Finished in 14.80s ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
********************************************************************************
هناك وسائط إضافية يمكن أن تكون مفيدة عند اختبار بياناتك ونماذجك. قم بتشغيل python3 query.py --help
لمزيد من الخيارات.