Skip to main content
Open In ColabOpen on GitHub

Google BigQuery 向量搜索

Google Cloud BigQuery向量搜索 让你使用GoogleSQL进行语义搜索,使用向量索引以快速获取近似结果,或者使用暴力算法以获得精确结果。

此教程展示了如何在 LangChain 中使用端到端的数据和嵌入管理系统,并提供了一种使用 BigQueryVectorStore 类在 BigQuery 中进行可扩展的语义搜索的方法。此类属于一套包含 2 个类别的集合,能够为 Google Cloud 提供统一数据存储和灵活向量搜索:

  • BigQuery向量搜索: 通过BigQueryVectorStore类实现,这使得快速原型设计和无需基础设施设置的批量检索变得理想。
  • Feature Store 在线商店: 通过 VertexFSVectorStore 类别,实现低延迟检索,并支持手动或计划的数据同步。适用于生产级别的面向用户的生成式AI应用程序。

Diagram BQ-VertexFS

Getting Started

安装库

%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
)
API 参考:VertexAI 嵌入

初始化 BigQuery向量存储库

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)

使用元数据过滤器搜索文档

矢量存储支持在执行文档搜索时对元数据字段应用过滤器的两种方法:

  • 基于字典的过滤器
  • SQL-based Filters
    • Alternatively, you can提供一个表示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方法自带自己的嵌入。 这对于需要在生成嵌入之前进行自定义预处理的多模态数据特别有用。

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类中传输过来。请参阅类定义以了解您可以使用的其他参数。

使用.to_bq_vector_store()方法重新连接到BigQueryVectorStore同样非常简单。

store.to_vertex_fs_vector_store()  # pass optional VertexFSVectorStore parameters as arguments