빠른 시작: .NET 또는 Python을 사용한 의미 체계 순위

Azure AI Search 에서 의미 체계 순위 는 Microsoft의 컴퓨터 읽기 이해력을 사용하여 검색 결과를 다시 점수 매칭하여 가장 의미상 관련성이 높은 일치 항목을 목록 맨 위로 승격하는 쿼리 쪽 기능입니다. 콘텐츠와 쿼리에 따라 의미 체계 순위는 개발자의 작업을 최소화하면서 검색 관련성을 대폭 향상할 수 있습니다.

이 빠른 시작에서는 의미 체계 순위를 호출하는 인덱스 및 쿼리 수정 사항을 안내합니다.

참고 항목

ChatGPT 상호 작용이 가능한 Azure AI 검색 솔루션을 찾고 있나요? 자세한 내용은 이 데모 또는 이 가속기를 참조하세요.

필수 조건

  • 활성 구독이 있는 Azure 계정. 체험 계정을 만듭니다.

  • 의미 체계 순위가 사용하도록 설정된 Azure AI 검색입니다(기본 계층 이상).

  • API 키 및 검색 서비스 엔드포인트입니다. Azure Portal에 로그인하고 검색 서비스를 찾습니다.

    개요에서 URL을 복사하고 이후 단계에 사용할 수 있도록 메모장에 저장합니다. 엔드포인트의 예는 다음과 같습니다. https://mydemo.search.windows.net

    에서 개체를 만들고 삭제할 수 있는 모든 권한의 관리자 키를 복사하고 저장합니다. 상호 교환 가능한 기본 키와 보조 키가 있습니다. 둘 중 하나를 선택합니다.

    Get an HTTP endpoint and access key

의미 체계 순위 추가

의미 체계 순위를 사용하려면 검색 인덱스에 의미 체계 구성을 추가하고 쿼리에 매개 변수를 추가합니다. 기존 인덱스가 있는 경우 검색 가능한 콘텐츠의 구조에 영향을 주지 않으므로 콘텐츠를 다시 인덱싱하지 않고도 이러한 변경을 수행할 수 있습니다.

  • 의미 체계 구성은 의미 체계 재전송에 사용되는 제목, 키워드(keyword) 및 콘텐츠에 기여하는 필드의 우선 순위 순서를 설정합니다. 필드 우선 순위를 지정하면 처리 속도가 빨라집니다.

  • 의미 체계 순위를 호출하는 쿼리에는 쿼리 형식에 대한 매개 변수와 캡션 및 답변이 반환되는지 여부가 포함됩니다. 이러한 매개 변수를 기존 쿼리 논리에 추가할 수 있습니다. 다른 매개 변수와는 충돌하지 않습니다.

기존 검색 인덱스에 의미 체계 순위를 추가하려면 Azure.Search.Documents 클라이언트 라이브러리를 사용하여 콘솔 애플리케이션을 빌드합니다.

또는 소스 코드를 다운로드하여 완성된 프로젝트로 시작하거나 다음 단계를 수행하여 새 프로젝트를 직접 만들 수 있습니다.

환경 설정

  1. Visual Studio를 시작하고 콘솔 앱용 새 프로젝트를 만듭니다.

  2. 도구>NuGet 패키지 관리자에서 솔루션의 NuGet 패키지 관리...를 선택합니다.

  3. 찾아보기를 선택합니다.

  4. Azure.Search.Documents 패키지를 검색하고 안정적인 최신 버전을 선택합니다.

  5. 설치를 선택하여 프로젝트 및 솔루션에 어셈블리를 추가합니다.

검색 클라이언트 만들기

  1. Program.cs에서 다음 using 지시문을 추가합니다.

    using Azure;
    using Azure.Search.Documents;
    using Azure.Search.Documents.Indexes;
    using Azure.Search.Documents.Indexes.Models;
    using Azure.Search.Documents.Models;
    
  2. 두 개의 클라이언트를 만듭니다. SearchIndexClient는 인덱스를 만들고, SearchClient는 기존 인덱스를 로드하고 쿼리합니다. 둘 다 만들기/삭제 권한 인증을 위한 서비스 엔드포인트와 관리 API 키가 필요합니다.

    코드가 자동으로 URI를 빌드하므로 "serviceName" 속성에 검색 서비스 이름만 지정합니다.

     static void Main(string[] args)
     {
         string serviceName = "<YOUR-SEARCH-SERVICE-NAME>";
         string apiKey = "<YOUR-SEARCH-ADMIN-API-KEY>";
         string indexName = "hotels-quickstart";
    
    
         // Create a SearchIndexClient to send create/delete index commands
         Uri serviceEndpoint = new Uri($"https://{serviceName}.search.windows.net/");
         AzureKeyCredential credential = new AzureKeyCredential(apiKey);
         SearchIndexClient adminClient = new SearchIndexClient(serviceEndpoint, credential);
    
         // Create a SearchClient to load and query documents
         SearchClient srchclient = new SearchClient(serviceEndpoint, indexName, credential);
         . . . 
     }
    

