تخطئ روبوتات الدردشة ذات النماذج اللغوية الكبيرة (LLM) مثل ChatGPT وGPT-4 كثيرًا، خاصة إذا كانت المعلومات التي تبحث عنها حديثة ("أخبرني عن Super Bowl 2024.") أو حول موضوعات أقل شيوعًا ("ما هي؟") بعض الأفلام الجيدة التي يمكنك مشاهدتها من [أدخل مخرجك الأجنبي المفضل]؟"). يستخدم WikiChat ويكيبيديا وخط الأنابيب التالي المكون من 7 مراحل للتأكد من أن ردوده واقعية. تتضمن كل مرحلة مرقمة مكالمة LLM واحدة أو أكثر.
تحقق من ورقتنا لمزيد من التفاصيل: سينا جيه سمناني، وفيوليت زي ياو*، وهايدي سي تشانغ*، ومونيكا إس لام. 2023. WikiChat: إيقاف هلوسة روبوتات المحادثة ذات النماذج اللغوية الكبيرة من خلال تقنية Few-Shot Grounding على ويكيبيديا. في نتائج جمعية اللغويات الحاسوبية: EMNLP 2023، سنغافورة. جمعية اللغويات الحاسوبية.
(22 أغسطس 2024) WikiChat 2.0 متوفر الآن! تشمل التحديثات الرئيسية ما يلي:
يدعم الآن الاسترجاع من البيانات المنظمة مثل الجداول وصناديق المعلومات والقوائم، بالإضافة إلى النص.
يحتوي على نصوص المعالجة المسبقة العامة لـ Wikipedia بأعلى جودة
يستخدم نموذج الاسترجاع متعدد اللغات الحديث BGE-M3.
يستخدم Qdrant للبحث عن المتجهات القابلة للتطوير.
يستخدم RankGPT لإعادة ترتيب نتائج البحث.
دعم متعدد اللغات: بشكل افتراضي، يسترد المعلومات من 10 مواقع ويكيبيديا مختلفة: ؟؟ إنجليزي، ؟؟ صيني،؟؟ الاسبانية؟؟ البرتغالية،؟؟ روسية؟؟ الألمانية،؟؟ الفارسية؟؟ اليابانية،؟؟ الفرنسية و؟؟ ايطالي.
تحسين استرجاع المعلومات
واجهة برمجة تطبيقات مجانية لبحث ويكيبيديا متعدد اللغات: نحن نقدم واجهة برمجة تطبيقات بحث مجانية عالية الجودة (لكن بمعدل محدود) للوصول إلى 10 مواقع ويكيبيديا، تشمل أكثر من 180 مليون عملية تضمين متجهة.
توافق LLM الموسع: يدعم أكثر من 100 LLM من خلال واجهة موحدة، وذلك بفضل LiteLLM.
خط الأنابيب الأمثل: خيار لخط أنابيب أسرع وأكثر فعالية من حيث التكلفة من خلال دمج مرحلتي "إنشاء" و"استخراج المطالبة" في WikiChat.
توافق LangChain: متوافق تمامًا مع LangChain ️؟.
وأكثر من ذلك بكثير!
(20 يونيو 2024) فاز WikiChat بجائزة ويكيميديا للأبحاث لعام 2024!
تذهب جائزة @Wikimedia Research لعام 2024 إلى "WikiChat: إيقاف هلوسة روبوتات الدردشة ذات النماذج اللغوية الكبيرة من خلال تأريض عدد قليل من اللقطات على ويكيبيديا" ⚡
– ورشة ويكي 2024 (@wikiworkshop) 20 يونيو 2024
؟ https://t.co/d2M8Qrarkw pic.twitter.com/P2Sh47vkyi
(16 مايو 2024) تم قبول ورقة المتابعة الخاصة بنا "؟ SPAGHETTI: الإجابة على سؤال المجال المفتوح من مصادر البيانات غير المتجانسة مع الاسترجاع والتحليل الدلالي" في نتائج ACL 2024. تضيف هذه الورقة دعمًا للبيانات المنظمة مثل الجداول وصناديق المعلومات والقوائم.
(8 يناير 2024) تم إصدار نماذج LLaMA-2 المقطرة. يمكنك تشغيل هذه النماذج محليًا للحصول على بديل أرخص وأسرع لواجهات برمجة التطبيقات المدفوعة.
(8 ديسمبر 2023) نعرض عملنا في EMNLP 2023.
(27 أكتوبر 2023) النسخة الجاهزة للكاميرا من ورقتنا متاحة الآن على arXiv.
(06 أكتوبر 2023) تم قبول ورقتنا البحثية في نتائج EMNLP 2023.
يتضمن تثبيت WikiChat الخطوات التالية:
تثبيت التبعيات
قم بتكوين LLM من اختيارك. يدعم WikiChat أكثر من 100 ماجستير في القانون، بما في ذلك نماذج من OpenAI وAzure وAnthropic وMistral وHuggingFace وTogether.ai وGroq.
حدد مصدر استرجاع المعلومات. يمكن أن يكون هذا أي نقطة نهاية HTTP تتوافق مع الواجهة المحددة في retrieval/retriever_server.py. نحن نقدم التعليمات والبرامج النصية للخيارات التالية:
استخدم واجهة برمجة التطبيقات (API) المجانية ذات الأسعار المحدودة الخاصة بنا لويكيبيديا بـ 10 لغات.
قم بتنزيل واستضافة فهرس ويكيبيديا المقدم بنفسك.
قم بإنشاء وتشغيل فهرس مخصص جديد من مستنداتك الخاصة.
قم بتشغيل WikiChat بالإعدادات التي تريدها.
[اختياري] انشر WikiChat للوصول لعدة مستخدمين. نحن نقدم تعليمات برمجية لنشر واجهة أمامية وخلفية بسيطة، بالإضافة إلى تعليمات للاتصال بقاعدة بيانات Azure Cosmos DB لتخزين المحادثات.
تم اختبار هذا المشروع باستخدام Python 3.10 على Ubuntu 20.04 LTS (Focal Fossa)، ولكن يجب أن يكون متوافقًا مع العديد من توزيعات Linux الأخرى. إذا كنت تخطط لاستخدام هذا على Windows WSL أو macOS، أو مع إصدار Python مختلف، فكن مستعدًا لاستكشاف الأخطاء وإصلاحها المحتملة أثناء التثبيت.
تختلف متطلبات الأجهزة بناءً على الاستخدام المقصود:
الاستخدام الأساسي: تشغيل WikiChat باستخدام واجهات برمجة تطبيقات LLM وواجهة برمجة تطبيقات بحث Wikipedia الخاصة بنا يتطلب الحد الأدنى من متطلبات الأجهزة ويجب أن يعمل على معظم الأنظمة.
فهرس البحث المحلي: إذا كنت تنوي استضافة فهرس بحث محليًا، فتأكد من أن لديك مساحة كافية على القرص للفهرس. بالنسبة للمؤشرات الكبيرة، يعتمد زمن الوصول للاسترجاع بشكل كبير على سرعة القرص، لذلك نوصي باستخدام محركات أقراص SSD ويفضل محركات أقراص NVMe. على سبيل المثال، تعد الأجهزة الافتراضية المُحسّنة للتخزين مثل Standard_L8s_v3 على Azure مناسبة لهذا الغرض.
LLM محلي: إذا كنت تخطط لاستخدام WikiChat مع LLM محلي، فمن الضروري وجود وحدة معالجة الرسومات (GPU) لاستضافة النموذج.
إنشاء فهرس استرجاع جديد: إذا كنت تريد فهرسة مجموعة، فأنت بحاجة إلى وحدة معالجة الرسومات (GPU) لتضمين المستندات في المتجهات. يتطلب نموذج التضمين الافتراضي (BAAI/BGE-M3) ما لا يقل عن 13 جيجابايت من ذاكرة وحدة معالجة الرسومات (GPU) للتشغيل.
أولاً، قم باستنساخ المستودع:
استنساخ بوابة https://github.com/stanford-oval/WikiChat.git قرص مضغوط ويكي شات
نوصي باستخدام بيئة conda المحددة في conda_env.yaml. تتضمن هذه البيئة Python 3.10 وpip وgcc وg++ وmake وRedis وجميع حزم Python المطلوبة.
تأكد من تثبيت Conda أو Anaconda أو Miniconda. ثم قم بإنشاء وتنشيط بيئة conda:
إنشاء conda env --ملف conda_env.yaml كوندا تفعيل ويكي شات python -m spacy download en_core_web_sm # Spacy مطلوب فقط لبعض تكوينات WikiChat
إذا رأيت خطأ: فشل بحث Redis بعد تشغيل chatbot، فمن المحتمل أن يعني ذلك أن Redis لم يتم تثبيته بشكل صحيح. يمكنك محاولة إعادة تثبيته باتباع وثائقه الرسمية.
حافظ على تنشيط هذه البيئة لجميع الأوامر اللاحقة.
قم بتثبيت Docker لنظام التشغيل الخاص بك باتباع الإرشادات الموجودة على https://docs.docker.com/engine/install/. يستخدم WikiChat Docker في المقام الأول لإنشاء قواعد بيانات متجهة وتقديمها للاسترجاع، على وجه التحديد؟ تضمين النص الاستدلال وQdrant. في إصدارات Ubuntu الحديثة، يمكنك تجربة تشغيل inv install-docker. بالنسبة لأنظمة التشغيل الأخرى، اتبع الإرشادات الموجودة على موقع عامل الإرساء.
يستخدم WikiChat الاستدعاء لإضافة أوامر مخصصة لأغراض مختلفة. لرؤية جميع الأوامر المتاحة وأوصافها، قم بتشغيل:
استدعاء --list
أو الاختصار:
الجرد -ل
لمزيد من التفاصيل حول أمر محدد، استخدم:
inv [اسم الأمر] - مساعدة
يتم تنفيذ هذه الأوامر في مجلد المهام/.
WikiChat متوافق مع العديد من شهادات LLM، بما في ذلك نماذج من OpenAI وAzure وAnthropic وMistral وTogether.ai وGroq. يمكنك أيضًا استخدام WikiChat مع العديد من النماذج المستضافة محليًا عبر HuggingFace.
لتكوين LLM الخاص بك:
املأ الحقول المناسبة في llm_config.yaml.
قم بإنشاء ملف باسم API_KEYS (والذي تم تضمينه في .gitignore).
في ملف API_KEYS، قم بتعيين مفتاح API لنقطة نهاية LLM التي تريد استخدامها. يجب أن يتطابق اسم مفتاح API مع الاسم الذي قدمته في llm_config.yaml ضمن api_key. على سبيل المثال، إذا كنت تستخدم نماذج OpenAI عبر openai.com وMistral endpoints، فقد يبدو ملف API_KEYS الخاص بك كما يلي:
# املأ القيم التالية بمفاتيح API الخاصة بك. تأكد من عدم وجود مساحة إضافية بعد المفتاح. # يتم تجاهل التغييرات التي يتم إجراؤها على هذا الملف بواسطة git، حتى تتمكن من تخزين مفاتيحك بأمان هنا أثناء التطوير.OPENAI_API_KEY=[مفتاح OpenAI API الخاص بك من https://platform.openai.com/ مفاتيح واجهة برمجة التطبيقات] MISTRAL_API_KEY=[مفتاح واجهة برمجة تطبيقات Mistral الخاص بك من https://console.mistral.ai/api-keys/]
لاحظ أن النماذج المستضافة محليًا لا تحتاج إلى مفتاح API، لكنك تحتاج إلى توفير نقطة نهاية متوافقة مع OpenAI في api_base. تم اختبار الكود مع ؟ استنتاج توليد النص.
افتراضيًا، يسترد WikiChat المعلومات من 10 مواقع ويكيبيديا عبر نقطة النهاية على https://wikichat.genie.stanford.edu/search/. إذا كنت تريد فقط تجربة WikiChat، فلن تحتاج إلى تعديل أي شيء.
قم بتنزيل فهرس 1 أغسطس 2024 الذي يضم 10 لغات ويكيبيديا من؟ المحور واستخراجه:
تنزيل inv-wikipedia-index --workdir ./workdir
لاحظ أن هذا الفهرس يحتوي على ما يقرب من 180 مليونًا من التضمينات المتجهة وبالتالي يتطلب ما لا يقل عن 500 جيجابايت من مساحة القرص الفارغة. يستخدم التكميم الثنائي لـ Qdrant لتقليل متطلبات ذاكرة الوصول العشوائي (RAM) إلى 55 جيجابايت دون التضحية بالدقة أو زمن الوصول.
قم بتشغيل خادم FastAPI مشابه للخيار 1 الذي يستجيب لطلبات HTTP POST:
مسترد بداية inv - نموذج التضمين BAAI/bge-m3 - منفذ المسترد <رقم المنفذ>
ابدأ WikiChat عن طريق تمرير عنوان URL الخاص بهذا المسترد. على سبيل المثال:
عرض توضيحي لـ inv --retriever-endpoint "http://0.0.0.0:/search"
لاحظ أن هذا الخادم ونموذج التضمين الخاص به يعملان على وحدة المعالجة المركزية (CPU)، ولا يتطلبان وحدة معالجة الرسومات (GPU). للحصول على أداء أفضل، على الأنظمة المتوافقة، يمكنك إضافة --use-onnx لاستخدام إصدار ONNX من نموذج التضمين، لتقليل زمن وصول التضمين بشكل ملحوظ.
سيقوم الأمر التالي بتنزيل أحدث نسخة HTML من ويكيبيديا الكردية ومعالجتها مسبقًا وفهرستها، والتي نستخدمها في هذا المثال لحجمها الصغير نسبيًا.
مؤشر inv-wikipedia-dump --نموذج التضمين BAAI/bge-m3 --workdir ./workdir --language ku
قم بمعالجة بياناتك مسبقًا في ملف JSON Lines (بامتداد الملف .jsonl أو .jsonl.gz) حيث يحتوي كل سطر على الحقول التالية:
{"id": "integer"، "content_string": "string"، "article_title": "string"، "full_section_title": "string"، "block_type": "string"، "language": "string"، " last_edit_date": "سلسلة (اختياري)", "num_tokens": "عدد صحيح (اختياري)"}
يجب أن يكون content_string هو النص المقسم لمستنداتك. نوصي بتقسيم الرموز المميزة إلى أقل من 500 رمز مميز لنموذج التضمين. راجع هذا للحصول على نظرة عامة حول طرق التقطيع. يتم استخدام نوع_block_type واللغة فقط لتوفير التصفية لنتائج البحث. إذا لم تكن في حاجة إليها، يمكنك ببساطة ضبطها على block_type=text and language=en. سيقوم البرنامج النصي بتغذية full_section_title وcontent_string إلى نموذج التضمين لإنشاء متجهات التضمين.
راجع المعالجة المسبقة/preprocess_wikipedia_html_dump.py للحصول على تفاصيل حول كيفية تنفيذ ذلك لتفريغ Wikipedia HTML.
قم بتشغيل أمر الفهرسة:
مجموعة فهرس inv - مسار المجموعة <المسار إلى JSONL المعالج مسبقًا - اسم المجموعة <الاسم>
يبدأ هذا الأمر حاويات الإرساء لـ؟ استنتاج تضمين النص (واحد لكل وحدة معالجة رسومات متاحة). افتراضيًا، يستخدم صورة عامل الإرساء المتوافقة مع وحدات معالجة الرسومات NVIDIA ذات بنية Ampere 80، على سبيل المثال A100. يتوفر أيضًا دعم لبعض وحدات معالجة الرسومات الأخرى، ولكنك ستحتاج إلى اختيار صورة عامل الإرساء الصحيحة من صور عامل الإرساء المتاحة.
(اختياري) قم بإضافة فهرس الحمولة
استرجاع بايثون/add_payload_index.py
سيؤدي هذا إلى تمكين الاستعلامات التي تتم تصفيتها حسب اللغة أو block_type. لاحظ أنه بالنسبة للمؤشرات الكبيرة، قد يستغرق الأمر عدة دقائق حتى يصبح الفهرس متاحًا مرة أخرى.
بعد الفهرسة، قم بتحميل الفهرس واستخدامه كما في الخيار 2. على سبيل المثال:
inv start-retriever --embedding-model BAAI/bge-m3 --retriever-portcurl -X POST 0.0.0.0:5100/search -H "نوع المحتوى: application/json" -d '{" query": ["ما هو GPT-4؟", "ما هو LLaMA-3؟"], "num_blocks": 3}'
ابدأ WikiChat عن طريق تمرير عنوان URL الخاص بهذا المسترد. على سبيل المثال:
عرض توضيحي لـ inv --retriever-endpoint "http://0.0.0.0:/search"
قم بتقسيم الفهرس إلى أجزاء أصغر:
tar -cvf - <المسار إلى مجلد فهرس Qdrant> | بيجز -ص 14 | انقسام -- بايت = 10 جيجابايت -- اللواحق الرقمية = 0 -- طول اللاحقة = 4 - <المسار إلى مجلد الإخراج>/qdrant_index.tar.gz.part-
تحميل الأجزاء الناتجة:
استرداد بايثون/upload_folder_to_hf_hub.py --folder_path <المسار إلى مجلد الإخراج> --repo_id <معرف Repo on؟ المحور>
يمكنك تشغيل تكوينات مختلفة لـ WikiChat باستخدام أوامر مثل هذه:
inv demo --engine gpt-4o # يمكن أن يكون المحرك بأي قيمة تم تكوينها في llm_config، على سبيل المثال، mistra-large، claude-sonnet-35، local عرض inv --pipeline generator_and_correct # خطوط الأنابيب المتاحة يتم دمجها مبكرًا وإنشاء_وتصحيحها واستردادها_وإنشاءها inv demo --temperature 0.9 # يغير درجة حرارة المراحل التي يواجهها المستخدم مثل الصقل
للحصول على قائمة كاملة بجميع الخيارات المتاحة، يمكنك تشغيل inv demo --help
يوفر هذا المستودع تعليمات برمجية لنشر واجهة دردشة على الويب عبر Chainlit، وتخزين محادثات المستخدم في قاعدة بيانات Cosmos DB. يتم تنفيذها في backend_server.py وdata.py على التوالي. إذا كنت تريد استخدام قواعد بيانات أو واجهات أمامية أخرى، فستحتاج إلى تعديل هذه الملفات. من أجل التطوير، يجب أن يكون من السهل إزالة الاعتماد على Cosmos DB وتخزين المحادثات في الذاكرة ببساطة. يمكنك أيضًا تكوين معلمات chatbot المحددة في backend_server.py، على سبيل المثال لاستخدام LLM مختلف أو إضافة/إزالة مراحل WikiChat.
بعد إنشاء مثيل عبر Azure، احصل على سلسلة الاتصال وأضف هذه القيمة في API_KEYS.
COSMOS_CONNECTION_STRING=[سلسلة اتصال قاعدة بيانات Cosmos الخاصة بك]
سيؤدي تشغيل هذا إلى بدء تشغيل خوادم الواجهة الخلفية والأمامية. يمكنك بعد ذلك الوصول إلى الواجهة الأمامية من المنفذ المحدد (5001 افتراضيًا).inv chainlit --backend-port 5001
يمكنك استخدام نقطة نهاية API هذه لإنشاء نماذج أولية لأنظمة RAG عالية الجودة. راجع https://wikichat.genie.stanford.edu/search/redoc للحصول على المواصفات الكاملة.
لاحظ أننا لا نقدم أي ضمانات بشأن نقطة النهاية هذه، وهي غير صالحة للإنتاج.
(قريباً...)
نحن نصدر علنًا ويكيبيديا المُجهزة مسبقًا بـ 10 لغات.
WikiChat 2.0 غير متوافق مع نقاط التفتيش LLaMA-2 المضبوطة بدقة والتي تم إصدارها. يرجى الرجوع إلى v1.0 في الوقت الراهن.
لتقييم chatbot، يمكنك محاكاة المحادثات باستخدام جهاز محاكاة المستخدم. يمكن أن تكون معلمة المجموعة الفرعية واحدة من الرأس أو الذيل أو الأخيرة، والتي تتوافق مع المجموعات الفرعية الثلاث المقدمة في ورقة WikiChat. يمكنك أيضًا تحديد لغة المستخدم (يرد WikiChat دائمًا بلغة المستخدم). يقرأ هذا البرنامج النصي الموضوع (أي عنوان ومقالة Wikipedia) من ملف المعيار/الموضوعات/{subset}_articles_{language}.json المطابق. استخدم --num-dialogues لتعيين عدد الحوارات المحاكاة المراد إنشاؤها، و --num-turns لتحديد عدد الدورات في كل حوار.
محاكاة المستخدمين - عدد الحوارات 1 - عدد المنعطفات 2 - مرور وضع المحاكاة - اللغة أون - رأس المجموعة الفرعية
اعتمادًا على المحرك الذي تستخدمه، قد يستغرق ذلك بعض الوقت. سيتم حفظ الحوارات المحاكاة وملفات السجل في المعيار/simulated_dialogues/. يمكنك أيضًا توفير أي من معلمات خط الأنابيب من الأعلى. يمكنك تجربة خصائص مستخدم مختلفة عن طريق تعديل user_characteristics في Benchmark/user_simulator.py.
يتم إصدار كود WikiChat والنماذج والبيانات بموجب ترخيص Apache-2.0.
إذا كنت قد استخدمت تعليمات برمجية أو بيانات من هذا المستودع، فيرجى ذكر الأوراق التالية:
@inproceedings{semnani-etal-2023-wikichat,title = "قبعة {W}iki{C}: إيقاف هلوسة روبوتات الدردشة ذات النماذج اللغوية الكبيرة عن طريق التأريض قليل اللقطات على {W}ikipedia"،author = "Semnani, Sina and ياو، فيوليت وتشانغ، هايدي ولام، مونيكا"، المحرر = "بوعمر، هدى وبينو، خوان وبالي، كاليكا"، عنوان الكتاب = "نتائج جمعية اللغويات الحاسوبية: EMNLP 2023"، الشهر = ديسمبر، السنة = "2023"، العنوان = "سنغافورة"، الناشر = "جمعية اللغويات الحاسوبية"، URL = "https://aclanthology.org/2023.findings-emnlp.157"، الصفحات = "2387--2413"، }@inproceedings{zhang-etal-2024-spaghetti,title = "{SPAGHETTI}: الإجابة على سؤال المجال المفتوح من مصادر البيانات غير المتجانسة مع الاسترجاع والتحليل الدلالي"،author = "Zhang، Heidi وSemnani، سينا وقاسمي، فرهاد و Xu, Jialiang and Liu, Shicheng and Lam, Monica"، محرر = "Ku, Lun-Wei and Martins, Andre and Srikumar, Vivek"، عنوان الكتاب = "نتائج جمعية اللغويات الحاسوبية ACL 2024"، الشهر = أغسطس، العام = "2024"، العنوان = "بانكوك، تايلاند والاجتماع الافتراضي"، الناشر = "جمعية اللغويات الحاسوبية"، url = "https://aclanthology.org/2024.findings-acl.96"، الصفحات = "1663- -1678"، }