Azure AI 검색에서 하이브리드 쿼리 만들기

하이브리드 검색 은 단일 검색 요청에서 텍스트(키워드) 및 벡터 쿼리를 결합합니다. 요청의 모든 하위 쿼리는 병렬로 실행됩니다. 결과는 RRF(Reciprocal Rank Fusion)를 사용하여 병합되고 새 검색 점수로 순서가 변경되어 통합 결과 집합을 반환합니다. 대부분의 경우 벤치마크 테스트에 따라 의미 체계 순위가 있는 하이브리드 쿼리가 가장 관련성이 높은 결과를 반환합니다.

이 문서에서는 다음 방법을 알아봅니다.

  • 기본 요청 설정
  • 더 많은 매개 변수 및 필터를 사용하여 하이브리드 쿼리 작성
  • 의미 체계 순위 또는 벡터 가중치를 사용하여 관련성 향상
  • 텍스트 및 벡터 입력을 제어하여 쿼리 동작 최적화

참고 항목

2024-09-01-preview의 새로운 기능은 하이브리드 요청의 벡터 하위 쿼리에만 필터를 대상으로 지정하는 기능입니다. 이렇게 하면 필터가 적용되는 방식에 대한 정밀도가 높아집니다. 자세한 내용은 이 문서의 벡터 하위 쿼리에 대한 대상 지정 필터를 참조 하세요 .

필수 조건

API 또는 도구 선택

  • Azure Portal의 검색 탐색기(안정 및 미리 보기 API 검색 구문 모두 지원)에는 하이브리드 요청에 붙여넣을 수 있는 JSON 보기가 있습니다.

  • maxTextRecallSize 및 countAndFacetMode(미리 보기)와 같은 미리 보기 기능을 사용하는 경우 2024-07-01 안정적인 버전 또는 최근 미리 보기 API 버전.

    가독성을 위해 REST 예제를 사용하여 API의 작동 방식을 설명합니다. REST 확장과 함께 Visual Studio Code와 같은 REST 클라이언트를 사용하여 하이브리드 쿼리를 빌드할 수 있습니다. 자세한 내용은 빠른 시작: REST API를 사용한 벡터 검색을 참조하세요.

  • Azure SDK의 안정적인 최신 또는 베타 패키지(SDK 기능 지원에 대한 변경 로그 참조).

검색 탐색기에서 하이브리드 쿼리 설정

  1. 검색 탐색기에서 API 버전이 2024-07-01 또는 최신 미리 보기 API 버전인지 확인합니다.

  2. 보기에서 벡터 쿼리에 붙여넣을 수 있도록 JSON 보기를 선택합니다.

  3. 기본 쿼리 템플릿을 벡터 빠른 시작의 줄 539부터 시작하는 "하이브리드 쿼리 실행" 예제와 같은 하이브리드 쿼리로 바꿉니다. 간단히 보여주기 위해 이 문서에서는 벡터를 잘랐습니다.

    하이브리드 쿼리에는 search에 지정된 텍스트 쿼리와 vectorQueries.vector 아래에 지정된 벡터 쿼리가 있습니다.

    텍스트 쿼리와 벡터 쿼리는 동일하거나 서로 다를 수 있지만 동일한 의도를 공유하는 것이 일반적입니다.

    {
        "count": true,
        "search": "historic hotel walk to restaurants and shopping",
        "select": "HotelId, HotelName, Category, Tags, Description",
        "top": 7,
        "vectorQueries": [
            {
                "vector": [0.01944167, 0.0040178085, -0.007816401 ... <remaining values omitted> ], 
                "k": 7,
                "fields": "DescriptionVector",
                "kind": "vector",
                "exhaustive": true
            }
        ]
    }
    
  4. 검색을 선택합니다.

벡터를 숨기면 검색 결과를 더 쉽게 읽을 수 있습니다. 쿼리 옵션에서 검색 결과에서 벡터 값 숨기기를 켭니다.

하이브리드 쿼리 요청(REST API)

