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,
)
自訂文件頁面內容和元數據
載入器將傳回文件清單,其中包含來自特定資料欄的頁面內容。所有其他資料欄將新增至元數據。每一列都會變成一個文件。
自訂頁面內容格式
SpannerLoader 假設有一個名為 page_content
的欄。這些預設值可以變更,如下所示
custom_content_loader = SpannerLoader(
INSTANCE_ID, DATABASE_ID, query, content_columns=["custom_content"]
)
如果指定了多個欄,則頁面內容的字串格式將預設為 text
(空格分隔的字串串連)。使用者可以指定其他格式,包括 text
、JSON
、YAML
、CSV
。
自訂元數據格式
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"
)
自訂陳舊性
預設的陳舊性為 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,
)
開啟資料加速
依預設,載入器不會使用資料加速,因為它具有相關的額外成本,並且需要額外的 IAM 權限。但是,使用者可以選擇開啟它。
custom_databoost_loader = SpannerLoader(
INSTANCE_ID,
DATABASE_ID,
query,
databoost=True,
)
自訂客戶端
依預設建立的客戶端是預設客戶端。若要明確傳入 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 允許自訂初始化。這允許使用者指定如何將文件儲存到表格中。
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 的自訂結構描述
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),
],
)