Google Vertex AI 搜索
Google Vertex AI Search (formerly known as
Enterprise SearchonGenerative AI App Builder) is a part of the Vertex AI machine learning platform offered byGoogle Cloud.
Vertex AI Searchlets organizations quickly build generative AI-powered search engines for customers and employees. It's underpinned by a variety ofGoogle Searchtechnologies, including semantic search, which helps deliver more relevant results than traditional keyword-based search techniques by using natural language processing and machine learning techniques to infer relationships within the content and intent from the user’s query input. Vertex AI Search also benefits from Google’s expertise in understanding how users search and factors in content relevance to order displayed results.
Vertex AI Searchis available in theGoogle Cloud Consoleand via an API for enterprise workflow integration.
本笔记本演示了如何配置 Vertex AI Search 并使用 Vertex AI 搜索 检索器。Vertex AI 搜索检索器封装了 Python 客户端库,并使用它来访问 搜索服务 API。
有关所有 VertexAISearchRetriever 功能和配置的详细文档,请访问 API 参考。
集成详情
| 检索器 | Self-host | 云服务 | 包 |
|---|---|---|---|
| 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云存储文件夹的示例PDF文档填充它。 - 请确保使用
Cloud Storage (without metadata)选项。
- 使用来自
设置凭据以访问Vertex AI搜索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(默认)useu
其中之一:
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- 由搜索API构建的自动查询扩展。
engine_data_type定义 Vertex AI 搜索数据类型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 发出单个查询。因为检索器是可运行的,我们可以使用 可运行接口 中的任何方法,例如 .batch。
在链中使用
我们还可以将检索器整合到Chains中,以构建更大型的应用程序,例如一个简单的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 参考。