하이브리드 쿼리는 텍스트 검색과 벡터 검색을 결합합니다. 여기서 search 매개 변수는 쿼리 문자열을 사용하고 vectorQueries.vector는 벡터 쿼리를 사용합니다. 검색 엔진은 전체 텍스트 및 벡터 쿼리를 동시에 실행합니다. 모든 일치 항목의 합집합은 RRF(Reciprocal Rank Fusion)를 사용하여 관련성을 평가하며 단일 결과 집합이 응답에 반환됩니다.

retrievable로 표시된 필드의 벡터를 포함한 결과가 일반 텍스트로 반환됩니다. 숫자 벡터는 검색 결과에 유용하지 않으므로 인덱스의 다른 필드를 벡터 일치의 프록시로 선택합니다. 예를 들어 인덱스에 "descriptionVector" 및 "descriptionText" 필드가 있는 경우 쿼리는 "descriptionVector"에서 일치할 수 있지만 검색 결과에는 "descriptionText"가 표시될 수 있습니다. select 매개 변수를 사용하여 결과에서 사람이 읽을 수 있는 필드만 지정합니다.

다음 예제에서는 하이브리드 쿼리 구성을 보여줍니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        },
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City",
    "top": 10
}

주요 정보:

  • 벡터 쿼리 문자열은 vectorQueries.vector 속성을 통해 지정됩니다. 쿼리는 "DescriptionVector" 필드에 대해 실행됩니다. 쿼리 형식을 나타내려면 kind를 "vector"로 설정합니다. 필요에 따라 exhaustive를 true로 설정하여 벡터 필드의 전체 콘텐츠를 쿼리합니다.

  • 키워드 검색은 search 속성을 통해 지정됩니다. 벡터 쿼리와 동시에 실행됩니다.

  • k는 벡터 쿼리에서 반환되고 RRF 순위매기기에 제공되는 가장 인접한 일치 항목 수를 결정합니다.

  • top은 응답 전체에서 반환되는 일치 항목 수를 결정합니다. 이 예제에는 병합된 결과에 일치하는 항목이 10개 이상 있다고 가정하여 응답에 10개의 결과가 포함됩니다.

필터를 사용한 하이브리드 검색

이 예제에서는 검색 인덱스의 filterable 비벡터 필드에 적용되는 필터를 추가합니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "vectorFilterMode": "postFilter",
    "filter": "ParkingIncluded",
    "top": "10"
}

주요 정보:

  • 필터는 필터링 가능한 필드의 콘텐츠에 적용됩니다. 이 예제에서 ParkingIncluded 필드는 부울이며 인덱스 스키마에서 filterable로 표시됩니다.

  • 하이브리드 쿼리에서는 쿼리 실행 전에 필터를 적용하여 쿼리 노출 영역을 줄이거나 쿼리 실행 후에 결과를 트리밍할 수 있습니다. 기본값은 "preFilter"입니다. postFilter를 사용하려면 이 예제와 같이 필터 처리 모드를 설정합니다.

  • 쿼리 결과를 사후 필터링하면 결과 수가 상위 n개보다 작을 수 있습니다.

벡터 하위 쿼리를 대상으로 하는 필터를 사용하는 하이브리드 검색(미리 보기)

2024-09-01-preview를 사용하면 하이브리드 요청의 벡터 하위 쿼리만 대상으로 하는 보조 필터를 적용하여 검색 요청에 대한 전역 필터를 재정의할 수 있습니다.

이 기능은 필터가 벡터 검색 결과에만 영향을 주도록 하여 키워드 기반 검색 결과에 영향을 미치지 않도록 하여 세분화된 제어를 제공합니다.

대상 필터는 보안 트리밍 또는 지리 공간 검색에 사용되는 필터를 포함하여 전역 필터를 완전히 재정의합니다. 보안 트리밍과 같은 전역 필터가 필요한 경우 보안 및 기타 제약 조건이 일관되게 적용되도록 최상위 필터와 각 벡터 수준 필터에 이러한 필터를 명시적으로 포함해야 합니다.

