Добавление семантического ранжирования в запросы в поиске ИИ Azure
Статья
10.12.2024
Вы можете применить семантический ранжирование к текстовым запросам, гибридным запросам и векторным запросам, если в документах поиска содержатся строковые поля, а векторный запрос содержит текстовое представление в документе поиска.
В этой статье объясняется, как вызвать семантический рангер для запросов. Предполагается, что вы используете самые последние стабильные или предварительные версии API. Дополнительные сведения о более ранних версиях см. в статье "Миграция семантического ранжирования кода".
Необходимые компоненты
Служба поиска, уровень "Базовый" или более поздней версии с включенной семантикой ранжирования.
Заголовки и ответы извлекаются дословно из текста в документе поиска. Семантическая подсистема использует понимание машинного чтения для распознавания содержимого с характеристиками подписи или ответа, но не создает новые предложения или фразы. По этой причине содержимое, включающее объяснения или определения, лучше всего подходит для семантического ранжирования. Если требуется взаимодействие в стиле чата с созданными ответами, см. статью "Извлечение дополненного поколения" (RAG).
Выбор клиента
Для создания запроса, использующего семантический ранжирование, можно использовать любой из следующих средств и пакетов SDK:
портал Azure с помощью конструктора индексов для добавления семантической конфигурации.
Избегайте функций, которые обходят оценку релевантности
Несколько возможностей запросов обходят оценку релевантности, что делает их несовместимыми с семантической ранжированием. Если логика запроса включает следующие функции, вы не сможете семантической ранжировать результаты:
Запрос с search=* пустой строкой поиска, такой как чистый запрос только для фильтра, не будет работать, так как нет ничего, чтобы измерять семантику релевантности и поэтому оценки поиска равны нулю. Запрос должен предоставлять термины или фразы, которые можно оценить во время обработки.
Сортировка (предложения orderBy) для определенных полей переопределяет оценки поиска и семантические оценки. Учитывая, что семантическая оценка должна предоставлять рейтинг, добавление предложения orderby приводит к ошибке HTTP 400 при применении семантического ранжирования по упорядоченным результатам.
Настройка запроса
По умолчанию запросы не используют семантическое ранжирование. Для использования семантического ранжирования можно использовать два разных параметра. Каждый параметр поддерживает другой набор сценариев.
Семантические запросы, указанные в search плюсе queryTypeили через semanticQuery, должны быть обычным текстом, и они не могут быть пустыми. Пустые запросы не применяются к результатам семантического ранжирования.
1queryType=semantic не поддерживает явные simple или full значения, так как queryType параметр используется для semantic. Поведение эффективного запроса — это значения по умолчанию простого средства синтаксического анализа.
2 Параметр semanticQuery можно использовать для всех типов запросов. Однако он не поддерживается в обозревателе поиска портал Azure.
Независимо от выбранного параметра индекс должен содержать текстовые поля с форматированным семантического содержимого и семантической конфигурацией.
Откройте индекс поиска и выберите обозреватель поиска.
Выберите параметры запроса. Если вы уже определили семантику конфигурации, она выбрана по умолчанию. Если у вас его нет, создайте семантику конфигурации для индекса.
Введите запрос, например "исторический отель с хорошей едой", и выберите "Поиск".
Кроме того, выберите представление JSON и вставьте определения в редактор запросов. Портал Azure не поддерживает использованиеsemanticQuery, поэтому требуется"semantic":queryType
Пример JSON для задания типа запроса семантикой, которую можно вставить в представление:
{
"search": "funky or interesting hotel with good food on site",
"count": true,
"queryType": "semantic",
"semanticConfiguration": "my-semantic-config",
"captions": "extractive|highlight-true",
"answers": "extractive|count-3",
"highlightPreTag": "<strong>",
"highlightPostTag": "</strong>",
"select": "HotelId,HotelName,Description,Category"
}
Используйте документы поиска, чтобы сформулировать запрос.
Ответ включает автоматический @search.rerankerScore ответ. Если вы хотите заголовок или ответы в ответе, включите семантический ранжирование, задав queryTypesemantic или установив semanticQuery и добавив подписи и ответы на запрос.
В следующих примерах в этом разделе используется индекс hotels-sample-index для демонстрации семантического ранжирования с семантических ответов и субтитров.
Использование queryType=semantic
Если вы хотите задать значение queryTypesemantic, вставьте следующий запрос в веб-клиент в качестве шаблона. Замените на имя службы поиска и замените search-service-namehotels-sample-index его, если у вас есть другое имя индекса.
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "interesting hotel with restaurant on site and cozy lobby or shared area",
"count": true,
"queryType": "semantic",
"semanticConfiguration": "semantic-config",
"captions": "extractive|highlight-true",
"answers": "extractive|count-3",
"highlightPreTag": "<strong>",
"highlightPostTag": "</strong>",
"select": "HotelId,HotelName,Description,Category"
}
Задайте для параметра queryType значение semantic.
Задайте search простой текстовый запрос.
queryType Так как задано semanticзначение , простой синтаксис или полный синтаксис Lucene не поддерживается.
* Предоставление или пустая строка не приводит к применению семантического ранжирования к запросу.
Задайте semanticConfiguration предопределенную семантику конфигурации , внедренную в индекс.
Задайте для answers указания, включены ли семантические ответы в результат. В настоящее время единственным допустимым значением этого параметра является extractive. Ответы можно настроить для возврата не более 10. Значение по умолчанию — "один". В этом примере показано, как получать три ответа: extractive|count-3.
Ответы не гарантированы по каждому запросу. Чтобы получить ответ, запрос должен выглядеть как вопрос, и содержимое должно содержать текст, который выглядит как ответ.
Задайте значение captions , чтобы указать, включены ли семантические заголовки в результат. В настоящее время единственным допустимым значением этого параметра является extractive. Заголовки можно настроить для возврата результатов с выделением или без нее. Значение по умолчанию — для возвращаемых выделений. В этом примере возвращаются заголовки без выделения: extractive|highlight-false
Основой подписей и ответов являются поля, на которые ссылается семантикаConfiguration. Эти поля находятся под объединенным ограничением в диапазоне от 2000 маркеров или около 20 000 символов. Если ожидается, что количество маркеров превышает это ограничение, рассмотрите шаг фрагментирования данных с помощью навыка разделения текста. Этот подход представляет зависимость от конвейера обогащения ИИ и индексаторов.
Задайте highlightPreTag и highlightPostTag если вы хотите переопределить форматирование выделения по умолчанию, которое применяется к подписям.
Заголовки применяют форматирование выделения для ключевых фрагментов в документе, который обобщает ответ. Значение по умолчанию — <em>. Если необходимо указать тип форматирования (например, желтый фон), можно задать параметры highlightPreTag и highlightPostTag.
Установите флажок, чтобы указать, какие поля возвращаются в ответе, и "count", чтобы вернуть количество совпадений в индексе. Эти параметры повышают качество запроса и удобочитаемости ответа.
Отправьте запрос для выполнения запроса и возврата результатов.
Использование семантикиQuery
С помощью semanticQueryможно явно применить простой текстовый синтаксис или полнотекстовый синтаксис, что означает, что теперь можно выполнять поиск по полю, повышение терминов и поиск близкого взаимодействия. Можно также указать чистый векторный запрос вместо просто гибридного.
Измените запрос на следующий код JSON, чтобы использовать semanticQueryего.
POST https://[search-service-name].search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
"search": "Description:breakfast",
"semanticQuery": "interesting hotel with restaurant on site and cozy lobby or shared area",
"count": true,
"queryType": "full",
"semanticConfiguration": "semantic-config",
"captions": "extractive|highlight-true",
"answers": "extractive|count-3",
"highlightPreTag": "<strong>",
"highlightPostTag": "</strong>",
"select": "HotelId,HotelName,Description,Category"
}
Задайте queryType синтаксис поиска, который вы используете, либо простой, либо полный.
Задайте semanticQuery для простого текстового запроса, который вы хотите использовать для семантического ранжирования. Пустые запросы не поддерживаются. Избегайте операторов или любого синтаксиса запроса внутри самой строки.
Используйте QueryType или SemanticQuery для вызова семантического ранджера в семантическом запросе. Следующий пример приведен в команде azure SDK.
SearchResults<Hotel> response = await searchClient.SearchAsync<Hotel>(
"interesting hotel with restaurant on site and cozy lobby or shared area",
new SearchOptions
{
SemanticSearch = new()
{
SemanticConfigurationName = "my-semantic-config",
QueryCaption = new(QueryCaptionType.Extractive),
QueryAnswer = new(QueryAnswerType.Extractive)
},
QueryType = SearchQueryType.Semantic
});
int count = 0;
Console.WriteLine($"Semantic Search Results:");
Console.WriteLine($"\nQuery Answer:");
foreach (QueryAnswerResult result in response.SemanticSearch.Answers)
{
Console.WriteLine($"Answer Highlights: {result.Highlights}");
Console.WriteLine($"Answer Text: {result.Text}");
}
await foreach (SearchResult<Hotel> result in response.GetResultsAsync())
{
count++;
Hotel doc = result.Document;
Console.WriteLine($"{doc.HotelId}: {doc.HotelName}");
if (result.SemanticSearch.Captions != null)
{
var caption = result.SemanticSearch.Captions.FirstOrDefault();
if (caption.Highlights != null && caption.Highlights != "")
{
Console.WriteLine($"Caption Highlights: {caption.Highlights}");
}
else
{
Console.WriteLine($"Caption Text: {caption.Text}");
}
}
}
Console.WriteLine($"Total number of search results:{count}");
Чтобы использовать semanticQuery вместо параметра queryTypesemantic, фрагмент кода поиска можно заменить следующим фрагментом кода:
SearchResults<Hotel> response = await searchClient.SearchAsync<Hotel>(
"Luxury hotel",
new SearchOptions
{
SemanticSearch = new()
{
SemanticConfigurationName = "my-semantic-config",
QueryCaption = new(QueryCaptionType.Extractive),
QueryAnswer = new(QueryAnswerType.Extractive),
SemanticQuery = "Is there any hotel located on the main commercial artery of the city in the heart of New York?"
}
});
Оценка ответа
Только первые 50 совпадений из начальных результатов могут быть семантические. Как и во всех запросах, ответ состоит из всех полей, помеченных как извлекаемые, или только эти поля, перечисленные в параметре select . Ответ включает исходную оценку релевантности, а также может включать количество или пакетные результаты в зависимости от того, как вы сформулировали запрос.
В семантическом ранжировании ответ содержит больше элементов: новая семантическая оценка релевантности, необязательный заголовок в виде обычного текста и выделения и необязательный ответ. Если результаты не включают эти дополнительные элементы, запрос может быть неправильно настроен. В качестве первого шага по устранению проблемы проверьте семантику конфигурации, чтобы убедиться, что она указана как в определении индекса, так и в запросе.
В клиентском приложении можно структурировать страницу поиска, включив в нее заголовок в качестве описания совпадения, а не всего содержимого определенного поля. Этот подход полезен, если отдельные поля слишком плотны для страницы результатов поиска.
Ответ на приведенный выше пример запроса ("интересный отель с рестораном на сайте и уютный лобби или общий район") возвращает три ответа ("answers": "extractive|count-e"). Заголовки возвращаются, так как свойство "субтитры" задано с обычным текстом и выделенными версиями. Если не удается определить ответ, он опущен из ответа. Для краткости в этом примере показаны только три ответа и три самых высоких результата оценки из запроса.
{
"@odata.count": 29,
"@search.answers": [
{
"key": "24",
"text": "Chic hotel near the city. High-rise hotel in downtown, within walking distance to theaters, art galleries, restaurants and shops. Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"highlights": "Chic hotel near the city. <strong>High-rise hotel in downtown, </strong>within<strong> walking distance to </strong>theaters, art<strong> galleries, restaurants and shops.</strong> Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"score": 0.9340000152587891
},
{
"key": "40",
"text": "Only 8 miles from Downtown. On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport.",
"highlights": "Only 8 miles from Downtown. <strong>On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, </strong>All non-smoking<strong> hotel.</strong> Only 15 miles from airport.",
"score": 0.9210000038146973
},
{
"key": "38",
"text": "Nature is Home on the beach. Explore the shore by day, and then come home to our shared living space to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
"highlights": "Nature is Home on the beach. Explore the shore by day, and then come home to our<strong> shared living space </strong>to relax around a stone fireplace, sip something warm, and explore the library by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.",
"score": 0.9200000166893005
}
],
"value": [
{
"@search.score": 3.2328331,
"@search.rerankerScore": 2.575303316116333,
"@search.captions": [
{
"text": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a complimentary continental breakfast in the lobby, and free Wi-Fi throughout the hotel.",
"highlights": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our<strong> penthouse </strong>suites offer views for miles and the rooftop<strong> plaza </strong>is open to all guests from sunset to 10 p.m. Enjoy a<strong> complimentary continental breakfast in the lobby, </strong>and free Wi-Fi<strong> throughout </strong>the hotel."
}
],
"HotelId": "50",
"HotelName": "Head Wind Resort",
"Description": "The best of old town hospitality combined with views of the river and cool breezes off the prairie. Our penthouse suites offer views for miles and the rooftop plaza is open to all guests from sunset to 10 p.m. Enjoy a complimentary continental breakfast in the lobby, and free Wi-Fi throughout the hotel.",
"Category": "Suite"
},
{
"@search.score": 0.632956,
"@search.rerankerScore": 2.5425150394439697,
"@search.captions": [
{
"text": "Every stay starts with a warm cookie. Amenities like the Counting Sheep sleep experience, our Wake-up glorious breakfast buffet and spacious workout facilities await.",
"highlights": "Every stay starts with a warm cookie. Amenities like the<strong> Counting Sheep sleep experience, </strong>our<strong> Wake-up glorious breakfast buffet and spacious workout facilities </strong>await."
}
],
"HotelId": "34",
"HotelName": "Lakefront Captain Inn",
"Description": "Every stay starts with a warm cookie. Amenities like the Counting Sheep sleep experience, our Wake-up glorious breakfast buffet and spacious workout facilities await.",
"Category": "Budget"
},
{
"@search.score": 3.7076726,
"@search.rerankerScore": 2.4554927349090576,
"@search.captions": [
{
"text": "Chic hotel near the city. High-rise hotel in downtown, within walking distance to theaters, art galleries, restaurants and shops. Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"highlights": "Chic hotel near the city. <strong>High-rise hotel in downtown, </strong>within<strong> walking distance to </strong>theaters, art<strong> galleries, restaurants and shops.</strong> Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance."
}
],
"HotelId": "24",
"HotelName": "Uptown Chic Hotel",
"Description": "Chic hotel near the city. High-rise hotel in downtown, within walking distance to theaters, art galleries, restaurants and shops. Visit Seattle Art Museum by day, and then head over to Benaroya Hall to catch the evening's concert performance.",
"Category": "Suite"
},
. . .
]
}
Ожидаемые рабочие нагрузки
Для семантического ранжирования следует ожидать, что служба поиска поддерживает до 10 одновременных запросов на реплику.
Служба регулирует запросы семантического ранжирования, если объемы слишком высоки. Сообщение об ошибке, включающее эти фразы, указывает, что служба находится в емкости для семантического ранжирования:
Error in search query: Operation returned an invalid status 'Partial Content'`
@search.semanticPartialResponseReason`
CapacityOverloaded
Если вы ожидаете согласованные требования к пропускной способности вблизи этого уровня или выше, отправьте запрос в службу поддержки, чтобы мы могли подготовить рабочую нагрузку.
Следующие шаги
Семантический ранжирование можно использовать в гибридных запросах, которые объединяют поиск по ключевым словам и векторный поиск в одном запросе и унифицированном ответе.