استرداد المعلومات

Azure AI services
Azure الذكاء الاصطناعي Search
Azure OpenAI Service
Azure Machine Learning

بمجرد إنشاء عمليات التضمين للتقسيمات الخاصة بك، فإن الخطوة التالية هي إنشاء الفهرس في قاعدة بيانات المتجهات والتجربة لتحديد عمليات البحث المثلى التي يجب إجراؤها. عند تجربة استرداد المعلومات، هناك العديد من المجالات التي يجب مراعاتها، بما في ذلك خيارات التكوين لفهرس البحث، وأنواع عمليات البحث التي يجب عليك إجراؤها، واستراتيجية إعادة الترحيل. تتناول هذه المقالة هذه المواضيع الثلاثة.

هذا المقال جزء من سلسلة. اقرأ المقدمة.

فهرس البحث

إشعار

Azure الذكاء الاصطناعي Search هي خدمة بحث Azure الطرف الأول. سيذكر هذا القسم بعض التفاصيل الذكاء الاصطناعي Search. إذا كنت تستخدم متجرا مختلفا، فراجع الوثائق للعثور على تكوين المفتاح لتلك الخدمة.

يحتوي فهرس البحث في متجرك على عمود لكل حقل في بياناتك. تحتوي مخازن البحث بشكل عام على دعم لأنواع البيانات غير الوسيطة مثل سلسلة، منطقية، عدد صحيح، مفردة، مزدوجة، التاريخ والوقت، ومجموعات مثل أنواع بيانات المجموعة (مفردة) والمتجه مثل Collection(single). لكل عمود، يجب تكوين معلومات مثل نوع البيانات، سواء كان الحقل قابلا للتصفية والاسترداد و/أو قابلا للبحث.

فيما يلي بعض القرارات الرئيسية التي يجب اتخاذها لتكوين البحث في المتجهات التي يتم تطبيقها على حقول المتجهات:

  • خوارزمية بحث المتجهات - الخوارزمية المستخدمة للبحث عن التطابقات النسبية. يحتوي Azure الذكاء الاصطناعي Search على خيار خوارزمية القوة الغاشمة التي تفحص مساحة المتجه بأكملها تسمى KNN الشاملة، وخيار خوارزمية أكثر أداء يقوم بإجراء بحث أقرب جار (ANN) يسمى Hierarchical Navigable Small World (HNSW).
  • metric - هذا التكوين هو مقياس التشابه المستخدم لحساب القرب من الخوارزمية. الخيارات في Azure الذكاء الاصطناعي Search هي cosine وdotProduct وEclidean. إذا كنت تستخدم نماذج تضمين Azure OpenAI، فاختر cosine.
  • efConstruction - المعلمة المستخدمة أثناء إنشاء فهرس العوام الصغيرة القابلة للتنقل الهرمية (HNSW) الذي يحدد عدد أقرب الجيران المتصلين بالمتجه أثناء الفهرسة. ينتج عن قيمة efConstruction أكبر فهرس ذي جودة أفضل من عدد أصغر. المفاضلة هي أن القيمة الأكبر تتطلب المزيد من الوقت والتخزين والحوسبة. يجب أن يكون efConstruction أعلى لعدد كبير من المجموعات وأقل لعدد قليل من المجموعات. يتطلب تحديد القيمة المثلى تجربة البيانات والاستعلامات المتوقعة.
  • efSearch - المعلمة المستخدمة في وقت الاستعلام لتعيين عدد أقرب الجيران (أي المجموعات المماثلة) المستخدمة أثناء البحث.
  • m - عدد الارتباطات ثنائية الاتجاه. النطاق من 4 إلى 10، مع أرقام أقل ترجع ضوضاء أقل في النتائج.

في Azure الذكاء الاصطناعي Search، يتم تغليف تكوينات المتجهات في vectorSearch تكوين. عند تكوين أعمدة المتجهات، يمكنك الرجوع إلى التكوين المناسب لعمود المتجه هذا وتعيين عدد الأبعاد. تمثل سمة أبعاد العمود المتجه عدد الأبعاد التي تم إنشاؤها بواسطة نموذج التضمين الذي اخترته. على سبيل المثال، ينشئ النموذج المحسن text-embedding-3-small للتخزين 1536 بعدا.

البحث

