TiDB Cloud는 dedicated 및 serverless 옵션을 제공하는 포괄적인 Database-as-a-Service (DBaaS) 솔루션입니다. TiDB Serverless는 이제 MySQL 환경에 내장된 vector search를 통합하고 있습니다. 이 개선 사항을 통해 새로운 데이터베이스나 추가 기술 스택 없이 TiDB Serverless를 사용하여 AI 애플리케이션을 원활하게 개발할 수 있습니다. tidb.cloud/ai에서 private beta 대기자 명단에 등록하여 가장 먼저 경험해보세요.
이 notebook은 langchain에서 TiDBLoader를 사용하여 TiDB에서 데이터를 로드하는 방법을 소개합니다.

Prerequisites

TiDBLoader를 사용하기 전에 다음 종속성을 설치합니다:
pip install -qU langchain
그런 다음 TiDB에 대한 연결을 구성합니다. 이 notebook에서는 TiDB Cloud에서 제공하는 표준 연결 방법을 따라 안전하고 효율적인 데이터베이스 연결을 설정합니다.
import getpass

# copy from tidb cloud console,replace it with your own
tidb_connection_string_template = "mysql+pymysql://<USER>:<PASSWORD>@<HOST>:4000/<DB>?ssl_ca=/etc/ssl/cert.pem&ssl_verify_cert=true&ssl_verify_identity=true"
tidb_password = getpass.getpass("Input your TiDB password:")
tidb_connection_string = tidb_connection_string_template.replace(
    "<PASSWORD>", tidb_password
)

TiDB에서 데이터 로드하기

다음은 TiDBLoader의 동작을 사용자 정의하는 데 사용할 수 있는 몇 가지 주요 인수에 대한 설명입니다:
  • query (str): TiDB 데이터베이스에 대해 실행할 SQL query입니다. query는 Document 객체에 로드하려는 데이터를 선택해야 합니다. 예를 들어, "SELECT * FROM my_table"과 같은 query를 사용하여 my_table에서 모든 데이터를 가져올 수 있습니다.
  • page_content_columns (Optional[List[str]]): 각 Document 객체의 page_content에 포함되어야 하는 column 이름 목록을 지정합니다. None(기본값)으로 설정하면 query에서 반환된 모든 column이 page_content에 포함됩니다. 이를 통해 데이터의 특정 column을 기반으로 각 document의 내용을 맞춤 설정할 수 있습니다.
  • metadata_columns (Optional[List[str]]): 각 Document 객체의 metadata에 포함되어야 하는 column 이름 목록을 지정합니다. 기본적으로 이 목록은 비어 있으며, 명시적으로 지정하지 않는 한 metadata가 포함되지 않습니다. 이는 주요 내용의 일부를 형성하지는 않지만 처리나 분석에 여전히 유용한 각 document에 대한 추가 정보를 포함하는 데 유용합니다.
from sqlalchemy import Column, Integer, MetaData, String, Table, create_engine

# Connect to the database
engine = create_engine(tidb_connection_string)
metadata = MetaData()
table_name = "test_tidb_loader"

# Create a table
test_table = Table(
    table_name,
    metadata,
    Column("id", Integer, primary_key=True),
    Column("name", String(255)),
    Column("description", String(255)),
)
metadata.create_all(engine)


with engine.connect() as connection:
    transaction = connection.begin()
    try:
        connection.execute(
            test_table.insert(),
            [
                {"name": "Item 1", "description": "Description of Item 1"},
                {"name": "Item 2", "description": "Description of Item 2"},
                {"name": "Item 3", "description": "Description of Item 3"},
            ],
        )
        transaction.commit()
    except:
        transaction.rollback()
        raise
from langchain_community.document_loaders import TiDBLoader

# Setup TiDBLoader to retrieve data
loader = TiDBLoader(
    connection_string=tidb_connection_string,
    query=f"SELECT * FROM {table_name};",
    page_content_columns=["name", "description"],
    metadata_columns=["id"],
)

# Load data
documents = loader.load()

# Display the loaded documents
for doc in documents:
    print("-" * 30)
    print(f"content: {doc.page_content}\nmetada: {doc.metadata}")
------------------------------
content: name: Item 1
description: Description of Item 1
metada: {'id': 1}
------------------------------
content: name: Item 2
description: Description of Item 2
metada: {'id': 2}
------------------------------
content: name: Item 3
description: Description of Item 3
metada: {'id': 3}
test_table.drop(bind=engine)

Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I