使用 RAG 对文档进行排名和重新排名

作为 检索增强生成 (RAG) Vertex AI Agent Builder,您可以 基于查询对一组文档进行排名。

排序 API 会获取文档列表,并根据这些文档 文档与查询的相关程度。与仅考虑文档与查询的语义相似性的嵌入相比,Ranking API 可以根据文档回答给定查询的准确程度为您提供精确的得分。通过 检索初始候选文档集。

排名 API 是无状态的,因此无需在调用 API 之前对文档编入索引。您只需传入查询和文档即可。因此,该 API 非常适合对来自矢量搜索和其他搜索解决方案的文档进行重新排名。

本页介绍了如何使用 Ranking API 根据查询对一组文档进行排名。

使用场景

Ranking API 的主要用例是提高搜索结果的质量。

不过,对于您需要查找 哪些内容与用户的查询最相关。例如, ranking API 可以帮助您完成以下工作:

  • 查找合适的内容以提供给 LLM 进行接地

  • 提高现有搜索体验的相关性

  • 确定文档的相关部分

以下流程概述了如何使用 Ranking API 提高分块文档的结果质量:

  1. 使用 Document AI Layout Parser API 将一组文档拆分为多个文本块。

  2. 使用嵌入 API 为每个分块创建嵌入。

  3. 将嵌入加载到矢量搜索或其他搜索解决方案中。

  4. 查询您的搜索索引并检索最相关的数据块。

  5. 使用排名 API 对相关块进行重新排名。

输入数据

排名 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."
       }
    ]
    
  • 可选:您希望排名 API 添加的记录数上限 return。默认情况下,系统会返回所有记录;不过,您可以使用topN 字段以减少返回的记录数。无论设置了什么值,系统都会对所有记录进行排名。

    例如,下面会返回排名前 10 的记录:

    "topN": 10,
    
  • 可选:此设置用于指定您是希望仅返回 API 返回的记录 ID,还是希望同时返回记录标题和内容。默认情况下,系统会返回完整记录。设置此值的主要原因是 。

    例如,将其设置为 true 仅会返回记录 ID,而不会返回标题或内容:

    "ignoreRecordDetailsInResponse": true,
    
  • 可选:模型名称。它指定了用于对 进行排名的模型 文档。如果未指定模型,则系统会使用 semantic-ranker-512@latest,它会自动指向最新的可用模型。要指向 指定模型名称,请指定支持的 模型,例如 semantic-ranker-512-002

    在以下示例中,model 设置为 semantic-ranker-512@latest。这意味着,Ranking API 将始终使用最新的可用模型。

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

输出数据

排名 API 会返回经过排序的记录列表,其中包含以下输出:

  • Score:介于 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."
        }
    ]
}

根据查询对一组记录进行排名(或重新排名)

通常,您需要为排名 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_v1alpha 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 结合使用 根据非结构化数据生成有依据的答案