Поделиться через


Получение сведений

На предыдущем шаге вашего решения RAG для Retrieval-Augmented вы создали векторные представления для своих фрагментов. На этом шаге вы создаете индекс в векторной базе данных и экспериментируете, чтобы определить оптимальный поиск. В этой статье рассматриваются параметры конфигурации для индекса поиска, типы поиска и стратегии переоценки.

Эта статья является частью серии. Ознакомьтесь с введением .

Настройка индекса поиска

Заметка

В этом разделе описываются конкретные рекомендации по поиску ИИ Azure. Если вы используете другое хранилище, ознакомьтесь с соответствующей документацией, чтобы найти ключевые конфигурации для этой службы.

Индекс поиска в магазине содержит столбец для каждого поля в данных. Службы поиска обычно поддерживают типы данных, не относящиеся к невекторе,, например string, boolean, целочисленное, однократное, двойное и datetime. Они также поддерживают коллекции, такие как коллекции с одним типом и векторные типы данных. Для каждого столбца необходимо настроить сведения, например тип данных и возможность фильтрации, извлечения или поиска.

Рассмотрим следующие конфигурации векторного поиска, которые можно применить к полям векторов:

  • алгоритм поиска векторов: алгоритм поиска векторов ищет относительные совпадения. Поиск ИИ имеет опцию алгоритма поиска, называемую методом полных k-ближайших соседей (KNN), который сканирует всё векторное пространство. Он также имеет более производительный алгоритм, называемый иерархическим навигационно-навигационным небольшим миром (HNSW), который выполняет приблизительные ближайшие соседи (ANN) поиска.

  • метрика сходства: алгоритм использует метрику сходства для вычисления близкости. Типы метрик в поиске ИИ включают косинус, скалярное произведение и евклидово расстояние. Если вы используете модели встраивания службы Azure OpenAI, выберите косинус.

  • параметр efConstruction: этот параметр используется во время создания индекса HNSW. Он определяет количество ближайших соседей, подключенных к вектору во время индексирования. Большее значение efConstruction приводит к повышению качества индекса, чем меньшее число. Но для большего значения требуется больше времени, хранилища и вычислений. Для большого количества блоков задайте значение efConstruction выше. Для небольшого количества блоков задайте значение ниже. Чтобы определить оптимальное значение, поэкспериментируйте с данными и ожидаемыми запросами.

  • Параметр efSearch: Этот параметр используется во время запроса для задания количества ближайших соседей или аналогичных блоков, используемых поиском.

  • Параметр m: Этот параметр обозначает количество двунаправленных ссылок. Диапазон составляет от 4 до 10. Более низкие числа возвращают меньше шума в результатах.

В поиске ИИ конфигурации векторов инкапсулируются в конфигурации vectorSearch. При настройке векторных столбцов вы ссылаетесь на соответствующую конфигурацию для этого векторного столбца и задаете количество измерений. Атрибут измерений векторного столбца представляет количество измерений, создаваемых моделью внедрения. Например, модель встраивания текста text-embedding-3-small, оптимизированная для хранения, генерирует 1536 измерений.

Выбор подхода к поиску

При выполнении запросов из менеджера запросов в хранилище поиска учитывайте следующие факторы:

  • Тип выполняемого поиска, например вектора, ключевого слова или гибридного поиска.

  • Можно запросить данные по одному или нескольким столбцам

  • Хотели бы вы вручную выполнить несколько запросов, таких как запрос по ключевым словам и векторный поиск

  • Следует ли разбить запрос на подзапросы

  • Следует ли использовать фильтрацию в запросах

Оркестратор запросов может использовать статический подход или динамический подход, который объединяет подходы на основе контекстуальных подсказок из запроса. В следующих разделах описаны эти параметры, которые помогут вам найти правильный подход для рабочей нагрузки.

Типы поиска

Платформы поиска обычно поддерживают полнотекстовые и векторные поиски. Некоторые платформы, такие как поиск ИИ, поддерживают гибридные поиски.

Поиски векторов сравнивают сходство между векторизованным запросом и векторными полями. Дополнительные сведения см. в статье Выбор службы Azure для поиска векторов.

Важный

Перед внедрением запроса необходимо выполнить те же самые операции очистки, которые вы выполнили с фрагментами. Например, если вы перевели все слова в встраиваемом блоке в нижний регистр, то перед внедрением следует перевести все слова в запросе в нижний регистр.

Заметка

