paint-brush
التغلب على الهلوسة باستخدام قواعد المعرفةبواسطة@kattasundeep110
تاريخ جديد

التغلب على الهلوسة باستخدام قواعد المعرفة

بواسطة Sundeep Goud Katta7m2024/11/07
Read on Terminal Reader

طويل جدا؛ ليقرأ

يمكن تجنب الهلوسة في LLMs أو الحد منها عن طريق تعزيز الاستجابة باستخدام قواعد المعرفة. يمكن أن تكون قواعد المعرفة أيًا من بيانات المنظمة. تتأسس استجابة LLM ويتم تقديم استجابة معززة للمستخدم.
featured image - التغلب على الهلوسة باستخدام قواعد المعرفة
Sundeep Goud Katta HackerNoon profile picture
0-item

ماذا؟

إذا طلبت من طالب ماجستير في القانون "اقتراح لغة برمجة رائعة للتعلم الآلي"


ستكون استجابة برنامج الماجستير في القانون: "تعتبر لغة بايثون واحدة من أكثر لغات البرمجة الموصى بها للتعلم الآلي. تعد لغة بايثون لغة برمجة عالية المستوى..."


ماذا لو كنت تريد من مؤسستك تقديم معلومات محددة وموثقة عن المؤسسة، أي تعزيز الاستجابة بمعلومات مؤسسية موثوقة؟


دعونا نجعل ذلك يحدث عند التفاعل مع LLM

لماذا؟

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


وتُعرف هذه العملية باسم تأريض استجابة LLM باستخدام قواعد المعرفة.

كيف؟

في حين أنني أستطيع فقط التحدث عن ذلك.


كمهندس فإن النظر إلى بعض أجزاء التعليمات البرمجية يمنحني الثقة.


إن تنفيذها يزيد من ثقتي ويمنحني السعادة، كما أن المشاركة تمنحني الرضا 😄

