本快速入门介绍如何向现有索引添加语义排名。 可以使用 hotels-sample-index 或你自己的索引。
在 Azure AI 搜索中, 语义排名 是查询端功能,它使用从 Azure 进行计算机读取理解来重新评分搜索结果,从而将最相关的匹配项提升到列表顶部。 根据内容和查询,语义排名可以通过最少的开发人员工作量 显著提高搜索相关性 。
可以将语义配置添加到现有索引,而无需重新生成。 语义排名对信息性或描述性文本最为有效。
在此快速入门中,您将学习如何:
- 将语义配置添加到搜索索引
- 向查询添加语义参数
先决条件
拥有有效订阅的 Azure 帐户。 创建试用版订阅。
基本层或更高版本的 Azure AI 搜索服务,并启用了语义排名器。
具有描述性或详细文本字段的新索引或现有索引,在索引中属性为可检索。 本快速入门指南以hotels-sample-index为前提。
配置访问权限
可以使用 API 密钥 或通过具有角色分配的 Microsoft Entra ID 连接到 Azure AI 搜索服务。 使用密钥更容易上手,但使用角色更安全。
若要配置基于角色的访问权限,请执行以下操作:
登录到 Azure 门户 并选择搜索服务。
在左窗格中,选择“设置”“密钥”。>
在“API 访问控制”下,选择两项。
此选项同时启用基于密钥的身份验证和无密钥身份验证。 分配角色后,可以返回到此步骤并选择 基于角色的访问控制。
在左窗格中,选择“访问控制”(IAM)。
选择添加>添加角色分配。
将这些角色分配给用户帐户:
搜索服务参与者
搜索索引数据参与者
有关详细信息,请参阅使用角色连接到 Azure AI 搜索。
从索引开始
本快速入门假定现有索引已修改为包含语义配置。 我们建议使用 hotels-sample-index,你可以使用 Azure 门户向导在几分钟内创建它。
登录 Azure 门户并查找搜索服务。
在 “搜索管理>索引”下,打开 hotels-sample-index。 确保索引没有语义配置。
若要验证索引是否正常运行,请运行查询。 在 搜索资源管理器 中输入此搜索字符串 “步行距离到现场音乐”,以便在应用语义排名 之前 查看响应。
响应应类似于以下示例,由全文搜索的默认 BM25 L1 排名程序评分。 为了便于阅读,该示例只选择“HotelName”“HotelId”和“Description”字段。
此查询是关键字搜索。 结果包含查询术语(步行、距离、生活、音乐)或语言变体(散步、生计)的逐字匹配。
"@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 门户中添加语义配置。 但是,如果要了解如何以编程方式添加语义配置,请继续学习本快速入门中的说明。
安装客户端
在本快速入门中,你将使用 IDE 和 Azure.Search.Documents 客户端库将语义排名添加到现有搜索索引。
对于本快速入门,我们建议 使用 Visual Studio 。
小窍门
可以下载源代码,从已完成的项目着手,或按照这些步骤创建自己的项目。
安装库
启动 Visual Studio 并打开 quickstart-semantic-search.sln 或使用控制台应用程序模板创建新项目。
在“工具”>“NuGet 包管理器”中,选择“管理解决方案的 NuGet 包...”。
选择“浏览”。
搜索 Azure.Search.Documents 包,然后选择最新的稳定版本。
搜索 Azure.Identity 包 并选择最新的稳定版本。
选择安装”,将该程序集添加到你的项目和解决方案。
登录到 Azure
如果登录到 Azure 门户,则登录到 Azure。 如果不确定,请使用 Azure CLI 或 Azure PowerShell 登录: az login
或 az connect
。 如果有多个租户和订阅,请参阅 快速入门:在没有密钥的情况下进行连接 ,以获取有关如何连接的帮助。
更新索引
在本部分中,将更新搜索索引以包含语义配置。 该代码从搜索服务获取索引定义,并添加语义配置。
在 Visual Studio 中打开 BuildIndex 项目 。 该程序由以下代码组成。
此代码使用 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.azure.cn"; 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。
运行语义查询
在本部分中,程序按顺序运行多个语义查询。
在 Visual Studio 中打开 QueryIndex 项目 。 该程序由以下代码组成。
此代码使用 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.azure.cn"; 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 Beijing. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make Beijing 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 AI 搜索中, 语义排名 是查询端功能,它使用从 Azure 进行计算机读取理解来重新评分搜索结果,从而将最相关的匹配项提升到列表顶部。 根据内容和查询,语义排名可以通过最少的开发人员工作量 显著提高搜索相关性 。
可以将语义配置添加到现有索引,而无需重新生成。 语义排名对信息性或描述性文本最为有效。
在此快速入门中,您将学习如何:
- 将语义配置添加到搜索索引
- 向查询添加语义参数
先决条件
拥有有效订阅的 Azure 帐户。 创建试用版订阅。
基本层或更高版本的 Azure AI 搜索服务,并启用了语义排名器。
具有描述性或详细文本字段的新索引或现有索引,在索引中属性为可检索。 本快速入门指南以hotels-sample-index为前提。
配置访问权限
可以使用 API 密钥 或通过具有角色分配的 Microsoft Entra ID 连接到 Azure AI 搜索服务。 使用密钥更容易上手,但使用角色更安全。
若要配置基于角色的访问权限,请执行以下操作:
登录到 Azure 门户 并选择搜索服务。
在左窗格中,选择“设置”“密钥”。>
在“API 访问控制”下,选择两项。
此选项同时启用基于密钥的身份验证和无密钥身份验证。 分配角色后,可以返回到此步骤并选择 基于角色的访问控制。
在左窗格中,选择“访问控制”(IAM)。
选择添加>添加角色分配。
将这些角色分配给用户帐户:
搜索服务参与者
搜索索引数据参与者
有关详细信息,请参阅使用角色连接到 Azure AI 搜索。
从索引开始
本快速入门假定现有索引已修改为包含语义配置。 我们建议使用 hotels-sample-index,你可以使用 Azure 门户向导在几分钟内创建它。
登录 Azure 门户并查找搜索服务。
在 “搜索管理>索引”下,打开 hotels-sample-index。 确保索引没有语义配置。
若要验证索引是否正常运行,请运行查询。 在 搜索资源管理器 中输入此搜索字符串 “步行距离到现场音乐”,以便在应用语义排名 之前 查看响应。
响应应类似于以下示例,由全文搜索的默认 BM25 L1 排名程序评分。 为了便于阅读,该示例只选择“HotelName”“HotelId”和“Description”字段。
此查询是关键字搜索。 结果包含查询术语(步行、距离、生活、音乐)或语言变体(散步、生计)的逐字匹配。
"@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 门户中添加语义配置。 但是,如果要了解如何以编程方式添加语义配置,请继续学习本快速入门中的说明。
安装客户端
在本快速入门中,你将使用 IDE 和 @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 AI 搜索中, 语义排名 是查询端功能,它使用从 Azure 进行计算机读取理解来重新评分搜索结果,从而将最相关的匹配项提升到列表顶部。 根据内容和查询,语义排名可以通过最少的开发人员工作量 显著提高搜索相关性 。
可以将语义配置添加到现有索引,而无需重新生成。 语义排名对信息性或描述性文本最为有效。
在此快速入门中,您将学习如何:
- 将语义配置添加到搜索索引
- 向查询添加语义参数
先决条件
拥有有效订阅的 Azure 帐户。 创建试用版订阅。
基本层或更高版本的 Azure AI 搜索服务,并启用了语义排名器。
具有描述性或详细文本字段的新索引或现有索引,在索引中属性为可检索。 本快速入门指南以hotels-sample-index为前提。
配置访问权限
可以使用 API 密钥 或通过具有角色分配的 Microsoft Entra ID 连接到 Azure AI 搜索服务。 使用密钥更容易上手,但使用角色更安全。
若要配置基于角色的访问权限,请执行以下操作:
登录到 Azure 门户 并选择搜索服务。
在左窗格中,选择“设置”“密钥”。>
在“API 访问控制”下,选择两项。
此选项同时启用基于密钥的身份验证和无密钥身份验证。 分配角色后,可以返回到此步骤并选择 基于角色的访问控制。
在左窗格中,选择“访问控制”(IAM)。
选择添加>添加角色分配。
将这些角色分配给用户帐户:
搜索服务参与者
搜索索引数据参与者
有关详细信息,请参阅使用角色连接到 Azure AI 搜索。
从索引开始
本快速入门假定现有索引已修改为包含语义配置。 我们建议使用 hotels-sample-index,你可以使用 Azure 门户向导在几分钟内创建它。
登录 Azure 门户并查找搜索服务。
在 “搜索管理>索引”下,打开 hotels-sample-index。 确保索引没有语义配置。
若要验证索引是否正常运行,请运行查询。 在 搜索资源管理器 中输入此搜索字符串 “步行距离到现场音乐”,以便在应用语义排名 之前 查看响应。
响应应类似于以下示例,由全文搜索的默认 BM25 L1 排名程序评分。 为了便于阅读,该示例只选择“HotelName”“HotelId”和“Description”字段。
此查询是关键字搜索。 结果包含查询术语(步行、距离、生活、音乐)或语言变体(散步、生计)的逐字匹配。
"@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 门户中添加语义配置。 但是,如果要了解如何以编程方式添加语义配置,请继续学习本快速入门中的说明。
安装客户端
在本快速入门中,你将使用 IDE 和 Azure AI 搜索 Java SDK 客户端库将语义排名添加到现有搜索索引。
本快速入门假定计算机上提供以下内容:
- 使用 Java 扩展或 IntelliJ IDEA 的 Visual Studio Code
- 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/quickstart
中创建一个文件UpdateIndexSettings.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 AI 搜索中, 语义排名 是查询端功能,它使用从 Azure 进行计算机读取理解来重新评分搜索结果,从而将最相关的匹配项提升到列表顶部。 根据内容和查询,语义排名可以通过最少的开发人员工作量 显著提高搜索相关性 。
可以将语义配置添加到现有索引,而无需重新生成。 语义排名对信息性或描述性文本最为有效。
在此快速入门中,您将学习如何:
- 将语义配置添加到搜索索引
- 向查询添加语义参数
先决条件
拥有有效订阅的 Azure 帐户。 创建试用版订阅。
基本层或更高版本的 Azure AI 搜索服务,并启用了语义排名器。
具有描述性或详细文本字段的新索引或现有索引,在索引中属性为可检索。 本快速入门指南以hotels-sample-index为前提。
配置访问权限
可以使用 API 密钥 或通过具有角色分配的 Microsoft Entra ID 连接到 Azure AI 搜索服务。 使用密钥更容易上手,但使用角色更安全。
若要配置基于角色的访问权限,请执行以下操作:
登录到 Azure 门户 并选择搜索服务。
在左窗格中,选择“设置”“密钥”。>
在“API 访问控制”下,选择两项。
此选项同时启用基于密钥的身份验证和无密钥身份验证。 分配角色后,可以返回到此步骤并选择 基于角色的访问控制。
在左窗格中,选择“访问控制”(IAM)。
选择添加>添加角色分配。
将这些角色分配给用户帐户:
搜索服务参与者
搜索索引数据参与者
有关详细信息,请参阅使用角色连接到 Azure AI 搜索。
从索引开始
本快速入门假定现有索引已修改为包含语义配置。 我们建议使用 hotels-sample-index,你可以使用 Azure 门户向导在几分钟内创建它。
登录 Azure 门户并查找搜索服务。
在 “搜索管理>索引”下,打开 hotels-sample-index。 确保索引没有语义配置。
若要验证索引是否正常运行,请运行查询。 在 搜索资源管理器 中输入此搜索字符串 “步行距离到现场音乐”,以便在应用语义排名 之前 查看响应。
响应应类似于以下示例,由全文搜索的默认 BM25 L1 排名程序评分。 为了便于阅读,该示例只选择“HotelName”“HotelId”和“Description”字段。
此查询是关键字搜索。 结果包含查询术语(步行、距离、生活、音乐)或语言变体(散步、生计)的逐字匹配。
"@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 门户中添加语义配置。 但是,如果要了解如何以编程方式添加语义配置,请继续学习本快速入门中的说明。
安装客户端
在本快速入门中,使用适用于 Python 的 Azure SDK 中的 Jupyter 笔记本和 azure 搜索文档 库来了解语义排名。
对于本快速入门,我们建议使用 Visual Studio Code,搭配 Python 3.10 或更高版本以及 Python 扩展。
小窍门
可以 下载已完成的笔记本 以从已完成的项目开始,或按照以下步骤创建自己的笔记本。
建议针对本快速入门使用虚拟环境:
启动 Visual Studio Code。
打开 semantic-search-quickstart.ipynb 文件或创建新的笔记本。
通过使用 Ctrl+Shift+P 打开命令面板。
搜索“Python: 创建环境”。
选择
Venv.
选择 Python 解释器。 选择 3.10 或更高版本。
设置可能需要 1 分钟。 如果遇到问题,请参阅 VS Code 中的 Python 环境。
安装包并设置环境变量
安装包,包括 azure-search-documents。
! pip install -r requirements.txt --quiet
重命名
sample.env
为.env
,并提供搜索服务终结点。 可以在搜索服务 “概述 ”页上从 Azure 门户获取终结点。AZURE_SEARCH_ENDPOINT=https://your-search-service.search.azure.cn AZURE_SEARCH_INDEX_NAME=hotels-sample-index
登录到 Azure
如果登录到 Azure 门户,则登录到 Azure。 如果不确定,请使用 Azure CLI 或 Azure PowerShell 登录: az login
或 az connect
。 如果有多个租户和订阅,请参阅 快速入门:在没有密钥的情况下进行连接 ,以获取有关如何连接的帮助。
更新索引
在本部分中,将更新搜索索引以包含语义配置。 该代码从搜索服务获取索引定义,并添加语义配置。
在 Visual Studio Code 中打开 semantic-search-quickstart.ipynb 文件或创建新文件。
提供解决方案中使用的变量。
# 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 Beijing. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make Beijing 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 Beijing. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make Beijing 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 搜索中, 语义排名 是查询端功能,它使用从 Azure 进行计算机读取理解来重新评分搜索结果,从而将最相关的匹配项提升到列表顶部。 根据内容和查询,语义排名可以通过最少的开发人员工作量 显著提高搜索相关性 。
可以将语义配置添加到现有索引,而无需重新生成。 语义排名对信息性或描述性文本最为有效。
在此快速入门中,您将学习如何:
- 将语义配置添加到搜索索引
- 向查询添加语义参数
先决条件
拥有有效订阅的 Azure 帐户。 创建试用版订阅。
基本层或更高版本的 Azure AI 搜索服务,并启用了语义排名器。
具有描述性或详细文本字段的新索引或现有索引,在索引中属性为可检索。 本快速入门指南以hotels-sample-index为前提。
配置访问权限
可以使用 API 密钥 或通过具有角色分配的 Microsoft Entra ID 连接到 Azure AI 搜索服务。 使用密钥更容易上手,但使用角色更安全。
若要配置基于角色的访问权限,请执行以下操作:
登录到 Azure 门户 并选择搜索服务。
在左窗格中,选择“设置”“密钥”。>
在“API 访问控制”下,选择两项。
此选项同时启用基于密钥的身份验证和无密钥身份验证。 分配角色后,可以返回到此步骤并选择 基于角色的访问控制。
在左窗格中,选择“访问控制”(IAM)。
选择添加>添加角色分配。
将这些角色分配给用户帐户:
搜索服务参与者
搜索索引数据参与者
有关详细信息,请参阅使用角色连接到 Azure AI 搜索。
从索引开始
本快速入门假定现有索引已修改为包含语义配置。 我们建议使用 hotels-sample-index,你可以使用 Azure 门户向导在几分钟内创建它。
登录 Azure 门户并查找搜索服务。
在 “搜索管理>索引”下,打开 hotels-sample-index。 确保索引没有语义配置。
若要验证索引是否正常运行,请运行查询。 在 搜索资源管理器 中输入此搜索字符串 “步行距离到现场音乐”,以便在应用语义排名 之前 查看响应。
响应应类似于以下示例,由全文搜索的默认 BM25 L1 排名程序评分。 为了便于阅读,该示例只选择“HotelName”“HotelId”和“Description”字段。
此查询是关键字搜索。 结果包含查询术语(步行、距离、生活、音乐)或语言变体(散步、生计)的逐字匹配。
"@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 客户端和 Azure AI 搜索 REST API 来配置和使用语义排名器。
对于本快速入门,建议使用具有 REST 客户端扩展的 Visual Studio Code。
小窍门
可以下载源代码,从已完成的项目着手,或按照这些步骤创建自己的项目。
启动 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-08-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-08-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 成功状态消息。
运行语义查询
必需的语义参数包括 query_type
和 semantic_configuration_name
。 下面是使用最小参数的基本语义查询的示例。
打开 semantic-search-query.rest 文件或创建新文件。
在文件的顶部,为搜索服务、授权和索引名称设置环境变量。
对于 @searchURL,请登录到 Azure 门户,并从搜索服务 “概述 ”页复制 URL。
对于 @personalAccessToken,请按照无密钥连接中的说明获取个人访问令牌。
使用返回 hotels-sample-index 的 GET 请求测试连接。
GET {{searchUrl}}/indexes/hotels-sample-index?api-version=2025-08-01-preview HTTP/1.1 Authorization: Bearer {{personalAccessToken}}
发送包含语义查询类型和配置名称的查询。
POST {{searchUrl}}/indexes/hotels-sample-index/docs/search?api-version=2025-08-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 搜索结果组成。 13 家酒店与查询匹配。 此示例中包括前七名。
{ "@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-08-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-08-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 Beijing. A few minutes away is Times Square and the historic centre of the city, as well as other places of interest that make Beijing 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 搜索中, 语义排名 是查询端功能,它使用从 Azure 进行计算机读取理解来重新评分搜索结果,从而将最相关的匹配项提升到列表顶部。 根据内容和查询,语义排名可以通过最少的开发人员工作量 显著提高搜索相关性 。
可以将语义配置添加到现有索引,而无需重新生成。 语义排名对信息性或描述性文本最为有效。
在此快速入门中,您将学习如何:
- 将语义配置添加到搜索索引
- 向查询添加语义参数
先决条件
拥有有效订阅的 Azure 帐户。 创建试用版订阅。
基本层或更高版本的 Azure AI 搜索服务,并启用了语义排名器。
具有描述性或详细文本字段的新索引或现有索引,在索引中属性为可检索。 本快速入门指南以hotels-sample-index为前提。
配置访问权限
可以使用 API 密钥 或通过具有角色分配的 Microsoft Entra ID 连接到 Azure AI 搜索服务。 使用密钥更容易上手,但使用角色更安全。
若要配置基于角色的访问权限,请执行以下操作:
登录到 Azure 门户 并选择搜索服务。
在左窗格中,选择“设置”“密钥”。>
在“API 访问控制”下,选择两项。
此选项同时启用基于密钥的身份验证和无密钥身份验证。 分配角色后,可以返回到此步骤并选择 基于角色的访问控制。
在左窗格中,选择“访问控制”(IAM)。
选择添加>添加角色分配。
将这些角色分配给用户帐户:
搜索服务参与者
搜索索引数据参与者
有关详细信息,请参阅使用角色连接到 Azure AI 搜索。
从索引开始
本快速入门假定现有索引已修改为包含语义配置。 我们建议使用 hotels-sample-index,你可以使用 Azure 门户向导在几分钟内创建它。
登录 Azure 门户并查找搜索服务。
在 “搜索管理>索引”下,打开 hotels-sample-index。 确保索引没有语义配置。
若要验证索引是否正常运行,请运行查询。 在 搜索资源管理器 中输入此搜索字符串 “步行距离到现场音乐”,以便在应用语义排名 之前 查看响应。
响应应类似于以下示例,由全文搜索的默认 BM25 L1 排名程序评分。 为了便于阅读,该示例只选择“HotelName”“HotelId”和“Description”字段。
此查询是关键字搜索。 结果包含查询术语(步行、距离、生活、音乐)或语言变体(散步、生计)的逐字匹配。
"@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 门户中添加语义配置。 但是,如果要了解如何以编程方式添加语义配置,请继续学习本快速入门中的说明。
安装客户端
在本快速入门中,你将使用 IDE 和 @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-dev
在项目目录中创建文件
tsconfig.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 门户中查找和管理资源,只需使用左侧导航窗格中的“所有资源”或“资源组”链接即可。
相关内容
在本快速入门中,你学习了如何对现有索引调用语义排名。 下一步,建议尝试对自己的索引进行语义排名。 以下文章可帮助你入门。