Google Vertex AI 搜索
Google Vertex AI Search(以前称为 Google Vertex AI Search)
Enterprise Search上Generative AI App Builder) 是 Vertex AI 机器学习平台的一部分,由Google Cloud.
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 搜索检索器封装 Python 客户端库并使用它来访问搜索服务 API。
有关所有VertexAISearchRetriever功能和配置可参考 API 参考。
集成详细信息
| Retriever | 自托管 | 云产品 | 包 |
|---|---|---|---|
| VertexAISearchRetriever | ❌ | ✅ | langchain_google_community |
设置
安装
您需要安装langchain-google-community和google-cloud-discoveryengine包以使用 Vertex AI 搜索检索器。
%pip install -qU langchain-google-community google-cloud-discoveryengine
配置对 Google Cloud 和 Vertex AI Search 的访问权限
Vertex AI Search 自 2023 年 8 月起正式推出,没有白名单。
在使用检索器之前,您需要完成以下步骤:
创建搜索引擎并填充非结构化数据存储
- 按照 Vertex AI Search 入门指南中的说明设置 Google Cloud 项目和 Vertex AI Search。
- 使用 Google Cloud Console 创建非结构化数据存储
- 使用来自
gs://cloud-samples-data/gen-app-builder/search/alphabet-investor-pdfsCloud Storage 文件夹中。 - 请务必使用
Cloud Storage (without metadata)选择。
- 使用来自
设置凭据以访问 Vertex AI 搜索 API
Vertex AI Search 检索器使用的 Vertex AI Search 客户端库为以编程方式向 Google Cloud 进行身份验证提供了高级语言支持。 客户端库支持应用程序默认凭据 (ADC);这些库在一组定义的位置中查找凭证,并使用这些凭证对 API 的请求进行身份验证。 借助 ADC,您可以在各种环境(例如本地开发或生产)中为应用程序提供凭证,而无需修改应用程序代码。
如果在 Google Colab 中运行,请使用google.colab.google.auth否则,请按照支持的方法之一进行作,以确保您正确设置了 Application Default Credentials。
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_documentsmethod 返回一个langchain.schema.Document文档,其中page_content字段将填充文档内容。
根据 Vertex AI Search 中使用的数据类型(网站、结构化或非结构化),该page_content字段的填充方式如下:
- 具有高级索引的网站:一个
extractive answer匹配查询。这metadata字段中填充了从中提取区段或答案的文档的元数据(如果有)。 - 非结构化数据源:一个
extractive segment或extractive answer匹配查询。这metadata字段中填充了从中提取区段或答案的文档的元数据(如果有)。 - 结构化数据源:一个字符串 json,其中包含从结构化数据源返回的所有字段。这
metadata字段填充了文档的元数据(如果有)
提取答案和提取部分
抽取式答案是随每个搜索结果返回的逐字文本。它是直接从原始文档中提取的。抽取式答案通常显示在网页顶部附近,以便为最终用户提供与其查询上下文相关的简短答案。抽取式答案可用于网站和非结构化搜索。
提取句段是随每个搜索结果返回的逐字文本。抽取式句段通常比抽取式答案更冗长。提取句段可以显示为查询的答案,并可用于执行后处理任务,并用作大型语言模型的输入以生成答案或新文本。提取区段可用于非结构化搜索。
有关提取细分和提取答案的更多信息,请参阅产品文档。
注意:提取区段需要启用 Enterprise Edition 功能。
在创建检索器实例时,您可以指定许多参数来控制要访问的数据存储以及自然语言查询的处理方式,包括提取式答案和区段的配置。
必需的参数是:
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参数可以在 Retriever 的构造函数中显式提供,也可以通过环境变量 -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- 未指定的查询扩展条件。在这种情况下,服务器行为默认为 disabled。1- 禁用了查询扩展。仅使用确切的搜索查询,即使 SearchResponse.total_size 为零。2- 由搜索 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"
实例
配置和使用具有提取 Segment 的非结构化数据的检索器
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)
使用 Advanced Website Indexing 配置和使用网站数据检索器
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发出单个查询。因为 retriever 是 Runnable,所以我们可以使用 Runnable 接口中的任何方法,例如.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 参考。