Вы можете выполнить поиск вектора по нескольким полям векторов в одном запросе. В поиске ИИ этот подход считается гибридным поиском. Для получения дополнительной информации см. гибридного поиска.

В следующем примере кода выполняется векторный поиск по полю contentVector.

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"],
)

Код, который внедряет запрос, сначала обрабатывает запрос. Этот препроцесс должен быть тем же кодом, который предварительно обрабатывает блоки перед внедрением. Необходимо использовать ту же модель встраивания, которая использовалась для встраивания фрагментов.

Полнотекстовые поиски соответствуют обычному тексту, хранящемуся в индексе. Обычно рекомендуется извлекать ключевые слова из запроса и использовать эти извлеченные ключевые слова в полнотекстовом поиске по одному или нескольким индексированных столбцов. Можно настроить полнотекстовые поиски для возврата совпадений, если какие-либо термины или все термины совпадают.

Поэкспериментируйте, чтобы определить поля для выполнения полнотекстового поиска. Как описано в статьеэтапа обогащения , следует использовать поля ключевых слов и метаданных сущностей для полнотекстового поиска в сценариях, где содержимое имеет аналогичное семантическое значение, но сущности или ключевые слова отличаются. Другие распространенные поля, которые следует учитывать для полнотекстового поиска, включают название, сводку и фрагмент текста.

В следующем примере кода выполняется полнотекстовый поиск по заголовку, содержимому и полям сводки.

formatted_search_results = []

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

formatted_search_results = format_results(results)

Поиск ИИ поддерживает гибридные запросы, содержащие один или несколько текстовых поисковых запросов и один или несколько векторных запросов. Платформа выполняет каждый запрос, получает промежуточные результаты, повторно ранжирует их с помощью метода взаимного ранжирования, и возвращает первые N результатов.

В следующем примере кода выполняется полнотекстовый поиск по заголовку, содержимому и полям сводки. Он также выполняет векторные поиски по полям contentVector и questionVector. Поиск ИИ выполняет все запросы параллельно, переупорядочивает результаты и возвращает первые retrieve_num_of_documents.

 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"],
)

Выполнение вручную нескольких запросов

Можно выполнять несколько запросов, таких как векторный поиск и полнотекстовый поиск ключевого слова, вручную. Вы агрегируете результаты, вручную изменяете их порядок и возвращаете лучшие результаты. Рассмотрим следующие варианты использования нескольких ручных запросов:

  • Вы используете платформу поиска, которая не поддерживает гибридные поиски. Вы используете несколько ручных запросов для выполнения собственного гибридного поиска.

  • Вы хотите выполнить полнотекстовый поиск по разным запросам. Например, вы можете извлечь ключевые слова из запроса и выполнить полнотекстовый поиск в поле метаданных ключевых слов. Затем можно извлечь сущности и запустить запрос к полю метаданных сущностей.

  • Вы хотите контролировать процесс переранжировки.

  • Запрос требует выполнения разложенных подзапросов для получения данных об обосновании из нескольких источников.

Перевод поисковых запросов

Перевод запросов — это необязательный шаг на этапе получения информации решения RAG. Этот шаг преобразует или переводит запрос в оптимизированную форму, чтобы получить лучшие результаты. Методы перевода запросов включают расширение, декомпозицию, перезапись и гипотетические встраивания документов (HyDE).

Расширение запросов

Расширение запросов — это шаг перевода, который упрощает и повышает удобство использования запроса и улучшает контекст. Следует рассмотреть возможность расширения, если ваш запрос мал или расплывчат. Например, рассмотрим запрос "Сравнить доходы майкрософт". Этот запрос не включает временные интервалы или единицы времени для сравнения и указывает только доходы. Рассмотрим дополненную версию запроса, например "Сравнить доходы и доходы Майкрософт в текущем году по сравнению с прошлым годом по кварталу". Новый запрос является четким и конкретным.

При увеличении запроса вы сохраняете исходный запрос, но добавляете дополнительный контекст. Не удаляйте и не изменяйте исходный запрос и не изменяйте характер запроса.

Для расширения запроса можно использовать языковую модель. Но вы не можете расширить все запросы. Если у вас есть контекст, его можно передать в языковую модель для расширения запроса. Если у вас нет контекста, необходимо определить, содержит ли языковая модель информацию, которую можно использовать для расширения запроса. Например, если вы используете большую языковую модель, например модель GPT, можно определить, доступна ли информация о запросе в Интернете. В этом случае модель можно использовать для расширения запроса. В противном случае не следует расширять запрос.

