Google Spanner
Spanner 是一個高度可擴展的資料庫,它將無限的可擴展性與關聯式語義(例如二級索引、強一致性、結構描述和 SQL)相結合,在一個簡單的解決方案中提供 99.999% 的可用性。
本筆記本將介紹如何使用 Spanner 透過 SpannerLoader
和 SpannerDocumentSaver
儲存、載入和刪除 langchain 文件。
在 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"}
🦜🔗 程式庫安裝
整合位於其自己的 langchain-google-spanner
套件中,因此我們需要安裝它。
%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 Cloud 專案
設定您的 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 Workbench,請查看此處的設定說明。
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
刪除文件
使用 SpannerDocumentSaver.delete(<documents>)
從資料表中刪除 langchain 文件清單。
docs = loader.load()
print("Documents before delete:", docs)
doc = test_docs[0]
saver.delete([doc])
print("Documents after delete:", loader.load())
進階用法
自訂用戶端
依預設建立的用戶端是預設用戶端。 若要明確傳入 credentials
和 project
,可以將自訂用戶端傳遞給建構函式。
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,
)
自訂文件頁面內容 & Metadata
載入器將傳回文件清單,其中包含來自特定資料欄的頁面內容。 所有其他資料欄將新增至 metadata。 每一列都會變成一個文件。
自訂頁面內容格式
SpannerLoader 假設有一個名為 page_content
的欄。 可以像這樣變更這些預設值
custom_content_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, content_columns=["custom_content"]
)
如果指定了多個欄,則頁面內容的字串格式預設為 text
(以空格分隔的字串串連)。 使用者可以指定其他格式,包括 text
、JSON
、YAML
、CSV
。
自訂 metadata 格式
SpannerLoader 假設存在一個名為 langchain_metadata
的元數據欄位,用於儲存 JSON 資料。該元數據欄位將作為基礎字典。預設情況下,所有其他欄位的資料將會被加入,並且可能會覆寫原始值。這些預設值可以像這樣更改:
custom_metadata_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, metadata_columns=["column1", "column2"]
)
自訂 JSON 元數據欄位名稱
預設情況下,載入器會使用 langchain_metadata
作為基礎字典。可以自訂此設定,選擇一個 JSON 欄位作為 Document 元數據的基礎字典。
custom_metadata_json_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, metadata_json_column="another-json-column"
)
自訂過時性 (staleness)
預設的 過時性 (staleness) 為 15 秒。可以透過指定較弱的界限(可以是將所有讀取操作都視為在給定的時間戳記執行),或者指定過去的一段時間來進行自訂。
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,
)
啟用資料加速 (data boost)
預設情況下,載入器不會使用 資料加速 (data boost),因為它會產生額外的成本,並且需要額外的 IAM 權限。但是,使用者可以選擇啟用它。
custom_databoost_loader = SpannerLoader(
INSTANCE_ID,
DATABASE_ID,
query,
databoost=True,
)
自訂客戶端 (client)
依預設建立的用戶端是預設用戶端。 若要明確傳入 credentials
和 project
,可以將自訂用戶端傳遞給建構函式。
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,
)
SpannerDocumentSaver 的自訂初始化
SpannerDocumentSaver 允許自訂初始化。這讓使用者可以指定如何將 Document 儲存到資料表中。
content_column: 這將用作 Document 頁面內容的欄位名稱。預設為 page_content
。
metadata_columns: 如果 Document 的元數據中存在這些鍵,這些元數據將被儲存到特定的欄位中。
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 的自訂綱要
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),
],
)