RAG를 사용하여 문서 순위 지정 및 재순위 지정

Vertex AI Agent Builder에서 검색 증강 생성(RAG) 경험에 따라 쿼리를 기반으로 문서 집합의 순위를 지정할 수 있습니다.

Ranking API는 문서 목록을 가져와 문서가 쿼리와 얼마나 관련성이 있는지에 따라 문서의 순위를 다시 지정합니다. 문서와 쿼리의 시맨틱 유사성만 고려하는 임베딩과 비교하여 Ranking API는 문서가 특정 쿼리에 얼마나 잘 대답하는지에 관한 정확한 점수를 제공할 수 있습니다. Ranking API는 후보 문서의 초기 집합을 검색한 후 검색 결과의 품질을 개선하는 데 사용할 수 있습니다.

Ranking API는 스테이트리스(Stateless)이므로 API를 호출하기 전에 문서 색인을 생성할 필요가 없습니다. 쿼리와 문서를 전달하기만 하면 됩니다. 따라서 이 API는 벡터 검색 및 기타 검색 솔루션의 문서 순위를 다시 지정하는 데 적합합니다.

이 페이지에서는 Ranking API를 사용하여 쿼리를 기반으로 문서 집합의 순위를 지정하는 방법을 설명합니다.

사용 사례

Ranking API의 기본 사용 사례는 검색 결과의 품질을 개선하는 것입니다.

하지만 Ranking API는 사용자의 쿼리와 가장 관련성이 높은 콘텐츠를 찾아야 하는 모든 시나리오에 유용할 수 있습니다. 예를 들어 Ranking API를 사용하면 다음 작업을 할 수 있습니다.

  • 그라운딩을 위해 LLM에 제공할 적절한 콘텐츠 찾기

  • 기존 검색 환경의 관련성 개선

  • 문서의 관련 섹션 식별

다음 흐름에서는 Ranking API를 사용하여 청크 처리된 문서의 결과 품질을 개선하는 방법을 간략히 설명합니다.

  1. Document AI Layout Parser API를 사용하여 문서 집합을 청크로 분할합니다.

  2. 임베딩 API를 사용하여 각 청크의 임베딩을 만듭니다.

  3. 벡터 검색 또는 다른 검색 솔루션에 임베딩을 로드합니다.

  4. 검색 색인을 쿼리하고 가장 관련성 높은 청크를 검색합니다.

  5. Ranking API를 사용하여 관련 청크의 순위를 다시 지정합니다.

입력 데이터

