Skip to main content
Open In ColabOpen on GitHub

Google Spanner

Spanner 是一种高度可扩展的数据库,结合了无限的可扩展性与关系型语义,如二级索引、强一致性、模式和 SQL,在一个简单的解决方案中提供了 99.999% 的可用性。

这个笔记本介绍了如何使用Spanner通过SpannerLoaderSpannerDocumentSaver来保存、加载和删除LangChain文档。

Learn more about the package on GitHub.

Open In Colab

开始之前

要运行此笔记本,您需要执行以下操作:

在确认此笔记本运行环境中的数据库访问后,请填写以下值并运行该单元格,然后运行示例脚本。

# @markdown Please specify an instance id, a database, and a table for demo purpose.
INSTANCE_ID = "test_instance" # @param {type:"string"}
DATABASE_ID = "test_database" # @param {type:"string"}
TABLE_NAME = "test_table" # @param {type:"string"}

🦜🔗 库安装

The integration lives in its own langchain-google-spanner package, so we need to install it.

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

仅限 Colab:取消以下单元格的注释以重启内核,或使用按钮重启内核。对于 Vertex AI Workbench,您可以使用顶部的按钮重启终端。

# # Automatically restart kernel after installs so that your environment can access the new packages
# import IPython

# app = IPython.Application.instance()
# app.kernel.do_shutdown(True)

☁ 设置您的Google云项目

设置您的Google Cloud项目,以便在此笔记本中利用Google Cloud资源。

如果您不知道您的项目ID,请尝试以下方法:

  • 运行 gcloud config list
  • 运行 gcloud projects list
  • 见支持页面:查找项目ID
# @markdown Please fill in the value below with your Google Cloud project ID and then run the cell.

PROJECT_ID = "my-project-id" # @param {type:"string"}

# Set the project id
!gcloud config set project {PROJECT_ID}

🔐 认证

请以笔记本中已登录的IAM用户身份向Google Cloud进行认证,以便访问您的Google Cloud项目。

  • 如果您在Colab中运行此笔记本,请使用下方单元格继续。
  • 如果您正在使用Vertex AI工作区,请参阅设置说明这里
from google.colab import auth

auth.authenticate_user()

基本用法

保存文档

使用SpannerDocumentSaver.add_documents(<documents>)保存langchain文档。要初始化SpannerDocumentSaver类,您需要提供3个东西:

  1. instance_id - 一个用于加载数据的Spanner实例。
  2. database_id - 一个用于加载数据的Spanner数据库实例。
  3. table_name - 在Spanner数据库中的表名称,用于存储langchain文档。
from langchain_core.documents import Document
from langchain_google_spanner import SpannerDocumentSaver

test_docs = [
Document(
page_content="Apple Granny Smith 150 0.99 1",
metadata={"fruit_id": 1},
),
Document(
page_content="Banana Cavendish 200 0.59 0",
metadata={"fruit_id": 2},
),
Document(
page_content="Orange Navel 80 1.29 1",
metadata={"fruit_id": 3},
),
]

saver = SpannerDocumentSaver(
instance_id=INSTANCE_ID,
database_id=DATABASE_ID,
table_name=TABLE_NAME,
)
saver.add_documents(test_docs)
API 参考:文档

查询来自Spanner的文档

对于连接Spanner表的更多详细信息,请参阅Python SDK文档

载入表格中的文档

使用 SpannerLoader.load()SpannerLoader.lazy_load() 加载 langchain 文档。lazy_load 返回一个生成器,在迭代过程中仅在查询数据库时进行查询。要初始化 SpannerLoader 类,您需要提供:

  1. instance_id - 一个用于加载数据的Spanner实例。
  2. database_id - 一个用于加载数据的Spanner数据库实例。
  3. query - 数据库方言的查询。
from langchain_google_spanner import SpannerLoader

query = f"SELECT * from {TABLE_NAME}"
loader = SpannerLoader(
instance_id=INSTANCE_ID,
database_id=DATABASE_ID,
query=query,
)

for doc in loader.lazy_load():
print(doc)
break

删除文档

