Skip to main content
Open In Colab在 GitHub 上打开

适用于 Oracle 工作负载的 Google El Carro

Google El Carro Oracle Operator 提供了一种在 Kubernetes 中以可移植、开源、 社区驱动,无提供商锁定容器编排系统。埃尔卡罗 提供强大的声明式 API,以实现全面且一致的 配置和部署以及实时作和 监测。 扩展 Oracle 数据库的功能以构建 AI 驱动的体验 通过利用 El Carro Langchain 集成。

本指南介绍了如何使用 El Carro Langchain 集成来保存、加载和删除 langchain 文档ElCarroLoaderElCarroDocumentSaver.此集成适用于任何 Oracle 数据库,无论它在何处运行。

GitHub 上了解有关该软件包的更多信息。

Open In Colab

准备工作

请填写 的 Getting Started 部分 用于设置 El Carro Oracle 数据库的自述文件。

🦜🔗 库安装

集成存在于自己的langchain-google-el-carropackage 中,因此 我们需要安装它。

%pip install --upgrade --quiet langchain-google-el-carro

基本用法

设置 Oracle Database 连接

使用您的 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,则可以在 状态。 使用您为 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,
)

初始化表

初始化 default schema 的表 通过elcarro_engine.init_document_table(<table_name>).表列:

  • page_content (类型: text)
  • langchain_metadata (类型: JSON)
elcarro_engine.drop_document_table(TABLE_NAME)
elcarro_engine.init_document_table(
table_name=TABLE_NAME,
)

保存文档

保存 langchain 文档ElCarroDocumentSaver.add_documents(<documents>). 初始化ElCarroDocumentSaverclass 你需要提供 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 参考:文档

加载文档

加载 langchain 文档ElCarroLoader.load()ElCarroLoader.lazy_load().lazy_load返回一个生成器,该生成器在迭代期间仅查询 database。 初始化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 查询生成的视图可以具有与 default table 不同的架构。 在这种情况下,ElCarroLoader 的行为与从表中加载相同 使用非默认架构。请参考 部分使用自定义文档页面内容和元数据加载文档

删除文档

从 Oracle 表中删除 langchain 文档列表 跟ElCarroDocumentSaver.delete(<documents>).

对于具有默认架构 (page_content, langchain_metadata) 的表, 删除标准为:

一个row如果存在document,以便

  • 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在此示例表中,page_content的 表的第一列,以及metadata将由键值对组成 的

loader = ElCarroLoader(
elcarro_engine=elcarro_engine,
table_name=TABLE_NAME,
)
loaded_docs = loader.load()
print(f"Loaded Documents: [{loaded_docs}]")

我们可以通过设置 这content_columnsmetadata_columns初始化时 这ElCarroLoader.

  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我们希望它拥有。在此示例中, created table 将包含表列:

  • content (type: text):用于存储水果描述。
  • type (type VARCHAR2(200)):用于存储水果类型。
  • weight (type INT): 用于储存水果重量。
  • extra_json_metadata (type: JSON):用于存储 水果。

我们可以使用以下参数 跟elcarro_engine.init_document_table()要创建表,请执行以下作:

  1. table_name:Oracle 数据库中要存储的表的名称 langchain 文档。
  2. metadata_columns:一个sqlalchemy.Column指示 metadata 列。
  3. content_column:要存储的列名称page_contentLangChain 的 公文。违约:"page_content", "VARCHAR2(4000)"
  4. metadata_json_column:用于存储额外 JSON 格式metadata的 langchain 文档。 违约:"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将保存到extra_json_metadata列 JSON 格式。
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>).删除条件为:

一个row如果存在document,以便

  • document.page_content等于row[page_content]
  • 对于每个元数据字段kdocument.metadata
    • 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 完成代码示例。