检索和排名

本页介绍了重新排名,并展示了如何使用 API 重新排名检索到的回答。

检索后重新排名是一种用于提高检索结果相关性的技术。Vertex AI RAG Engine 提供可选的重新排名器,可在查询期间提高检索结果的相关性。重新排名器会评估查询中各个块的相关性,并相应地对结果进行重新排序。新的顺序可生成更适合回答查询的回答,或者可包含在模型推理提示中,以生成更相关、更准确的回答。

可用的重新排名器

本部分将探讨重新排名算法的类型。

LLM 重新排名器

LLM 重新排名器是一种重新排名器,它使用 LLM 来评估各个块与查询的相关性,并相应地对结果进行重新排序,从而为模型推理提供更合适的回答或改进的提示。

Vertex AI 排名服务重新排名器

排名服务重新排名器基于排名 API,该 API 会接受文档列表,并根据文档与查询的相关性对这些文档进行重新排名。与仅考虑文档与查询的语义相似度的嵌入相比,这种方法可以为文档回答给定查询的准确程度提供精确的得分。

选择重新排名算法时的注意事项

选择重新排名算法时,请考虑以下事项:

  • LLM 和 Rank 服务重排序程序使用重新排序来提高检索到的上下文的相关性,从而使模型能够提供更优质的回答。
  • 重新排名器会引入延迟,随着处理的上下文数量增加,延迟会增加。
  • LLM 重新排名器的费用取决于所处理的 token 数量,但使用 Rank 服务重新排名器的费用是按查询固定收取的。

如何使用重新排名器

本部分介绍了使用重新排名器的前提条件和代码示例。

使用 LLM 重新排名器的前提条件

LLM 重新排名器仅支持 Gemini 模型,您可以在启用 RAG API 后访问这些模型。如需查看受支持的模型列表,请参阅 Gemini 模型

使用 RAG API 检索相关上下文

此代码示例演示了如何使用 RAG API 检索相关上下文。

REST

替换代码示例中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • TEXT:要获取相关上下文的查询文本。
  • MODEL_NAME:用于重新排名的模型的名称。