В следующей подсказке языковая модель уточняет и расширяет запрос. Этот запрос содержит примеры для случаев, когда у запроса есть контекст и когда его нет. Дополнительные сведения см. в репозитория GitHub RAG Experiment Accelerator.

Input Processing:

Analyze the input query to identify the core concept or topic.
Check whether the query provides context.
If context is provided, use it as the primary basis for augmentation and explanation.
If no context is provided, determine the likely domain or field, such as science, technology, history, or arts, based on the query.

Query Augmentation:

If context is provided:

Use the given context to frame the query more specifically.
Identify other aspects of the topic not covered in the provided context that enrich the explanation.

If no context is provided, expand the original query by adding the following elements, as applicable:

Include definitions about every word, such as adjective or noun, and the meaning of each keyword, concept, and phrase including synonyms and antonyms.
Include historical context or background information, if relevant.
Identify key components or subtopics within the main concept.
Request information about practical applications or real-world relevance.
Ask for comparisons with related concepts or alternatives, if applicable.
Inquire about current developments or future prospects in the field.

Other Guidelines:

Prioritize information from provided context when available.
Adapt your language to suit the complexity of the topic, but aim for clarity.
Define technical terms or jargon when they're first introduced.
Use examples to illustrate complex ideas when appropriate.
If the topic is evolving, mention that your information might not reflect the very latest developments.
For scientific or technical topics, briefly mention the level of scientific consensus if relevant.
Use Markdown formatting for better readability when appropriate.

Example Input-Output:

Example 1 (With provided context):

Input: "Explain the impact of the Gutenberg Press"
Context Provided: "The query is part of a discussion about revolutionary inventions in medieval Europe and their long-term effects on society and culture."
Augmented Query: "Explain the impact of the Gutenberg Press in the context of revolutionary inventions in medieval Europe. Cover its role in the spread of information, its effects on literacy and education, its influence on the Reformation, and its long-term impact on European society and culture. Compare it to other medieval inventions in terms of societal influence."

Example 2 (Without provided context):

Input: "Explain CRISPR technology"
Augmented Query: "Explain CRISPR technology in the context of genetic engineering and its potential applications in medicine and biotechnology. Cover its discovery, how it works at a molecular level, its current uses in research and therapy, ethical considerations surrounding its use, and potential future developments in the field."
Now, provide a comprehensive explanation based on the appropriate augmented query.

Context: {context}

Query: {query}

Augmented Query:

Разложение

Сложные запросы требуют более одной коллекции данных для создания модели. Например, запрос "Как работают электрические автомобили и как они сравниваются с автомобилями с двигателями внутреннего сгорания (ICE)?" вероятно требует подтверждения данных из нескольких источников. Один из источников может описать, как работают электрические автомобили, где другой сравнивает их с ICE транспортных средств.

Декомпозиция — это процесс разбиения сложного запроса на несколько небольших и простых вложенных запросов. Вы выполняете каждый из декомпилированных запросов независимо и агрегируете первые результаты всех декомпозированных запросов в виде накапливаемого контекста. Затем вы запустите исходный запрос, который передает накопленный контекст в языковую модель.

Перед выполнением любого поиска необходимо определить, требует ли запрос нескольких попыток. Если требуется несколько вложенных запросов, можно запустить вручную несколько запросов для всех запросов. Используйте языковую модель, чтобы определить, рекомендуется ли использовать несколько вложенных запросов.

Следующий запрос классифицирует запрос как простой или сложный. Дополнительные сведения см. в репозитория GitHub RAG Experiment Accelerator.

Consider the given question to analyze and determine whether it falls into one of these categories:

1. Simple, factual question
  a. The question asks for a straightforward fact or piece of information.
  b. The answer can 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 are the features of productX?"

2. Complex, multipart question
  a. The question has multiple distinct components or asks for information about several related topics.
  b. Different parts of the question likely need to be answered by separate passages or documents.
  c. Breaking the question down into subquestions for each component provides better results.
  d. The question is open-ended and likely to have a complex or nuanced answer.
  e. Answering the question might require synthesizing information from multiple sources.
  f. The question might 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% structurally correct, with proper nesting, comma placement, and quotation marks. There shouldn't be a comma after the last element in the JSON.

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

Вы также можете использовать языковую модель для разложения сложного запроса. Следующий промпт разбивает сложный запрос. См. дополнительные сведения в RAG Experiment Accelerator репозитория GitHub.

