本页面介绍了如何使用 Elasticsearch 实例来利用数据进行接地。
使用 Elasticsearch 让 Gemini 接地
接地是指使用公开和私有数据集来提供上下文和事实,以便让大语言模型 (LLM) 回答接地。通过使用 Elasticsearch 进行接地,您可以利用现有的 Elasticsearch 索引来帮助提高 Gemini 输出的质量和可靠性,减少幻觉并帮助确保回答与您的数据相关。这样一来,您就可以构建强大的 RAG 应用,例如:
- 生成式搜索摘要
- 可使用企业数据的问答聊天机器人
- 根据您的数据进行接地的智能体
您一次最多可以基于 10 个数据源让回答接地。您可以将“使用 Elasticsearch 进行接地”与使用 Google 搜索进行接地相结合,将模型与世界知识、各种主题或互联网上的最新信息相连接。
支持的模型
以下模型支持使用 Elasticsearch 进行连接(仅限文本输入):
- Gemini 2.5 Flash-Lite
- Gemini 2.5 Flash(支持 Live API 原生音频功能)(预览版)
- 支持 Live API 的 Gemini 2.0 Flash(预览版)
- Gemini 2.5 Pro
- Gemini 2.5 Flash
- Gemini 2.0 Flash
在 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 进行接地,请执行以下操作:
前往 Vertex AI Studio 的创建提示页面。
在设置面板中,如需让数据接地,请点击接地:您的数据切换开关。
在自定义接地窗格中,选择 Elasticsearch。
在 Elasticsearch 端点字段中输入端点。
在 Elasticsearch API 密钥字段中输入 API 密钥。
在 Elasticsearch 索引字段中输入索引。
在 Elasticsearch 搜索模板字段中输入搜索模板。
滑动命中数滑块,来调整命中数。
点击保存。
输入您的提示。
点击提交。
理解回答
如果您的模型提示使用 Vertex AI Studio 或 API 成功接地到 Elasticsearch 数据存储区,则模型的回答会包含具有引用和来源内容的元数据。如果模型回答中出现来源相关性低或信息不完整的情况,则可能不会提供元数据,并且提示回答不会接地。
REST
本部分介绍了如何使用 Vertex AI API 让 LLM 回答接地。
前提条件
在使用 Elasticsearch 让 LLM 回答接地之前,您必须完成以下操作:
激活 Vertex AI API:确保已为您的 Google Cloud 项目启用 Vertex AI API。
安装并登录 Google Cloud CLI:安装并初始化 gcloud CLI 命令行工具。
Elasticsearch 设置:使用您想要用于接地的现有 Elasticsearch 集群和索引。从 Elasticsearch 设置中获取以下信息:
- 端点:Elasticsearch 集群的网址。
- 索引名称:要搜索的索引的名称,例如 my-data-index。
- API 密钥:允许访问 Elasticsearch 集群的 API 密钥。 API 密钥必须以 ApiKey 前缀开头。
创建 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 请求,并进行以下替换:
- LOCATION:处理请求的区域。如需详细了解可用位置,请参阅 Vertex AI 上的生成式 AI 位置。
- PROJECT_ID:您的 Google Cloud 项目 ID。如需详细了解项目 ID,请参阅创建和管理项目。
- MODEL_ID:多模态模型的模型 ID。
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 及更高版本。