跳至主要內容

Google El Carro for Oracle Workloads

Google El Carro Oracle Operator 提供一種在 Kubernetes 中執行 Oracle 資料庫的方式,作為一個可攜式、開放原始碼、社群驅動、無廠商鎖定的容器編排系統。 El Carro 提供了一個強大的宣告式 API,用於全面且一致的配置和部署,以及即時操作和監控。透過利用 El Carro Langchain 整合,擴展 Oracle 資料庫的功能以構建 AI 驅動的體驗。

本指南介紹如何使用 El Carro Langchain 整合,透過 ElCarroLoaderElCarroDocumentSaver 儲存、載入和刪除 langchain 文件。此整合適用於任何 Oracle 資料庫,無論它在哪裡執行。

GitHub 上了解更多關於此套件的資訊。

Open In Colab

開始之前

請完成 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 件事

  1. elcarro_engine - ElCarroEngine 引擎的實例。
  2. 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])
API 參考:文件

載入文件

使用 ElCarroLoader.load()ElCarroLoader.lazy_load() 載入 langchain 文件。 lazy_load 返回一個生成器,該生成器僅在迭代期間查詢資料庫。要初始化 ElCarroLoader 類別,您需要提供

  1. elcarro_engine - ElCarroEngine 引擎的實例。
  2. 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())

進階用法

載入具有自訂文件頁面內容和元數據的文件

首先,我們準備一個具有非預設 schema 的範例表格,並使用一些任意資料來填充它。

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_columnsmetadata_columns 來指定我們想要載入的內容和元數據。

  1. content_columns:要寫入文件 page_content 的欄位。
  2. 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 (類型:text):用於儲存水果描述。
  • type (類型:VARCHAR2(200)):用於儲存水果類型。
  • weight (類型:INT):用於儲存水果重量。
  • extra_json_metadata (類型:JSON):用於儲存水果的其他元數據資訊。

我們可以將以下參數與 elcarro_engine.init_document_table() 一起使用來建立表格

  1. table_name:Oracle 資料庫中用於儲存 langchain 文件的表格名稱。
  2. metadata_columns:指示我們需要的元數據欄位列表的 sqlalchemy.Column 列表。
  3. content_column:用於儲存 langchain 文件 page_content 的欄位名稱。 預設值:"page_content", "VARCHAR2(4000)"
  4. metadata_json_column:用於儲存 langchain 文件的額外 JSON metadata 的欄位名稱。 預設值:"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.pydemo_doc_loader_advanced.py 以取得完整的程式碼範例。


此頁面是否有幫助?