Google Spanner
Spanner 是一种高度可扩展的数据库,结合了无限的可扩展性与关系型语义,如二级索引、强一致性、模式和 SQL,在一个简单的解决方案中提供了 99.999% 的可用性。
这个笔记本介绍了如何使用Spanner通过SpannerLoader和SpannerDocumentSaver来保存、加载和删除LangChain文档。
Learn more about the package on GitHub.
开始之前
要运行此笔记本,您需要执行以下操作:
在确认此笔记本运行环境中的数据库访问后,请填写以下值并运行该单元格,然后运行示例脚本。
# @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个东西:
instance_id- 一个用于加载数据的Spanner实例。database_id- 一个用于加载数据的Spanner数据库实例。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)
查询来自Spanner的文档
对于连接Spanner表的更多详细信息,请参阅Python SDK文档。
载入表格中的文档
使用 SpannerLoader.load() 或 SpannerLoader.lazy_load() 加载 langchain 文档。lazy_load 返回一个生成器,在迭代过程中仅在查询数据库时进行查询。要初始化 SpannerLoader 类,您需要提供:
instance_id- 一个用于加载数据的Spanner实例。database_id- 一个用于加载数据的Spanner数据库实例。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),
],
)