谷歌 Vertex AI 搜索
Google Vertex AI Search(原称 `Generative AI App Builder` 上的 `Enterprise Search`)是 `Google Cloud` 提供的 Vertex AI 机器学习平台的一部分。
`Vertex AI Search` 使组织能够快速为客户和员工构建由生成式 AI 驱动的搜索引擎。它由各种 `Google Search` 技术支持,包括语义搜索,通过使用自然语言处理和机器学习技术推断内容中的关系以及用户查询输入中的意图,从而提供比传统基于关键词的搜索技术更相关的结果。`Vertex AI Search` 还受益于 Google 在理解用户搜索方式方面的专业知识,并考虑内容相关性以排序显示结果。
`Vertex AI Search` 可在 `Google Cloud Console` 中使用,并通过 API 进行企业工作流集成。
本 Notebook 演示了如何配置 `Vertex AI Search` 并使用 Vertex AI Search 检索器。Vertex AI Search 检索器封装了 Python 客户端库,并使用它访问 Search Service API。
有关所有 `VertexAISearchRetriever` 功能和配置的详细文档,请参阅 API 参考。
集成详情
检索器 | 自托管 | 云服务 | 包 |
---|---|---|---|
VertexAISearchRetriever | ❌ | ✅ | langchain_google_community |
设置
安装
您需要安装 `langchain-google-community` 和 `google-cloud-discoveryengine` 包才能使用 Vertex AI Search 检索器。
%pip install -qU langchain-google-community google-cloud-discoveryengine
配置 Google Cloud 和 Vertex AI Search 的访问权限
截至 2023 年 8 月,Vertex AI Search 已普遍可用,无需许可列表。
在使用检索器之前,您需要完成以下步骤
创建搜索引擎并填充非结构化数据存储
- 按照 Vertex AI Search 入门指南 中的说明设置 Google Cloud 项目和 Vertex AI Search。
- 使用 Google Cloud 控制台创建非结构化数据存储
- 使用 `gs://cloud-samples-data/gen-app-builder/search/alphabet-investor-pdfs` Cloud Storage 文件夹中的示例 PDF 文档填充它。
- 请务必使用 `Cloud Storage (不含元数据)` 选项。
设置凭据以访问 Vertex AI Search API
Vertex AI Search 检索器使用的 Vertex AI Search 客户端库 提供了高级语言支持,用于以编程方式向 Google Cloud 进行身份验证。客户端库支持 应用程序默认凭据 (ADC);这些库会在一组定义的位置查找凭据,并使用这些凭据对 API 请求进行身份验证。通过 ADC,您可以将凭据提供给您应用程序在各种环境中使用,例如本地开发或生产环境,而无需修改您的应用程序代码。
如果在 Google Colab 中运行,请使用 `google.colab.google.auth` 进行身份验证,否则请按照 支持的方法 之一确保您的应用程序默认凭据已正确设置。
import sys
if "google.colab" in sys.modules:
from google.colab import auth as google_auth
google_auth.authenticate_user()
配置并使用 Vertex AI Search 检索器
Vertex AI Search 检索器在 `langchain_google_community.VertexAISearchRetriever` 类中实现。`get_relevant_documents` 方法返回一个 `langchain.schema.Document` 文档列表,其中每个文档的 `page_content` 字段都填充了文档内容。根据 Vertex AI Search 中使用的数据类型(网站、结构化或非结构化),`page_content` 字段填充如下:
- 具有高级索引的网站:与查询匹配的“摘录答案”(`extractive answer`)。`metadata` 字段填充了从中提取片段或答案的文档的元数据(如果有)。
- 非结构化数据源:与查询匹配的“摘录片段”(`extractive segment`)或“摘录答案”(`extractive answer`)。`metadata` 字段填充了从中提取片段或答案的文档的元数据(如果有)。
- 结构化数据源:一个字符串 JSON,包含从结构化数据源返回的所有字段。`metadata` 字段填充了文档的元数据(如果有)。
摘录答案和摘录片段
摘录答案是随每个搜索结果返回的原文文本。它直接从原始文档中提取。摘录答案通常显示在网页顶部,为最终用户提供与其查询上下文相关的简短答案。摘录答案适用于网站和非结构化搜索。
摘录片段是随每个搜索结果返回的原文文本。摘录片段通常比摘录答案更详细。摘录片段可以作为查询的答案显示,也可以用于执行后处理任务,并作为大型语言模型的输入来生成答案或新文本。摘录片段适用于非结构化搜索。
有关摘录片段和摘录答案的更多信息,请参阅 产品文档。
注意:摘录片段需要启用 企业版 功能。
创建检索器实例时,您可以指定多个参数来控制访问哪个数据存储以及如何处理自然语言查询,包括摘录答案和片段的配置。
强制参数为:
- `project_id` - 您的 Google Cloud 项目 ID。
- `location_id` - 数据存储的位置。
- `global` (默认)
us
eu
其中之一
- `search_engine_id` - 您要使用的搜索应用 ID。(混合搜索必需)
- `data_store_id` - 您要使用的数据存储 ID。
`project_id`、`search_engine_id` 和 `data_store_id` 参数可以通过检索器的构造函数明确提供,也可以通过环境变量 `PROJECT_ID`、`SEARCH_ENGINE_ID` 和 `DATA_STORE_ID` 提供。
您还可以配置多个可选参数,包括
- `max_documents` - 用于提供摘录片段或摘录答案的最大文档数
- `get_extractive_answers` - 默认情况下,检索器配置为返回摘录片段。
- 将此字段设置为 `True` 可返回摘录答案。仅当 `engine_data_type` 设置为 `0`(非结构化)时使用此功能。
- `max_extractive_answer_count` - 每个搜索结果中返回的最大摘录答案数。
- 最多返回 5 个答案。仅当 `engine_data_type` 设置为 `0`(非结构化)时使用此功能。
- `max_extractive_segment_count` - 每个搜索结果中返回的最大摘录片段数。
- 目前将返回一个片段。仅当 `engine_data_type` 设置为 `0`(非结构化)时使用此功能。
- `filter` - 根据数据存储中与文档关联的元数据对搜索结果进行过滤的表达式。
- `query_expansion_condition` - 用于确定何时进行查询扩展的规范。
- `0` - 未指定查询扩展条件。在这种情况下,服务器行为默认为禁用。
- `1` - 禁用查询扩展。即使 `SearchResponse.total_size` 为零,也仅使用精确的搜索查询。
- `2` - 由 Search API 构建的自动查询扩展。
- `engine_data_type` - 定义 Vertex AI Search 数据类型
- `0` - 非结构化数据
- `1` - 结构化数据
- `2` - 网站数据
- `3` - 混合搜索
`GoogleCloudEnterpriseSearchRetriever` 迁移指南
在早期版本中,此检索器名为 `GoogleCloudEnterpriseSearchRetriever`。
要更新到新的检索器,请进行以下更改
- 将导入从:`from langchain.retrievers import GoogleCloudEnterpriseSearchRetriever` 更改为 `from langchain_google_community import VertexAISearchRetriever`。
- 将所有类引用从 `GoogleCloudEnterpriseSearchRetriever` 更改为 `VertexAISearchRetriever`。
注意:使用检索器时,如果您想从单个查询获取自动化追踪,您也可以通过取消下方注释来设置您的 LangSmith API 密钥
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"
实例化
配置并使用带有摘录片段的**非结构化**数据检索器
from langchain_google_community import (
VertexAIMultiTurnSearchRetriever,
VertexAISearchRetriever,
)
PROJECT_ID = "<YOUR PROJECT ID>" # Set to your Project ID
LOCATION_ID = "<YOUR LOCATION>" # Set to your data store location
SEARCH_ENGINE_ID = "<YOUR SEARCH APP ID>" # Set to your search app ID
DATA_STORE_ID = "<YOUR DATA STORE ID>" # Set to your data store ID
retriever = VertexAISearchRetriever(
project_id=PROJECT_ID,
location_id=LOCATION_ID,
data_store_id=DATA_STORE_ID,
max_documents=3,
)
query = "What are Alphabet's Other Bets?"
result = retriever.invoke(query)
for doc in result:
print(doc)
配置并使用带有摘录答案的**非结构化**数据检索器
retriever = VertexAISearchRetriever(
project_id=PROJECT_ID,
location_id=LOCATION_ID,
data_store_id=DATA_STORE_ID,
max_documents=3,
max_extractive_answer_count=3,
get_extractive_answers=True,
)
result = retriever.invoke(query)
for doc in result:
print(doc)
配置并使用**结构化**数据检索器
retriever = VertexAISearchRetriever(
project_id=PROJECT_ID,
location_id=LOCATION_ID,
data_store_id=DATA_STORE_ID,
max_documents=3,
engine_data_type=1,
)
result = retriever.invoke(query)
for doc in result:
print(doc)
配置并使用具有高级网站索引的**网站**数据检索器
retriever = VertexAISearchRetriever(
project_id=PROJECT_ID,
location_id=LOCATION_ID,
data_store_id=DATA_STORE_ID,
max_documents=3,
max_extractive_answer_count=3,
get_extractive_answers=True,
engine_data_type=2,
)
result = retriever.invoke(query)
for doc in result:
print(doc)
配置并使用**混合**数据检索器
retriever = VertexAISearchRetriever(
project_id=PROJECT_ID,
location_id=LOCATION_ID,
search_engine_id=SEARCH_ENGINE_ID,
max_documents=3,
engine_data_type=3,
)
result = retriever.invoke(query)
for doc in result:
print(doc)
配置并使用多轮搜索检索器
带追问的搜索 基于生成式 AI 模型,与常规的非结构化数据搜索不同。
retriever = VertexAIMultiTurnSearchRetriever(
project_id=PROJECT_ID, location_id=LOCATION_ID, data_store_id=DATA_STORE_ID
)
result = retriever.invoke(query)
for doc in result:
print(doc)
使用
按照上述示例,我们使用 `.invoke` 发出单个查询。由于检索器是 Runnables,我们也可以使用 Runnable 接口 中的任何方法,例如 `.batch`。
在链中使用
我们还可以将检索器整合到 链 中以构建更大的应用程序,例如简单的 RAG 应用程序。为了演示目的,我们还实例化了一个 VertexAI 聊天模型。有关设置说明,请参阅相应的 Vertex 集成文档。
%pip install -qU langchain-google-vertexai
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_google_vertexai import ChatVertexAI
prompt = ChatPromptTemplate.from_template(
"""Answer the question based only on the context provided.
Context: {context}
Question: {question}"""
)
llm = ChatVertexAI(model_name="chat-bison", temperature=0)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
chain.invoke(query)
API 参考
有关所有 `VertexAISearchRetriever` 功能和配置的详细文档,请参阅 API 参考。