Ranking API에는 다음 입력이 필요합니다.

  • 레코드의 순위를 지정할 쿼리입니다.

    예를 들면 다음과 같습니다.

    "query": "Why is the sky blue?"
    
  • 쿼리와 관련된 레코드 집합입니다. 레코드는 객체 배열로 제공됩니다. 각 레코드에는 고유 ID, 제목, 문서 콘텐츠가 포함될 수 있습니다. 각 레코드는 제목, 콘텐츠 또는 둘 다를 포함합니다. 제목과 콘텐츠의 길이가 합쳐서 512개 토큰을 초과하면 추가 콘텐츠가 잘립니다. 요청당 레코드는 최대 200개까지 포함할 수 있습니다.

    예를 들어 레코드 배열은 다음과 같습니다. 실제로는 배열에 더 많은 레코드가 포함되고 콘텐츠가 훨씬 더 길 것입니다.

    "records": [
       {
           "id": "1",
           "title": "The Color of the Sky: A Poem",
           "content": "A canvas stretched across the day,\nWhere sunlight learns to dance and play.\nBlue, a hue of scattered light,\nA gentle whisper, soft and bright."
       },
       {
           "id": "2",
           "title": "The Science of a Blue Sky",
           "content": "The sky appears blue due to a phenomenon called Rayleigh scattering. Sunlight is comprised of all the colors of the rainbow. Blue light has shorter wavelengths than other colors, and is thus scattered more easily."
       }
    ]
    
  • 선택사항: Ranking API가 반환할 최대 레코드 수입니다. 기본적으로 모든 레코드가 반환되지만 topN 필드를 사용하여 더 적은 수의 레코드를 반환할 수 있습니다. 설정된 값에 관계없이 모든 레코드의 순위가 매겨집니다.

    예를 들어 다음은 순위가 높은 상위 10개 레코드를 반환합니다.

    "topN": 10,
    
  • 선택사항: API에서 레코드의 ID만 반환할지 아니면 레코드 제목과 콘텐츠도 반환할지 지정하는 설정입니다. 기본적으로 전체 레코드가 반환됩니다. 이를 설정하는 주된 이유는 응답 페이로드의 크기를 줄이기 위해서입니다.

    예를 들어 true로 설정하면 제목이나 콘텐츠가 아닌 레코드 ID만 반환됩니다.

    "ignoreRecordDetailsInResponse": true,
    
  • 선택사항: 모델 이름입니다. 문서 순위에 사용할 모델을 지정합니다. 모델이 지정되지 않으면 사용 가능한 최신 모델을 자동으로 가리키는 semantic-ranker-512@latest가 사용됩니다. 특정 모델을 가리키려면 지원되는 모델에 나열된 모델 이름 중 하나(예: semantic-ranker-512-002)를 지정합니다.

    다음 예시에서는 modelsemantic-ranker-512@latest로 설정되었습니다. 즉, Ranking API는 항상 사용 가능한 최신 모델을 사용합니다.

    "model": "semantic-ranker-512@latest"
    

출력 데이터

Ranking API는 다음과 같은 출력과 함께 순위가 지정된 레코드 목록을 반환합니다.

  • 점수: 레코드의 관련성을 나타내는 0과 1 사이의 부동 소수점 값입니다.

  • ID: 레코드의 고유 ID입니다.

  • 요청된 경우 전체 객체는 ID, 제목, 콘텐츠입니다.

    예를 들면 다음과 같습니다.

{
    "records": [
        {
            "id": "2",
            "score": 0.98,
            "title": "The Science of a Blue Sky",
            "content": "The sky appears blue due to a phenomenon called Rayleigh scattering. Sunlight is comprised of all the colors of the rainbow. Blue light has shorter wavelengths than other colors, and is thus scattered more easily."
        },
        {
            "id": "1",
            "score": 0.64,
            "title": "The Color of the Sky: A Poem",
            "content": "A canvas stretched across the day,\nWhere sunlight learns to dance and play.\nBlue, a hue of scattered light,\nA gentle whisper, soft and bright."
        }
    ]
}

쿼리에 따라 레코드 집합의 순위 지정(또는 재순위 지정)

일반적으로 쿼리와 해당 쿼리와 관련이 있고 키워드 검색이나 벡터 검색과 같은 다른 방법으로 이미 순위가 지정된 레코드 집합을 Ranking API에 제공합니다. 그런 다음 Ranking API를 사용하여 순위의 품질을 개선하고 각 레코드와 쿼리의 관련성을 나타내는 점수를 결정합니다.

  1. 쿼리 및 결과 레코드를 가져옵니다. 각 레코드에 ID와 제목, 콘텐츠 또는 둘 다가 있는지 확인하세요.

    이 모델은 레코드당 최대 512개의 토큰을 지원합니다. 제목과 콘텐츠의 합산 길이가 512개 토큰을 초과하면 추가 콘텐츠가 잘립니다.

  2. 다음 코드를 사용하여 rankingConfigs.rank 메서드를 호출합니다.

REST

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: PROJECT_ID" \
"https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/rankingConfigs/default_ranking_config:rank" \
-d '{
"model": "semantic-ranker-512@latest",
"query": "QUERY",
"records": [
    {
        "id": "RECORD_ID_1",
        "title": "TITLE_1",
        "content": "CONTENT_1"
    },
    {
        "id": "RECORD_ID_2",
        "title": "TITLE_2",
        "content": "CONTENT_2"
    },
    {
        "id": "RECORD_ID_3",
        "title": "TITLE_3",
        "content": "CONTENT_3"
    }
]
}'

