Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Из этого краткого руководства вы узнаете, как использовать семантическое ранжирование, добавив семантическую конфигурацию в поисковый индекс и добавив семантические параметры к запросу. Вы можете использовать индекс hotels-sample-index или ваш собственный.
В службе "Поиск искусственного интеллекта Azure" семантическое ранжирование — это функция на стороне запроса, которая использует понимание машинного чтения от Microsoft для пересчитывания результатов поиска, повышая наиболее семантически релевантные совпадения в верхней части списка. В зависимости от содержимого и запроса семантический рейтинг может значительно повысить релевантность поиска с минимальными усилиями разработчика.
Вы можете добавить семантическую конфигурацию в существующий индекс без необходимости перестройки. Семантическая ранжирование наиболее эффективна для текста, который является информационным или описательным.
Необходимые компоненты
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Служба поиска ИИ Azure с поддержкой семантического ранджера.
Новый или существующий индекс с описательными или подробными текстовыми полями, которые атрибутируются как извлекаемые. В этом кратком руководстве предполагается индекс hotels-sample-index.
Настройка доступа
Вы можете подключиться к службе поиска ИИ Azure с помощью ключей API или идентификатора Microsoft Entra с назначениями ролей. Ключи проще начать с, но роли более безопасны. Дополнительные сведения см. в статье "Подключение к поиску ИИ Azure" с помощью ролей.
Чтобы настроить доступ на основе ролей, выполните приведенные действия.
Войдите на портал Azure и выберите службу поиска.
На левой панели выберите Настройки>Ключи.
В разделе "Управление доступом к API" выберите управление доступом на основе ролей или Оба , если требуется время для перехода клиентов на доступ на основе ролей.
В левой области выберите элемент управления доступом (IAM).
Выберите Добавить>Добавить назначение ролей.
Назначьте роли участника службы поиска и участника индекса поиска учетной записи пользователя.
Начните с индекса
Предполагается, что в этом кратком руководстве уже существует индекс, который затем изменяется для включения семантической конфигурации. Мы рекомендуем использовать индекс hotels-sample-index, который можно создать за считанные минуты средствами мастера Azure-портала.
Чтобы начать с существующего индекса, выполните приведенные далее действия.
Войдите в портал Azure и найдите службу поиска.
В разделе"Индексы управления >поиском" выберите индекс hotels-sample-index.
Выберите семантические конфигурации , чтобы гарантировать, что индекс не имеет семантической конфигурации.
Выберите обозреватель поиска и выберите представление JSON.
Вставьте следующий код JSON в редактор запросов.
{ "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true }
Выберите "Поиск", чтобы запустить запрос.
Этот запрос — это поиск ключевых слов. Ответ должен быть аналогичен следующему примеру, оцененному по умолчанию через BM25 L1 для полнотекстового поиска.
Для удобства чтения пример выбирает только поля
HotelId,HotelName, иDescription. Результаты содержат подробные совпадения в терминах запроса (walking, ,distance,live)musicили лингвистических вариантах (walk,living)."@odata.count": 13, "value": [ { "@search.score": 5.5153193, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 5.074317, "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." }, { "@search.score": 4.8959594, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 2.5966604, "HotelId": "35", "HotelName": "Bellevue Suites", "Description": "Comfortable city living in the very center of downtown Bellevue. Newly reimagined, this hotel features apartment-style suites with sleeping, living and work spaces. Located across the street from the Light Rail to downtown. Free shuttle to the airport." }, { "@search.score": 2.566386, "HotelId": "47", "HotelName": "Country Comfort Inn", "Description": "Situated conveniently at the north end of the village, the inn is just a short walk from the lake, offering reasonable rates and all the comforts home inlcuding living room suites and functional kitchens. Pets are welcome." }, { "@search.score": 2.2405157, "HotelId": "9", "HotelName": "Smile Up Hotel", "Description": "Experience the fresh, modern downtown. Enjoy updated rooms, bold style & prime location. Don't miss our weekend live music series featuring who's new/next on the scene." }, { "@search.score": 2.1737604, "HotelId": "8", "HotelName": "Foot Happy Suites", "Description": "Downtown in the heart of the business district. Close to everything. Leave your car behind and walk to the park, shopping, and restaurants. Or grab one of our bikes and take your explorations a little further." }, { "@search.score": 2.0364518, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." }, { "@search.score": 1.7595702, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 1.5502293, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3302404, "HotelId": "42", "HotelName": "Rock Bottom Resort & Campground", "Description": "Rock Bottom is nestled on 20 unspoiled acres on a private cove of Rock Bottom Lake. We feature both lodging and campground accommodations to suit just about every taste. Even though we are out of the traffic of the city, getting there is only a short drive away." }, { "@search.score": 0.9050383, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 0.7334347, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." } ]
В этом запросе показано, как выглядит ответ перед применением семантического ранжирования. Позже вы можете выполнить тот же запрос после настройки семантического ранжирования, чтобы узнать, как изменяется ответ.
Подсказка
Вы можете добавить семантическую конфигурацию на портале Azure. Однако если вы хотите узнать, как добавить семантическую конфигурацию программным методом, перейдите к этому краткому руководству пользователя.
Настройка клиента
В этом кратком руководстве вы используете интегрированную среду разработки и клиентскую библиотеку Azure.Search.Documents для добавления семантического ранжирования в существующий индекс поиска.
Мы рекомендуем Visual Studio для этого быстрого начала.
Подсказка
Исходный код можно скачать, чтобы начать с готового проекта или выполнить следующие действия, чтобы создать собственный.
Установка библиотек
Запустите Visual Studio и откройте quickstart-semantic-search.sln или создайте проект с помощью шаблона консольного приложения.
В разделе Инструменты>Диспетчер пакетов NuGet выберите Управление пакетами NugGet для решения....
Выберите Обзор.
Найдите пакет Azure.Search.Documents и выберите последнюю стабильную версию.
Найдите пакет Azure.Identity и выберите последнюю стабильную версию.
Выберите " Установить" , чтобы добавить сборку в проект и решение.
Вход в Azure
Если вы вошли на портал Azure, вы вошли в Azure. Если вы не уверены, используйте Azure CLI или Azure PowerShell для входа в систему: az login или az connect. Если у вас несколько арендаторов и подписок, см. Краткое руководство: Подключение без ключей для получения помощи по подключению.
Обновление индекса
В этом разделе вы обновите индекс поиска, чтобы включить семантическую конфигурацию. Код получает определение индекса из службы поиска и добавляет семантическую конфигурацию.
Откройте проект BuildIndex в Visual Studio. Программа состоит из следующего кода.
Этот код использует SearchIndexClient для обновления индекса в службе поиска.
class BuildIndex { static async Task Main(string[] args) { string searchServiceName = "PUT-YOUR-SEARCH-SERVICE-NAME-HERE"; string indexName = "hotels-sample-index"; string endpoint = $"https://{searchServiceName}.search.windows.net"; var credential = new Azure.Identity.DefaultAzureCredential(); await ListIndexesAsync(endpoint, credential); await UpdateIndexAsync(endpoint, credential, indexName); } // Print a list of all indexes on the search service // You should see hotels-sample-index in the list static async Task ListIndexesAsync(string endpoint, Azure.Core.TokenCredential credential) { try { var indexClient = new Azure.Search.Documents.Indexes.SearchIndexClient( new Uri(endpoint), credential ); var indexes = indexClient.GetIndexesAsync(); Console.WriteLine("Here's a list of all indexes on the search service. You should see hotels-sample-index:"); await foreach (var index in indexes) { Console.WriteLine(index.Name); } Console.WriteLine(); // Add an empty line for readability } catch (Exception ex) { Console.WriteLine($"Error listing indexes: {ex.Message}"); } } static async Task UpdateIndexAsync(string endpoint, Azure.Core.TokenCredential credential, string indexName) { try { var indexClient = new Azure.Search.Documents.Indexes.SearchIndexClient( new Uri(endpoint), credential ); // Get the existing definition of hotels-sample-index var indexResponse = await indexClient.GetIndexAsync(indexName); var index = indexResponse.Value; // Add a semantic configuration const string semanticConfigName = "semantic-config"; AddSemanticConfiguration(index, semanticConfigName); // Update the index with the new information var updatedIndex = await indexClient.CreateOrUpdateIndexAsync(index); Console.WriteLine("Index updated successfully."); // Print the updated index definition as JSON var refreshedIndexResponse = await indexClient.GetIndexAsync(indexName); var refreshedIndex = refreshedIndexResponse.Value; var jsonOptions = new JsonSerializerOptions { WriteIndented = true }; string indexJson = JsonSerializer.Serialize(refreshedIndex, jsonOptions); Console.WriteLine($"Here is the revised index definition:\n{indexJson}"); } catch (Exception ex) { Console.WriteLine($"Error updating index: {ex.Message}"); } } // This is the semantic configuration definition static void AddSemanticConfiguration(SearchIndex index, string semanticConfigName) { if (index.SemanticSearch == null) { index.SemanticSearch = new SemanticSearch(); } var configs = index.SemanticSearch.Configurations; if (configs == null) { throw new InvalidOperationException("SemanticSearch.Configurations is null and cannot be assigned. Your service must be Basic tier or higher."); } if (!configs.Any(c => c.Name == semanticConfigName)) { var prioritizedFields = new SemanticPrioritizedFields { TitleField = new SemanticField("HotelName"), ContentFields = { new SemanticField("Description") }, KeywordsFields = { new SemanticField("Tags") } }; configs.Add( new SemanticConfiguration( semanticConfigName, prioritizedFields ) ); Console.WriteLine($"Added new semantic configuration '{semanticConfigName}' to the index definition."); } else { Console.WriteLine($"Semantic configuration '{semanticConfigName}' already exists in the index definition."); } index.SemanticSearch.DefaultConfigurationName = semanticConfigName; } }Замените URL-адрес службы поиска допустимой конечной точкой.
Запустите программу.
Выходные данные записываются в окно консоли из Console.WriteLine. Для каждого шага должны отображаться сообщения, включая JSON схемы индекса с новой семантической конфигурацией.
Выполнение семантических запросов
В этом разделе программа выполняет несколько семантических запросов в последовательности.
Откройте проект QueryIndex в Visual Studio. Программа состоит из следующего кода.
Этот код использует SearchClient для отправки запросов в индекс.
class SemanticQuery { static async Task Main(string[] args) { string searchServiceName = "PUT-YOUR-SEARCH-SERVICE-NAME-HERE"; string indexName = "hotels-sample-index"; string endpoint = $"https://{searchServiceName}.search.windows.net"; var credential = new Azure.Identity.DefaultAzureCredential(); var client = new SearchClient(new Uri(endpoint), indexName, credential); // Query 1: Simple query string searchText = "walking distance to live music"; Console.WriteLine("\nQuery 1: Simple query using the search string 'walking distance to live music'."); await RunQuery(client, searchText, new SearchOptions { Size = 5, QueryType = SearchQueryType.Simple, IncludeTotalCount = true, Select = { "HotelId", "HotelName", "Description" } }); Console.WriteLine("Press Enter to continue to the next query..."); Console.ReadLine(); // Query 2: Semantic query (no captions, no answers) Console.WriteLine("\nQuery 2: Semantic query (no captions, no answers) for 'walking distance to live music'."); var semanticOptions = new SearchOptions { Size = 5, QueryType = SearchQueryType.Semantic, SemanticSearch = new SemanticSearchOptions { SemanticConfigurationName = "semantic-config" }, IncludeTotalCount = true, Select = { "HotelId", "HotelName", "Description" } }; await RunQuery(client, searchText, semanticOptions); Console.WriteLine("Press Enter to continue to the next query..."); Console.ReadLine(); // Query 3: Semantic query with captions Console.WriteLine("\nQuery 3: Semantic query with captions."); var captionsOptions = new SearchOptions { Size = 5, QueryType = SearchQueryType.Semantic, SemanticSearch = new SemanticSearchOptions { SemanticConfigurationName = "semantic-config", QueryCaption = new QueryCaption(QueryCaptionType.Extractive) { HighlightEnabled = true } }, IncludeTotalCount = true, Select = { "HotelId", "HotelName", "Description" } }; // Add the field(s) you want captions for to the QueryCaption.Fields collection captionsOptions.HighlightFields.Add("Description"); await RunQuery(client, searchText, captionsOptions, showCaptions: true); Console.WriteLine("Press Enter to continue to the next query..."); Console.ReadLine(); // Query 4: Semantic query with answers // This query uses different search text designed for an answers scenario string searchText2 = "what's a good hotel for people who like to read"; searchText = searchText2; // Update searchText for the next query Console.WriteLine("\nQuery 4: Semantic query with a verbatim answer from the Description field for 'what's a good hotel for people who like to read'."); var answersOptions = new SearchOptions { Size = 5, QueryType = SearchQueryType.Semantic, SemanticSearch = new SemanticSearchOptions { SemanticConfigurationName = "semantic-config", QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive) }, IncludeTotalCount = true, Select = { "HotelId", "HotelName", "Description" } }; await RunQuery(client, searchText2, answersOptions, showAnswers: true); static async Task RunQuery( SearchClient client, string searchText, SearchOptions options, bool showCaptions = false, bool showAnswers = false) { try { var response = await client.SearchAsync<SearchDocument>(searchText, options); if (showAnswers && response.Value.SemanticSearch?.Answers != null) { Console.WriteLine("Extractive Answers:"); foreach (var answer in response.Value.SemanticSearch.Answers) { Console.WriteLine($" {answer.Highlights}"); } Console.WriteLine(new string('-', 40)); } await foreach (var result in response.Value.GetResultsAsync()) { var doc = result.Document; // Print captions first if available if (showCaptions && result.SemanticSearch?.Captions != null) { foreach (var caption in result.SemanticSearch.Captions) { Console.WriteLine($"Caption: {caption.Highlights}"); } } Console.WriteLine($"HotelId: {doc.GetString("HotelId")}"); Console.WriteLine($"HotelName: {doc.GetString("HotelName")}"); Console.WriteLine($"Description: {doc.GetString("Description")}"); Console.WriteLine($"@search.score: {result.Score}"); // Print @search.rerankerScore if available if (result.SemanticSearch != null && result.SemanticSearch.RerankerScore.HasValue) { Console.WriteLine($"@search.rerankerScore: {result.SemanticSearch.RerankerScore.Value}"); } Console.WriteLine(new string('-', 40)); } } catch (Exception ex) { Console.WriteLine($"Error querying index: {ex.Message}"); } } } }Замените URL-адрес службы поиска допустимой конечной точкой.
Запустите программу.
Выходные данные записываются в окно консоли из Console.WriteLine. Результаты поиска должны отображаться для каждого запроса.
Выходные данные для семантического запроса (без подписей или ответов)
Это выходные данные из семантического запроса без подписей или ответов. Строка запроса — "пешая доступность до живой музыки".
Здесь начальные результаты терминного запроса пересматриваются с использованием семантических моделей ранжирования. Для этого конкретного набора данных и запроса первые несколько результатов находятся в аналогичных позициях. Эффекты семантического ранжирования более выражены в оставшейся части результатов.
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.
@search.score: 5.074317
@search.rerankerScore: 2.613231658935547
----------------------------------------
HotelId: 2
HotelName: Old Century Hotel
Description: The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.
@search.score: 5.5153193
@search.rerankerScore: 2.271434783935547
----------------------------------------
HotelId: 4
HotelName: Sublime Palace Hotel
Description: Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience.
@search.score: 4.8959594
@search.rerankerScore: 1.9861756563186646
----------------------------------------
HotelId: 39
HotelName: White Mountain Lodge & Suites
Description: Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings.
@search.score: 0.7334347
@search.rerankerScore: 1.9615401029586792
----------------------------------------
HotelId: 15
HotelName: By the Market Hotel
Description: Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service.
@search.score: 1.5502293
@search.rerankerScore: 1.9085469245910645
----------------------------------------
Press Enter to continue to the next query...
Выходные данные для семантического запроса с заголовками
Ниже приведены результаты запроса, добавляющего надписи с выделением совпадений.
Caption: Chic hotel near the city. High-rise hotel in downtown, within walking distance to<em> theaters, </em>art galleries, restaurants and shops. Visit<em> Seattle Art Museum </em>by day, and then head over to<em> Benaroya Hall </em>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.
@search.score: 5.074317
@search.rerankerScore: 2.613231658935547
----------------------------------------
Caption:
HotelId: 2
HotelName: Old Century Hotel
Description: The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.
@search.score: 5.5153193
@search.rerankerScore: 2.271434783935547
----------------------------------------
Caption: Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within<em> short walking distance </em>to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort,.
HotelId: 4
HotelName: Sublime Palace Hotel
Description: Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience.
@search.score: 4.8959594
@search.rerankerScore: 1.9861756563186646
----------------------------------------
Caption: Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend<em> evening entertainment </em>on the patio features special<em> guest musicians </em>or.
HotelId: 39
HotelName: White Mountain Lodge & Suites
Description: Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings.
@search.score: 0.7334347
@search.rerankerScore: 1.9615401029586792
----------------------------------------
Caption: Book now and Save up to 30%. Central location. <em>Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood.</em> Brand new rooms. Impeccable service.
HotelId: 15
HotelName: By the Market Hotel
Description: Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service.
@search.score: 1.5502293
@search.rerankerScore: 1.9085469245910645
----------------------------------------
Press Enter to continue to the next query...
Выходные данные для семантических ответов
Окончательный запрос возвращает семантический ответ. Обратите внимание, что мы изменили строку запроса для этого примера: "Что такое хороший отель для людей, которые любят читать".
Семантический рангировщик может создать ответ на строку запроса, которая имеет характеристики вопроса. Созданный ответ извлекается непосредственно из вашего содержимого, поэтому он не будет содержать составленного контента, который можно ожидать от модели завершения чата. Если семантический ответ не полезен для вашего сценария, можно исключить semantic_answers из вашего кода.
Чтобы создать семантический ответ, вопрос и ответ должны быть тесно согласованы, и модель должна найти содержимое, которое четко отвечает на этот вопрос. Если потенциальные ответы не соответствуют порогу достоверности, модель не возвращает ответ. В демонстрационных целях вопрос в этом примере предназначен для получения ответа, чтобы увидеть синтаксис.
Помните, что ответы представляют собой дословное содержание, извлеченное из вашего индекса, и могут отсутствовать фразы, которые пользователь ожидает увидеть. Чтобы получить составленные ответы, созданные моделью завершения чата, стоит учесть использование шаблона RAG или агентного извлечения.
Extractive Answers:
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<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.
----------------------------------------
HotelId: 1
HotelName: Stay-Kay City Hotel
Description: This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.
@search.score: 2.0361428
@search.rerankerScore: 2.124817371368408
----------------------------------------
HotelId: 16
HotelName: Double Sanctuary Resort
Description: 5 star Luxury Hotel - Biggest Rooms in the city. #1 Hotel in the area listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso in room.
@search.score: 3.759768
@search.rerankerScore: 2.0705394744873047
----------------------------------------
HotelId: 38
HotelName: Lakeside B & B
Description: 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.
@search.score: 0.7308748
@search.rerankerScore: 2.041472911834717
----------------------------------------
HotelId: 2
HotelName: Old Century Hotel
Description: The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music.
@search.score: 3.391012
@search.rerankerScore: 2.0231292247772217
----------------------------------------
HotelId: 15
HotelName: By the Market Hotel
Description: Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service.
@search.score: 1.3198771
@search.rerankerScore: 2.021622657775879
----------------------------------------
В этом кратком руководстве вы узнаете, как использовать семантическое ранжирование, добавив семантическую конфигурацию в индекс поиска и добавив в запрос семантические параметры. Вы можете использовать индекс hotels-sample-index или ваш собственный.
В службе "Поиск искусственного интеллекта Azure", семантическое ранжирование — это функциональность на стороне запроса, которая использует технологию машинного понимания от Microsoft для пересчета результатов поиска, продвигая наиболее семантически релевантные совпадения на верхние позиции в списке. В зависимости от содержимого и запроса семантический рейтинг может значительно повысить релевантность поиска с минимальными усилиями разработчика.
Вы можете добавить семантическую конфигурацию в существующий индекс без необходимости перестройки. Семантическая ранжирование наиболее эффективна для текста, который является информационным или описательным.
Необходимые компоненты
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Служба поиска ИИ Azure с поддержкой семантического ранджера.
Новый или существующий индекс с описательными или подробными текстовыми полями, которые атрибутируются как извлекаемые. В этом кратком руководстве предполагается индекс hotels-sample-index.
Настройка доступа
Вы можете подключиться к службе поиска ИИ Azure с помощью ключей API или идентификатора Microsoft Entra с назначениями ролей. Ключи проще начать с, но роли более безопасны. Дополнительные сведения см. в статье "Подключение к поиску ИИ Azure" с помощью ролей.
Чтобы настроить доступ на основе ролей, выполните приведенные действия.
Войдите на портал Azure и выберите службу поиска.
На левой панели выберите Настройки>Ключи.
В разделе "Управление доступом к API" выберите управление доступом на основе ролей или Оба , если требуется время для перехода клиентов на доступ на основе ролей.
В левой области выберите элемент управления доступом (IAM).
Выберите Добавить>Добавить назначение ролей.
Назначьте роли участника службы поиска и участника индекса поиска учетной записи пользователя.
Начните с индекса
Предполагается, что в этом кратком руководстве уже имеется существующий индекс, который модифицируется для включения семантической конфигурации. Мы рекомендуем использовать индекс hotels-sample-index, который можно создать за считанные минуты средствами мастера Azure-портала.
Чтобы начать с существующего индекса, выполните приведенные далее действия.
Войдите в портал Azure и найдите службу поиска.
В разделе"Индексы управления >поиском" выберите индекс hotels-sample-index.
Выберите семантические конфигурации , чтобы гарантировать, что индекс не имеет семантической конфигурации.
Выберите обозреватель поиска и выберите представление JSON.
Вставьте следующий код JSON в редактор запросов.
{ "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true }
Выберите "Поиск", чтобы запустить запрос.
Этот запрос — это поиск ключевых слов. Ответ должен быть аналогичен следующему примеру, оцененному по умолчанию через BM25 L1 для полнотекстового поиска.
Для удобства чтения пример выбирает только поля
HotelId,HotelName, иDescription. Результаты содержат подробные совпадения в терминах запроса (walking, ,distance,live)musicили лингвистических вариантах (walk,living)."@odata.count": 13, "value": [ { "@search.score": 5.5153193, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 5.074317, "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." }, { "@search.score": 4.8959594, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 2.5966604, "HotelId": "35", "HotelName": "Bellevue Suites", "Description": "Comfortable city living in the very center of downtown Bellevue. Newly reimagined, this hotel features apartment-style suites with sleeping, living and work spaces. Located across the street from the Light Rail to downtown. Free shuttle to the airport." }, { "@search.score": 2.566386, "HotelId": "47", "HotelName": "Country Comfort Inn", "Description": "Situated conveniently at the north end of the village, the inn is just a short walk from the lake, offering reasonable rates and all the comforts home inlcuding living room suites and functional kitchens. Pets are welcome." }, { "@search.score": 2.2405157, "HotelId": "9", "HotelName": "Smile Up Hotel", "Description": "Experience the fresh, modern downtown. Enjoy updated rooms, bold style & prime location. Don't miss our weekend live music series featuring who's new/next on the scene." }, { "@search.score": 2.1737604, "HotelId": "8", "HotelName": "Foot Happy Suites", "Description": "Downtown in the heart of the business district. Close to everything. Leave your car behind and walk to the park, shopping, and restaurants. Or grab one of our bikes and take your explorations a little further." }, { "@search.score": 2.0364518, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." }, { "@search.score": 1.7595702, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 1.5502293, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3302404, "HotelId": "42", "HotelName": "Rock Bottom Resort & Campground", "Description": "Rock Bottom is nestled on 20 unspoiled acres on a private cove of Rock Bottom Lake. We feature both lodging and campground accommodations to suit just about every taste. Even though we are out of the traffic of the city, getting there is only a short drive away." }, { "@search.score": 0.9050383, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 0.7334347, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." } ]
В этом запросе показано, как выглядит ответ перед применением семантического ранжирования. Позже вы можете выполнить тот же запрос после настройки семантического ранжирования, чтобы узнать, как изменяется ответ.
Подсказка
Вы можете добавить семантическую конфигурацию на портале Azure. Однако если вы хотите узнать, как добавить семантическую конфигурацию программным методом, перейдите к этому краткому руководству пользователя.
Настройка клиента
В этом кратком руководстве вы используете интегрированную среду разработки и клиентскую библиотеку @azure/search-documents для добавления семантического ранжирования в существующий индекс поиска.
В кратком руководстве предполагается, что на компьютере доступно следующее:
- Visual Studio Code для этого быстрого начала.
- Node.js (LTS) для запуска примера.
Подсказка
Исходный код можно скачать, чтобы начать с готового проекта или выполнить следующие действия, чтобы создать собственный.
Настройка локальной среды разработки
Запустите Visual Studio Code в новом каталоге.
mkdir semantic-ranking-quickstart && cd semantic-ranking-quickstart code .Создайте новый пакет для модулей ESM в каталоге проекта.
npm init -y npm pkg set type=moduleУстановите пакеты, включая документы azure-search-documents.
npm install @azure/identity @azure/search-documents dotenvСоздайте
.envи укажите конечную точку службы поиска. Конечную точку можно получить на портале Azure на странице обзора службы поиска.AZURE_SEARCH_ENDPOINT=YOUR-SEARCH-SERVICE-ENDPOINT AZURE_SEARCH_INDEX_NAME=hotels-sample-index SEMANTIC_CONFIGURATION_NAME=semantic-configСоздайте каталог
srcв каталоге вашего проекта.mkdir src
Вход в Azure
Если вы вошли на портал Azure, вы вошли в Azure. Если вы не уверены, используйте Azure CLI или Azure PowerShell для входа в систему: az login или az connect. Если у вас несколько арендаторов и подписок, см. Краткое руководство: Подключение без ключей для получения помощи по подключению.
Создание общего файла проверки подлинности
Создайте файл в ./src, названный config.ts, чтобы читать файл .env и хранить переменные среды и учетные данные проверки подлинности. Скопируйте следующий код; не изменяйте его. Этот файл будет использоваться всеми остальными файлами в этом кратком руководстве по быстрому запуску.
import { DefaultAzureCredential } from "@azure/identity";
// Configuration - use environment variables
export const searchEndpoint = process.env.AZURE_SEARCH_ENDPOINT || "PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE";
export const indexName = process.env.AZURE_SEARCH_INDEX_NAME || "hotels-sample-index";
export const semanticConfigurationName = process.env.SEMANTIC_CONFIGURATION_NAME || "semantic-config";
// Create credential
export const credential = new DefaultAzureCredential();
console.log(`Using Azure Search endpoint: ${searchEndpoint}`);
console.log(`Using index name: ${indexName}\n\n`);
Получение схемы индекса
В этом разделе вы получите параметры существующего hotels-sample-index индекса в службе поиска.
Создайте файл в
./src, названномgetIndexSettings.js, и скопируйте в него следующий код.import { SearchIndexClient } from "@azure/search-documents"; import { searchEndpoint, indexName, credential } from "./config.js"; const indexClient = new SearchIndexClient(searchEndpoint, credential); console.log('Getting semantic search index settings...'); // Get the existing schema const index = await indexClient.getIndex(indexName); console.log(`Index name: ${index.name}`); console.log(`Number of fields: ${index.fields.length}`); for(const field of index.fields) { console.log(`Field: ${field.name}, Type: ${field.type}, Searchable: ${field.searchable}`); } if(index.semanticSearch && index.semanticSearch.configurations) { console.log(`Semantic search configurations: ${index.semanticSearch.configurations.length}`); for(const config of index.semanticSearch.configurations) { console.log(`Configuration name: ${config.name}`); console.log(`Title field: ${config.prioritizedFields.titleField?.name}`); } } else { console.log("No semantic configuration exists for this index."); }Выполните код.
node -r dotenv/config src/getIndexSettings.jsВыходные данные — это имя индекса, списка полей и оператор, указывающий, существует ли семантическая конфигурация. В целях этого краткого руководства сообщение должно гласить
No semantic configuration exists for this index.
Обновление индекса с помощью семантической конфигурации
Создайте файл в
./srcс именемupdateIndexSettings.jsи скопируйте следующий код, чтобы добавить семантическую конфигурацию в существующийhotels-sample-indexиндекс в службе поиска. После добавления конфигурации поисковые документы не удаляются этой операцией, и индекс по-прежнему работает.import { SearchIndexClient } from "@azure/search-documents"; import { searchEndpoint, indexName, credential, semanticConfigurationName } from "./config.js"; try { const indexClient = new SearchIndexClient(searchEndpoint, credential); const existingIndex = await indexClient.getIndex(indexName); const fields = { titleField: { name: "HotelName" }, keywordsFields: [{ name: "Tags" }], contentFields: [{ name: "Description" }] }; const newSemanticConfiguration = { name: semanticConfigurationName, prioritizedFields: fields }; // Add the new semantic configuration to the existing index if (existingIndex.semanticSearch && existingIndex.semanticSearch.configurations) { existingIndex.semanticSearch.configurations.push(newSemanticConfiguration); } else { const configExists = existingIndex.semanticSearch?.configurations?.some( config => config.name === semanticConfigurationName ); if (!configExists) { existingIndex.semanticSearch = { configurations: [newSemanticConfiguration] }; } } await indexClient.createOrUpdateIndex(existingIndex); const updatedIndex = await indexClient.getIndex(indexName); console.log(`Semantic configurations:`); console.log("-".repeat(40)); if (updatedIndex.semanticSearch && updatedIndex.semanticSearch.configurations) { for (const config of updatedIndex.semanticSearch.configurations) { console.log(`Configuration name: ${config.name}`); console.log(`Title field: ${config.prioritizedFields.titleField?.name}`); console.log(`Keywords fields: ${config.prioritizedFields.keywordsFields?.map(f => f.name).join(", ")}`); console.log(`Content fields: ${config.prioritizedFields.contentFields?.map(f => f.name).join(", ")}`); console.log("-".repeat(40)); } } else { console.log("No semantic configurations found."); } console.log("Semantic configuration updated successfully."); } catch (error) { console.error("Error updating semantic configuration:", error); }Выполните код.
node -r dotenv/config src/updateIndexSettings.jsРезультат — это семантическая конфигурация, которую вы только что добавили
Semantic configuration updated successfully..
Выполнение семантических запросов
После того как у hotels-sample-index индекса есть семантическая конфигурация, можно выполнять запросы, включающие семантические параметры.
Создайте файл в
./src, названномsemanticQuery.js, и вставьте следующий код, чтобы создать семантический индексный запрос. Это минимальное требование для вызова семантического ранжирования.import { SearchClient } from "@azure/search-documents"; import { credential, searchEndpoint, indexName, semanticConfigurationName } from "./config.js"; const searchClient = new SearchClient( searchEndpoint, indexName, credential ); const results = await searchClient.search("walking distance to live music", { queryType: "semantic", semanticSearchOptions: { configurationName: semanticConfigurationName }, select: ["HotelId", "HotelName", "Description"] }); let rowNumber = 1; for await (const result of results.results) { // Log each result const doc = result.document; const score = result.score; const rerankerScoreDisplay = result.rerankerScore; console.log(`Search result #${rowNumber++}:`); console.log(` Re-ranker Score: ${rerankerScoreDisplay}`); console.log(` HotelId: ${doc.HotelId}`); console.log(` HotelName: ${doc.HotelName}`); console.log(` Description: ${doc.Description || 'N/A'}\n`); }Выполните код.
node -r dotenv/config src/semanticQuery.jsВыходные данные должны состоять из 13 документов, упорядоченных по
rerankerScoreDisplay.
Возвращаемые субтитры
"При необходимости можно добавить подписи, чтобы извлечь части текста и применить выделение к важным терминам и фразам." Этот запрос добавляет заголовки.
Создайте файл в
./srcпод названиемsemanticQueryReturnCaptions.jsи вставьте в него следующий код, чтобы добавить подписи к запросу.import { SearchClient } from "@azure/search-documents"; import { credential, searchEndpoint, indexName, semanticConfigurationName } from "./config.js"; const searchClient = new SearchClient( searchEndpoint, indexName, credential ); console.log(`Using semantic configuration: ${semanticConfigurationName}`); console.log("Search query: walking distance to live music"); const results = await searchClient.search("walking distance to live music", { queryType: "semantic", semanticSearchOptions: { configurationName: semanticConfigurationName, captions: { captionType: "extractive", highlight: true } }, select: ["HotelId", "HotelName", "Description"], }); console.log(`Found ${results.count} results with semantic search\n`); let rowNumber = 1; for await (const result of results.results) { // Log each result const doc = result.document; const rerankerScoreDisplay = result.rerankerScore; console.log(`Search result #${rowNumber++}:`); console.log(` Re-ranker Score: ${rerankerScoreDisplay}`); console.log(` HotelName: ${doc.HotelName}`); console.log(` Description: ${doc.Description || 'N/A'}\n`); // Caption handling with better debugging const captions = result.captions; if (captions && captions.length > 0) { const caption = captions[0]; if (caption.highlights) { console.log(` Caption with highlights: ${caption.highlights}`); } else if (caption.text) { console.log(` Caption text: ${caption.text}`); } else { console.log(` Caption exists but has no text or highlights content`); } } else { console.log(" No captions found for this result"); } console.log("-".repeat(60)); }Выполните код.
node -r dotenv/config src/semanticQueryReturnCaptions.jsВыходные данные должны содержать новый элемент заголовка вместе с полем поиска. Подписи — это наиболее релевантные отрывки в результатах поиска. Если индекс содержит более крупные фрагменты текста, подпись полезна для извлечения наиболее интересных предложений.
Search result #1: Re-ranker Score: 2.613231658935547 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. Caption with highlights: Chic hotel near the city. High-rise hotel in downtown, within walking distance to<em> theaters, </em>art galleries, restaurants and shops. Visit<em> Seattle Art Museum </em>by day, and then head over to<em> Benaroya Hall </em>to catch the evening's concert performance.
Возврат семантических ответов
В этом окончательном запросе возвращаются семантические ответы.
Семантический рангировщик может создать ответ на строку запроса, которая имеет характеристики вопроса. Созданный ответ извлекается непосредственно из вашего содержимого, поэтому он не будет содержать составленного контента, который можно ожидать от модели завершения чата. Если семантический ответ не полезен для вашего сценария, можно исключить semantic_answers из вашего кода.
Чтобы создать семантический ответ, вопрос и ответ должны быть тесно согласованы, и модель должна найти содержимое, которое четко отвечает на этот вопрос. Если потенциальные ответы не соответствуют порогу достоверности, модель не возвращает ответ. В демонстрационных целях вопрос в этом примере предназначен для получения ответа, чтобы увидеть синтаксис.
Создайте файл с именем
./src, вставьте в него следующий кодsemanticAnswer.js, чтобы получить семантические ответы.import { SearchClient } from "@azure/search-documents"; import { credential, searchEndpoint, indexName, semanticConfigurationName } from "./config.js"; const searchClient = new SearchClient( searchEndpoint, indexName, credential ); const results = await searchClient.search("What's a good hotel for people who like to read", { queryType: "semantic", semanticSearchOptions: { configurationName: semanticConfigurationName, captions: { captionType: "extractive" }, answers: { answerType: "extractive" } }, select: ["HotelName", "Description", "Category"] }); console.log(`Answers:\n\n`); let rowNumber = 1; // Extract semantic answers from the search results const semanticAnswers = results.answers; for (const answer of semanticAnswers || []) { console.log(`Semantic answer result #${rowNumber++}:`); if (answer.highlights) { console.log(`Semantic Answer: ${answer.highlights}`); } else { console.log(`Semantic Answer: ${answer.text}`); } console.log(`Semantic Answer Score: ${answer.score}\n\n`); } console.log(`Search Results:\n\n`); rowNumber = 1; // Iterate through the search results for await (const result of results.results) { // Log each result const doc = result.document; const rerankerScoreDisplay = result.rerankerScore; console.log(`Search result #${rowNumber++}:`); console.log(`${rerankerScoreDisplay}`); console.log(`${doc.HotelName}`); console.log(`${doc.Description || 'N/A'}`); const captions = result.captions; if (captions && captions.length > 0) { const caption = captions[0]; if (caption.highlights) { console.log(`Caption: ${caption.highlights}\n`); } else { console.log(`Caption: ${caption.text}\n`); } } }Выполните код.
node -r dotenv/config src/semanticAnswer.jsВыходные данные должны выглядеть примерно так, как показано в следующем примере, где лучший ответ на вопрос извлекается из одного из результатов.
Помните, что ответы представляют собой дословное содержание, извлеченное из вашего индекса, и могут отсутствовать фразы, которые пользователь ожидает увидеть. Чтобы получить составленные ответы, созданные моделью завершения чата, стоит учесть использование шаблона RAG или агентного извлечения.
Semantic answer result #1: Semantic Answer: 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<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply. Semantic Answer Score: 0.9829999804496765
Из этого краткого руководства вы узнаете, как использовать семантическое ранжирование, добавив семантическую конфигурацию в поисковый индекс и добавив семантические параметры в запрос. Вы можете использовать индекс hotels-sample-index или ваш собственный.
В службе "Поиск искусственного интеллекта Azure" семантическое ранжирование — это функциональность со стороны запроса, которая использует понимание машинного чтения от Microsoft для пересчитывания результатов поиска, выводя наиболее семантически релевантные совпадения в верхнюю часть списка. В зависимости от содержимого и запроса семантический рейтинг может значительно повысить релевантность поиска с минимальными усилиями разработчика.
Вы можете добавить семантическую конфигурацию в существующий индекс без необходимости перестройки. Семантическая ранжирование наиболее эффективна для текста, который является информационным или описательным.
Необходимые компоненты
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Служба поиска ИИ Azure с поддержкой семантического ранджера.
Новый или существующий индекс с описательными или подробными текстовыми полями, которые атрибутируются как извлекаемые. В этом кратком руководстве предполагается индекс hotels-sample-index.
Настройка доступа
Вы можете подключиться к службе поиска ИИ Azure с помощью ключей API или идентификатора Microsoft Entra с назначениями ролей. Ключи проще начать с, но роли более безопасны. Дополнительные сведения см. в статье "Подключение к поиску ИИ Azure" с помощью ролей.
Чтобы настроить доступ на основе ролей, выполните приведенные действия.
Войдите на портал Azure и выберите службу поиска.
На левой панели выберите Настройки>Ключи.
В разделе "Управление доступом к API" выберите управление доступом на основе ролей или Оба , если требуется время для перехода клиентов на доступ на основе ролей.
В левой области выберите элемент управления доступом (IAM).
Выберите Добавить>Добавить назначение ролей.
Назначьте роли участника службы поиска и участника индекса поиска учетной записи пользователя.
Начните с индекса
В этом кратком руководстве подразумевается существующий индекс, который изменяется для включения семантической конфигурации. Мы рекомендуем использовать индекс hotels-sample-index, который можно создать за считанные минуты средствами мастера Azure-портала.
Чтобы начать с существующего индекса, выполните приведенные далее действия.
Войдите в портал Azure и найдите службу поиска.
В разделе"Индексы управления >поиском" выберите индекс hotels-sample-index.
Выберите семантические конфигурации , чтобы гарантировать, что индекс не имеет семантической конфигурации.
Выберите обозреватель поиска и выберите представление JSON.
Вставьте следующий код JSON в редактор запросов.
{ "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true }
Выберите "Поиск", чтобы запустить запрос.
Этот запрос — это поиск ключевых слов. Ответ должен быть аналогичен следующему примеру, оцененному по умолчанию через BM25 L1 для полнотекстового поиска.
Для удобства чтения пример выбирает только поля
HotelId,HotelName, иDescription. Результаты содержат подробные совпадения в терминах запроса (walking, ,distance,live)musicили лингвистических вариантах (walk,living)."@odata.count": 13, "value": [ { "@search.score": 5.5153193, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 5.074317, "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." }, { "@search.score": 4.8959594, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 2.5966604, "HotelId": "35", "HotelName": "Bellevue Suites", "Description": "Comfortable city living in the very center of downtown Bellevue. Newly reimagined, this hotel features apartment-style suites with sleeping, living and work spaces. Located across the street from the Light Rail to downtown. Free shuttle to the airport." }, { "@search.score": 2.566386, "HotelId": "47", "HotelName": "Country Comfort Inn", "Description": "Situated conveniently at the north end of the village, the inn is just a short walk from the lake, offering reasonable rates and all the comforts home inlcuding living room suites and functional kitchens. Pets are welcome." }, { "@search.score": 2.2405157, "HotelId": "9", "HotelName": "Smile Up Hotel", "Description": "Experience the fresh, modern downtown. Enjoy updated rooms, bold style & prime location. Don't miss our weekend live music series featuring who's new/next on the scene." }, { "@search.score": 2.1737604, "HotelId": "8", "HotelName": "Foot Happy Suites", "Description": "Downtown in the heart of the business district. Close to everything. Leave your car behind and walk to the park, shopping, and restaurants. Or grab one of our bikes and take your explorations a little further." }, { "@search.score": 2.0364518, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." }, { "@search.score": 1.7595702, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 1.5502293, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3302404, "HotelId": "42", "HotelName": "Rock Bottom Resort & Campground", "Description": "Rock Bottom is nestled on 20 unspoiled acres on a private cove of Rock Bottom Lake. We feature both lodging and campground accommodations to suit just about every taste. Even though we are out of the traffic of the city, getting there is only a short drive away." }, { "@search.score": 0.9050383, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 0.7334347, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." } ]
В этом запросе показано, как выглядит ответ перед применением семантического ранжирования. Позже вы можете выполнить тот же запрос после настройки семантического ранжирования, чтобы узнать, как изменяется ответ.
Подсказка
Вы можете добавить семантическую конфигурацию на портале Azure. Однако если вы хотите узнать, как добавить семантическую конфигурацию программным методом, перейдите к этому краткому руководству пользователя.
Настройка клиента
В этом кратком руководстве вы используете интегрированную среду разработки и клиентская библиотека пакета SDK для Поиска ИИ Azure для Java для добавления семантического ранжирования в существующий индекс поиска.
В кратком руководстве предполагается, что на компьютере доступно следующее:
- Visual Studio Code с расширениями Java или IntelliJ IDEA
- Java 21 (LTS).
- Maven.
Настройка локальной среды разработки
Создайте новый каталог проекта Maven.
mkdir semantic-ranking-quickstart && cd semantic-ranking-quickstart code .pom.xmlСоздайте файл с необходимыми зависимостями.<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.azure.search</groupId> <artifactId>semantic-ranking-quickstart</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>com.azure</groupId> <artifactId>azure-search-documents</artifactId> <version>11.7.8</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> <version>1.17.0</version> </dependency> </dependencies> </project>Скомпилируйте проект для разрешения зависимостей.
mvn compileСоздайте структуру исходного каталога.
mkdir -p src/main/java/com/azure/search/quickstart mkdir -p src/main/resourcesСоздайте
src/main/resources/application.propertiesи укажите конечную точку службы поиска. Конечную точку можно получить на портале Azure на странице обзора службы поиска.azure.search.endpoint=YOUR-SEARCH-SERVICE-ENDPOINT azure.search.index.name=hotels-sample-index semantic.configuration.name=semantic-config
Вход в Azure
Если вы вошли на портал Azure, вы вошли в Azure. Если вы не уверены, используйте Azure CLI для входа: az login Если у вас несколько арендаторов и подписок, см. Краткое руководство: Подключение без ключей для получения помощи по подключению.
Создание общего класса конфигурации
Создайте файл, src/main/java/com/azure/search/quickstart который вызывается SearchConfig.java для чтения файла свойств и хранения значений конфигурации и учетных данных проверки подлинности.
package com.azure.search.quickstart;
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class SearchConfig {
private static final Properties properties = new Properties();
static {
try (InputStream input = SearchConfig.class.getClassLoader()
.getResourceAsStream("application.properties")) {
properties.load(input);
} catch (IOException e) {
throw new RuntimeException(
"Failed to load application.properties", e);
}
}
public static final String SEARCH_ENDPOINT =
properties.getProperty("azure.search.endpoint");
public static final String INDEX_NAME =
properties.getProperty("azure.search.index.name");
public static final String SEMANTIC_CONFIG_NAME =
properties.getProperty("semantic.configuration.name");
public static final DefaultAzureCredential CREDENTIAL =
new DefaultAzureCredentialBuilder().build();
static {
System.out.println("Using Azure Search endpoint: " + SEARCH_ENDPOINT);
System.out.println("Using index name: " + INDEX_NAME + "\n");
}
}
Получение схемы индекса
В этом разделе вы получите параметры существующего hotels-sample-index индекса в службе поиска.
Создайте файл с
src/main/java/com/azure/search/quickstartименемGetIndexSettings.java.package com.azure.search.quickstart; import com.azure.search.documents.indexes.SearchIndexClientBuilder; import com.azure.search.documents.indexes.models.SearchField; import com.azure.search.documents.indexes.models.SearchIndex; import com.azure.search.documents.indexes.models.SemanticConfiguration; import com.azure.search.documents.indexes.models.SemanticField; import com.azure.search.documents.indexes.models.SemanticSearch; public class GetIndexSettings { public static void main(String[] args) { var indexClient = new SearchIndexClientBuilder() .endpoint(SearchConfig.SEARCH_ENDPOINT) .credential(SearchConfig.CREDENTIAL) .buildClient(); System.out.println("Getting semantic search index settings..."); SearchIndex index = indexClient.getIndex(SearchConfig.INDEX_NAME); System.out.println("Index name: " + index.getName()); System.out.println("Number of fields: " + index.getFields().size()); for (SearchField field : index.getFields()) { System.out.printf("Field: %s, Type: %s, Searchable: %s%n", field.getName(), field.getType(), field.isSearchable()); } SemanticSearch semanticSearch = index.getSemanticSearch(); if (semanticSearch != null && semanticSearch.getConfigurations() != null) { System.out.println("Semantic search configurations: " + semanticSearch.getConfigurations().size()); for (SemanticConfiguration config : semanticSearch.getConfigurations()) { System.out.println("Configuration name: " + config.getName()); SemanticField titleField = config.getPrioritizedFields().getTitleField(); if (titleField != null) { System.out.println("Title field: " + titleField.getFieldName()); } } } else { System.out.println( "No semantic configuration exists for this index."); } System.exit(0); } }Скомпилируйте и запустите код.
mvn compile exec:java -Dexec.mainClass="com.azure.search.quickstart.GetIndexSettings"Выходные данные — это имя индекса, списка полей и оператор, указывающий, существует ли семантическая конфигурация. В целях этого краткого руководства сообщение должно гласить
No semantic configuration exists for this index.
Обновление индекса с помощью семантической конфигурации
Создайте файл,
src/main/java/com/azure/search/quickstartUpdateIndexSettings.javaвызываемый для добавления семантической конфигурации в существующийhotels-sample-indexиндекс в службе поиска.package com.azure.search.quickstart; import com.azure.search.documents.indexes.SearchIndexClientBuilder; import com.azure.search.documents.indexes.models.SearchIndex; import com.azure.search.documents.indexes.models.SemanticConfiguration; import com.azure.search.documents.indexes.models.SemanticField; import com.azure.search.documents.indexes.models.SemanticPrioritizedFields; import com.azure.search.documents.indexes.models.SemanticSearch; import java.util.ArrayList; import java.util.List; public class UpdateIndexSettings { public static void main(String[] args) { try { var indexClient = new SearchIndexClientBuilder() .endpoint(SearchConfig.SEARCH_ENDPOINT) .credential(SearchConfig.CREDENTIAL) .buildClient(); SearchIndex existingIndex = indexClient.getIndex(SearchConfig.INDEX_NAME); // Create prioritized fields for semantic configuration var prioritizedFields = new SemanticPrioritizedFields() .setTitleField(new SemanticField("HotelName")) .setKeywordsFields(List.of(new SemanticField("Tags"))) .setContentFields(List.of(new SemanticField("Description"))); var newSemanticConfiguration = new SemanticConfiguration( SearchConfig.SEMANTIC_CONFIG_NAME, prioritizedFields); // Add the semantic configuration to the index SemanticSearch semanticSearch = existingIndex.getSemanticSearch(); if (semanticSearch == null) { semanticSearch = new SemanticSearch(); existingIndex.setSemanticSearch(semanticSearch); } List<SemanticConfiguration> configurations = semanticSearch.getConfigurations(); if (configurations == null) { configurations = new ArrayList<>(); semanticSearch.setConfigurations(configurations); } // Check if configuration already exists boolean configExists = configurations.stream() .anyMatch(config -> SearchConfig.SEMANTIC_CONFIG_NAME .equals(config.getName())); if (!configExists) { configurations.add(newSemanticConfiguration); } indexClient.createOrUpdateIndex(existingIndex); SearchIndex updatedIndex = indexClient.getIndex(SearchConfig.INDEX_NAME); System.out.println("Semantic configurations:"); System.out.println("-".repeat(40)); SemanticSearch updatedSemanticSearch = updatedIndex.getSemanticSearch(); if (updatedSemanticSearch != null && updatedSemanticSearch.getConfigurations() != null) { for (SemanticConfiguration config : updatedSemanticSearch.getConfigurations()) { System.out.println("Configuration name: " + config.getName()); SemanticPrioritizedFields fields = config.getPrioritizedFields(); if (fields.getTitleField() != null) { System.out.println("Title field: " + fields.getTitleField().getFieldName()); } if (fields.getKeywordsFields() != null) { List<String> keywords = fields.getKeywordsFields().stream() .map(SemanticField::getFieldName) .toList(); System.out.println("Keywords fields: " + String.join(", ", keywords)); } if (fields.getContentFields() != null) { List<String> content = fields.getContentFields().stream() .map(SemanticField::getFieldName) .toList(); System.out.println("Content fields: " + String.join(", ", content)); } System.out.println("-".repeat(40)); } } else { System.out.println("No semantic configurations found."); } System.out.println("Semantic configuration updated successfully."); System.exit(0); } catch (Exception e) { System.err.println("Error updating semantic configuration: " + e.getMessage()); } } }Выполните код.
mvn compile exec:java -Dexec.mainClass="com.azure.search.quickstart.UpdateIndexSettings"Результат — это семантическая конфигурация, которую вы только что добавили
Semantic configuration updated successfully..
Выполнение семантических запросов
После того как у hotels-sample-index индекса есть семантическая конфигурация, можно выполнять запросы, включающие семантические параметры.
Создайте файл с
src/main/java/com/azure/search/quickstartвызовомSemanticQuery.javaдля создания семантического запроса индекса.package com.azure.search.quickstart; import com.azure.search.documents.SearchClientBuilder; import com.azure.search.documents.SearchDocument; import com.azure.search.documents.models.QueryType; import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.SearchResult; import com.azure.search.documents.models.SemanticSearchOptions; import com.azure.search.documents.util.SearchPagedIterable; public class SemanticQuery { public static void main(String[] args) { var searchClient = new SearchClientBuilder() .endpoint(SearchConfig.SEARCH_ENDPOINT) .indexName(SearchConfig.INDEX_NAME) .credential(SearchConfig.CREDENTIAL) .buildClient(); var searchOptions = new SearchOptions() .setQueryType(QueryType.SEMANTIC) .setSemanticSearchOptions(new SemanticSearchOptions() .setSemanticConfigurationName(SearchConfig.SEMANTIC_CONFIG_NAME)) .setSelect("HotelId", "HotelName", "Description"); SearchPagedIterable results = searchClient.search( "walking distance to live music", searchOptions, null); int rowNumber = 1; for (SearchResult result : results) { var document = result.getDocument(SearchDocument.class); double rerankerScore = result.getSemanticSearch().getRerankerScore(); System.out.printf("Search result #%d:%n", rowNumber++); System.out.printf(" Re-ranker Score: %.2f%n", rerankerScore); System.out.printf(" HotelId: %s%n", document.get("HotelId")); System.out.printf(" HotelName: %s%n", document.get("HotelName")); System.out.printf(" Description: %s%n%n", document.get("Description") != null ? document.get("Description") : "N/A"); } System.exit(0); } }Выполните код.
mvn compile exec:java -Dexec.mainClass="com.azure.search.quickstart.SemanticQuery"Выходные данные должны состоять из 13 документов, упорядоченных по оценке повторного ранга.
Возвращаемые субтитры
"При необходимости можно добавить подписи, чтобы извлечь части текста и применить выделение к важным терминам и фразам."
Создайте файл с
src/main/java/com/azure/search/quickstartименемSemanticQueryWithCaptions.java.package com.azure.search.quickstart; import com.azure.search.documents.SearchClientBuilder; import com.azure.search.documents.SearchDocument; import com.azure.search.documents.models.QueryCaption; import com.azure.search.documents.models.QueryCaptionResult; import com.azure.search.documents.models.QueryCaptionType; import com.azure.search.documents.models.QueryType; import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.SearchResult; import com.azure.search.documents.models.SemanticSearchOptions; import com.azure.search.documents.util.SearchPagedIterable; import java.util.List; public class SemanticQueryWithCaptions { public static void main(String[] args) { var searchClient = new SearchClientBuilder() .endpoint(SearchConfig.SEARCH_ENDPOINT) .indexName(SearchConfig.INDEX_NAME) .credential(SearchConfig.CREDENTIAL) .buildClient(); System.out.println("Using semantic configuration: " + SearchConfig.SEMANTIC_CONFIG_NAME); System.out.println("Search query: walking distance to live music"); var searchOptions = new SearchOptions() .setQueryType(QueryType.SEMANTIC) .setSemanticSearchOptions(new SemanticSearchOptions() .setSemanticConfigurationName(SearchConfig.SEMANTIC_CONFIG_NAME) .setQueryCaption(new QueryCaption(QueryCaptionType.EXTRACTIVE) .setHighlightEnabled(true))) .setSelect("HotelId", "HotelName", "Description"); SearchPagedIterable results = searchClient.search( "walking distance to live music", searchOptions, null); System.out.printf("Found results with semantic search%n%n"); int rowNumber = 1; for (SearchResult result : results) { var document = result.getDocument(SearchDocument.class); double rerankerScore = result.getSemanticSearch().getRerankerScore(); System.out.printf("Search result #%d:%n", rowNumber++); System.out.printf(" Re-ranker Score: %.2f%n", rerankerScore); System.out.printf(" HotelName: %s%n", document.get("HotelName")); System.out.printf(" Description: %s%n%n", document.get("Description") != null ? document.get("Description") : "N/A"); // Handle captions List<QueryCaptionResult> captions = result.getSemanticSearch().getQueryCaptions(); if (captions != null && !captions.isEmpty()) { QueryCaptionResult caption = captions.get(0); if (caption.getHighlights() != null && !caption.getHighlights().trim().isEmpty()) { System.out.printf(" Caption with highlights: %s%n", caption.getHighlights()); } else if (caption.getText() != null && !caption.getText().trim().isEmpty()) { System.out.printf(" Caption text: %s%n", caption.getText()); } else { System.out.println( " Caption exists but has no text or highlights content"); } } else { System.out.println(" No captions found for this result"); } System.out.println("-".repeat(60)); } System.exit(0); } }Выполните код.
mvn compile exec:java -Dexec.mainClass="com.azure.search.quickstart.SemanticQueryWithCaptions"Выходные данные должны содержать новый элемент заголовка вместе с полем поиска. Подписи — это наиболее релевантные отрывки в результатах поиска. Если индекс содержит более крупные фрагменты текста, подпись полезна для извлечения наиболее интересных предложений.
Search result #1: Re-ranker Score: 2.613231658935547 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. Caption with highlights: Chic hotel near the city. High-rise hotel in downtown, within walking distance to<em> theaters, </em>art galleries, restaurants and shops. Visit<em> Seattle Art Museum </em>by day, and then head over to<em> Benaroya Hall </em>to catch the evening's concert performance.
Возврат семантических ответов
В этом окончательном запросе возвращаются семантические ответы.
Семантический рангировщик может создать ответ на строку запроса, которая имеет характеристики вопроса. Созданный ответ извлекается непосредственно из вашего содержимого, поэтому он не будет содержать составленного контента, который можно ожидать от модели завершения чата.
Чтобы создать семантический ответ, вопрос и ответ должны быть тесно согласованы, и модель должна найти содержимое, которое четко отвечает на этот вопрос. Если потенциальные ответы не соответствуют порогу достоверности, модель не возвращает ответ. В демонстрационных целях вопрос в этом примере предназначен для получения ответа, чтобы увидеть синтаксис.
Создайте файл с
src/main/java/com/azure/search/quickstartименемSemanticAnswer.java.package com.azure.search.quickstart; import com.azure.search.documents.SearchClientBuilder; import com.azure.search.documents.SearchDocument; import com.azure.search.documents.models.QueryAnswer; import com.azure.search.documents.models.QueryAnswerResult; import com.azure.search.documents.models.QueryAnswerType; import com.azure.search.documents.models.QueryCaption; import com.azure.search.documents.models.QueryCaptionResult; import com.azure.search.documents.models.QueryCaptionType; import com.azure.search.documents.models.QueryType; import com.azure.search.documents.models.SearchOptions; import com.azure.search.documents.models.SearchResult; import com.azure.search.documents.models.SemanticSearchOptions; import com.azure.search.documents.util.SearchPagedIterable; import java.util.List; public class SemanticAnswer { public static void main(String[] args) { var searchClient = new SearchClientBuilder() .endpoint(SearchConfig.SEARCH_ENDPOINT) .indexName(SearchConfig.INDEX_NAME) .credential(SearchConfig.CREDENTIAL) .buildClient(); var searchOptions = new SearchOptions() .setQueryType(QueryType.SEMANTIC) .setSemanticSearchOptions(new SemanticSearchOptions() .setSemanticConfigurationName(SearchConfig.SEMANTIC_CONFIG_NAME) .setQueryCaption(new QueryCaption(QueryCaptionType.EXTRACTIVE)) .setQueryAnswer(new QueryAnswer(QueryAnswerType.EXTRACTIVE))) .setSelect("HotelName", "Description", "Category"); SearchPagedIterable results = searchClient.search( "What's a good hotel for people who like to read", searchOptions, null); System.out.println("Answers:\n"); // Extract semantic answers List<QueryAnswerResult> semanticAnswers = results.getSemanticResults().getQueryAnswers(); int answerNumber = 1; if (semanticAnswers != null) { for (QueryAnswerResult answer : semanticAnswers) { System.out.printf("Semantic answer result #%d:%n", answerNumber++); if (answer.getHighlights() != null && !answer.getHighlights().trim().isEmpty()) { System.out.printf("Semantic Answer: %s%n", answer.getHighlights()); } else { System.out.printf("Semantic Answer: %s%n", answer.getText()); } System.out.printf("Semantic Answer Score: %.2f%n%n", answer.getScore()); } } System.out.println("Search Results:\n"); int rowNumber = 1; // Iterate through search results for (SearchResult result : results) { var document = result.getDocument(SearchDocument.class); double rerankerScore = result.getSemanticSearch().getRerankerScore(); System.out.printf("Search result #%d:%n", rowNumber++); System.out.printf("Re-ranker Score: %.2f%n", rerankerScore); System.out.printf("Hotel: %s%n", document.get("HotelName")); System.out.printf("Description: %s%n", document.get("Description") != null ? document.get("Description") : "N/A"); List<QueryCaptionResult> captions = result.getSemanticSearch().getQueryCaptions(); if (captions != null && !captions.isEmpty()) { QueryCaptionResult caption = captions.get(0); if (caption.getHighlights() != null && !caption.getHighlights().trim().isEmpty()) { System.out.printf("Caption: %s%n%n", caption.getHighlights()); } else { System.out.printf("Caption: %s%n%n", caption.getText()); } } else { System.out.println(); } } System.exit(0); } }Выполните код.
mvn compile exec:java -Dexec.mainClass="com.azure.search.quickstart.SemanticAnswer"Выходные данные должны выглядеть примерно так, как показано в следующем примере, где лучший ответ на вопрос извлекается из одного из результатов.
Помните, что ответы представляют собой дословное содержание, извлеченное из вашего индекса, и могут отсутствовать фразы, которые пользователь ожидает увидеть. Чтобы получить составленные ответы, созданные моделью завершения чата, стоит учесть использование шаблона RAG или агентного извлечения.
Semantic answer result #1: Semantic Answer: 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<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply. Semantic Answer Score: 0.9829999804496765
Из этого краткого руководства вы узнаете, как использовать семантический ранжирование, добавляя семантическую конфигурацию в индекс поиска и добавляя семантические параметры в запрос. Вы можете использовать индекс hotels-sample-index или ваш собственный.
В службе "Поиск искусственного интеллекта Azure" семантическое ранжирование — это функция на стороне запроса, которая использует машинное понимание текста от Microsoft, чтобы пересчитать результаты поиска, перемещая наиболее семантически релевантные совпадения в верхнюю часть списка. В зависимости от содержимого и запроса семантический рейтинг может значительно повысить релевантность поиска с минимальными усилиями разработчика.
Вы можете добавить семантическую конфигурацию в существующий индекс без необходимости перестройки. Семантическая ранжирование наиболее эффективна для текста, который является информационным или описательным.
Необходимые компоненты
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Служба поиска ИИ Azure с поддержкой семантического ранджера.
Новый или существующий индекс с описательными или подробными текстовыми полями, которые атрибутируются как извлекаемые. В этом кратком руководстве предполагается индекс hotels-sample-index.
Настройка доступа
Вы можете подключиться к службе поиска ИИ Azure с помощью ключей API или идентификатора Microsoft Entra с назначениями ролей. Ключи проще начать с, но роли более безопасны. Дополнительные сведения см. в статье "Подключение к поиску ИИ Azure" с помощью ролей.
Чтобы настроить доступ на основе ролей, выполните приведенные действия.
Войдите на портал Azure и выберите службу поиска.
На левой панели выберите Настройки>Ключи.
В разделе "Управление доступом к API" выберите управление доступом на основе ролей или Оба , если требуется время для перехода клиентов на доступ на основе ролей.
В левой области выберите элемент управления доступом (IAM).
Выберите Добавить>Добавить назначение ролей.
Назначьте роли участника службы поиска и участника индекса поиска учетной записи пользователя.
Начните с индекса
В этом кратком руководстве предполагается наличие существующего индекса, который нужно изменить для включения семантической конфигурации. Мы рекомендуем использовать индекс hotels-sample-index, который можно создать за считанные минуты средствами мастера Azure-портала.
Чтобы начать с существующего индекса, выполните приведенные далее действия.
Войдите в портал Azure и найдите службу поиска.
В разделе"Индексы управления >поиском" выберите индекс hotels-sample-index.
Выберите семантические конфигурации , чтобы гарантировать, что индекс не имеет семантической конфигурации.
Выберите обозреватель поиска и выберите представление JSON.
Вставьте следующий код JSON в редактор запросов.
{ "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true }
Выберите "Поиск", чтобы запустить запрос.
Этот запрос — это поиск ключевых слов. Ответ должен быть аналогичен следующему примеру, оцененному по умолчанию через BM25 L1 для полнотекстового поиска.
Для удобства чтения пример выбирает только поля
HotelId,HotelName, иDescription. Результаты содержат подробные совпадения в терминах запроса (walking, ,distance,live)musicили лингвистических вариантах (walk,living)."@odata.count": 13, "value": [ { "@search.score": 5.5153193, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 5.074317, "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." }, { "@search.score": 4.8959594, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 2.5966604, "HotelId": "35", "HotelName": "Bellevue Suites", "Description": "Comfortable city living in the very center of downtown Bellevue. Newly reimagined, this hotel features apartment-style suites with sleeping, living and work spaces. Located across the street from the Light Rail to downtown. Free shuttle to the airport." }, { "@search.score": 2.566386, "HotelId": "47", "HotelName": "Country Comfort Inn", "Description": "Situated conveniently at the north end of the village, the inn is just a short walk from the lake, offering reasonable rates and all the comforts home inlcuding living room suites and functional kitchens. Pets are welcome." }, { "@search.score": 2.2405157, "HotelId": "9", "HotelName": "Smile Up Hotel", "Description": "Experience the fresh, modern downtown. Enjoy updated rooms, bold style & prime location. Don't miss our weekend live music series featuring who's new/next on the scene." }, { "@search.score": 2.1737604, "HotelId": "8", "HotelName": "Foot Happy Suites", "Description": "Downtown in the heart of the business district. Close to everything. Leave your car behind and walk to the park, shopping, and restaurants. Or grab one of our bikes and take your explorations a little further." }, { "@search.score": 2.0364518, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." }, { "@search.score": 1.7595702, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 1.5502293, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3302404, "HotelId": "42", "HotelName": "Rock Bottom Resort & Campground", "Description": "Rock Bottom is nestled on 20 unspoiled acres on a private cove of Rock Bottom Lake. We feature both lodging and campground accommodations to suit just about every taste. Even though we are out of the traffic of the city, getting there is only a short drive away." }, { "@search.score": 0.9050383, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 0.7334347, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." } ]
В этом запросе показано, как выглядит ответ перед применением семантического ранжирования. Позже вы можете выполнить тот же запрос после настройки семантического ранжирования, чтобы узнать, как изменяется ответ.
Подсказка
Вы можете добавить семантическую конфигурацию на портале Azure. Однако если вы хотите узнать, как добавить семантическую конфигурацию программным методом, перейдите к этому краткому руководству пользователя.
Настройка клиента
В этом кратком руководстве используйте записную книжку Jupyter и библиотеку azure-search-documents в пакете SDK Azure для Python, чтобы узнать о семантической ранжировке.
Мы рекомендуем Visual Studio Code с Python 3.10 или более поздней версии и расширение Python для этого быстрого старта.
Подсказка
Вы можете скачать завершенную записную книжку , чтобы начать работу с готовым проектом или выполнить следующие действия, чтобы создать собственную.
Для этого краткого руководства рекомендуется использовать виртуальную среду:
Запустите Visual Studio Code.
Откройте файл semantic-search-quickstart.ipynb или создайте новый ноутбук.
Откройте палитру команд с помощью клавиш CTRL+SHIFT+P.
Поиск Python : создание среды.
Выберите
Venv.Выбор интерпретатора Python Выберите 3.10 или более поздней версии.
Для настройки может потребоваться несколько минут. Если возникнут проблемы, ознакомьтесь со средами Python в VS Code.
Установка пакетов и установка переменных среды
Установите пакеты, включая документы azure-search-documents.
! pip install -r requirements.txt --quietsample.envПереименуйте в.envи укажите конечную точку службы поиска. Конечную точку можно получить на портале Azure на странице обзора службы поиска.AZURE_SEARCH_ENDPOINT=https://your-search-service.search.windows.net AZURE_SEARCH_INDEX_NAME=hotels-sample-index
Вход в Azure
Если вы вошли на портал Azure, вы вошли в Azure. Если вы не уверены, используйте Azure CLI или Azure PowerShell для входа в систему: az login или az connect. Если у вас несколько арендаторов и подписок, см. Краткое руководство: Подключение без ключей для получения помощи по подключению.
Обновление индекса
В этом разделе вы обновите индекс поиска, чтобы включить семантическую конфигурацию. Код получает определение индекса из службы поиска и добавляет семантическую конфигурацию.
Откройте файл semantic-search-quickstart.ipynb в Visual Studio Code или создайте новый файл.
Укажите переменные, используемые в решении.
# Provide variables from dotenv import load_dotenv from azure.identity import DefaultAzureCredential, get_bearer_token_provider import os load_dotenv(override=True) # Take environment variables from .env. # The following variables from your .env file are used in this notebook search_endpoint = os.environ["AZURE_SEARCH_ENDPOINT"] credential = DefaultAzureCredential() token_provider = get_bearer_token_provider(credential, "https://search.azure.com/.default") index_name = os.getenv("AZURE_SEARCH_INDEX", "hotels-sample-index")Создайте SearchIndexClient и получите существующий индекс с именем "hotels-sample-index".
from azure.search.documents.indexes import SearchIndexClient from azure.identity import DefaultAzureCredential import os # Initialize the client (similar to what you already have) search_endpoint = os.environ["AZURE_SEARCH_ENDPOINT"] credential = DefaultAzureCredential() index_name = "hotels-sample-index" # or use your existing index_name variable # Create the SearchIndexClient index_client = SearchIndexClient(endpoint=search_endpoint, credential=credential) try: # Get the existing index schema index = index_client.get_index(index_name) print(f"Index name: {index.name}") print(f"Number of fields: {len(index.fields)}") # Print field details for field in index.fields: print(f"Field: {field.name}, Type: {field.type}, Searchable: {field.searchable}") # Access semantic configuration if it exists if index.semantic_search and index.semantic_search.configurations: for config in index.semantic_search.configurations: print(f"Semantic config: {config.name}") if config.prioritized_fields.title_field: print(f"Title field: {config.prioritized_fields.title_field.field_name}") else: print("No semantic configuration exists for this index") except Exception as ex: print(f"Error retrieving index: {ex}")Выполните код.
Выходные данные — это имя индекса, списка полей и оператор, указывающий, существует ли семантическая конфигурация. В целях этого краткого руководства сообщение должно содержать: "Для этого индекса не существует семантической конфигурации".
Добавьте семантическую конфигурацию в существующий индекс hotels-sample-index вашей поисковой службы. После добавления конфигурации поисковые документы не удаляются этой операцией, и индекс по-прежнему работает.
# Add semantic configuration to hotels-sample-index and display updated index details from azure.search.documents.indexes.models import ( SemanticConfiguration, SemanticField, SemanticPrioritizedFields, SemanticSearch ) try: # Get the existing index existing_index = index_client.get_index(index_name) # Create a new semantic configuration new_semantic_config = SemanticConfiguration( name="semantic-config", prioritized_fields=SemanticPrioritizedFields( title_field=SemanticField(field_name="HotelName"), keywords_fields=[SemanticField(field_name="Tags")], content_fields=[SemanticField(field_name="Description")] ) ) # Add semantic configuration to the index if existing_index.semantic_search is None: existing_index.semantic_search = SemanticSearch(configurations=[new_semantic_config]) else: # Check if configuration already exists config_exists = any(config.name == "semantic-config" for config in existing_index.semantic_search.configurations) if not config_exists: existing_index.semantic_search.configurations.append(new_semantic_config) # Update the index result = index_client.create_or_update_index(existing_index) # Get the updated index and display detailed information updated_index = index_client.get_index(index_name) print("Semantic configurations:") print("-" * 40) if updated_index.semantic_search and updated_index.semantic_search.configurations: for config in updated_index.semantic_search.configurations: print(f" Configuration: {config.name}") if config.prioritized_fields.title_field: print(f" Title field: {config.prioritized_fields.title_field.field_name}") if config.prioritized_fields.keywords_fields: keywords = [kf.field_name for kf in config.prioritized_fields.keywords_fields] print(f" Keywords fields: {', '.join(keywords)}") if config.prioritized_fields.content_fields: content = [cf.field_name for cf in config.prioritized_fields.content_fields] print(f" Content fields: {', '.join(content)}") print() else: print(" No semantic configurations found") print("✅ Semantic configuration successfully added!") except Exception as ex: print(f"❌ Error adding semantic configuration: {ex}")Выполните код.
Выходные данные — это только что добавленная семантическая конфигурация.
Выполнение семантических запросов
После того как индекс имеет семантику конфигурации, можно выполнять запросы, включающие семантические параметры.
Создайте SearchClient и запрос, включающий тип семантического запроса и семантическую конфигурацию. Это минимальное требование для вызова семантического ранжирования.
# Set up the search client search_client = SearchClient(endpoint=search_endpoint, index_name=index_name, credential=credential) # Runs a semantic query (runs a BM25-ranked query, rescoring and promoting the most semantically relevant matches to the top) results = search_client.search(query_type='semantic', semantic_configuration_name='semantic-config', search_text="walking distance to live music", select='HotelId,HotelName,Description', query_caption='extractive') for result in results: print(result["@search.reranker_score"]) print(result["HotelId"]) print(result["HotelName"]) print(f"Description: {result['Description']}")Выполните код.
Выходные данные должны состоять из 13 документов, упорядоченных по
"@search.reranker_score".
Возвращаемые субтитры
"При необходимости можно добавить подписи, чтобы извлечь части текста и применить выделение к важным терминам и фразам." Этот запрос добавляет заголовки.
Добавьте
captionsв запрос.# Runs a semantic query that returns captions results = search_client.search(query_type='semantic', semantic_configuration_name='semantic-config', search_text="walking distance to live music", select='HotelName,HotelId,Description', query_caption='extractive') for result in results: print(result["@search.reranker_score"]) print(result["HotelId"]) print(result["HotelName"]) print(f"Description: {result['Description']}") captions = result["@search.captions"] if captions: caption = captions[0] if caption.highlights: print(f"Caption: {caption.highlights}\n") else: print(f"Caption: {caption.text}\n")Выполните код.
Выходные данные должны содержать новый элемент заголовка вместе с полем поиска. Подписи — это наиболее релевантные отрывки в результатах поиска. Если индекс содержит более крупные фрагменты текста, подпись полезна для извлечения наиболее интересных предложений.
2.613231658935547 24 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. Caption: Chic hotel near the city. High-rise hotel in downtown, within walking distance to<em> theaters, </em>art galleries, restaurants and shops. Visit<em> Seattle Art Museum </em>by day, and then head over to<em> Benaroya Hall </em>to catch the evening's concert performance.
Возврат семантических ответов
В этом окончательном запросе возвращаются семантические ответы.
Семантический рангировщик может создать ответ на строку запроса, которая имеет характеристики вопроса. Созданный ответ извлекается непосредственно из вашего содержимого, поэтому он не будет содержать составленного контента, который можно ожидать от модели завершения чата. Если семантический ответ не полезен для вашего сценария, можно исключить semantic_answers из вашего кода.
Чтобы создать семантический ответ, вопрос и ответ должны быть тесно согласованы, и модель должна найти содержимое, которое четко отвечает на этот вопрос. Если потенциальные ответы не соответствуют порогу достоверности, модель не возвращает ответ. В демонстрационных целях вопрос в этом примере предназначен для получения ответа, чтобы увидеть синтаксис.
Добавьте
answersв запрос.# Run a semantic query that returns semantic answers results = search_client.search(query_type='semantic', semantic_configuration_name='semantic-config', search_text="what's a good hotel for people who like to read", select='HotelName,Description,Category', query_caption='extractive', query_answer="extractive",) semantic_answers = results.get_answers() for answer in semantic_answers: if answer.highlights: print(f"Semantic Answer: {answer.highlights}") else: print(f"Semantic Answer: {answer.text}") print(f"Semantic Answer Score: {answer.score}\n") for result in results: print(result["@search.reranker_score"]) print(result["HotelName"]) print(f"Description: {result['Description']}") captions = result["@search.captions"] if captions: caption = captions[0] if caption.highlights: print(f"Caption: {caption.highlights}\n") else: print(f"Caption: {caption.text}\n")Выполните код.
Выходные данные должны выглядеть примерно так, как показано в следующем примере, где лучший ответ на вопрос извлекается из одного из результатов.
Помните, что ответы представляют собой дословное содержание, извлеченное из вашего индекса, и могут отсутствовать фразы, которые пользователь ожидает увидеть. Чтобы получить составленные ответы, созданные моделью завершения чата, стоит учесть использование шаблона RAG или агентного извлечения.
Semantic Answer: 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<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply. Semantic Answer Score: 0.9829999804496765 2.124817371368408 1 Stay-Kay City Hotel Description: This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities. Caption: This classic hotel is<em> fully-refurbished </em>and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities. 2.0705394744873047 16 Double Sanctuary Resort Description: 5 star Luxury Hotel - Biggest Rooms in the city. #1 Hotel in the area listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso in room. Caption: <em>5 star Luxury Hotel </em>-<em> Biggest </em>Rooms in the city. #1 Hotel in the area listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso in room. 2.041472911834717 38 Lakeside B & B Description: 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. Caption: 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<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply. 2.084540843963623 Double Sanctuary Resort Description: 5 star Luxury Hotel - Biggest Rooms in the city. #1 Hotel in the area listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso in room. Caption: <em>5 star Luxury Hotel </em>-<em> Biggest </em>Rooms in the<em> city. #1 </em>Hotel in the area listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso in room. ...
В этом кратком руководстве вы узнаете, как использовать семантическое ранжирование с добавлением семантической конфигурации в индекс поиска и добавления семантических параметров в запрос. Вы можете использовать индекс hotels-sample-index или ваш собственный.
В поисковой системе Azure AI семантическое ранжирование — это функциональность на стороне запроса, которая использует машинное понимание текста от Microsoft для пересчета результатов поиска, выдвигая наиболее семантически релевантные совпадения на верх списка. В зависимости от содержимого и запроса семантический рейтинг может значительно повысить релевантность поиска с минимальными усилиями разработчика.
Вы можете добавить семантическую конфигурацию в существующий индекс без необходимости перестройки. Семантическая ранжирование наиболее эффективна для текста, который является информационным или описательным.
Необходимые компоненты
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Служба поиска ИИ Azure с поддержкой семантического ранджера.
Новый или существующий индекс с описательными или подробными текстовыми полями, которые атрибутируются как извлекаемые. В этом кратком руководстве предполагается индекс hotels-sample-index.
Настройка доступа
Вы можете подключиться к службе поиска ИИ Azure с помощью ключей API или идентификатора Microsoft Entra с назначениями ролей. Ключи проще начать с, но роли более безопасны. Дополнительные сведения см. в статье "Подключение к поиску ИИ Azure" с помощью ролей.
Чтобы настроить доступ на основе ролей, выполните приведенные действия.
Войдите на портал Azure и выберите службу поиска.
На левой панели выберите Настройки>Ключи.
В разделе "Управление доступом к API" выберите управление доступом на основе ролей или Оба , если требуется время для перехода клиентов на доступ на основе ролей.
В левой области выберите элемент управления доступом (IAM).
Выберите Добавить>Добавить назначение ролей.
Назначьте роли участника службы поиска и участника индекса поиска учетной записи пользователя.
Начните с индекса
Считается, что в этом кратком руководстве уже есть существующий индекс, который затем изменяется для включения семантической конфигурации. Мы рекомендуем использовать индекс hotels-sample-index, который можно создать за считанные минуты средствами мастера Azure-портала.
Чтобы начать с существующего индекса, выполните приведенные далее действия.
Войдите в портал Azure и найдите службу поиска.
В разделе"Индексы управления >поиском" выберите индекс hotels-sample-index.
Выберите семантические конфигурации , чтобы гарантировать, что индекс не имеет семантической конфигурации.
Выберите обозреватель поиска и выберите представление JSON.
Вставьте следующий код JSON в редактор запросов.
{ "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true }
Выберите "Поиск", чтобы запустить запрос.
Этот запрос — это поиск ключевых слов. Ответ должен быть аналогичен следующему примеру, оцененному по умолчанию через BM25 L1 для полнотекстового поиска.
Для удобства чтения пример выбирает только поля
HotelId,HotelName, иDescription. Результаты содержат подробные совпадения в терминах запроса (walking, ,distance,live)musicили лингвистических вариантах (walk,living)."@odata.count": 13, "value": [ { "@search.score": 5.5153193, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 5.074317, "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." }, { "@search.score": 4.8959594, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 2.5966604, "HotelId": "35", "HotelName": "Bellevue Suites", "Description": "Comfortable city living in the very center of downtown Bellevue. Newly reimagined, this hotel features apartment-style suites with sleeping, living and work spaces. Located across the street from the Light Rail to downtown. Free shuttle to the airport." }, { "@search.score": 2.566386, "HotelId": "47", "HotelName": "Country Comfort Inn", "Description": "Situated conveniently at the north end of the village, the inn is just a short walk from the lake, offering reasonable rates and all the comforts home inlcuding living room suites and functional kitchens. Pets are welcome." }, { "@search.score": 2.2405157, "HotelId": "9", "HotelName": "Smile Up Hotel", "Description": "Experience the fresh, modern downtown. Enjoy updated rooms, bold style & prime location. Don't miss our weekend live music series featuring who's new/next on the scene." }, { "@search.score": 2.1737604, "HotelId": "8", "HotelName": "Foot Happy Suites", "Description": "Downtown in the heart of the business district. Close to everything. Leave your car behind and walk to the park, shopping, and restaurants. Or grab one of our bikes and take your explorations a little further." }, { "@search.score": 2.0364518, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." }, { "@search.score": 1.7595702, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 1.5502293, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3302404, "HotelId": "42", "HotelName": "Rock Bottom Resort & Campground", "Description": "Rock Bottom is nestled on 20 unspoiled acres on a private cove of Rock Bottom Lake. We feature both lodging and campground accommodations to suit just about every taste. Even though we are out of the traffic of the city, getting there is only a short drive away." }, { "@search.score": 0.9050383, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 0.7334347, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." } ]
В этом запросе показано, как выглядит ответ перед применением семантического ранжирования. Позже вы можете выполнить тот же запрос после настройки семантического ранжирования, чтобы узнать, как изменяется ответ.
Подсказка
Вы можете добавить семантическую конфигурацию на портале Azure. Однако если вы хотите узнать, как добавить семантическую конфигурацию программным методом, перейдите к этому краткому руководству пользователя.
Настройка клиента
В этом кратком руководстве вы используете клиент REST и REST API Azure AI Search для настройки и использования семантического ранжировщика.
Для этого краткого руководства мы рекомендуем использовать Visual Studio Code с расширением для клиента REST.
Подсказка
Исходный код можно скачать, чтобы начать с готового проекта или выполнить следующие действия, чтобы создать собственный.
Запустите Visual Studio Code и откройте файл semantic-search-index-update.rest или создайте новый файл.
В верхней части задайте переменные среды для службы поиска, авторизации и имени индекса.
Для @searchURLвойдите на портал Azure и скопируйте URL-адрес со страницы Обзор службы поиска.
Для @personalAccessToken следуйте инструкциям в Подключение без ключей, чтобы получить личный токен доступа.
Чтобы проверить подключение, отправьте первый запрос.
### List existing indexes by name (verify the connection) GET {{searchUrl}}/indexes?api-version=2025-11-01-preview&$select=name HTTP/1.1 Authorization: Bearer {{personalAccessToken}}Выберите Отправить запрос.
Выходные данные для этого запроса GET возвращают список существующих индексов. Вы должны получить код состояния успешного выполнения HTTP 200 и список индексов, включая индекс hotels-sample-index, используемый в этом кратком руководстве.
Обновление индекса
Чтобы обновить индекс с помощью REST API, необходимо предоставить всю схему, а также изменения, которые необходимо внести. Этот запрос предоставляет схему индекса hotels-sample-index, а также семантическую конфигурацию. Изменение состоит из следующего массива JSON.
"semantic": {
"configurations": [
{
"name": "semantic-config",
"flightingOptIn": false,
"rankingOrder": "BoostedRerankerScore",
"prioritizedFields": {
"titleField": { "fieldName": "HotelName" },
"prioritizedContentFields": [{ "fieldName": "Description" }],
"prioritizedKeywordsFields": [{ "fieldName": "Tags" }]
}
}
]
}
Сформулируйте запрос POST, указывающий имя индекса, операцию и полную схему JSON. Все необходимые элементы схемы должны присутствовать. Этот запрос включает полную схему для "hotels-sample-index" и семантическую конфигурацию.
POST {{searchUrl}}/indexes?api-version=2025-11-01-preview HTTP/1.1 Content-Type: application/json Authorization: Bearer {{personalAccessToken}} { "name": "hotels-sample-index", "fields": [ { "name": "HotelId", "type": "Edm.String", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "key": true }, { "name": "HotelName", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "stored": true, "sortable": false, "facetable": false, "analyzer": "en.microsoft" }, { "name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "stored": true, "sortable": false, "facetable": false, "analyzer": "en.microsoft" }, { "name": "Description_fr", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "stored": true, "sortable": false, "facetable": false, "analyzer": "fr.microsoft" }, { "name": "Category", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "ParkingIncluded", "type": "Edm.Boolean", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true }, { "name": "LastRenovationDate", "type": "Edm.DateTimeOffset", "searchable": false, "filterable": false, "retrievable": true, "stored": true, "sortable": true, "facetable": false }, { "name": "Rating", "type": "Edm.Double", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": true, "facetable": true }, { "name": "Address", "type": "Edm.ComplexType", "fields": [ { "name": "StreetAddress", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "stored": true, "sortable": false, "facetable": false, "analyzer": "en.microsoft" }, { "name": "City", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "StateProvince", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "PostalCode", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "Country", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }]}, { "name": "Location", "type": "Edm.GeographyPoint", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": true, "facetable": false }, { "name": "Rooms", "type": "Collection(Edm.ComplexType)", "fields": [ { "name": "Description", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "stored": true, "sortable": false, "facetable": false, "analyzer": "en.microsoft" }, { "name": "Description_fr", "type": "Edm.String", "searchable": true, "filterable": false, "retrievable": true, "stored": true, "sortable": false, "facetable": false, "analyzer": "fr.microsoft" }, { "name": "Type", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "BaseRate", "type": "Edm.Double", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true }, { "name": "BedOptions", "type": "Edm.String", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }, { "name": "SleepsCount", "type": "Edm.Int64", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true }, { "name": "SmokingAllowed", "type": "Edm.Boolean", "searchable": false, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true }, { "name": "Tags", "type": "Collection(Edm.String)", "searchable": true, "filterable": true, "retrievable": true, "stored": true, "sortable": false, "facetable": true, "analyzer": "en.microsoft" }]}, { "name": "id", "type": "Edm.String", "searchable": false, "filterable": false, "retrievable": false, "stored": true, "sortable": false, "facetable": false }, { "name": "rid", "type": "Edm.String", "searchable": false, "filterable": false, "retrievable": false, "stored": true, "sortable": false, "facetable": false }], "scoringProfiles": [], "suggesters": [], "analyzers": [], "normalizers": [], "tokenizers": [], "tokenFilters": [], "charFilters": [], "similarity": { "@odata.type": "#Microsoft.Azure.Search.BM25Similarity" }, "semantic": { "configurations": [ { "name": "semantic-config", "flightingOptIn": false, "rankingOrder": "BoostedRerankerScore", "prioritizedFields": { "titleField": { "fieldName": "HotelName" }, "prioritizedContentFields": [ { "fieldName": "Description" } ], "prioritizedKeywordsFields": [ { "fieldName": "Tags" } ] } } ] } }Выберите Отправить запрос.
Результат выполнения этого запроса POST
HTTP 200 Successпредставляет собой сообщение о состоянии.
Выполнение семантических запросов
Обязательные семантические параметры включают query_type и semantic_configuration_name. Ниже приведен пример базового семантического запроса с использованием минимальных параметров.
Откройте файл semantic-search-query.rest или создайте новый файл.
В верхней части файла задайте переменные среды для службы поиска, авторизации и имени индекса.
Для @searchURLвойдите на портал Azure и скопируйте URL-адрес со страницы Обзор службы поиска.
Для @personalAccessToken следуйте инструкциям в Подключение без ключей, чтобы получить личный токен доступа.
Проверьте подключение с помощью GET-запроса, который возвращает индекс "hotels-sample-index".
GET {{searchUrl}}/indexes/hotels-sample-index?api-version=2025-11-01-preview HTTP/1.1 Authorization: Bearer {{personalAccessToken}}Отправьте запрос, включающий тип семантического запроса и имя конфигурации.
POST {{searchUrl}}/indexes/hotels-sample-index/docs/search?api-version=2025-11-01-preview HTTP/1.1 Content-Type: application/json Authorization: Bearer {{personalAccessToken}} { "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true, "top": 7, "queryType": "simple" }Выходные данные состоят из результатов поиска JSON. Тринадцать отелей соответствуют запросу. В этом примере включены первые семь.
{ "@odata.count": 13, "@search.answers": [], "value": [ { "@search.score": 5.074317, "@search.rerankerScore": 2.613231658935547, "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." }, { "@search.score": 5.5153193, "@search.rerankerScore": 2.271434783935547, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 4.8959594, "@search.rerankerScore": 1.9861756563186646, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 0.7334347, "@search.rerankerScore": 1.9615401029586792, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." }, { "@search.score": 1.5502293, "@search.rerankerScore": 1.9085469245910645, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.7595702, "@search.rerankerScore": 1.90234375, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 2.0364518, "@search.rerankerScore": 1.9012802839279175, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." } ] }
Возвращаемые субтитры
"При необходимости можно добавить подписи, чтобы извлечь части текста и применить выделение к важным терминам и фразам." Этот запрос добавляет заголовки, включающие выделение попаданий.
captionsДобавьте параметр и отправьте запрос.POST {{searchUrl}}/indexes/hotels-sample-index/docs/search?api-version=2025-11-01-preview HTTP/1.1 Content-Type: application/json Authorization: Bearer {{personalAccessToken}} { "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true, "queryType": "semantic", "semanticConfiguration": "semantic-config", "captions": "extractive|highlight-true" }Выходные данные состоят из одинаковых результатов с добавлением
"@search.captions". Ниже приведен код JSON для одного документа. Каждое совпадение включает оценки поиска, подписи в виде обычного текста, форматирование выделения и выбранные поля.{ "@search.score": 5.074317, "@search.rerankerScore": 2.613231658935547, "@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. High-rise hotel in downtown, within walking distance to<em> theaters, </em>art galleries, restaurants and shops. Visit<em> Seattle Art Museum </em>by day, and then head over to<em> Benaroya Hall </em>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." }
Возврат семантических ответов
В этом окончательном запросе возвращаются семантические ответы.
Семантический рангировщик может создать ответ на строку запроса, которая имеет характеристики вопроса. Созданный ответ извлекается непосредственно из вашего содержимого, поэтому он не будет содержать составленного контента, который можно ожидать от модели завершения чата. Если семантический ответ не полезен для вашего сценария, можно исключить semantic_answers из вашего кода.
Чтобы создать семантический ответ, вопрос и ответ должны быть тесно согласованы, и модель должна найти содержимое, которое четко отвечает на этот вопрос. Если потенциальные ответы не соответствуют порогу достоверности, модель не возвращает ответ. В демонстрационных целях вопрос в этом примере предназначен для получения ответа, чтобы увидеть синтаксис.
Сформулируйте запрос с помощью строки поиска, которая задает вопрос.
POST {{searchUrl}}/indexes/hotels-sample-index/docs/search?api-version=2025-11-01-preview HTTP/1.1 Content-Type: application/json Authorization: Bearer {{personalAccessToken}} { "search": "what's a good hotel for people who like to read", "select": "HotelId, HotelName, Description", "count": true, "queryType": "semantic", "semanticConfiguration": "semantic-config" "answers": "extractive" }Результаты включают 41 ответ для нового запроса с "@search.answers" на вопрос об отелях для людей, которые любят читать.
Помните, что ответы представляют собой дословное содержание, извлеченное из вашего индекса, и могут отсутствовать фразы, которые пользователь ожидает увидеть. Чтобы получить составленные ответы, созданные моделью завершения чата, стоит учесть использование шаблона RAG или агентного извлечения.
В этом примере ответ признается как хорошее соответствие для вопроса.
{ "@odata.count": 41, "@search.answers": [ { "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 shared living space to relax around a stone fireplace, sip something warm, and explore the<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply.", "score": 0.9829999804496765 } ], "value": [ { "@search.score": 2.0361428, "@search.rerankerScore": 2.124817371368408, "HotelId": "1", "HotelName": "Stay-Kay City Hotel", "Description": "This classic hotel is fully-refurbished and ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities." }, { "@search.score": 3.759768, "@search.rerankerScore": 2.0705394744873047, "HotelId": "16", "HotelName": "Double Sanctuary Resort", "Description": "5 star Luxury Hotel - Biggest Rooms in the city. #1 Hotel in the area listed by Traveler magazine. Free WiFi, Flexible check in/out, Fitness Center & espresso in room." }, { "@search.score": 0.7308748, "@search.rerankerScore": 2.041472911834717, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 3.391012, "@search.rerankerScore": 2.0231292247772217, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 1.3198771, "@search.rerankerScore": 2.021622657775879, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3983066, "@search.rerankerScore": 2.005582809448242, "HotelId": "5", "HotelName": "Red Tide Hotel", "Description": "On entering this charming hotel in Scarlet Harbor, you'll notice an uncommon blend of antiques, original artwork, and contemporary comforts that give this hotel its signature look. Each suite is furnished to accentuate the views and unique characteristics of the building's classic architecture. No two suites are alike. However, all guests are welcome in the mezzanine plaza, the surrounding gardens, and the northside terrace for evening refreshments." }, { "@search.score": 1.4815493, "@search.rerankerScore": 1.9739465713500977, "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." } ] }
Из этого краткого руководства вы узнаете, как использовать семантическое ранжирование, добавив семантическую конфигурацию к индексу поиска и добавив в запрос семантические параметры. Вы можете использовать индекс hotels-sample-index или ваш собственный.
В службе Azure AI Search семантическое ранжирование представляет собой функциональность на стороне запроса, которая использует технологии машинного понимания от Microsoft для пересчёта результатов поиска, продвижения наиболее семантически релевантных совпадений на верхние позиции списка. В зависимости от содержимого и запроса семантический рейтинг может значительно повысить релевантность поиска с минимальными усилиями разработчика.
Вы можете добавить семантическую конфигурацию в существующий индекс без необходимости перестройки. Семантическая ранжирование наиболее эффективна для текста, который является информационным или описательным.
Необходимые компоненты
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Служба поиска ИИ Azure с поддержкой семантического ранджера.
Новый или существующий индекс с описательными или подробными текстовыми полями, которые атрибутируются как извлекаемые. В этом кратком руководстве предполагается индекс hotels-sample-index.
Настройка доступа
Вы можете подключиться к службе поиска ИИ Azure с помощью ключей API или идентификатора Microsoft Entra с назначениями ролей. Ключи проще начать с, но роли более безопасны. Дополнительные сведения см. в статье "Подключение к поиску ИИ Azure" с помощью ролей.
Чтобы настроить доступ на основе ролей, выполните приведенные действия.
Войдите на портал Azure и выберите службу поиска.
На левой панели выберите Настройки>Ключи.
В разделе "Управление доступом к API" выберите управление доступом на основе ролей или Оба , если требуется время для перехода клиентов на доступ на основе ролей.
В левой области выберите элемент управления доступом (IAM).
Выберите Добавить>Добавить назначение ролей.
Назначьте роли участника службы поиска и участника индекса поиска учетной записи пользователя.
Начните с индекса
Это краткое руководство предполагает наличие существующего индекса и его изменение для включения семантической конфигурации. Мы рекомендуем использовать индекс hotels-sample-index, который можно создать за считанные минуты средствами мастера Azure-портала.
Чтобы начать с существующего индекса, выполните приведенные далее действия.
Войдите в портал Azure и найдите службу поиска.
В разделе"Индексы управления >поиском" выберите индекс hotels-sample-index.
Выберите семантические конфигурации , чтобы гарантировать, что индекс не имеет семантической конфигурации.
Выберите обозреватель поиска и выберите представление JSON.
Вставьте следующий код JSON в редактор запросов.
{ "search": "walking distance to live music", "select": "HotelId, HotelName, Description", "count": true }
Выберите "Поиск", чтобы запустить запрос.
Этот запрос — это поиск ключевых слов. Ответ должен быть аналогичен следующему примеру, оцененному по умолчанию через BM25 L1 для полнотекстового поиска.
Для удобства чтения пример выбирает только поля
HotelId,HotelName, иDescription. Результаты содержат подробные совпадения в терминах запроса (walking, ,distance,live)musicили лингвистических вариантах (walk,living)."@odata.count": 13, "value": [ { "@search.score": 5.5153193, "HotelId": "2", "HotelName": "Old Century Hotel", "Description": "The hotel is situated in a nineteenth century plaza, which has been expanded and renovated to the highest architectural standards to create a modern, functional and first-class hotel in which art and unique historical elements coexist with the most modern comforts. The hotel also regularly hosts events like wine tastings, beer dinners, and live music." }, { "@search.score": 5.074317, "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." }, { "@search.score": 4.8959594, "HotelId": "4", "HotelName": "Sublime Palace Hotel", "Description": "Sublime Cliff Hotel is located in the heart of the historic center of Sublime in an extremely vibrant and lively area within short walking distance to the sites and landmarks of the city and is surrounded by the extraordinary beauty of churches, buildings, shops and monuments. Sublime Cliff is part of a lovingly restored 19th century resort, updated for every modern convenience." }, { "@search.score": 2.5966604, "HotelId": "35", "HotelName": "Bellevue Suites", "Description": "Comfortable city living in the very center of downtown Bellevue. Newly reimagined, this hotel features apartment-style suites with sleeping, living and work spaces. Located across the street from the Light Rail to downtown. Free shuttle to the airport." }, { "@search.score": 2.566386, "HotelId": "47", "HotelName": "Country Comfort Inn", "Description": "Situated conveniently at the north end of the village, the inn is just a short walk from the lake, offering reasonable rates and all the comforts home inlcuding living room suites and functional kitchens. Pets are welcome." }, { "@search.score": 2.2405157, "HotelId": "9", "HotelName": "Smile Up Hotel", "Description": "Experience the fresh, modern downtown. Enjoy updated rooms, bold style & prime location. Don't miss our weekend live music series featuring who's new/next on the scene." }, { "@search.score": 2.1737604, "HotelId": "8", "HotelName": "Foot Happy Suites", "Description": "Downtown in the heart of the business district. Close to everything. Leave your car behind and walk to the park, shopping, and restaurants. Or grab one of our bikes and take your explorations a little further." }, { "@search.score": 2.0364518, "HotelId": "31", "HotelName": "Country Residence Hotel", "Description": "All of the suites feature full-sized kitchens stocked with cookware, separate living and sleeping areas and sofa beds. Some of the larger rooms have fireplaces and patios or balconies. Experience real country hospitality in the heart of bustling Nashville. The most vibrant music scene in the world is just outside your front door." }, { "@search.score": 1.7595702, "HotelId": "49", "HotelName": "Swirling Currents Hotel", "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center. Each room comes equipped with a microwave, a coffee maker and a minifridge. In-room entertainment includes complimentary W-Fi and flat-screen TVs. " }, { "@search.score": 1.5502293, "HotelId": "15", "HotelName": "By the Market Hotel", "Description": "Book now and Save up to 30%. Central location. Walking distance from the Empire State Building & Times Square, in the Chelsea neighborhood. Brand new rooms. Impeccable service." }, { "@search.score": 1.3302404, "HotelId": "42", "HotelName": "Rock Bottom Resort & Campground", "Description": "Rock Bottom is nestled on 20 unspoiled acres on a private cove of Rock Bottom Lake. We feature both lodging and campground accommodations to suit just about every taste. Even though we are out of the traffic of the city, getting there is only a short drive away." }, { "@search.score": 0.9050383, "HotelId": "38", "HotelName": "Lakeside B & B", "Description": "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." }, { "@search.score": 0.7334347, "HotelId": "39", "HotelName": "White Mountain Lodge & Suites", "Description": "Live amongst the trees in the heart of the forest. Hike along our extensive trail system. Visit the Natural Hot Springs, or enjoy our signature hot stone massage in the Cathedral of Firs. Relax in the meditation gardens, or join new friends around the communal firepit. Weekend evening entertainment on the patio features special guest musicians or poetry readings." } ]
В этом запросе показано, как выглядит ответ перед применением семантического ранжирования. Позже вы можете выполнить тот же запрос после настройки семантического ранжирования, чтобы узнать, как изменяется ответ.
Подсказка
Вы можете добавить семантическую конфигурацию на портале Azure. Однако если вы хотите узнать, как добавить семантическую конфигурацию программным методом, перейдите к этому краткому руководству пользователя.
Настройка клиента
В этом кратком руководстве вы используете интегрированную среду разработки и клиентскую библиотеку @azure/search-documents для добавления семантического ранжирования в существующий индекс поиска.
В кратком руководстве предполагается, что на компьютере доступно следующее:
- Visual Studio Code для этого быстрого начала.
- Node.js (LTS) для запуска примера.
- TypeScript для написания примера кода.
Подсказка
Исходный код можно скачать, чтобы начать с готового проекта или выполнить следующие действия, чтобы создать собственный.
Настройка локальной среды разработки
Запустите Visual Studio Code в новом каталоге.
mkdir semantic-ranking-quickstart && cd semantic-ranking-quickstart code .Создайте новый пакет для модулей ESM в каталоге проекта.
npm init -y npm pkg set type=moduleУстановите пакеты разработки, включая azure-search-documents.
npm install @azure/identity @azure/search-documents dotenvУстановите пакеты зависимостей разработки.
npm install dotenv @types/node --save-devtsconfig.jsonСоздайте файл в каталоге проекта, чтобы включить модули ESM и задать разрешение модуля.{ "compilerOptions": { "target": "es2022", "module": "esnext", "moduleResolution": "bundler", "rootDir": "./src", "outDir": "./dist/", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, "skipLibCheck": true, "declaration": true, "sourceMap": true, "resolveJsonModule": true, "moduleDetection": "force", "allowSyntheticDefaultImports": true, "verbatimModuleSyntax": false }, "include": [ "src/**/*.ts" ], "exclude": [ "node_modules/**/*", "**/*.spec.ts" ] }Обновите
package.json, чтобы включить сценарий для компиляции файлов TypeScript. Добавьте следующую строку вscriptsраздел."build": "tsc"Создайте
.envи укажите конечную точку службы поиска. Конечную точку можно получить на портале Azure на странице обзора службы поиска.AZURE_SEARCH_ENDPOINT=YOUR-SEARCH-SERVICE-ENDPOINT AZURE_SEARCH_INDEX_NAME=hotels-sample-index SEMANTIC_CONFIGURATION_NAME=semantic-configСоздайте каталог
srcв каталоге вашего проекта.mkdir src
Вход в Azure
Если вы вошли на портал Azure, вы вошли в Azure. Если вы не уверены, используйте Azure CLI или Azure PowerShell для входа в систему: az login или az connect. Если у вас несколько арендаторов и подписок, см. Краткое руководство: Подключение без ключей для получения помощи по подключению.
Создание общего файла проверки подлинности
Создайте файл в ./src, названный config.ts, чтобы читать файл .env и хранить переменные среды и учетные данные проверки подлинности. Скопируйте следующий код; не изменяйте его. Этот файл будет использоваться всеми остальными файлами в этом кратком руководстве по быстрому запуску.
import { DefaultAzureCredential } from "@azure/identity";
// Configuration - use environment variables
export const searchEndpoint = process.env.AZURE_SEARCH_ENDPOINT || "PUT-YOUR-SEARCH-SERVICE-ENDPOINT-HERE";
export const indexName = process.env.AZURE_SEARCH_INDEX_NAME || "hotels-sample-index";
export const semanticConfigurationName = process.env.SEMANTIC_CONFIGURATION_NAME || "semantic-config";
// Create credential
export const credential = new DefaultAzureCredential();
console.log(`Using Azure Search endpoint: ${searchEndpoint}`);
console.log(`Using index name: ${indexName}\n\n`);
// Hotel document interface
export interface HotelDocument {
"@search.action"?: string;
HotelId: string;
HotelName: string;
Description: string;
Category: string;
Tags: string[];
ParkingIncluded: string;
LastRenovationDate: string;
Rating: number;
Address: {
StreetAddress: string;
City: string;
StateProvince: string;
PostalCode: string;
Country: string;
};
}
Получение схемы индекса
В этом разделе вы получите параметры существующего hotels-sample-index индекса в службе поиска.
Создайте файл в
./src, названномgetIndexSettings.ts, и скопируйте в него следующий код.import { SearchIndexClient } from "@azure/search-documents"; import { searchEndpoint, indexName, credential } from "./config.js"; const indexClient = new SearchIndexClient(searchEndpoint, credential); console.log('Updating semantic search index...'); // Get the existing schema const index = await indexClient.getIndex(indexName); console.log(`Index name: ${index.name}`); console.log(`Number of fields: ${index.fields.length}`); for(const field of index.fields) { // @ts-ignore console.log(`Field: ${field.name}, Type: ${field.type}, Searchable: ${field.searchable}`); } if(index.semanticSearch && index.semanticSearch.configurations) { console.log(`Semantic search configurations: ${index.semanticSearch.configurations.length}`); for(const config of index.semanticSearch.configurations) { console.log(`Configuration name: ${config.name}`); console.log(`Title field: ${config.prioritizedFields.titleField?.name}`); } } else { console.log("No semantic configuration exists for this index."); }Выполните код.
npm run build && node -r dotenv/config dist/getIndexSettings.jsВыходные данные — это имя индекса, списка полей и оператор, указывающий, существует ли семантическая конфигурация. В целях этого краткого руководства сообщение должно гласить
No semantic configuration exists for this index.
Обновление индекса с помощью семантической конфигурации
Создайте файл в
./srcс именемupdateIndexSettings.tsи скопируйте следующий код, чтобы добавить семантическую конфигурацию в существующийhotels-sample-indexиндекс в службе поиска. После добавления конфигурации поисковые документы не удаляются этой операцией, и индекс по-прежнему работает.import { SearchIndexClient, SemanticConfiguration, SemanticPrioritizedFields, SemanticField } from "@azure/search-documents"; import { searchEndpoint, indexName, credential, semanticConfigurationName } from "./config.js"; try { const indexClient = new SearchIndexClient(searchEndpoint, credential); const existingIndex = await indexClient.getIndex(indexName); const fields: SemanticPrioritizedFields = { titleField: { name: "HotelName" }, keywordsFields: [{ name: "Tags" }] as SemanticField[], contentFields: [{ name: "Description" }] as SemanticField[] } const newSemanticConfiguration: SemanticConfiguration = { name: semanticConfigurationName, prioritizedFields: fields }; // Add the new semantic configuration to the existing index if (existingIndex.semanticSearch && existingIndex.semanticSearch.configurations) { existingIndex.semanticSearch.configurations.push(newSemanticConfiguration); } else { const configExists = existingIndex.semanticSearch?.configurations?.some( config => config.name === semanticConfigurationName ); if (!configExists) { existingIndex.semanticSearch = { configurations: [newSemanticConfiguration] }; } } await indexClient.createOrUpdateIndex(existingIndex); const updatedIndex = await indexClient.getIndex(indexName); console.log(`Semantic configurations:`); console.log("-".repeat(40)); if (updatedIndex.semanticSearch && updatedIndex.semanticSearch.configurations) { for (const config of updatedIndex.semanticSearch.configurations) { console.log(`Configuration name: ${config.name}`); console.log(`Title field: ${config.prioritizedFields.titleField?.name}`); console.log(`Keywords fields: ${config.prioritizedFields.keywordsFields?.map(f => f.name).join(", ")}`); console.log(`Content fields: ${config.prioritizedFields.contentFields?.map(f => f.name).join(", ")}`); console.log("-".repeat(40)); } } else { console.log("No semantic configurations found."); } console.log("Semantic configuration updated successfully."); } catch (error) { console.error("Error updating semantic configuration:", error); }Выполните код.
npm run build && node -r dotenv/config dist/updateIndexSettings.jsРезультат — это семантическая конфигурация, которую вы только что добавили
Semantic configuration updated successfully..
Выполнение семантических запросов
После того как у hotels-sample-index индекса есть семантическая конфигурация, можно выполнять запросы, включающие семантические параметры.
Создайте файл в
./src, названномsemanticQuery.ts, и вставьте следующий код, чтобы создать семантический индексный запрос. Это минимальное требование для вызова семантического ранжирования.import { SearchClient } from "@azure/search-documents"; import { HotelDocument, credential, searchEndpoint, indexName, semanticConfigurationName } from "./config.js"; const searchClient = new SearchClient<HotelDocument>( searchEndpoint, indexName, credential ); const results = await searchClient.search("walking distance to live music", { queryType: "semantic", semanticSearchOptions: { configurationName: semanticConfigurationName }, select: ["HotelId", "HotelName", "Description"] }); let rowNumber = 1; for await (const result of results.results) { // Log each result const doc = result.document; const score = result.score; const rerankerScoreDisplay = result.rerankerScore; console.log(`Search result #${rowNumber++}:`); console.log(` Re-ranker Score: ${rerankerScoreDisplay}`); console.log(` HotelId: ${doc.HotelId}`); console.log(` HotelName: ${doc.HotelName}`); console.log(` Description: ${doc.Description || 'N/A'}\n`); }Выполните код.
npm run build && node -r dotenv/config dist/semanticQuery.jsВыходные данные должны состоять из 13 документов, упорядоченных по
rerankerScoreDisplay.
Возвращаемые субтитры
"При необходимости можно добавить подписи, чтобы извлечь части текста и применить выделение к важным терминам и фразам." Этот запрос добавляет заголовки.
Создайте файл в
./srcпод названиемsemanticQueryReturnCaptions.tsи вставьте в него следующий код, чтобы добавить подписи к запросу.import { SearchClient } from "@azure/search-documents"; import { HotelDocument, credential, searchEndpoint, indexName, semanticConfigurationName } from "./config.js"; const searchClient = new SearchClient<HotelDocument>( searchEndpoint, indexName, credential ); // Debug info console.log(`Using semantic configuration: ${semanticConfigurationName}`); console.log("Search query: walking distance to live music"); const results = await searchClient.search("walking distance to live music", { queryType: "semantic", semanticSearchOptions: { configurationName: semanticConfigurationName, captions: { captionType: "extractive", highlight: true } }, select: ["HotelId", "HotelName", "Description"], }); console.log(`Found ${results.count} results with semantic search\n`); let rowNumber = 1; for await (const result of results.results) { // Log each result const doc = result.document; const rerankerScoreDisplay = result.rerankerScore; console.log(`Search result #${rowNumber++}:`); console.log(` Re-ranker Score: ${rerankerScoreDisplay}`); console.log(` HotelName: ${doc.HotelName}`); console.log(` Description: ${doc.Description || 'N/A'}\n`); // Caption handling with better debugging const captions = result.captions; if (captions && captions.length > 0) { const caption = captions[0]; if (caption.highlights) { console.log(` Caption with highlights: ${caption.highlights}`); } else if (caption.text) { console.log(` Caption text: ${caption.text}`); } else { console.log(` Caption exists but has no text or highlights content`); } } else { console.log(" No captions found for this result"); } console.log("-".repeat(60)); }Выполните код.
npm run build && node -r dotenv/config dist/semanticQueryReturnCaptions.jsВыходные данные должны содержать новый элемент заголовка вместе с полем поиска. Подписи — это наиболее релевантные отрывки в результатах поиска. Если индекс содержит более крупные фрагменты текста, подпись полезна для извлечения наиболее интересных предложений.
Search result #1: Re-ranker Score: 2.613231658935547 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. Caption with highlights: Chic hotel near the city. High-rise hotel in downtown, within walking distance to<em> theaters, </em>art galleries, restaurants and shops. Visit<em> Seattle Art Museum </em>by day, and then head over to<em> Benaroya Hall </em>to catch the evening's concert performance.
Возврат семантических ответов
В этом окончательном запросе возвращаются семантические ответы.
Семантический рангировщик может создать ответ на строку запроса, которая имеет характеристики вопроса. Созданный ответ извлекается непосредственно из вашего содержимого, поэтому он не будет содержать составленного контента, который можно ожидать от модели завершения чата. Если семантический ответ не полезен для вашего сценария, можно исключить semantic_answers из вашего кода.
Чтобы создать семантический ответ, вопрос и ответ должны быть тесно согласованы, и модель должна найти содержимое, которое четко отвечает на этот вопрос. Если потенциальные ответы не соответствуют порогу достоверности, модель не возвращает ответ. В демонстрационных целях вопрос в этом примере предназначен для получения ответа, чтобы увидеть синтаксис.
Создайте файл с именем
./src, вставьте в него следующий кодsemanticAnswer.ts, чтобы получить семантические ответы.import { SearchClient } from "@azure/search-documents"; import { HotelDocument, credential, searchEndpoint, indexName, semanticConfigurationName } from "./config.js"; const searchClient = new SearchClient<HotelDocument>( searchEndpoint, indexName, credential ); const results = await searchClient.search("What's a good hotel for people who like to read", { queryType: "semantic", semanticSearchOptions: { configurationName: semanticConfigurationName, captions: { captionType: "extractive" }, answers: { answerType: "extractive" } }, select: ["HotelName", "Description", "Category"] }); console.log(`Answers:\n\n`); let rowNumber = 1; // Extract semantic answers from the search results const semanticAnswers = results.answers; for (const answer of semanticAnswers || []) { console.log(`Semantic answer result #${rowNumber++}:`); if (answer.highlights) { console.log(`Semantic Answer: ${answer.highlights}`); } else { console.log(`Semantic Answer: ${answer.text}`); } console.log(`Semantic Answer Score: ${answer.score}\n\n`); } console.log(`Search Results:\n\n`); rowNumber = 1; // Iterate through the search results for await (const result of results.results) { // Log each result const doc = result.document; const rerankerScoreDisplay = result.rerankerScore; console.log(`Search result #${rowNumber++}:`); console.log(`${rerankerScoreDisplay}`); console.log(`${doc.HotelName}`); console.log(`${doc.Description || 'N/A'}`); const captions = result.captions; if (captions && captions.length > 0) { const caption = captions[0]; if (caption.highlights) { console.log(`Caption: ${caption.highlights}\n`); } else { console.log(`Caption: ${caption.text}\n`); } } }Выполните код.
npm run build && node -r dotenv/config dist/semanticAnswer.jsВыходные данные должны выглядеть примерно так, как показано в следующем примере, где лучший ответ на вопрос извлекается из одного из результатов.
Помните, что ответы представляют собой дословное содержание, извлеченное из вашего индекса, и могут отсутствовать фразы, которые пользователь ожидает увидеть. Чтобы получить составленные ответы, созданные моделью завершения чата, стоит учесть использование шаблона RAG или агентного извлечения.
Semantic answer result #1: Semantic Answer: 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<em> library </em>by night. Save up to 30 percent. Valid Now through the end of the year. Restrictions and blackouts may apply. Semantic Answer Score: 0.9829999804496765
Очистка ресурсов
Если вы работаете в собственной подписке, в конце проекта следует решить, нужны ли вам созданные ресурсы. Ресурсы, которые продолжат работать, могут быть платными. Вы можете удалить ресурсы по отдельности либо удалить всю группу ресурсов.
Ресурсы и управление ими можно найти в портал Azure, используя ссылку "Все ресурсы" или "Группы ресурсов" в области навигации слева.
Связанный контент
В этом кратком руководстве вы узнали, как вызвать семантический ранжирование по существующему индексу. Мы рекомендуем попробовать семантический ранжирование по собственным индексам в качестве следующего шага. Следующие статьи помогут вам приступить к работе.