Analyze the following query:

For each query, follow these specific instructions:

- Expand the query to be clear, complete, fully qualified, and concise.
- Identify the main elements of the sentence, typically a subject, an action or relationship, and an object or complement. Determine which element is being asked about or emphasized (usually the unknown or focus of the question). Invert the sentence structure. Make the original object or complement the new subject. Transform the original subject into a descriptor or qualifier. Adjust the verb or relationship to fit the new structure.
- Break the query down into a set of subqueries that have clear, complete, fully qualified, concise, and self-contained propositions.
- Include another subquery by using one more rule: Identify the main subject and object. Swap their positions in the sentence. Adjust the wording to make the new sentence grammatically correct and meaningful. Ensure that the new sentence asks about the original subject.
- Express each idea or fact as a standalone statement that can be understood with the help of the given context.
- Break down the query into ordered subquestions, from least to most dependent.
- The most independent subquestion doesn't require or depend on the answer to any other subquestion or prior knowledge.
- Try having a complete subquestion that has all information only from the base query. There's no other context or information available.
- Separate complex ideas into multiple simpler propositions when appropriate.
- Decontextualize each proposition by adding necessary modifiers to nouns or entire sentences. Replace pronouns, such as it, he, she, they, this, and that, with the full name of the entities that they refer to.
- If you still need more questions, the subquestion isn't relevant and should be removed.

Provide your analysis in the following YAML format, and strictly adhere to the following structure. Don't output anything extra, including the language itself.

type: interdependent
queries:
- [First query or subquery]
- [Second query or subquery, if applicable]
- [Third query or subquery, if applicable]
- ...

Examples:

1. Query: "What is the capital of France?"
type: interdependent
queries:
    - What is the capital of France?

2. Query: "Who is the current CEO of the company that created the iPhone?"
type: interdependent
queries:
    - Which company created the iPhone?
    - Who is the current CEO of Apple? (identified in the previous question)

3. Query: "What is the population of New York City, and what is the tallest building in Tokyo?"
type: multiple_independent
queries:
    - What is the population of New York City?
    - What is the tallest building in Tokyo?

Now, analyze the following query:

{query}

Переписывание

Входной запрос может не находиться в оптимальной форме для получения основных данных. Вы можете использовать языковую модель для перезаписи запроса и достижения лучших результатов. Переопределите запрос, чтобы устранить следующие проблемы:

  • Неясность
  • Отсутствующие ключевые слова
  • Ненужные слова
  • Неясная семантика

Следующая строка использует языковую модель для перезаписи запроса. Дополнительные сведения см. в репозитория GitHub RAG Experiment Accelerator.

Rewrite the given query to optimize it for both keyword-based and semantic-similarity search methods. Follow these guidelines:

- Identify the core concepts and intent of the original query.
- Expand the query by including relevant synonyms, related terms, and alternate phrasings.
- Maintain the original meaning and intent of the query.
- Include specific keywords that are likely to appear in relevant documents.
- Incorporate natural language phrasing to capture semantic meaning.
- Include domain-specific terminology if applicable to the query's context.
- Ensure that the rewritten query covers both broad and specific aspects of the topic.
- Remove ambiguous or unnecessary words that might confuse the search.
- Combine all elements into a single, coherent paragraph that flows naturally.
- Aim for a balance between keyword richness and semantic clarity.

Provide the rewritten query as a single paragraph that incorporates various search aspects, such as keyword-focused, semantically focused, or domain-specific aspects.

query: {original_query}

Метод HyDE

HyDE — это альтернативный метод получения информации для решений RAG. Вместо преобразования запроса в внедрение и использования этих внедренных выражений для поиска ближайших совпадений в векторной базе данных HyDE использует языковую модель для создания ответов из запроса. Эти ответы преобразуются в внедрения, которые используются для поиска ближайших совпадений. Этот процесс позволяет HyDE выполнять поиск по схожести ответов с использованием вложений.

Объединение переводов запросов в поток

Можно использовать несколько переводов запросов. Вы даже можете использовать все четыре этих перевода в сочетании. На следующей схеме показан пример объединения этих переводов в конвейер.

диаграмма, показывющая конвейер RAG с преобразователями запросов.