curl -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION:retrieveContexts" \
  -d '{
    "vertex_rag_store": {
      "rag_resources": {
          "rag_corpus": """RAG_CORPUS_RESOURCE"
        }
    },
    "query": {
      "text": "TEXT",
      "rag_retrieval_config": {
        "top_k": 10,
        "ranking": {
          "llm_ranker": {
            "model_name": "MODEL_NAME"
          }
        }
      }
    }
  }'

Python

如需了解如何安装或更新 Python 版 Vertex AI SDK,请参阅安装 Python 版 Vertex AI SDK。如需了解详情,请参阅 Python API 参考文档

替换代码示例中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • TEXT:要获取相关上下文的查询文本。
  • MODEL_NAME:用于重新排名的模型的名称。
from vertexai import rag
import vertexai

PROJECT_ID = "PROJECT_ID"
CORPUS_NAME = "projects/[PROJECT_ID]/locations/LOCATION/ragCorpora/[RAG_CORPUS_ID]"
MODEL_NAME= "MODEL_NAME"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="LOCATION")

rag_retrieval_config = rag.RagRetrievalConfig(
    top_k=10,
    ranking=rag.Ranking(
        llm_ranker=rag.LlmRanker(
            model_name=MODEL_NAME
        )
    )
)

response = rag.retrieval_query(
    rag_resources=[
        rag.RagResource(
            rag_corpus=CORPUS_NAME,
        )
    ],
    text="TEXT",
    rag_retrieval_config=rag_retrieval_config,
)
print(response)
# Example response:
# contexts {
#   contexts {
#     source_uri: "gs://your-bucket-name/file.txt"
#     text: "....
#   ....

使用 RAG API 生成内容

REST

如需使用 Gemini 模型生成内容,请调用 Vertex AI GenerateContent API。

替换示例代码中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • MODEL_ID:用于内容生成的 LLM 模型。例如 gemini-1.5-flash-002
  • GENERATION_METHOD:用于生成内容的 LLM 方法。选项为 generateContentstreamGenerateContent
  • INPUT_PROMPT:发送到 LLM 用于生成内容的文本。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。
    格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • SIMILARITY_TOP_K(可选):要检索的热门上下文数量。
  • MODEL_NAME:用于重新排名的模型的名称。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:GENERATION_METHOD" \
-d '{
  "contents": {
    "role": "user",
    "parts": {
      "text": "INPUT_PROMPT"
    }
  },
  "tools": {
    "retrieval": {
      "disable_attribution": false,
      "vertex_rag_store": {
        "rag_resources": {
            "rag_corpus": "RAG_CORPUS_RESOURCE"
          },
        "rag_retrieval_config": {
          "top_k": 10,
          "ranking": {
            "llm_ranker": {
              "model_name": "MODEL_NAME"
            }
          }
        }
      }
    }
  }
}'

Python

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。如需了解详情,请参阅 Python API 参考文档

替换示例代码中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • MODEL_ID:用于内容生成的 LLM 模型。例如 gemini-1.5-flash-002
  • GENERATION_METHOD:用于生成内容的 LLM 方法。选项为 generateContentstreamGenerateContent
  • INPUT_PROMPT:发送到 LLM 用于生成内容的文本。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。
    格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • SIMILARITY_TOP_K(可选):要检索的热门上下文数量。
  • MODEL_NAME:用于重新排名的模型的名称。
from vertexai import rag
from vertexai.generative_models import GenerativeModel, Tool
import vertexai

PROJECT_ID = "PROJECT_ID"
CORPUS_NAME = "projects/{PROJECT_ID}/locations/LOCATION/ragCorpora/RAG_CORPUS_RESOURCE"
MODEL_NAME= "MODEL_NAME"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="LOCATION")

config = rag.RagRetrievalConfig(
    top_k=10,
    ranking=rag.Ranking(
        llm_ranker=rag.LlmRanker(
            model_name=MODEL_NAME
        )
    )
)

rag_retrieval_tool = Tool.from_retrieval(
    retrieval=rag.Retrieval(
        source=rag.VertexRagStore(
            rag_resources=[
                rag.RagResource(
                    rag_corpus=CORPUS_NAME,
                )
            ],
            rag_retrieval_config=config
        ),
    )
)

rag_model = GenerativeModel(
    model_name=MODEL_NAME, tools=[rag_retrieval_tool]
)
response = rag_model.generate_content("Why is the sky blue?")
print(response.text)
# Example response:
#   The sky appears blue due to a phenomenon called Rayleigh scattering.
#   Sunlight, which contains all colors of the rainbow, is scattered
#   by the tiny particles in the Earth's atmosphere....
#   ...

Vertex 排名服务重新排名器的前提条件

如需使用 Vertex AI 排名服务重新排名器,必须启用 Discovery Engine API。如需查看所有受支持的模型,请参阅此文档

使用 RAG API 检索相关上下文

创建 RAG 语料库后,您可以通过 RetrieveContexts API 从 Vertex AI RAG 引擎检索相关上下文。

以下代码示例演示了如何使用该 API 从 Vertex AI RAG Engine 检索上下文。

REST

替换示例代码中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • TEXT:要获取相关上下文的查询文本。
  • MODEL_NAME:用于重新排名的模型的名称。
curl -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION:retrieveContexts" \
  -d '{
    "vertex_rag_store": {
      "rag_resources": {
          "rag_corpus": "RAG_CORPUS_RESOURCE"
        }
    },
    "query": {
      "text": "TEXT",
      "rag_retrieval_config": {
        "top_k": 5,
        "ranking": {
          "rank_service": {
            "model_name": "MODEL_NAME"
          }
        }
      }
    }
  }'

Python

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。如需了解详情,请参阅 Python API 参考文档

替换示例代码中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。
    格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • TEXT:要获取相关上下文的查询文本。
  • MODEL_NAME:用于重新排名的模型的名称。
from vertexai import rag
import vertexai

PROJECT_ID = "PROJECT_ID"
CORPUS_NAME = "projects/[PROJECT_ID]/locations/LOCATION/ragCorpora/RAG_CORPUS_RESOURCE"
MODEL_NAME= "MODEL_NAME"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="LOCATION")

rag_retrieval_config = rag.RagRetrievalConfig(
    top_k=10,
    ranking=rag.Ranking(
        rank_service=rag.RankService(
            model_name=MODEL_NAME
        )
    )
)
response = rag.retrieval_query(
    rag_resources=[
        rag.RagResource(
            rag_corpus=CORPUS_NAME,
        )
    ],
    text="TEXT",
    rag_retrieval_config=rag_retrieval_config,
)
print(response)
# Example response:
# contexts {
#   contexts {
#     source_uri: "gs://your-bucket-name/file.txt"
#     text: "....
#   ....

使用 RAG API 生成内容

REST

如需使用 Gemini 模型生成内容,请调用 Vertex AI GenerateContent API。通过在请求中指定 RAG_CORPUS_RESOURCE,模型会自动从 Vertex AI RAG 引擎检索数据。

替换示例代码中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • MODEL_ID:用于内容生成的 LLM 模型。例如 gemini-1.5-flash-002
  • GENERATION_METHOD:用于生成内容的 LLM 方法。选项包括 generateContentstreamGenerateContent
  • INPUT_PROMPT:发送到 LLM 用于生成内容的文本。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。
    格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • SIMILARITY_TOP_K(可选):要检索的热门上下文数量。
  • MODEL_NAME:用于重新排名的模型的名称。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:GENERATION_METHOD" \
-d '{
  "contents": {
    "role": "user",
    "parts": {
      "text": "INPUT_PROMPT"
    }
  },
  "tools": {
    "retrieval": {
      "disable_attribution": false,
      "vertex_rag_store": {
        "rag_resources": {
            "rag_corpus": "RAG_CORPUS_RESOURCE"
          },
        "rag_retrieval_config": {
          "top_k": 10,
          "ranking": {
            "rank_service": {
              "model_name": "MODEL_NAME"
            }
          }
        }
      }
    }
  }
}'

Python

如需了解如何安装或更新 Python 版 Vertex AI SDK,请参阅安装 Python 版 Vertex AI SDK。如需了解详情,请参阅 Python API 参考文档

替换示例代码中使用的以下变量:

  • PROJECT_ID:您的 Google Cloud 项目的 ID。
  • LOCATION:处理请求的区域。
  • MODEL_ID:用于内容生成的 LLM 模型。例如 gemini-1.5-flash-002
  • GENERATION_METHOD:用于生成内容的 LLM 方法。选项包括 generateContentstreamGenerateContent
  • INPUT_PROMPT:发送到 LLM 用于生成内容的文本。
  • RAG_CORPUS_RESOURCE:RAG 语料库资源的名称。
    格式:projects/{project}/locations/{location}/ragCorpora/{rag_corpus}
  • SIMILARITY_TOP_K(可选):要检索的热门上下文数量。
  • MODEL_NAME:用于重新排名的模型的名称。
from vertexai import rag
from vertexai.generative_models import GenerativeModel, Tool
import vertexai

PROJECT_ID = "PROJECT_ID"
CORPUS_NAME = "projects/{PROJECT_ID}/locations/LOCATION/ragCorpora/RAG_CORPUS_RESOURCE"

# Initialize Vertex AI API once per session
vertexai.init(project=PROJECT_ID, location="LOCATION")

config = rag.RagRetrievalConfig(
    top_k=10,
    ranking=rag.Ranking(
        rank_service=rag.RankService(
            model_name=MODEL_NAME
        )
    )
)

rag_retrieval_tool = Tool.from_retrieval(
    retrieval=rag.Retrieval(
        source=rag.VertexRagStore(
            rag_resources=[
                rag.RagResource(
                    rag_corpus=CORPUS_NAME,
                )
            ],
            rag_retrieval_config=config
        ),
    )
)

rag_model = GenerativeModel(
    model_name="MODEL_NAME", tools=[rag_retrieval_tool]
)
response = rag_model.generate_content("INPUT_PROMPT")
print(response.text)
# Example response:
#   The sky appears blue due to a phenomenon called Rayleigh scattering.
#   Sunlight, which contains all colors of the rainbow, is scattered
#   by the tiny particles in the Earth's atmosphere....
#   ...

后续步骤