대상 벡터 필터를 적용하려면 다음을 수행합니다.

다음은 필터 재정의를 추가하는 하이브리드 쿼리의 예입니다. 전역 필터 "Rating gt 3"은 런타임에 filterOvrride로 대체됩니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview

{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "exhaustive": true,
            "filterOverride": "Address/City eq 'Seattle'",
            "k": 10
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Address/City, Rating",
    "filter": "Rating gt 3"
    "debug": "vector",
    "top": 10
}

의미 순위매기기를 활성화하고 인덱스 정의에 의미 체계 구성이 포함되어 있다고 가정하면 병합된 결과 집합에 대한 의미 체계 순위와 함께 벡터 검색과 키워드 검색이 포함된 쿼리를 작성할 수 있습니다. 필요에 따라 캡션과 답변을 추가할 수 있습니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "top": "50"
}

주요 정보:

  • 의미 순위매기기는 병합된 응답에서 최대 50개의 결과를 허용합니다.

  • "queryType" 및 "semanticConfiguration"이 필요합니다.

  • "captions" 및 "answers"는 선택 사항입니다. 값은 결과의 축자 텍스트에서 추출됩니다. 결과에 쿼리 답변의 특성을 갖는 콘텐츠가 포함된 경우에만 답변이 반환됩니다.

필터를 사용한 의미 체계 하이브리드 검색

컬렉션의 마지막 쿼리는 다음과 같습니다. 이전 예제와 동일한 의미 체계 하이브리드 쿼리이지만 필터가 있습니다.

POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
    "vectorQueries": [
        {
            "vector": [
                -0.009154141,
                0.018708462,
                . . . 
                -0.02178128,
                -0.00086512347
            ],
            "fields": "DescriptionVector",
            "kind": "vector",
            "k": 50
        }
    ],
    "search": "historic hotel walk to restaurants and shopping",
    "select": "HotelName, Description, Tags",
    "queryType": "semantic",
    "semanticConfiguration": "my-semantic-config",
    "captions": "extractive",
    "answers": "extractive",
    "filter": "ParkingIsIncluded'",
    "vectorFilterMode": "postFilter",
    "top": "50"
}

주요 정보:

  • 필터 모드는 의미 다시 순위매기기에 사용할 수 있는 결과 수에 영향을 미칠 수 있습니다. 모범 사례로, 의미 순위매기기에 최대 문서 수(50개)를 제공하는 것이 좋습니다. 전 필터 또는 사후 필터가 너무 선택적인 경우 작업할 문서를 50개 미만으로 제공하면 의미 순위매기기가 부족할 수 있습니다.

  • 쿼리를 실행하기 전에 사전 필터링이 적용됩니다. 사전 필터가 검색 영역을 100개 문서로 줄이는 경우 벡터 쿼리는 해당 100개의 문서에 대한 "DescriptionVector" 필드에 대해 실행되어 k=50개의 가장 일치하는 항목을 반환합니다. 일치하는 50개의 문서는 병합된 결과를 위해 RRF로 전달된 다음, 의미 순위매기기로 전달됩니다.

  • 사후 필터는 쿼리 실행 후에 적용됩니다. k=50이 벡터 쿼리 측에서 50개의 일치 항목을 반환하면 사후 필터가 50개의 일치 항목에 적용되어 필터 조건을 충족하는 결과가 줄어들고, 의미 순위매기기에 전달할 문서가 50개 미만이 됩니다.

maxTextRecallSize 및 countAndFacetMode 설정(미리 보기)

이 섹션에서는 하이브리드 순위 모델로 이동하는 BM25 순위 결과의 양을 제어하여 입력을 하이브리드 쿼리로 조정하는 방법을 설명합니다. BM25 순위 입력을 제어하면 하이브리드 시나리오에서 관련성 튜닝에 대한 추가 옵션을 제공합니다.

미리 보기 REST API 버전 2024-05-01-preview를 사용하는 것이 좋습니다.

