使用 Elasticsearch 进行接地

本页面介绍了如何使用 Elasticsearch 实例来利用数据进行接地。

使用 Elasticsearch 让 Gemini 接地

接地是指使用公开和私有数据集来提供上下文和事实,以便让大语言模型 (LLM) 回答接地。通过使用 Elasticsearch 进行接地,您可以利用现有的 Elasticsearch 索引来帮助提高 Gemini 输出的质量和可靠性,减少幻觉并帮助确保回答与您的数据相关。这样一来,您就可以构建强大的 RAG 应用,例如:

  • 生成式搜索摘要
  • 可使用企业数据的问答聊天机器人
  • 根据您的数据进行接地的智能体

您一次最多可以基于 10 个数据源让回答接地。您可以将“使用 Elasticsearch 进行接地”与使用 Google 搜索进行接地相结合,将模型与世界知识、各种主题或互联网上的最新信息相连接。

支持的模型

以下模型支持使用 Elasticsearch 进行连接(仅限文本输入):

在 Elasticsearch 中设置搜索模板

本部分介绍如何使用 Elasticsearch 实例来利用存储在该实例中的数据进行接地。

最佳做法

为了获得最佳接地回答,请在创建搜索模板时遵循以下原则:

  • 仅包含相关且有用的数据。例如,在产品目录中,指定图片网址可能无法帮助 LLM 回答有关产品属性的提示,除非提示明确要求提供网址。同样,避免输出嵌入向量。

  • 接地会移除与提示相关性较低的 Elasticsearch 结果。您应提供更多 Elasticsearch 结果,以捕获所有相关上下文。

  • 结果数据可以位于一个字段中,也可以分布在多个字段中。

示例模板

您可以使用搜索模板。不过,我们建议您使用具有 Elasticsearch 接地的通用 kNN 搜索模板。如需查看其他搜索模板,请参阅 GitHub 代码库

这种基于 Vertex AI 的语义搜索是一种通用的 kNN 搜索。

    PUT _scripts/google-template-knn-multioutput
    {
      "script": {
        "lang": "mustache",
        "source": {
          "_source": {
            "excludes": [ "title_embedding", "description_embedding", "images"]
          },
            "size": "num_hits",
              "knn" : [
              {
                "field": "description_embedding",
                "k": 5,
                "num_candidates": 10,
                "query_vector_builder": {
                  "text_embedding": {
                    "model_id": "googlevertexai_embeddings_004",
                    "model_text": "query"
                  }
                },
                "boost": 0.4
              },
              {
                "field": "title_embedding",
                "k": 5,
                "num_candidates": 10,
                "query_vector_builder": {
                  "text_embedding": {
                    "model_id": "googlevertexai_embeddings_004",
                    "model_text": "query"
                }
              },
              "boost": 0.6
              }
              ]
        }
      }
    }

使用 Elasticsearch 生成接地的回答

控制台

如需在 Google Cloud 控制台中使用 Elasticsearch 进行接地,请执行以下操作:

  1. 前往 Vertex AI Studio 的创建提示页面。

    前往“创建提示”

  2. 设置面板中,如需让数据接地,请点击接地:您的数据切换开关。

  3. 自定义接地窗格中,选择 Elasticsearch

  4. Elasticsearch 端点字段中输入端点。

  5. Elasticsearch API 密钥字段中输入 API 密钥。

  6. Elasticsearch 索引字段中输入索引。

  7. Elasticsearch 搜索模板字段中输入搜索模板。

  8. 滑动命中数滑块,来调整命中数。

  9. 点击保存

  10. 输入您的提示。

  11. 点击提交

理解回答

如果您的模型提示使用 Vertex AI Studio 或 API 成功接地到 Elasticsearch 数据存储区,则模型的回答会包含具有引用和来源内容的元数据。如果模型回答中出现来源相关性低或信息不完整的情况,则可能不会提供元数据,并且提示回答不会接地。

REST

本部分介绍了如何使用 Vertex AI API 让 LLM 回答接地。

前提条件

在使用 Elasticsearch 让 LLM 回答接地之前,您必须完成以下操作:

  1. 激活 Vertex AI API:确保已为您的 Google Cloud 项目启用 Vertex AI API。

  2. 安装并登录 Google Cloud CLI:安装并初始化 gcloud CLI 命令行工具

  3. Elasticsearch 设置:使用您想要用于接地的现有 Elasticsearch 集群和索引。从 Elasticsearch 设置中获取以下信息:

    • 端点:Elasticsearch 集群的网址。
    • 索引名称:要搜索的索引的名称,例如 my-data-index
    • API 密钥:允许访问 Elasticsearch 集群的 API 密钥。 API 密钥必须以 ApiKey 前缀开头。
  4. 创建 Elasticsearch 搜索模板:使用采用引用模板的 Elasticsearch 数据源,该模板会返回用于接地的搜索结果数据。

