Google BigQuery 向量搜索
Google Cloud BigQuery Vector Search lets you use GoogleSQL to do semantic search, using vector indexes for fast approximate results, or using brute force for exact results.
本教程演示了如何在 LangChain 中使用端到端的数据和嵌入管理系统的操作,并提供了使用BigQueryVectorStore类在 BigQuery 中进行可扩展语义搜索的方法。该类是 Google Cloud 中提供统一数据存储和灵活向量搜索的 2 个类之一:
- BigQuery 向量搜索:带有
BigQueryVectorStore个类别,非常适合无需基础设施设置即可快速原型设计和批量检索。 - 特征存储在线存储:具有
VertexFSVectorStore个类,支持低延迟检索,并可手动或定时同步数据。非常适合生产就绪的面向用户的生成式人工智能应用程序。
入门指南
安装该库
%pip install --upgrade --quiet langchain langchain-google-vertexai "langchain-google-community[featurestore]"
要使用此 Jupyter 运行时中新安装的包,您必须重启运行时。您可以运行下面的单元格来重启当前内核。
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)
开始之前
设置您的项目ID
如果您不知道自己的项目 ID,请尝试以下操作:
- 运行
gcloud config list。 - 运行
gcloud projects list。 - 查看支持页面:定位项目 ID。
PROJECT_ID = "" # @param {type:"string"}
# Set the project id
! gcloud config set project {PROJECT_ID}
设置区域
您还可以更改BigQuery使用的REGION变量。了解更多关于BigQuery区域的信息。
REGION = "us-central1" # @param {type: "string"}
设置数据集和表名称
它们将是你的BigQuery向量存储。
DATASET = "my_langchain_dataset" # @param {type: "string"}
TABLE = "doc_and_vectors" # @param {type: "string"}
验证您的笔记本环境
- 如果你使用 Colab 来运行此笔记本,请取消下面单元格的注释并继续。
- 如果你使用的是Vertex AI Workbench,请查看设置说明这里。
# from google.colab import auth as google_auth
# google_auth.authenticate_user()
Demo: BigQueryVectorStore
创建嵌入类实例
您可能需要通过运行
gcloud services enable aiplatform.googleapis.com --project {PROJECT_ID}
(将 {PROJECT_ID} 替换为您的项目名称)来在您的项目中启用 Vertex AI API。
您可以使用任何 LangChain 嵌入模型。
from langchain_google_vertexai import VertexAIEmbeddings
embedding = VertexAIEmbeddings(
model_name="textembedding-gecko@latest", project=PROJECT_ID
)
初始化 BigQueryVectorStore
如果BigQuery数据集和表不存在,它们将自动创建。有关所有可选参数,请参阅类定义 此处。
from langchain_google_community import BigQueryVectorStore
store = BigQueryVectorStore(
project_id=PROJECT_ID,
dataset_name=DATASET,
table_name=TABLE,
location=REGION,
embedding=embedding,
)
添加文本
all_texts = ["Apples and oranges", "Cars and airplanes", "Pineapple", "Train", "Banana"]
metadatas = [{"len": len(t)} for t in all_texts]
store.add_texts(all_texts, metadatas=metadatas)
搜索文档
query = "I'd like a fruit."
docs = store.similarity_search(query)
print(docs)
通过向量搜索文档
query_vector = embedding.embed_query(query)
docs = store.similarity_search_by_vector(query_vector, k=2)
print(docs)
使用元数据过滤器搜索文档
向量存储支持在执行文档搜索时对元数据字段应用过滤的两种方法:
- 基于字典的过滤器
- 你可以传递一个字典(dict),其中键表示元数据字段,值指定过滤条件。这种方法在键和对应的值之间应用相等过滤器。当提供多个键值对时,它们通过逻辑与操作组合在一起。
- 基于SQL的过滤器
- 或者,您可以提供一个表示 SQL WHERE 子句的字符串来定义更复杂的过滤条件。这提供了更大的灵活性,支持 SQL 表达式,例如比较运算符和逻辑运算符。了解更多关于 BigQuery 运算符 的信息。
# Dictionary-based Filters
# This should only return "Banana" document.
docs = store.similarity_search_by_vector(query_vector, filter={"len": 6})
print(docs)
# SQL-based Filters
# This should return "Banana", "Apples and oranges" and "Cars and airplanes" documents.
docs = store.similarity_search_by_vector(query_vector, filter="len = 6 AND len > 17")
print(docs)
批量搜索
BigQueryVectorStore 提供了一种 batch_search 方法,用于可扩展的向量相似性搜索。
results = store.batch_search(
embeddings=None, # can pass embeddings or
queries=["search_query", "search_query"], # can pass queries
)
添加带有嵌入的文本
您也可以使用 add_texts_with_embeddings 方法引入自己的嵌入(embeddings)。这对于需要在生成嵌入之前进行自定义预处理的多模态数据特别有用。
items = ["some text"]
embs = embedding.embed(items)
ids = store.add_texts_with_embeddings(
texts=["some text"], embs=embs, metadatas=[{"len": 1}]
)
低延迟服务与特征存储
您可以简单地使用方法 .to_vertex_fs_vector_store() 来获取一个 VertexFSVectorStore 对象,该对象为在线用例提供了低延迟。所有必需的参数将自动从现有的 BigQueryVectorStore 类中传递。请参阅 类定义 以了解您可以使用的其他参数。
回到 BigQueryVectorStore 也非常简单,使用 .to_bq_vector_store() 方法即可。
store.to_vertex_fs_vector_store() # pass optional VertexFSVectorStore parameters as arguments