عند تنفيذ الاستعلامات من منسق المطالبة مقابل مخزن البحث الخاص بك، لديك العديد من الخيارات التي يجب مراعاتها. تحتاج إلى تحديد:

  • ما نوع البحث الذي ستقوم به: متجه أو كلمة أساسية أو مختلطة
  • سواء كنت ستستعلم عن عمود واحد أو أكثر
  • ما إذا كنت ستقوم بتشغيل استعلامات متعددة يدويا، مثل استعلام الكلمة الأساسية والبحث المتجه
  • ما إذا كان يجب تقسيم الاستعلام إلى استعلامات فرعية
  • ما إذا كان يجب استخدام التصفية في الاستعلامات الخاصة بك

قد يتخذ منسق المطالبة نهجا ثابتا أو نهجا ديناميكيا يخلط بين الأساليب بناء على أدلة السياق من المطالبة. تتناول الأقسام التالية هذه الخيارات لمساعدتك على التجربة للعثور على النهج الصحيح لحمل العمل الخاص بك.

أنواع البحث

تدعم أنظمة البحث الأساسية بشكل عام البحث الكامل عن النص والخطوط المتجهة. تدعم بعض الأنظمة الأساسية، مثل Azure الذكاء الاصطناعي Search عمليات البحث المختلطة. لمشاهدة قدرات عروض البحث عن المتجهات المختلفة، راجع اختيار خدمة Azure للبحث في المتجهات.

تتطابق عمليات البحث في المتجهات مع التشابه بين حقلي الاستعلام المتجه (المطالبة) والمتجه.

هام

يجب تنفيذ نفس عمليات التنظيف التي أجريتها على مجموعات قبل تضمين الاستعلام. على سبيل المثال، إذا قمت بتقليص كل كلمة في المجموعة المضمنة، يجب أن تقوم بتقليص كل كلمة في الاستعلام قبل التضمين.

إشعار

يمكنك إجراء بحث متجه مقابل حقول متجهات متعددة في نفس الاستعلام. في Azure الذكاء الاصطناعي Search، هذا بحث مختلط تقنيا. لمزيد من المعلومات، راجع هذا القسم.

embedding = embedding_model.generate_embedding(
    chunk=str(pre_process.preprocess(query))
)

vector = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="contentVector",
    vector=embedding,
)