인덱스 만들기

SemanticConfiguration을 포함하도록 인덱스 스키마를 만들거나 업데이트합니다. 기존 인덱스를 업데이트하는 경우 문서 구조가 변경되지 않기 때문에 이 수정을 다시 인덱싱할 필요가 없습니다.

// Create hotels-quickstart index
private static void CreateIndex(string indexName, SearchIndexClient adminClient)
{

    FieldBuilder fieldBuilder = new FieldBuilder();
    var searchFields = fieldBuilder.Build(typeof(Hotel));

    var definition = new SearchIndex(indexName, searchFields);
    var suggester = new SearchSuggester("sg", new[] { "HotelName", "Category", "Address/City", "Address/StateProvince" });
    definition.Suggesters.Add(suggester);
    definition.SemanticSearch = new SemanticSearch
    {
        Configurations =
        {
            new SemanticConfiguration("my-semantic-config", new()
            {
                TitleField = new SemanticField("HotelName"),
                ContentFields =
                {
                    new SemanticField("Description"),
                    new SemanticField("Description_fr")
                },
                KeywordsFields =
                {
                    new SemanticField("Tags"),
                    new SemanticField("Category")
                }
            })
        }
    };

    adminClient.CreateOrUpdateIndex(definition);
}

다음 코드는 검색 서비스에 인덱스를 만듭니다.

// Create index
Console.WriteLine("{0}", "Creating index...\n");
CreateIndex(indexName, adminClient);

SearchClient ingesterClient = adminClient.GetSearchClient(indexName);

문서 로드

Azure AI 검색은 서비스에 저장된 콘텐츠를 검색합니다. 문서를 업로드하는 코드는 전체 텍스트 검색을 위한 C# 빠른 시작과 동일하므로 여기에서 중복할 필요가 없습니다. 이름, 주소 및 설명이 있는 4개의 호텔이 있어야 합니다. 솔루션에는 호텔 및 주소 유형이 있어야 합니다.

인덱스 검색

매개 변수를 지정하기 위한 검색 옵션을 사용하여 의미 체계 순위를 호출하는 쿼리는 다음과 같습니다.

Console.WriteLine("Example of a semantic query.");

options = new SearchOptions()
{
    QueryType = Azure.Search.Documents.Models.SearchQueryType.Semantic,
    SemanticSearch = new()
    {
        SemanticConfigurationName = "my-semantic-config",
        QueryCaption = new(QueryCaptionType.Extractive)
    }
};
options.Select.Add("HotelName");
options.Select.Add("Category");
options.Select.Add("Description");

// response = srchclient.Search<Hotel>("*", options);
response = srchclient.Search<Hotel>("what hotel has a good restaurant on site", options);
WriteDocuments(response);

비교를 위해 용어 빈도 및 근접성을 기반으로 기본 BM25 순위를 사용하는 쿼리의 결과는 다음과 같습니다. BM25 순위 알고리즘은 "어떤 호텔 구내에 좋은 레스토랑이 있는가?" 쿼리를 감안할 때 다음 스크린샷에 표시된 순서대로 일치 항목을 반환합니다.

Screenshot showing matches ranked by BM25.

반면, 의미 체계 순위가 동일한 쿼리("어떤 호텔 구내에 좋은 레스토랑이 있는가?")에 적용되는 경우 쿼리에 대한 의미 체계 관련성에 따라 결과 순위가 다시 지정됩니다. 여기서 가장 좋은 결과는 레스토랑이 있는 호텔이며, 이는 사용자의 기대에 더욱 잘 부합합니다.

Screenshot showing matches ranked based on semantic ranking.

프로그램 실행

F5 키를 눌러서 애플리케이션을 다시 빌드하고 프로그램 전체를 실행합니다.

출력에는 쿼리 정보 및 결과가 추가된 Console.WriteLine의 메시지가 포함됩니다.

리소스 정리

본인 소유의 구독으로 이 모듈을 진행하고 있는 경우에는 프로젝트가 끝날 때 여기에서 만든 리소스가 계속 필요한지 확인하는 것이 좋습니다. 계속 실행되는 리소스에는 요금이 부과될 수 있습니다. 리소스를 개별적으로 삭제하거나 리소스 그룹을 삭제하여 전체 리소스 세트를 삭제할 수 있습니다.

왼쪽 탐색 창의 모든 리소스 또는 리소스 그룹 링크를 사용하여 포털에서 리소스를 찾고 관리할 수 있습니다.

다음 단계

이 빠른 시작에서는 기존 인덱스의 의미 체계 순위를 호출하는 방법을 알아보았습니다. 다음 단계로 사용자 고유의 인덱스에 대한 의미 체계 순위를 시도하는 것이 좋습니다. 그러나 데모를 계속하려면 다음 링크를 방문하세요.