Google El Carro Oracle Operator는 Kubernetes에서 Oracle 데이터베이스를 이식 가능하고, 오픈 소스이며, 커뮤니티 주도적이고, 벤더 종속이 없는 컨테이너 오케스트레이션 시스템으로 실행할 수 있는 방법을 제공합니다. El Carro는 포괄적이고 일관된 구성 및 배포뿐만 아니라 실시간 운영 및 모니터링을 위한 강력한 선언적 API를 제공합니다. El Carro LangChain 통합을 활용하여 Oracle 데이터베이스의 기능을 확장하고 AI 기반 경험을 구축하세요.
이 가이드는 El Carro LangChain 통합을 사용하여 ElCarroLoaderElCarroDocumentSaverlangchain 문서를 저장, 로드 및 삭제하는 방법을 다룹니다. 이 통합은 실행 위치에 관계없이 모든 Oracle 데이터베이스에서 작동합니다. GitHub에서 패키지에 대해 자세히 알아보세요. Open In Colab

시작하기 전에

El Carro Oracle 데이터베이스를 설정하려면 README의 Getting Started 섹션을 완료하세요.

🦜🔗 라이브러리 설치

이 통합은 자체 langchain-google-el-carro 패키지에 있으므로 설치해야 합니다.
pip install -qU 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를 사용하는 경우, El Carro Kubernetes 인스턴스의 상태에서 hostname과 port 값을 찾을 수 있습니다. 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 Connection Pool

ElCarroEngine은 Oracle 데이터베이스에 대한 connection pool을 구성하여 애플리케이션에서 성공적인 연결을 가능하게 하고 업계 모범 사례를 따릅니다.
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 (타입: text)
  • 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 - langchain 문서를 저장할 Oracle 데이터베이스 내 테이블의 이름.
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는 반복 중에만 데이터베이스를 쿼리하는 generator를 반환합니다. ElCarroLoader 클래스를 초기화하려면 다음이 필요합니다:
  1. elcarro_engine - ElCarroEngine 엔진의 인스턴스.
  2. table_name - langchain 문서를 저장할 Oracle 데이터베이스 내 테이블의 이름.
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 쿼리에서 생성된 view에서 문서를 로드할 수도 있습니다. 예를 들어:
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 쿼리에서 생성된 view는 기본 테이블과 다른 스키마를 가질 수 있습니다. 이러한 경우 ElCarroLoader의 동작은 기본이 아닌 스키마를 가진 테이블에서 로드하는 것과 동일합니다. 사용자 정의 문서 page content 및 metadata로 문서 로드 섹션을 참조하세요.

문서 삭제

ElCarroDocumentSaver.delete(<documents>)로 Oracle 테이블에서 langchain 문서 목록을 삭제합니다. 기본 스키마(page_content, langchain_metadata)를 가진 테이블의 경우 삭제 기준은 다음과 같습니다: 목록에 document가 존재하여 다음을 만족하는 경우 row가 삭제되어야 합니다:
  • document.page_contentrow[page_content]와 같음
  • document.metadatarow[langchain_metadata]와 같음
docs = loader.load()
print("Documents before delete:", docs)
saver.delete(onedoc)
print("Documents after delete:", loader.load())

고급 사용법

사용자 정의 문서 page content 및 metadata로 문서 로드

먼저 기본이 아닌 스키마를 가진 예제 테이블을 준비하고 임의의 데이터로 채웁니다.
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는 다른 모든 컬럼의 key-value 쌍으로 구성됩니다.
loader = ElCarroLoader(
    elcarro_engine=elcarro_engine,
    table_name=TABLE_NAME,
)
loaded_docs = loader.load()
print(f"Loaded Documents: [{loaded_docs}]")
ElCarroLoader를 초기화할 때 content_columnsmetadata_columns를 설정하여 로드하려는 content와 metadata를 지정할 수 있습니다.
  1. content_columns: 문서의 page_content에 작성할 컬럼.
  2. metadata_columns: 문서의 metadata에 작성할 컬럼.
예를 들어 여기서 content_columns의 컬럼 값들은 공백으로 구분된 문자열로 결합되어 로드된 문서의 page_content가 되고, 로드된 문서의 metadatametadata_columns에 지정된 컬럼의 key-value 쌍만 포함합니다.
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}]")

사용자 정의 page content 및 metadata로 문서 저장

사용자 정의 metadata 필드가 있는 테이블에 langchain 문서를 저장하려면 먼저 ElCarroEngine.init_document_table()을 통해 해당 테이블을 생성하고 원하는 metadata_columns 목록을 지정해야 합니다. 이 예제에서 생성된 테이블은 다음 테이블 컬럼을 갖습니다:
  • content (타입: text): 과일 설명 저장용.
  • type (타입 VARCHAR2(200)): 과일 타입 저장용.
  • weight (타입 INT): 과일 무게 저장용.
  • extra_json_metadata (타입: JSON): 과일의 기타 metadata 정보 저장용.
테이블을 생성하기 위해 elcarro_engine.init_document_table()에서 다음 매개변수를 사용할 수 있습니다:
  1. table_name: langchain 문서를 저장할 Oracle 데이터베이스 내 테이블의 이름.
  2. metadata_columns: 필요한 metadata 컬럼 목록을 나타내는 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_contentcontent 컬럼에 저장됩니다.
  • document.metadata.typetype 컬럼에 저장됩니다.
  • document.metadata.weightweight 컬럼에 저장됩니다.
  • document.metadata.organicextra_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]}]")

사용자 정의 page content 및 metadata로 문서 삭제

ElCarroDocumentSaver.delete(<documents>)를 통해 사용자 정의 metadata 컬럼이 있는 테이블에서 문서를 삭제할 수도 있습니다. 삭제 기준은 다음과 같습니다: 목록에 document가 존재하여 다음을 만족하는 경우 row가 삭제되어야 합니다:
  • document.page_contentrow[page_content]와 같음
  • document.metadata의 모든 metadata 필드 k에 대해
    • document.metadata[k]row[k]와 같거나 document.metadata[k]row[langchain_metadata][k]와 같음
  • row에는 있지만 document.metadata에는 없는 추가 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를 참조하세요.
Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I