고려해야 할 또 다른 옵션은 추가 또는 대체 기술로, 요청에서 벡터 쿼리의 중요성을 높이는 벡터 가중치입니다.

  1. 2024-05-01-preview의 Search - POST 또는 Search - GET을 사용하여 이러한 매개 변수를 지정합니다.

  2. hybridSearch 쿼리 매개 변수 개체를 추가하여 하이브리드 쿼리의 BM25 순위 결과를 통해 회수되는 최대 문서 수를 설정합니다. 여기에는 다음과 같은 두 가지 속성이 있습니다.

    • maxTextRecallSize는 하이브리드 쿼리에 사용되는 RRF(Reciprocal Rank Fusion) 순위매기기에 제공할 BM25 순위 결과의 수를 지정합니다. 기본값은 1,000입니다. 최대값은 10,000입니다.

    • countAndFacetMode는 BM25 순위 결과의 개수와 사용 중인 패싯의 수를 보고합니다. 기본값은 쿼리와 일치하는 모든 문서의 개수입니다. 필요에 따라 "count"의 범위를 maxTextRecallSize로 지정할 수 있습니다.

  3. 벡터 유사성 검색이 일반적으로 하이브리드 쿼리의 텍스트 측 성능보다 우수한 경우 maxTextRecallSize를 줄입니다.

  4. 인덱스가 크고 기본값이 충분한 수의 결과를 캡처하지 않는 경우 maxTextRecallSize를 늘립니다. 더 큰 BM25 순위 결과 집합을 사용하면 top, skipnext를 설정하여 해당 결과의 일부를 검색할 수도 있습니다.

다음 REST 예제에서는 maxTextRecallSize 설정에 대한 두 가지 사용 사례를 보여 줍니다.

