Поисковые индексы
Вы можете загружать для AI-ассистента, созданного с помощью AI Assistant API, документы с дополнительной информацией. Поисковые индексы помогают ориентироваться в загруженных документах, чтобы при генерации ответов языковая модель могла использовать эту информацию.
В AI Assistant API доступны следующие типы поиска:
- Текстовый поиск или поиск по ключевым словам — это традиционный вид поиска, при котором каждое слово разбивается на части, и эти части ищутся в документе. Чем больше частей искомого слова или фразы найдено в тексте, тем более релевантным будет результат. Например, при запросе
свет
текстовый поиск найдет фрагменты, содержащие словасветящийся
иосвещение
, но нелампочка
. - Векторный или смысловой поиск позволяет находить в тексте синонимы и близкие по значению слова и фразы. В результатах векторного поиска слова
свет
будут содержаться не только однокоренные слова, но и близкие по смыслу:лампочка
,люстра
илисолнце
. - Гибридный поиск комбинирует текстовый и векторный поиск. При создании гибридного поискового индекса вы можете настроить, какой из типов поиска будет оказывать большее влияние на результаты.
Совет
При создании базы знаний для AI-ассистента используйте векторный или гибридный тип поиска.
Если в первую очередь вам важно точное совпадение ключевых слов, создайте текстовый или гибридный поисковый индекс.
При создании поискового индекса загруженные файлы разбиваются на чанки (chunks) — фрагменты текста от нескольких строк до нескольких абзацев, а текстовые символы преобразуются в токены. Когда пользователь задает вопрос, ассистент ищет релевантную информацию и добавляет в контекст запроса найденные чанки. При разбиении информации на чанки не учитывается смысл, поэтому текст может быть разделен, например, в середине предложения. Тогда контекст окажется неполным. Чтобы уменьшить потери информации из-за разрыва контекста, при разбиении данных на чанки используют перекрытие. Оно позволяет сохранить часть информации одновременно в двух соседних чанках. Чем больше размер чанков, тем больше контекста получит модель для генерации ответа, но тем медленнее и дороже будет обработка запроса. При создании поискового индекса вы можете использовать дообученую модель эмбеддингов.
Размер чанков и перекрытия, политика токенизации и другие настройки влияют на качество поиска. Не существует универсальных параметров, работающих одинаково на всех типах данных, поэтому параметры для оптимального поиска необходимо отдельно подбирать для каждого случая.
Текстовые поисковые индексы
При работе с текстовым поисковым индексом вы можете настроить размер чанка и размер перекрытия чанков в группе параметров StaticChunkingStrategy
. Размеры указываются в токенах, в текстовом поиске один токен равен одному символу.
На качество текстового поиска также влияют параметры политики токенизации NgramTokenizer
. С ее помощью вы можете задать минимальный и максимальный размер перекрывающих последовательностей символов, на которые разбивается искомая строка, и управлять частичным совпадением в результатах поиска.
Пример создания текстового поискового индекса для одного файла:
from yandex_cloud_ml_sdk import YCloudML
from yandex_cloud_ml_sdk import search_indexes
file = sdk.files.upload("<путь_к_файлу>")
operation = sdk.search_indexes.create_deferred(
files,
index_type=TextSearchIndexType(
chunking_strategy=StaticIndexChunkingStrategy(
max_chunk_size_tokens=700,
chunk_overlap_tokens=300,
)
)
)
grpcurl \
-H "Authorization: Bearer <IAM-токен>" \
-d @ \
llm.api.cloud.yandex.net:443 yandex.cloud.ai.assistants.v1.SearchIndexService.Create <<EOM
{
"folder_id": "<идентификатор_каталога>",
"file_ids": [ "<идентификатор_файла>" ],
"name": "название_индекса",
"text_search_index": {
"chunking_strategy": {
"static_strategy": {
"max_chunk_size_tokens": "700",
"chunk_overlap_tokens": "300"
}
},
"ngram_tokenizer": {
"min_gram": "2",
"max_gram": "5"
}
}
}
Векторные поисковые индексы
При создании векторного индекса модель эмбеддинга создает из чанков векторы, которые хранят смысл текстового фрагмента. Как и в текстовом поиске, вы можете указать размер чанка и размер перекрытия чанков в токенах. Учитывайте, что в векторном поиске токены, как правило, содержат больше одного символа.
Также вы можете переопределить модели эмбеддингов для запросов и ответов. По умолчанию используются модели эмбеддингов Foundation Models. Дообученные модели эмбеддингов позволят улучшить качество векторного поиска на специфичных доменах.
Пример создания векторного поиска для одного файла:
from yandex_cloud_ml_sdk import YCloudML
from yandex_cloud_ml_sdk import search_indexes
file = sdk.files.upload("<путь_к_файлу>")
operation = sdk.search_indexes.create_deferred(
files,
index_type=VectorSearchIndexType(
doc_embedder_uri="emb://<идентификатор_каталога>/text-search-doc/latest",
query_embedder_uri="emb://<идентификатор_каталога>/text-search-query/latest",
chunking_strategy=StaticIndexChunkingStrategy(
max_chunk_size_tokens=700,
chunk_overlap_tokens=300,
)
)
grpcurl \
-H "Authorization: Bearer <IAM-токен>" \
-d @ \
llm.api.cloud.yandex.net:443 yandex.cloud.ai.assistants.v1.SearchIndexService.Create <<EOM
{
"folder_id": "<идентификатор_каталога>",
"file_ids": [ "<идентификатор_файла>" ],
"name": "название_индекса",
"vector_search_index": {
"doc_embedder_uri": "emb://<идентификатор_каталога>/text-search-doc/latest",
"query_embedder_uri": "emb://<идентификатор_каталога>/text-search-query/latest",
"chunking_strategy": {
"static_strategy": {
"max_chunk_size_tokens": "700",
"chunk_overlap_tokens": "300"
}
}
}
}
Гибридный поиск
Гибридный поисковый индекс состоит из текстового и векторного индексов и содержит дополнительные настройки для согласования результатов поиска. Вы можете задавать политики чанкования для каждого типа индексов отдельно, однако скорее всего это не приведет к оптимальным результатам. Задавайте настройки политики чанкования в гибридном поиске глобально, чтобы содержание чанков для текстового и векторного индексов совпадали. В этом случае деление на чанки будет основано на токенах векторного индекса.
Итоговые результаты гибридного поиска будут зависеть от стратегии комбинирования результатов каждого индекса. Параметр combination_strategy
позволяет выбрать один из двух способ объединения результатов текстового и векторного индексов:
rrf_combination
(Reciprocal Rank Fusion , RRF) — метод объединения, придающий большее значение элементам, занимающим высшие позиции в каждом из индексов.mean_combination
— метод объединения на основе среднего значения. На выбор доступны среднее арифметическое, среднее геометрическое и среднее гармоническое. Дополнительно можно указать веса каждого индекса: первое значение будет задавать вес текстового поиска, второе — векторного. Сумма весов должна быть равна 1. По умолчанию используется среднее арифметическое.
Системы оценки качества текстового и векторного поиска различаются. Чтобы правильно интерпретировать результаты поиска, необходимо нормализовать эти оценки. Вы можете выбрать тип нормализации с помощью параметра normalization_strategy
:
MIN_MAX
— минимально-максимальная нормализация , нормализованные результаты находятся в диапазоне от 0 до 1. При использовании минимально-максимальной нормализации усиливается разница между лучшими и худшими оценками результатов поиска. По умолчанию используется нормализацияMIN_MAX
.L2
— L2-нормализация на основе Евклидовых расстояний. L2-нормализация сглаживает влияние лучших и худших оценок на общие результаты поиска.
Совет
При создании поискового индекса для AI-ассистента на основе документации наилучшие результаты показывает гибридный поиск со стратегией комбинирования RRF. При этом тип нормализации не оказывает принципиальное влияние на итоговый результат, поскольку метод RRF нормализует результаты.
Использование одной политики чанкования для текстового и векторного поиска также повышает качество поиска.
Пример создания векторного поиска для одного файла:
from yandex_cloud_ml_sdk import YCloudML
from yandex_cloud_ml_sdk import search_indexes
file = sdk.files.upload("<путь_к_файлу>")
operation = sdk.search_indexes.create_deferred(
files,
index_type=HybridSearchIndexType(
# Используйте глобальные параметры, чтобы размеры чанков двух индексов совпадали
chunking_strategy=StaticIndexChunkingStrategy(
max_chunk_size_tokens=700,
chunk_overlap_tokens=300
),
vector_search_index=VectorSearchIndexType(
doc_embedder_uri="emb://<идентификатор_каталога>/text-search-doc/latest",
query_embedder_uri="emb://<идентификатор_каталога>/text-search-query/latest"
),
normalization_strategy='L2',
combination_strategy=ReciprocalRankFusionIndexCombinationStrategy(
k=60
)
)
)
grpcurl \
-H "Authorization: Bearer <IAM-токен>" \
-d @ \
llm.api.cloud.yandex.net:443 yandex.cloud.ai.assistants.v1.SearchIndexService.Create <<EOM
{
"folder_id": "<идентификатор_каталога>",
"file_ids": [ "<идентификатор_файла>" ],
"name": "название_индекса",
"hybrid_search_index": {
"chunking_strategy": {
"static_strategy": {
"max_chunk_size_tokens": "700",
"chunk_overlap_tokens": "300"
}
},
"normalization_strategy": "L2",
"combination_strategy": {
"rrf_combination": {
"k": "60"
}
},
"vector_search_index": {
"doc_embedder_uri": "emb://<идентификатор_каталога>/text-search-doc/latest",
"query_embedder_uri": "emb://<идентификатор_каталога>/text-search-query/latest",
}
}
}
Примеры использования
- Создать ассистента с поисковым индексом
- Примеры работы с ML SDK на GitHub