从表格中删除一系列langchain文档,请使用SpannerDocumentSaver.delete(<documents>)

docs = loader.load()
print("Documents before delete:", docs)

doc = test_docs[0]
saver.delete([doc])
print("Documents after delete:", loader.load())

高级用法

自定义客户端

The client created by default is the default client. To pass in credentials and project explicitly, a custom client can be passed to the constructor.

from google.cloud import spanner
from google.oauth2 import service_account

creds = service_account.Credentials.from_service_account_file("/path/to/key.json")
custom_client = spanner.Client(project="my-project", credentials=creds)
loader = SpannerLoader(
INSTANCE_ID,
DATABASE_ID,
query,
client=custom_client,
)

自定义文档页面内容及元数据

该加载器将从特定数据列返回一系列包含页面内容的Documents。其他所有数据列将被添加到metadata中。每一行变成一个文档。

自定义页面内容格式

The SpannerLoader 假设存在一个名为 page_content 的列。这些默认值可以像这样进行更改:

custom_content_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, content_columns=["custom_content"]
)

如果指定了多个列,则页面内容的字符串格式将默认为text(空格分隔的字符串连接)。用户还可以指定其他格式,包括text, JSON, YAML, CSV

自定义元数据格式

The SpannerLoader 假设存在一个名为 langchain_metadata 的元数据列,存储 JSON 数据。该元数据列将用作基础字典。默认情况下,其他所有列的数据都将被添加,并可能覆盖原始值。这些默认设置可以通过以下方式更改:

custom_metadata_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, metadata_columns=["column1", "column2"]
)

自定义JSON元数据列名

默认情况下,加载器使用langchain_metadata作为基础字典。可以自定义为选择一个JSON列来作为文档元数据的基础字典。

custom_metadata_json_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, metadata_json_column="another-json-column"
)

自定义陈旧度

The default staleness is 15s. This can be customized by specifying a weaker bound (which can either be to perform all reads as of a given timestamp), or as of a given duration in the past.

import datetime

timestamp = datetime.datetime.utcnow()
custom_timestamp_loader = SpannerLoader(
INSTANCE_ID,
DATABASE_ID,
query,
staleness=timestamp,
)
duration = 20.0
custom_duration_loader = SpannerLoader(
INSTANCE_ID,
DATABASE_ID,
query,
staleness=duration,
)

启动数据增强

默认情况下,加载器不会使用数据加速,因为这会产生额外费用,并且需要额外的IAM权限。但是用户可以选择启用它。

custom_databoost_loader = SpannerLoader(
INSTANCE_ID,
DATABASE_ID,
query,
databoost=True,
)

自定义客户端

The client created by default is the default client. To pass in credentials and project explicitly, a custom client can be passed to the constructor.

from google.cloud import spanner

custom_client = spanner.Client(project="my-project", credentials=creds)
saver = SpannerDocumentSaver(
INSTANCE_ID,
DATABASE_ID,
TABLE_NAME,
client=custom_client,
)

Custom initialization for SpannerDocumentSaver

The SpannerDocumentSaver 允许自定义初始化。这允许用户指定如何将文档保存到表中。

content_column: 这将作为文档页面内容的列名称。默认值为page_content

metadata_columns: 这些元数据将在文档的元数据中存在时保存到特定的列中。

metadata_json_column: 这将是特殊JSON列的列名。默认值为langchain_metadata

custom_saver = SpannerDocumentSaver(
INSTANCE_ID,
DATABASE_ID,
TABLE_NAME,
content_column="my-content",
metadata_columns=["foo"],
metadata_json_column="my-special-json-column",
)

初始化自定义模式以供Spanner使用

The SpannerDocumentSaver 将有一个 init_document_table 方法来创建一个新的表以存储文档并自定义模式。

from langchain_google_spanner import Column

new_table_name = "my_new_table"

SpannerDocumentSaver.init_document_table(
INSTANCE_ID,
DATABASE_ID,
new_table_name,
content_column="my-page-content",
metadata_columns=[
Column("category", "STRING(36)", True),
Column("price", "FLOAT64", False),
],
)