API 访问权限

按照以下说明使用 Vertex AI API 通过 Elasticsearch 数据源让 Gemini 接地。

准备接地的生成请求

如需发送文本提示并使用 Elasticsearch 让其接地,请向 Vertex AI API 发送 POST 请求。您必须至少提供请求正文。请务必进行以下替换:

  • QUERY:要接地的文本提示。
  • ELASTIC_SEARCH_ENDPOINT:要使用的 Elasticsearch 资源的绝对端点路径。
  • ELASTIC_SEARCH_API_KEY:Elasticsearch 数据端点的 API 密钥。
  • INDEX_NAME:用于接地的 Elasticsearch 索引的名称。
  • SEARCH_TEMPLATE_NAME:用于接地的 Elasticsearch 搜索模板。
  • NUM_HITS:从 Elasticsearch 数据源返回并用于接地的结果数。

请求 JSON 正文:

    {
      "contents": [
        {
          "role": "user",
          "parts": [
            {
              "text": "QUERY"
            }
          ]
        }
      ],
      "tools": [{
        "retrieval": {
          "externalApi": {
            "api_spec": "ELASTIC_SEARCH",
            "endpoint": "ELASTIC_SEARCH_ENDPOINT",
            "apiAuth": {
              "apiKeyConfig": {
                "apiKeyString": "ApiKey ELASTIC_SEARCH_API_KEY"
              }
            },
            "elasticSearchParams": {
              "index": "INDEX_NAME",
              "searchTemplate": "SEARCH_TEMPLATE_NAME",
              "numHits": "NUM_HITS",
            }
          }
        }
      }]
    }

如需详细了解其他 API 字段(例如系统指令和多轮聊天),请参阅生成式 AI 新手指南

发送 API 请求

您可以将请求正文保存在名为 request.json 的文件中。然后执行 POST API 请求,并进行以下替换:

  curl -X POST \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @request.json \
  "https://LOCATION-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/MODEL_ID:generateContent"

您应该收到类似以下内容的 JSON 响应:

  {
    "candidates": [
      {
        "content": {
          "role": "model",
          "parts": [
            {
              "text": "Based on the information ..."
            }
          ]
        },
        "finishReason": "STOP",
        "safetyRatings": [ "..." ],
        "groundingMetadata": {
          "groundingChunks": [
            {
              "retrievedContext": {
                "text": "ipsum lorem ..."
              }
            },
            {...},
            {...},
          ],
          "groundingSupports": [
            {
              "segment": {
                "startIndex": 25,
                "endIndex": 147,
                "text": "ipsum lorem ..."
              },
              "groundingChunkIndices": [1,2],
              "confidenceScores": [0.6626542, 0.82018316],
            },
          ],
        },
      }
    ],
  }

理解回答

这两个 API 的回答都包含 LLM 生成的文本,称为候选回答。如果您的模型提示成功接地到 Elasticsearch 数据源,则回答会包含接地元数据,用于标识回答中源自 Elasticsearch 数据的部分。但是,有多种原因可能会导致此元数据无法提供,并且提示回答不会接地。这些原因包括模型回答中的来源相关性低或信息不完整。

以下是输出数据的细分:

  • 角色:指示接地回答的发送者。由于回答始终包含接地的文本,因此角色始终为 model
  • 文本:由 LLM 生成的接地的回答。
  • 接地元数据:有关接地来源的信息,包含以下元素:
    • 接地块:来自 Elasticsearch 索引且支持回答的结果列表。
    • 接地支持:回答中有关特定声明的信息,可用于显示引用:
    • 片段:模型回答中由接地块证实的部分。
    • 接地块索引:接地块列表中与相应声明对应的接地块的索引。
    • 置信度得分:一个介于 0 到 1 之间的数字,表示声明在所提供的接地块集中的接地程度。不适用于 Gemini 2.5 Pro 和 Gemini 2.5 Flash 及更高版本。

后续步骤

  • 如需了解如何发送聊天提示请求,请参阅多轮聊天
  • 如需了解 Responsible AI 最佳实践和 Vertex AI 的安全过滤器,请参阅安全最佳实践