適用於 Oracle 工作負載的 Google El Carro
Google El Carro Oracle Operator 提供一種在 Kubernetes 中執行 Oracle 資料庫的方法,作為可攜式、開放原始碼、社群驅動、無供應商鎖定的容器協調系統。El Carro 為全面且一致的配置和部署,以及即時操作和監控提供強大的宣告式 API。透過利用 El Carro Langchain 整合,擴展 Oracle 資料庫的功能,以建立 AI 驅動的體驗。
本指南說明如何使用 El Carro Langchain 整合,透過 ElCarroLoader
和 ElCarroDocumentSaver
儲存、載入和刪除 langchain 文件。此整合適用於任何 Oracle 資料庫,無論其執行位置為何。
在 GitHub 上進一步瞭解套件。
開始之前
請完成 README 的 入門指南 章節,以設定您的 El Carro Oracle 資料庫。
🦜🔗 程式庫安裝
此整合位於其自身的 langchain-google-el-carro
套件中,因此我們需要安裝它。
%pip install --upgrade --quiet langchain-google-el-carro
基本用法
設定 Oracle 資料庫連線
使用您的 Oracle 資料庫連線詳細資訊填寫以下變數。
# @title Set Your Values Here { display-mode: "form" }
HOST = "127.0.0.1" # @param {type: "string"}
PORT = 3307 # @param {type: "integer"}
DATABASE = "my-database" # @param {type: "string"}
TABLE_NAME = "message_store" # @param {type: "string"}
USER = "my-user" # @param {type: "string"}
PASSWORD = input("Please provide a password to be used for the database user: ")
如果您使用 El Carro,您可以在 El Carro Kubernetes 執行個體的狀態中找到主機名稱和埠號值。使用您為 PDB 建立的使用者密碼。
範例輸出
kubectl get -w instances.oracle.db.anthosapis.com -n db
NAME DB ENGINE VERSION EDITION ENDPOINT URL DB NAMES BACKUP ID READYSTATUS READYREASON DBREADYSTATUS DBREADYREASON
mydb Oracle 18c Express mydb-svc.db 34.71.69.25:6021 ['pdbname'] TRUE CreateComplete True CreateComplete
ElCarroEngine 連線池
ElCarroEngine
設定 Oracle 資料庫的連線池,從您的應用程式啟用成功連線,並遵循業界最佳實務。
from langchain_google_el_carro import ElCarroEngine
elcarro_engine = ElCarroEngine.from_instance(
db_host=HOST,
db_port=PORT,
db_name=DATABASE,
db_user=USER,
db_password=PASSWORD,
)
初始化表格
透過 elcarro_engine.init_document_table(<table_name>)
初始化預設結構描述的表格。表格欄
- page_content (類型:文字)
- langchain_metadata (類型:JSON)
elcarro_engine.drop_document_table(TABLE_NAME)
elcarro_engine.init_document_table(
table_name=TABLE_NAME,
)
儲存文件
使用 ElCarroDocumentSaver.add_documents(<documents>)
儲存 langchain 文件。若要初始化 ElCarroDocumentSaver
類別,您需要提供 2 個項目
elcarro_engine
-ElCarroEngine
引擎的執行個體。table_name
- Oracle 資料庫中用於儲存 langchain 文件的表格名稱。
from langchain_core.documents import Document
from langchain_google_el_carro import ElCarroDocumentSaver
doc = Document(
page_content="Banana",
metadata={"type": "fruit", "weight": 100, "organic": 1},
)
saver = ElCarroDocumentSaver(
elcarro_engine=elcarro_engine,
table_name=TABLE_NAME,
)
saver.add_documents([doc])
載入文件
使用 ElCarroLoader.load()
或 ElCarroLoader.lazy_load()
載入 langchain 文件。lazy_load
傳回僅在迭代期間查詢資料庫的產生器。若要初始化 ElCarroLoader
類別,您需要提供
elcarro_engine
-ElCarroEngine
引擎的執行個體。table_name
- Oracle 資料庫中用於儲存 langchain 文件的表格名稱。
from langchain_google_el_carro import ElCarroLoader
loader = ElCarroLoader(elcarro_engine=elcarro_engine, table_name=TABLE_NAME)
docs = loader.lazy_load()
for doc in docs:
print("Loaded documents:", doc)
透過查詢載入文件
除了從表格載入文件外,我們也可以選擇從 SQL 查詢產生的檢視載入文件。例如
from langchain_google_el_carro import ElCarroLoader
loader = ElCarroLoader(
elcarro_engine=elcarro_engine,
query=f"SELECT * FROM {TABLE_NAME} WHERE json_value(langchain_metadata, '$.organic') = '1'",
)
onedoc = loader.load()
print(onedoc)
從 SQL 查詢產生的檢視可以具有與預設表格不同的結構描述。在這種情況下,ElCarroLoader 的行為與從具有非預設結構描述的表格載入相同。請參閱 載入具有自訂文件頁面內容和中繼資料的文件 章節。
刪除文件
使用 ElCarroDocumentSaver.delete(<documents>)
從 Oracle 表格中刪除 langchain 文件清單。
對於具有預設結構描述 (page_content、langchain_metadata) 的表格,刪除條件為
如果清單中存在 document
,則應刪除 row
,使得
document.page_content
等於row[page_content]
document.metadata
等於row[langchain_metadata]
docs = loader.load()
print("Documents before delete:", docs)
saver.delete(onedoc)
print("Documents after delete:", loader.load())
進階用法
載入具有自訂文件頁面內容和中繼資料的文件
首先,我們準備一個具有非預設結構描述的範例表格,並使用一些任意資料來填入它。
import sqlalchemy
create_table_query = f"""CREATE TABLE {TABLE_NAME} (
fruit_id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
fruit_name VARCHAR2(100) NOT NULL,
variety VARCHAR2(50),
quantity_in_stock NUMBER(10) NOT NULL,
price_per_unit NUMBER(6,2) NOT NULL,
organic NUMBER(3) NOT NULL
)"""
elcarro_engine.drop_document_table(TABLE_NAME)
with elcarro_engine.connect() as conn:
conn.execute(sqlalchemy.text(create_table_query))
conn.commit()
conn.execute(
sqlalchemy.text(
f"""
INSERT INTO {TABLE_NAME} (fruit_name, variety, quantity_in_stock, price_per_unit, organic)
VALUES ('Apple', 'Granny Smith', 150, 0.99, 1)
"""
)
)
conn.execute(
sqlalchemy.text(
f"""
INSERT INTO {TABLE_NAME} (fruit_name, variety, quantity_in_stock, price_per_unit, organic)
VALUES ('Banana', 'Cavendish', 200, 0.59, 0)
"""
)
)
conn.execute(
sqlalchemy.text(
f"""
INSERT INTO {TABLE_NAME} (fruit_name, variety, quantity_in_stock, price_per_unit, organic)
VALUES ('Orange', 'Navel', 80, 1.29, 1)
"""
)
)
conn.commit()
如果我們仍然從此範例表格使用 ElCarroLoader
的預設參數載入 langchain 文件,則載入文件的 page_content
將是表格的第一欄,而 metadata
將包含所有其他欄的鍵值組。
loader = ElCarroLoader(
elcarro_engine=elcarro_engine,
table_name=TABLE_NAME,
)
loaded_docs = loader.load()
print(f"Loaded Documents: [{loaded_docs}]")
我們可以透過在初始化 ElCarroLoader
時設定 content_columns
和 metadata_columns
,來指定我們想要載入的內容和中繼資料。
content_columns
:要寫入文件page_content
的欄。metadata_columns
:要寫入文件metadata
的欄。
例如,在此處,content_columns
中欄的值將聯結在一起成為空格分隔的字串,作為載入文件的 page_content
,而載入文件的 metadata
將僅包含 metadata_columns
中指定的欄的鍵值組。
loader = ElCarroLoader(
elcarro_engine=elcarro_engine,
table_name=TABLE_NAME,
content_columns=[
"variety",
"quantity_in_stock",
"price_per_unit",
"organic",
],
metadata_columns=["fruit_id", "fruit_name"],
)
loaded_docs = loader.load()
print(f"Loaded Documents: [{loaded_docs}]")
儲存具有自訂頁面內容和中繼資料的文件
為了將 langchain 文件儲存到具有自訂中繼資料欄位的表格中,我們需要先透過 ElCarroEngine.init_document_table()
建立此類表格,並指定我們希望它擁有的 metadata_columns
清單。在此範例中,建立的表格將具有表格欄
- content (類型:文字):用於儲存水果描述。
- type (類型 VARCHAR2(200)):用於儲存水果類型。
- weight (類型 INT):用於儲存水果重量。
- extra_json_metadata (類型:JSON):用於儲存水果的其他中繼資料資訊。
我們可以將以下參數與 elcarro_engine.init_document_table()
搭配使用來建立表格
table_name
:Oracle 資料庫中用於儲存 langchain 文件的表格名稱。metadata_columns
:sqlalchemy.Column
的清單,指示我們需要的中繼資料欄清單。content_column
:用於儲存 langchain 文件page_content
的欄名稱。預設值:"page_content", "VARCHAR2(4000)"
metadata_json_column
:用於儲存 langchain 文件的額外 JSONmetadata
的欄名稱。預設值:"langchain_metadata", "VARCHAR2(4000)"
。
elcarro_engine.drop_document_table(TABLE_NAME)
elcarro_engine.init_document_table(
table_name=TABLE_NAME,
metadata_columns=[
sqlalchemy.Column("type", sqlalchemy.dialects.oracle.VARCHAR2(200)),
sqlalchemy.Column("weight", sqlalchemy.INT),
],
content_column="content",
metadata_json_column="extra_json_metadata",
)
使用 ElCarroDocumentSaver.add_documents(<documents>)
儲存文件。如您在此範例中所見,
document.page_content
將儲存到content
欄。document.metadata.type
將儲存到type
欄。document.metadata.weight
將儲存到weight
欄。document.metadata.organic
將以 JSON 格式儲存到extra_json_metadata
欄。
doc = Document(
page_content="Banana",
metadata={"type": "fruit", "weight": 100, "organic": 1},
)
print(f"Original Document: [{doc}]")
saver = ElCarroDocumentSaver(
elcarro_engine=elcarro_engine,
table_name=TABLE_NAME,
content_column="content",
metadata_json_column="extra_json_metadata",
)
saver.add_documents([doc])
loader = ElCarroLoader(
elcarro_engine=elcarro_engine,
table_name=TABLE_NAME,
content_columns=["content"],
metadata_columns=[
"type",
"weight",
],
metadata_json_column="extra_json_metadata",
)
loaded_docs = loader.load()
print(f"Loaded Document: [{loaded_docs[0]}]")
刪除具有自訂頁面內容和中繼資料的文件
我們也可以透過 ElCarroDocumentSaver.delete(<documents>)
從具有自訂中繼資料欄的表格中刪除文件。刪除條件為
如果清單中存在 document
,則應刪除 row
,使得
document.page_content
等於row[page_content]
- 對於
document.metadata
中的每個中繼資料欄位k
document.metadata[k]
等於row[k]
或document.metadata[k]
等於row[langchain_metadata][k]
row
中存在但document.metadata
中不存在額外的中繼資料欄位。
loader = ElCarroLoader(elcarro_engine=elcarro_engine, table_name=TABLE_NAME)
saver.delete(loader.load())
print(f"Documents left: {len(loader.load())}")
更多範例
請查看 demo_doc_loader_basic.py 和 demo_doc_loader_advanced.py 以取得完整的程式碼範例。