results = client.search(
    search_text=None,
    vector_queries=[vector],
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

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

تتطابق عمليات البحث في النص الكامل مع النص العادي المخزن في فهرس. من الممارسات الشائعة استخراج الكلمات الأساسية من استعلام واستخدام هذه الكلمات الأساسية المستخرجة في بحث نصي كامل مقابل عمود واحد أو أكثر من الأعمدة المفهرسة. يمكن تكوين عمليات البحث عن النص الكامل لإرجاع التطابقات حيث تتطابق أي مصطلحات أو جميع المصطلحات.

يجب عليك تجربة لتحديد الحقول الفعالة لتشغيل عمليات البحث عن النص الكامل مقابلها. كما تمت مناقشته في مرحلة الإثراء، فإن حقول بيانات تعريف الكلمة الأساسية والكيان هي مرشحات جيدة للنظر فيها للبحث عن النص الكامل في السيناريوهات التي يكون للمحتوى معنى دلالي مشابه، ولكن تختلف الكيانات أو الكلمات الأساسية. الحقول الشائعة الأخرى التي يجب مراعاتها للبحث عن النص الكامل هي العنوان والملخص ونص المجموعة.

formatted_search_results = []

results = client.search(
    search_text=query,
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

formatted_search_results = format_results(results)

يقوم نموذج التعليمات البرمجية بإجراء بحث نصي كامل مقابل حقول العنوان والمحتوى والملخص.

يدعم Azure الذكاء الاصطناعي Search الاستعلامات المختلطة حيث يمكن أن يحتوي استعلامك على بحث نصي واحد أو أكثر وبحث متجه واحد أو أكثر. يقوم النظام الأساسي بتنفيذ كل استعلام، والحصول على النتائج الوسيطة، وإعادة ترتيب النتائج باستخدام Fusion Rank Fusion (RRF)، وإرجاع أفضل نتائج N.

 embedding = embedding_model.generate_embedding(
    chunk=str(pre_process.preprocess(query))
)
vector1 = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="contentVector",
    vector=embedding,
)
vector2 = RawVectorQuery(
    k=retrieve_num_of_documents,
    fields="questionVector",
    vector=embedding,
)

results = client.search(
    search_text=query,
    vector_queries=[vector1, vector2],
    top=retrieve_num_of_documents,
    select=["title", "content", "summary"],
)

يقوم نموذج التعليمات البرمجية بإجراء بحث نصي كامل مقابل حقول العنوان والمحتوى والملخص وعمليات البحث المتجهة مقابل حقول contentVector و questionVector. يقوم النظام الأساسي Azure الذكاء الاصطناعي Search بتشغيل جميع الاستعلامات بالتوازي، وإعادة ترتيب النتائج، وإرجاع أعلى retrieve_num_of_documents المستندات.

مضاعف يدوي

يمكنك، بطبيعة الحال، تشغيل استعلامات متعددة، مثل بحث متجه والبحث عن نص كامل للكلمة الأساسية، يدويا. يمكنك تجميع النتائج وإعادة تجميع النتائج يدويا وإرجاع أفضل النتائج. فيما يلي حالات استخدام لعدة مضاعفات يدوية:

  • أنت تستخدم نظاما أساسيا للبحث لا يدعم عمليات البحث المختلطة. ستتبع هذا الخيار لإجراء البحث المختلط الخاص بك.
  • تريد تشغيل عمليات البحث عن النص الكامل مقابل استعلامات مختلفة. على سبيل المثال، يمكنك استخراج الكلمات الأساسية من الاستعلام وتشغيل بحث نصي كامل مقابل حقل بيانات التعريف للكلمات الأساسية. يمكنك بعد ذلك استخراج الكيانات وتشغيل استعلام مقابل حقل بيانات تعريف الكيانات.
  • تريد التحكم في عملية إعادة الترحيل بنفسك.
  • يتطلب الاستعلام تشغيل استعلامات فرعية متعددة لاسترداد بيانات الأساس من مصادر متعددة.

استعلام فرعي متعدد

بعض المطالبات معقدة وتتطلب أكثر من مجموعة واحدة من البيانات لأرضية النموذج. على سبيل المثال، من المحتمل أن يتطلب الاستعلام "كيف تعمل السيارات الكهربائية وكيف تقارن بمركبات ICE؟" بيانات الأساس من مصادر متعددة.

من الممارسات الجيدة تحديد ما إذا كان الاستعلام يتطلب عمليات بحث متعددة قبل تشغيل أي عمليات بحث. إذا كنت ترى أن هناك عدة استعلامات فرعية مطلوبة، يمكنك تشغيل استعلامات متعددة يدوية لجميع الاستعلامات. استخدم نموذج لغة كبير لتحديد ما إذا كانت هناك عدة استعلام فرعي مطلوب. يتم أخذ المطالبة التالية من مستودع GitHub مسرع تجربة RAG الذي يستخدم لتصنيف استعلام على أنه بسيط أو معقد، مع معقدة تتطلب استعلامات متعددة:

Consider the given question to analyze and determine if it falls into one of these categories:
1. Simple, factual question
  a. The question is asking for a straightforward fact or piece of information
  b. The answer could likely be found stated directly in a single passage of a relevant document
  c. Breaking the question down further is unlikely to be beneficial
  Examples: "What year did World War 2 end?", "What is the capital of France?, "What is the features of productX?"
2. Complex, multi-part question
  a. The question has multiple distinct components or is asking for information about several related topics
  b. Different parts of the question would likely need to be answered by separate passages or documents
  c. Breaking the question down into sub-questions for each component would allow for better results
  d. The question is open-ended and likely to have a complex or nuanced answer
  e. Answering it may require synthesizing information from multiple sources
  f. The question may not have a single definitive answer and could warrant analysis from multiple angles
  Examples: "What were the key causes, major battles, and outcomes of the American Revolutionary War?", "How do electric cars work and how do they compare to gas-powered vehicles?"

Based on this rubric, does the given question fall under category 1 (simple) or category 2 (complex)? The output should be in strict JSON format. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. There should not be any comma after last element in the JSON.

Example output:
{
  "category": "simple"
}

يمكن أيضا استخدام نموذج لغة كبير لاستخراج الاستعلامات الفرعية من استعلام معقد. يتم أخذ المطالبة التالية من مستودع GitHub مسرع تجربة RAG الذي يحول استعلاما معقدا إلى استعلامات فرعية متعددة.

Your task is to take a question as input and generate maximum 3 sub-questions that cover all aspects of the original question. The output should be in strict JSON format, with the sub-questions contained in an array.
Here are the requirements:
1. Analyze the original question and identify the key aspects or components.
2. Generate sub-questions that address each aspect of the original question.
3. Ensure that the sub-questions collectively cover the entire scope of the original question.
4. Format the output as a JSON object with a single key "questions" that contains an array of the generated sub-questions.
5. Each sub-question should be a string within the "questions" array.
6. The JSON output should be valid and strictly formatted.
7. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. The JSON should be formatted with proper indentation for readability.
8. There should not be any comma after last element in the array.

Example input question:
What are the main causes of deforestation, and how can it be mitigated?

Example output:
{
  "questions": [
    "What are the primary human activities that contribute to deforestation?",
    "How does agriculture play a role in deforestation?",
    "What is the impact of logging and timber harvesting on deforestation?",
    "How do urbanization and infrastructure development contribute to deforestation?",
    "What are the environmental consequences of deforestation?",
    "What are some effective strategies for reducing deforestation?",
    "How can reforestation and afforestation help mitigate the effects of deforestation?",
    "What role can governments and policies play in preventing deforestation?",
    "How can individuals and communities contribute to reducing deforestation?"
  ]
}

تمرير الصور في الاستعلامات

يمكن لبعض النماذج متعددة الوسائط مثل GPT-4V وGPT-4o تفسير الصور. إذا كنت تستخدم هذه النماذج، يمكنك اختيار ما إذا كنت تريد تجنب تقسيم الصور وتمرير الصورة كجزء من المطالبة إلى النموذج متعدد الوسائط. يجب عليك تجربة لتحديد كيفية أداء هذا النهج مقارنة بتقسيم الصور مع سياق إضافي ودون تمريره. يجب عليك أيضا مقارنة الفرق في التكلفة بين النهج والقيام بتحليل التكلفة والفائدة.

التصفية

يمكن استخدام الحقول في مخزن البحث التي تم تكوينها على أنها قابلة للتصفية لتصفية الاستعلامات. ضع في اعتبارك التصفية على الكلمات الأساسية والكيانات للاستعلامات التي تستخدم هذه الحقول للمساعدة في تضييق نطاق النتيجة. تسمح لك التصفية باسترداد البيانات التي تفي بشروط معينة فقط من الفهرس عن طريق إزالة البيانات غير ذات الصلة. يؤدي ذلك إلى تحسين الأداء العام للاستعلام مع نتائج أكثر صلة. كما هو الحال مع كل قرار، من المهم التجربة والاختبار. قد لا تحتوي الاستعلامات على كلمات أساسية أو كلمات أساسية خاطئة أو اختصارات أو اختصارات. تحتاج إلى أخذ هذه الحالات في الاعتبار.

إعادة التحوين

تسمح لك إعادة التشغيل بتشغيل استعلام واحد أو أكثر وتجميع النتائج وترتيب تلك النتائج. ضع في اعتبارك الأسباب التالية لإعادة نسخ نتائج البحث:

  • لقد أجريت عمليات بحث يدوية متعددة وتريد تجميع النتائج وترتيبها.
  • عمليات البحث عن المتجهات والكلمة الأساسية ليست دقيقة دائما. يمكنك زيادة عدد المستندات التي تم إرجاعها من البحث، بما في ذلك بعض النتائج الصالحة التي قد يتم تجاهلها بخلاف ذلك، واستخدام إعادة الترحيل لتقييم النتائج.

يمكنك استخدام نموذج لغة كبير أو أداة ترميز متقاطعة لإجراء إعادة النسخ. بعض الأنظمة الأساسية، مثل Azure الذكاء الاصطناعي Search لديها أساليب خاصة لإعادة نسخ النتائج. يمكنك تقييم هذه الخيارات لبياناتك لتحديد ما يصلح بشكل أفضل للسيناريو الخاص بك. توفر الأقسام التالية تفاصيل حول هذه الأساليب.

إعادة تعيين نموذج لغة كبيرة

فيما يلي نموذج نموذج لغة كبيرة من مسرع تجربة RAG الذي يعيد ترتيب النتائج.

A list of documents is shown below. Each document has a number next to it along with a summary of the document. A question is also provided.
Respond with the numbers of the documents you should consult to answer the question, in order of relevance, as well as the relevance score as json string based on json format as shown in the schema section. The relevance score is a number from 1–10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any additional text or explanation or metadata apart from json string. Just output the json string and strip rest every other text. Strictly remove any last comma from the nested json elements if it's present.
Don't include any documents that are not relevant to the question. There should exactly be one documents element.
Example format:
Document 1:
content of document 1
Document 2:
content of document 2
Document 3:
content of document 3
Document 4:
content of document 4
Document 5:
content of document 5
Document 6:
content of document 6
Question: user defined question

schema:
{
    "documents": {
        "document_1": "Relevance",
        "document_2": "Relevance"
    }
}

إعادة ترتيب أداة الترميز المتقاطعة

يستخدم المثال التالي من مستودع RAG Experiment Accelerator GitHub CrossEncoder الذي يوفره Hugging Face لتحميل نموذج Roberta. ثم يكرر على كل مجموعة ويستخدم النموذج لحساب التشابه، ومنحهم قيمة. نقوم بفرز النتائج وإرجاع أعلى N.

from sentence_transformers import CrossEncoder
...

model_name = 'cross-encoder/stsb-roberta-base'
model = CrossEncoder(model_name)

cross_scores_ques = model.predict(
    [[user_prompt, item] for item in documents],
    apply_softmax=True,
    convert_to_numpy=True,
)

top_indices_ques = cross_scores_ques.argsort()[-k:][::-1]
sub_context = []
for idx in list(top_indices_ques):
    sub_context.append(documents[idx])

الترتيب الدلالي

يحتوي Azure الذكاء الاصطناعي Search على ميزة خاصة تسمى الترتيب الدلالي. تستخدم هذه الميزة نماذج التعلم العميق التي تم تكييفها من Microsoft Bing التي تعزز النتائج الأكثر صلة بالدلالة. اقرأ ما يلي للاطلاع على كيفية عمل المصنف الدلالي.

إرشادات البحث

ضع في اعتبارك الإرشادات العامة التالية عند تنفيذ حل البحث:

  • العنوان والملخص والمصدر والمحتوى الخام (غير نظيف) هي حقول جيدة لإرجاعها من عملية بحث.
  • حدد مقدما ما إذا كان يجب تقسيم الاستعلام إلى استعلامات فرعية.
  • بشكل عام، من الممارسات الجيدة تشغيل الاستعلامات على حقول متعددة، كل من الاستعلامات المتجهة والنصية. عندما تتلقى استعلاما، لا تعرف ما إذا كان البحث في المتجهات أو البحث في النص أفضل. كما أنك لا تعرف الحقول الأفضل للبحث في المتجهات أو البحث عن الكلمات الأساسية. يمكنك البحث عن حقول متعددة، من المحتمل أن تكون باستخدام استعلامات متعددة، وإعادة تجميع النتائج وإرجاع النتائج بأعلى الدرجات.
  • تعد الكلمات الأساسية وحقول الكيانات مرشحات جيدة للنظر في التصفية عليها.
  • من الممارسات الجيدة استخدام الكلمات الأساسية جنبا إلى جنب مع عمليات البحث عن المتجهات. تقوم الكلمات الأساسية بتصفية النتائج إلى مجموعة فرعية أصغر. يعمل مخزن المتجهات مقابل تلك المجموعة الفرعية للعثور على أفضل التطابقات.

تقييم البحث

في مرحلة الإعداد، يجب أن تكون قد جمعت استعلامات الاختبار جنبا إلى جنب مع معلومات مستند الاختبار. يمكنك استخدام المعلومات التالية التي جمعتها في تلك المرحلة لتقييم نتائج البحث:

  • الاستعلام - نموذج الاستعلام
  • السياق - مجموعة كل النص في مستندات الاختبار التي تتناول نموذج الاستعلام

فيما يلي ثلاث طرق تقييم استرداد راسخة يمكنك استخدامها لتقييم حل البحث الخاص بك:

  • الدقة عند K - النسبة المئوية للعناصر ذات الصلة المحددة بشكل صحيح من إجمالي نتائج البحث. يركز هذا المقياس على دقة نتائج البحث.
  • الاستدعاء في K - الاستدعاء عند K يقيس النسبة المئوية للعناصر ذات الصلة في أعلى K من إجمالي العناصر النسبية المحتملة. يركز هذا المقياس على تغطية نتائج البحث.
  • متوسط الترتيب المتبادل (MRR) - يقيس MRR متوسط الرتب المتبادلة للإجابة الأولى ذات الصلة في نتائج البحث المصنفة. يركز هذا المقياس على مكان حدوث النتيجة الأولى ذات الصلة في نتائج البحث.

يجب اختبار الأمثلة الإيجابية والسلبية على حد سواء. للحصول على الأمثلة الإيجابية، تريد أن تكون المقاييس قريبة من 1 قدر الإمكان. بالنسبة للأمثلة السلبية، حيث لا ينبغي أن تكون بياناتك قادرة على معالجة الاستعلامات، تريد أن تكون المقاييس قريبة من 0 قدر الإمكان. يجب اختبار جميع استعلامات الاختبار ومتوسط نتائج الاستعلام الموجبة ونتائج الاستعلام السالبة لفهم كيفية أداء نتائج البحث بشكل مجمع.

الخطوات التالية