첫 번째 예제에서는 maxTextRecallSize를 100으로 줄여 하이브리드 쿼리의 텍스트 측을 문서 100개로 제한합니다. 또한 maxTextRecallSize에서 해당 결과만 포함하도록 countAndFacetMode를 설정합니다.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world", 
      "hybridSearch": { 
        "maxTextRecallSize": 100, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

두 번째 예제에서는 maxTextRecallSize를 5,000으로 늘립니다. 또한 top, skip 및 next를 사용하여 큰 결과 집합에서 결과를 가져옵니다. 이 경우 요청은 RRF 복합 결과 집합에 대한 텍스트 쿼리 기여도로 위치 1,500에서 2,000까지의 BM25 순위 결과를 가져옵니다.

POST https://[service-name].search.windows.net/indexes/[index-name]/docs/search?api-version=2024-05-01-Preview 

    { 
      "vectorQueries": [ 
        { 
          "kind": "vector", 
          "vector": [1.0, 2.0, 3.0], 
          "fields": "my_vector_field", 
          "k": 10 
        } 
      ], 
      "search": "hello world",
      "top": 500,
      "skip": 1500,
      "next": 500,
      "hybridSearch": { 
        "maxTextRecallSize": 5000, 
        "countAndFacetMode": "countRetrievableResults" 
      } 
    } 

쿼리 응답 구성

하이브리드 쿼리를 설정할 때 응답 구조를 생각해 보세요. 응답은 일반 행 집합입니다. 쿼리의 매개 변수는 각 행에 있는 필드와 응답에 있는 행 수를 결정합니다. 검색 엔진은 일치하는 문서의 순위를 매기고 가장 관련성이 높은 결과를 반환합니다.

응답의 필드

검색 결과는 검색 인덱스의 retrievable 필드로 구성됩니다. 결과는 다음 중 하나와 같습니다.

  • 모든 retrievable 필드(REST API 기본값).
  • 쿼리의 "select" 매개 변수에 명시적으로 나열된 필드입니다.

이 문서의 예제에서는 "select" 문을 사용하여 응답에서 텍스트(비벡터) 필드를 지정했습니다.

참고 항목

벡터는 사람이 읽을 수 있는 텍스트로 리버스 엔지니어링되지 않으므로 응답에 반환하지 마세요. 대신 검색 문서를 나타내는 비벡터 필드를 선택하세요. 예를 들어 쿼리가 "DescriptionVector" 필드를 대상으로 하는 경우 응답에 동일한 텍스트 필드("description")가 있다면 해당 텍스트 필드를 반환합니다.

결과 수

쿼리는 원하는 문서 수와 일치할 수 있으며 검색 조건이 약한 경우 모든 문서 수와 일치할 수 있습니다(예: null 쿼리의 경우 "search=*"). 바인딩되지 않은 결과를 반환하는 것은 거의 실용적이지 않으므로 전체 응답에 대한 최대값을 지정해야 합니다.

  • 키워드 전용 쿼리(벡터 없음)에 대한 "top": n 결과
  • 벡터 전용 쿼리에 대한 "k": n 결과
  • "search" 매개 변수를 포함하는 하이브리드 쿼리(의미 체계 포함 또는 제외)에 대한 "top": n 결과

"k" 및 "top"은 모두 선택 사항입니다. 지정되지 않은 응답의 기본 결과 수는 50입니다. 더 많은 결과를 통해 페이지를 "top" 및 "skip"로 설정하거나 기본값을 변경할 수 있습니다.

참고 항목

2024-05-01-preview API에서 하이브리드 검색을 사용하는 경우 maxTextRecallSize를 사용하여 키워드 쿼리의 결과 수를 제어할 수 있습니다. 이를 "k" 설정과 결합하여 각 검색 하위 시스템(키워드 및 벡터)의 표현을 제어합니다.

의미 순위매기기 결과

참고 항목

의미 순위매기기는 최대 50개의 결과를 가져올 수 있습니다.

2024-05-01-preview API에서 의미 순위매기기를 사용하는 경우 "k" 및 "maxTextRecallSize"를 총 50개 이상으로 설정하는 것이 가장 좋습니다. 그런 다음, "top" 매개 변수를 사용하여 사용자에게 반환되는 결과를 제한할 수 있습니다.

이전 API에서 의미 순위매기기를 사용하는 경우 다음을 수행합니다.

  • 키워드 전용 검색(벡터 없음)을 수행하는 경우 "top"을 50으로 설정합니다.
  • 하이브리드 검색을 수행하는 경우 "k"를 50으로 설정하면 의미 순위매기기를 통해 50개 이상의 결과를 얻을 수 있습니다.

순위

선택 사항인 다시 의미 순위매기기 여부에 관계없이 하이브리드 쿼리에 대해 여러 집합이 만들어집니다. 결과의 순위는 RRF(Reciprocal Rank Fusion)에 의해 계산됩니다.

이 섹션에서는 상위 결과에 대한 단일 벡터 검색과 단순 하이브리드 검색 간의 응답을 비교합니다. 서로 다른 순위 알고리즘, HNSW의 유사성 메트릭 및 RRF(이 경우)는 크기가 서로 다른 점수를 생성합니다. 이 동작은 의도된 것입니다. RRF 점수는 유사성이 높은 경우에도 매우 낮게 나타날 수 있습니다. 낮은 점수는 RRF 알고리즘의 특징입니다. RRF를 사용하는 하이브리드 쿼리에서는 순수 벡터 검색과 달리, RRF 순위가 매겨진 문서의 점수가 상대적으로 작기 때문에 순위가 매겨진 문서의 더 많은 역수가 결과에 포함됩니다.

단일 벡터 검색: 코사인 유사성(기본 벡터 유사성 거리 함수)을 기준으로 정렬된 결과에 대한 @search.score입니다.

{
    "@search.score": 0.8399121,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

하이브리드 검색: Reciprocal Rank Fusion을 사용하여 순위가 지정된 하이브리드 결과에 대한 @search.score입니다.

{
    "@search.score": 0.032786883413791656,
    "HotelId": "49",
    "HotelName": "Old Carrabelle Hotel",
    "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center.",
    "Category": "Luxury",
    "Address": {
    "City": "Arlington"
    }
}

다음 단계

다음 단계로 Python, C# 또는 JavaScript의 데모 코드를 검토하는 것이 좋습니다.