На схеме показан конвейер с четырьмя шагами. Исходный запрос передается на первый шаг, в блок под названием расширитель запроса. Средство расширения запроса выводит исходный запрос и дополненный запрос. Дополненный запрос передается на второй шаг — блок под названием «декомпозер запроса». Декомпозер запроса выводит исходный запрос, дополненный запрос и четыре разложенных запроса. Декомпозитированные запросы передаются на третий шаг. Третий шаг содержит поле с надписью "Для каждого разложенного запроса." В этом блоке три подэтапа: переписыватель запросов, исполнитель запросов и ранжировщик. Выходные данные шага 3 — это исходный запрос, дополненный запрос, четыре разложенных запроса и накопленный контекст. Исходный запрос и накопленный контекст передаются на четвертый шаг. Четвертый шаг состоит из трех подэтапов: перезаписчика запросов, исполнителя запросов и переупорядочивателя. Результатом четырех шагов является окончательный результат.

Конвейер состоит из следующих действий:

  1. Необязательный шаг расширения запроса получает исходный запрос. На этом шаге выводится исходный запрос и дополненный запрос.

  2. Необязательный шаг разложения запроса получает расширенный запрос. На этом шаге выводится исходный запрос, дополненный запрос и декомпилированные запросы.

  3. Каждый разложенный запрос выполняет три подшага. После того как все декомпозированные запросы проходят через подэтапы, результаты включают исходный запрос, дополненный запрос, декомпозированные запросы и накопленный контекст. Накопленный контекст включает агрегирование верхних N результатов из всех декомпозированных запросов, которые проходят через дополнительные подэтапы. Ниже перечислены следующие задачи.

    1. Необязательный переписчик запросов переписывает разложенный запрос.

    2. Индекс поиска обрабатывает перезаписанный запрос или исходный запрос. Он выполняет запрос с помощью типов поиска, таких как векторный, полнотекстовый, гибридный или ручной. Индекс поиска также может использовать расширенные возможности запроса, такие как HyDE.

    3. Результаты пересортированы. В накопленный контекст добавляются лучшие N пересортированные результаты.

  4. Исходный запрос вместе с накопленным контекстом проходит через те же три подраздела, что и каждый разложенный запрос. Но только один запрос проходит через шаги, и запрашивающий получает лучшие N результатов.

Передача изображений в запросах

Некоторые многомодальные модели, такие как GPT-4V и GPT-4o, могут интерпретировать изображения. Если вы используете эти модели, вы можете избежать фрагментирования изображений и передать изображение как часть запроса в многомодальную модель. Следует поэкспериментировать, чтобы определить, как этот подход работает по сравнению с разбиением изображений на части с передачей дополнительного контекста и без нее. Кроме того, следует сравнить затраты и провести анализ затрат и выгод.

Фильтрация запросов

Для фильтрации запросов можно использовать поля в хранилище поиска, настроенные как фильтруемые. Рассмотрите возможность фильтрации ключевых слов и сущностей для запросов, использующих эти поля, чтобы сузить результат. Используйте фильтрацию для устранения неуместных данных. Извлеките только данные, удовлетворяющие определенным условиям из индекса. Эта практика повышает общую производительность запроса и предоставляет более релевантные результаты. Чтобы определить, является ли фильтрация преимуществами вашего сценария, выполните эксперименты и тесты. Рассмотрим такие факторы, как запросы, которые не имеют ключевых слов или имеют неточные ключевые слова, аббревиатуры или акронимы.

Поля для ввода веса

В поиске ИИ можно взвесить поля, чтобы повлиять на ранжирование результатов на основе критериев.

Заметка

В этом разделе описаны возможности взвешивания поиска ИИ. Если вы используете другую платформу данных, изучите возможности взвешивания этой платформы.

Поиск ИИ поддерживает профили оценки, содержащие параметры для весовых полей и функций для числовых данных. Профили оценки применяются только к невекторным полям. Поддержка векторного и гибридного поиска доступна в предварительной версии. Вы можете создать несколько профилей оценки в индексе и при необходимости выбрать один для каждого запроса.

Поля, которые вы весите, зависят от типа запроса и варианта использования. Например, если запрос ориентирован на ключевые слова, например "Где размещена корпорация Майкрософт?", требуется профиль оценки, который весит сущность или поля ключевых слов выше. Вы можете использовать разные профили для разных пользователей, разрешить пользователям выбирать фокус или выбирать профили на основе приложения.

В рабочих системах следует поддерживать только профили, которые активно используются в рабочей среде.

Использование переранжирования