다음을 바꿉니다.

  • PROJECT_ID: Google Cloud 프로젝트의 ID입니다.
  • QUERY: 레코드의 순위 및 점수가 매겨지는 쿼리입니다.
  • RECORD_ID_n: 레코드를 식별하는 고유한 문자열입니다.
  • TITLE_n: 레코드의 제목입니다.
  • CONTENT_n: 레코드의 콘텐츠입니다.

이 메서드에 관한 일반 정보는 rankingConfigs.rank를 참고하세요.

클릭하여 curl 명령어 및 응답 예시를 확인하세요.

    curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: my-project-123" \
    "https://discoveryengine.googleapis.com/v1/projects/my-project-123/locations/global/rankingConfigs/default_ranking_config:rank" \
    -d '{
        "model": "semantic-ranker-512@latest",
        "query": "what is Google gemini?",
        "records": [
            {
                "id": "1",
                "title": "Gemini",
                "content": "The Gemini zodiac symbol often depicts two figures standing side-by-side."
            },
            {
                "id": "2",
                "title": "Gemini",
                "content": "Gemini is a cutting edge large language model created by Google."
            },
            {
                "id": "3",
                "title": "Gemini Constellation",
                "content": "Gemini is a constellation that can be seen in the night sky."
            }
        ]
    }'
    
{
    "records": [
        {
            "id": "2",
            "title": "Gemini",
            "content": "Gemini is a cutting edge large language model created by Google.",
            "score": 0.97
        },
        {
            "id": "3",
            "title": "Gemini Constellation",
            "content": "Gemini is a constellation that can be seen in the night sky.",
            "score": 0.18
        },
        {
            "id": "1",
            "title": "Gemini",
            "content": "The Gemini zodiac symbol often depicts two figures standing side-by-side.",
            "score": 0.05
        }
    ]
}

Python

자세한 내용은 Vertex AI Agent Builder Python API 참고 문서를 확인하세요.

Vertex AI Agent Builder에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

from google.cloud import discoveryengine_v1 as discoveryengine

# TODO(developer): Uncomment these variables before running the sample.
# project_id = "YOUR_PROJECT_ID"

client = discoveryengine.RankServiceClient()

# The full resource name of the ranking config.
# Format: projects/{project_id}/locations/{location}/rankingConfigs/default_ranking_config
ranking_config = client.ranking_config_path(
    project=project_id,
    location="global",
    ranking_config="default_ranking_config",
)
request = discoveryengine.RankRequest(
    ranking_config=ranking_config,
    model="semantic-ranker-512@latest",
    top_n=10,
    query="What is Google Gemini?",
    records=[
        discoveryengine.RankingRecord(
            id="1",
            title="Gemini",
            content="The Gemini zodiac symbol often depicts two figures standing side-by-side.",
        ),
        discoveryengine.RankingRecord(
            id="2",
            title="Gemini",
            content="Gemini is a cutting edge large language model created by Google.",
        ),
        discoveryengine.RankingRecord(
            id="3",
            title="Gemini Constellation",
            content="Gemini is a constellation that can be seen in the night sky.",
        ),
    ],
)

response = client.rank(request=request)

# Handle the response
print(response)

지원되는 모델

다음 모델을 사용할 수 있습니다.

모델 이름 최신 모델(semantic-ranker-512@latest) 입력 컨텍스트 윈도우 출시일 지원 중단 날짜
semantic-ranker-512-003 텍스트(25개 언어) 512 2024년 9월 10일 미정
semantic-ranker-512-002 아니요 텍스트(영어만 해당) 512 2024년 6월 3일 미정

다음 단계

다른 RAG API와 함께 순위 메서드를 사용하여 비정형 데이터에서 그라운딩된 답변을 생성하는 방법을 알아보세요.