الكود؟ لماذا لا! → بايثون؟ بالطبع!!

  1. تثبيت المكتبات المطلوبة

     pip install openai faiss-cpu numpy python-dotenv
  • openai : للتفاعل مع نماذج GPT والتضمينات الخاصة بـ OpenAI.
  • faiss-cpu : مكتبة من الذكاء الاصطناعي الخاص بفيسبوك للبحث عن التشابه بكفاءة، تُستخدم لتخزين عمليات التضمين والبحث عنها.
  • numpy : للعمليات العددية، بما في ذلك التعامل مع التضمينات كمتجهات.
  • python-dotenv : لتحميل متغيرات البيئة (على سبيل المثال، مفاتيح API) من ملف .env بشكل آمن.


  1. إعداد متغيرات البيئة

    • انتقل إلى https://platform.openai.com/settings/organization/api-keys
    • انقر فوق "إنشاء مفتاح سري جديد" كما هو موضح في الصورة أدناه.
    • قم بتوفير التفاصيل، يمكنك استخدام حساب الخدمة. قم بتوفير اسم لمعرف حساب الخدمة وحدد مشروعًا.
    • انسخ المفتاح السري إلى الحافظة
    • قم بإنشاء ملف .env في دليل المشروع الخاص بك. أضف مفتاح API الخاص بـ OpenAI إلى هذا الملف.
     OPENAI_API_KEY=your_openai_api_key_here
    • يحافظ هذا الملف على مفتاح API الخاص بك آمنًا ومنفصلًا عن الكود.


  2. تهيئة العميل وتحميل متغيرات البيئة

    • يقوم load_dotenv() بتحميل ملف .env ، ويقوم os.getenv("OPENAI_API_KEY") باسترداد مفتاح API. يحافظ هذا الإعداد على مفتاح API الخاص بك آمنًا.
 import os from openai import OpenAI from dotenv import load_dotenv import faiss import numpy as np # Load environment variables load_dotenv() client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))


  1. تعريف قاعدة البيانات/المعرفة الأساسية
    • يحتوي هذا القاموس على معلومات أساسية حول المواضيع. في الواقع، قد تكون هذه مجموعة بيانات أكبر أو قاعدة بيانات.
 # Grounding data grounding_data = { "Python": "Python is dynamically typed, which can be a double-edged sword. While it makes coding faster and more flexible, it can lead to runtime errors that might have been caught at compile-time in statically-typed languages.", "LLMs": "Large Language Models (LLMs) are neural networks trained on large text datasets.", "Data Science": "Data Science involves using algorithms, data analysis, and machine learning to understand and interpret data.", "Java": "Java is great, it powers most of the machine learning code, and has a rich set of libraries available." }


  1. إنشاء تضمينات نصية

    • دالة لتوليد تضمينات لنص معين باستخدام نموذج التضمين الخاص بـ OpenAI. تستدعي هذه الدالة واجهة برمجة تطبيقات OpenAI للحصول على التضمين لإدخال نص، والذي يتم إرجاعه بعد ذلك كمصفوفة NumPy
     # Function to generate embedding for a text def get_embedding(text): response = client.embeddings.create( model="text-embedding-ada-002", input=text ) return np.array(response.data[0].embedding)


  2. مؤشر FAISS والتضمينات لبيانات التأريض

    • إنشاء فهرس FAISS، وهو هيكل مُحسَّن لعمليات البحث السريعة عن التشابه، وملئه بتضمينات البيانات الأساسية.
     # Create FAISS index and populate it with grounding data embeddings dimension = len(get_embedding("test")) # Dimension of embeddings index = faiss.IndexFlatL2(dimension) # L2 distance index for similarity search grounding_embeddings = [] grounding_keys = list(grounding_data.keys()) for key, text in grounding_data.items(): embedding = get_embedding(text) grounding_embeddings.append(embedding) index.add(np.array([embedding]).astype("float32"))

    • dimension : حجم كل تضمين، المطلوب لتهيئة مؤشر FAISS.
    • index = faiss.IndexFlatL2(dimension) : ينشئ مؤشر FAISS الذي يستخدم المسافة الإقليدية (L2) للتشابه.
    • بالنسبة لكل إدخال في grounding_data ، يقوم هذا الكود بإنشاء تضمين ويضيفه إلى فهرس FAISS.


  3. وظيفة البحث عن المتجه

    • تبحث الوظيفة في فهرس FAISS عن إدخال بيانات التأريض الأكثر تشابهًا مع استعلام ما.
 # Function to perform vector search on FAISS def vector_search(query_text, threshold=0.8): query_embedding = get_embedding(query_text).astype("float32").reshape(1, -1) D, I = index.search(query_embedding, 1) # Search for the closest vector if I[0][0] != -1 and D[0][0] <= threshold: return grounding_data[grounding_keys[I[0][0]]] else: return None # No similar grounding information available
  • Query Embedding : تحويل نص الاستعلام إلى متجه تضمين.
  • FAISS Search : يبحث في الفهرس عن المتجه الأقرب إلى الاستعلام.
  • Threshold Check : إذا كانت مسافة المتجه الأقرب (D) أقل من العتبة، فإنه يعيد معلومات التأريض. وإلا، فإنه يشير إلى عدم العثور على تأريض موثوق به.
  1. استعلام عن ماجستير القانون

    نحن نقوم بالاستعلام عن LLM باستخدام واجهة برمجة تطبيقات Chatgpt الخاصة بـ OpenAI ونموذج gpt-4.

     # Query the LLM def query_llm(prompt): response = client.chat.completions.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt} ] ) return response.choices[0].message.content


  1. استجابة معززة

    • يضيف معلومات التأريض إذا كانت متوفرة، أو
    • يضيف إخلاء مسؤولية إذا لم يتم العثور على معلومات أساسية ذات صلة.
     def enhance_response(topic, llm_response): grounding_info = vector_search(llm_response) if grounding_info: # Check if the LLM's response aligns well with grounding information return f"{llm_response}\n\n(Verified Information: {grounding_info})" else: # Add a disclaimer when no grounding data is available return f"{llm_response}\n\n(Disclaimer: This information could not be verified against known data and may contain inaccuracies.)"
  2. تحديد الوظيفة الرئيسية

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

     # Main function to execute the grounding check def main(): topic = input("Enter a topic: ") llm_response = query_llm(f"What can you tell me about {topic}?") grounding_info = vector_search(llm_response, threshold=0.8) print(f"LLM Response: {llm_response}") print(f"Grounding Information: {grounding_info}") if grounding_info != "No grounding information available": print("Response is grounded and reliable.") else: print("Potential hallucination detected. Using grounded information instead.") print(f"Grounded Answer: {grounding_info}") if __name__ == "__main__": main()

حصيلة

تنفيذ البرنامج النصي

استدعاء هذه القطعة باستخدام

 python groundin_llm.py


الرد:

استجابة معززة على الأرض

توضيح

إذا لاحظت الاستجابة، على الرغم من أن استجابة LLM كانت "واحدة من أكثر لغات البرمجة الموصى بها للتعلم الآلي ..."، فإن الاستجابة الواقعية كانت "Java رائعة، فهي تدعم معظم أكواد التعلم الآلي، ولديها مجموعة غنية من المكتبات المتاحة".


من الممكن القيام بذلك باستخدام مكتبة FAISS الخاصة بـ Meta للبحث عن المتجهات استنادًا إلى التشابه.

عملية :

  1. قم أولاً باسترجاع استجابة LLMs.
  2. تحقق مما إذا كانت قاعدة المعرفة لدينا تحتوي على أي معلومات ذات صلة باستخدام البحث المتجه.
  3. إذا كان موجودًا، قم بإرجاع الاستجابة من "قاعدة المعرفة"
  4. إذا لم يتم إرجاع استجابة LLM كما هي.


هذا هو الكود: https://github.com/sundeep110/groundingLLMs

تأريض سعيد!!