Google Vertex AI Search
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 提供,用于企业工作流程集成。
本笔记本演示了如何配置 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 Console 创建非结构化数据存储
- 使用来自
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
字段的填充方式如下
- 具有高级索引的网站:与查询匹配的
提取式答案
。metadata
字段填充了从中提取段落或答案的文档的元数据(如果有)。 - 非结构化数据源:与查询匹配的
提取式段落
或提取式答案
。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
(非结构化)时使用。
- 最多返回 5 个答案。仅当
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)
配置和使用检索器以处理website数据,使用高级网站索引
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)
配置和使用检索器以处理blended数据
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 interface 中的任何方法,例如 .batch
。
在链中使用
我们还可以将检索器整合到 chains 中,以构建更大的应用程序,例如一个简单的 RAG 应用程序。为了演示目的,我们还实例化了一个 VertexAI 聊天模型。有关设置说明,请参阅相应的 Vertex integration docs。
%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 参考。