Используйте повторную обработку для выполнения одного или нескольких запросов, агрегирования результатов и ранжирования этих результатов. Рассмотрим следующие сценарии, которые выигрывают от повторной сортировки результатов поиска.

  • Вы выполнили вручную несколько поисковых запросов, и вы хотите агрегировать результаты и ранжировать их.

  • Поиск векторов и ключевых слов не всегда является точным. Вы хотите увеличить количество документов, которые возвращаются из поиска, включая допустимые результаты, которые в противном случае могли бы быть проигнорированы, и использовать ререйтинг для оценки результатов.

Для переупорядочения можно использовать языковую модель или кросскодировщик. Некоторые платформы, такие как AI Search, используют проприетарные методы для переранжировки результатов. Эти параметры можно оценить для ваших данных, чтобы определить, что лучше всего подходит для вашего сценария. В следующих разделах приведены сведения об этих методах.

Пересортировка языковой модели

Следующий пример языковой модели пересортировывает результаты. Для получения дополнительной информации см. акселератор экспериментов RAG .

Each document in the following list 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 that you should consult to answer the question, in order of relevance, and the relevance score as a JSON string based on JSON format as shown in the schema section. The relevance score is a number from 1 to 10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any other text, explanation, or metadata apart from the JSON string. Just output the JSON string, and strip every other text. Strictly remove the last comma from the nested JSON elements if it's present.
Don't include any documents that aren't relevant to the question. There should be exactly one document 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"
    }
}

Перекрестное изменение кодирования

В следующем примере используется кросскодировщик , предоставляемый Hugging Face для загрузки модели Роберты. Происходит итерация по каждому блоку и используется модель для вычисления сходства, в результате чего получается значение. Он сортирует результаты и возвращает верхние N результатов. Дополнительные сведения см. в репозитория GitHub RAG Experiment Accelerator.

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])

Семантическое ранжирование

Поиск ИИ обладает собственной функцией, называемой семантическим ранжированием . Эта функция использует модели глубокого обучения, адаптированные от Microsoft Bing, которые повышают семантические результаты. Дополнительные сведения см. в разделе Поиск по работе семантического ранжировщика.

Рассмотрим другие рекомендации по поиску

При реализации решения поиска рассмотрите следующее общее руководство.

  • Возвращает заголовок, сводку, источник и необработанные поля содержимого из поиска.

  • Определите заранее, нужно ли разбить запрос на подзапросы.

  • Выполнение векторных и текстовых запросов в нескольких полях. При получении запроса вы не знаете, лучше ли поиск векторов или текстовый поиск. И вы не знаете идеальные поля, которые должен искать векторный поиск или поиск ключевых слов. Вы можете искать по нескольким полям, потенциально с несколькими запросами, перераспределять результаты и возвращать результаты с самыми высокими оценками.

  • Отфильтруйте ключевые слова и поля сущностей, чтобы сузить результаты.

  • Используйте ключевые слова вместе с векторными поисками. Ключевые слова фильтруют результаты до меньшего подмножества. Хранилище векторов работает с этим подмножеством, чтобы найти лучшие совпадения.

Оценка результатов поиска

На этапе подготовки вы собрали тестовые запросы вместе со сведениями о тестовых документах. Для оценки результатов поиска можно использовать следующие сведения, собранные на этом этапе:

  • Запрос: пример запроса
  • Контекст: коллекция всех текстов в тестовых документах, которые относятся к образцу запроса

Чтобы оценить решение поиска, можно использовать следующие хорошо установленные методы оценки извлечения:

  • точность в K: процент правильно определенных соответствующих элементов из общих результатов поиска. Эта метрика фокусируется на точности результатов поиска.

  • Отзыв на K: Процент релевантных элементов среди первых K из общего числа возможных релевантных элементов. Эта метрика фокусируется на охвате результатов поиска.

  • Средний взаимный ранг (MRR): среднее значение взаимных рангов первого релевантного ответа в ранжированных результатах поиска. Эта метрика фокусируется на том, где первый соответствующий результат возникает в результатах поиска.

Следует проверить положительные и отрицательные примеры. Для положительных примеров необходимо, чтобы метрики были как можно ближе к 1. В отрицательных примерах, где данные не должны решать запросы, необходимо, чтобы метрики были как можно ближе к 0. Необходимо протестировать все тестовые запросы. Усредните положительные и отрицательные результаты запросов, чтобы понять, как ваши результаты поиска выглядят в совокупности.

Следующий шаг