深入探讨Oracle AI Vector Search: 文档处理及应用

106 阅读4分钟

深入探讨Oracle AI Vector Search: 文档处理及应用

引言

Oracle AI Vector Search是一种专为AI工作负载设计的技术,它允许您基于语义而非关键词对数据进行查询。相比于传统的关系型数据库,Oracle AI Vector Search能够在单一系统中将非结构化数据的语义搜索与业务数据的关系搜索结合起来。这种组合不仅强大,而且有效地避免了在不同系统间的数据碎片化问题。此外,Oracle AI Vector Search还可以利用Oracle数据库中众多强大的特性,如分区支持、事务处理、并行SQL等。

本文将详细介绍如何在Oracle AI Vector Search中使用文档处理功能,通过OracleDocLoader加载文档并利用OracleTextSplitter对文档进行分块。

主要内容

连接到Oracle数据库

在开始文档处理之前,我们需要先连接到Oracle数据库。以下是一个简单的连接示例:

import sys
import oracledb

# 请用您的用户名、密码、主机名和服务名进行替换
username = "<username>"
password = "<password>"
dsn = "<hostname>/<service_name>"

try:
    conn = oracledb.connect(user=username, password=password, dsn=dsn)
    print("Connection successful!")
except Exception as e:
    print("Connection failed!")
    sys.exit(1)

创建并插入测试文档

连接成功后,我们可以创建一个数据表并插入一些测试文档:

try:
    cursor = conn.cursor()

    drop_table_sql = """drop table if exists demo_tab"""
    cursor.execute(drop_table_sql)

    create_table_sql = """create table demo_tab (id number, data clob)"""
    cursor.execute(create_table_sql)

    insert_row_sql = """insert into demo_tab values (:1, :2)"""
    rows_to_insert = [
        (
            1,
            "如果前面任何一个问题的答案是肯定的,那么数据库会停止搜索,并从指定的表空间分配空间;否则,空间将从数据库的默认共享临时表空间中分配。",
        ),
        (
            2,
            "当数据库打开时,一个表空间可以是在线的(可访问)或离线的(不可访问)。表空间通常是在线的,以便用户可以使用其数据。SYSTEM表空间和临时表空间不能被设置为离线状态。",
        ),
        (
            3,
            "数据库存储LOB(大对象)的方式与其他数据类型不同。创建LOB列会隐式创建LOB段和LOB索引。存储LOB段和LOB索引(它们总是一起存储)的表空间可能与存储表的表空间不同。",
        ),
    ]
    cursor.executemany(insert_row_sql, rows_to_insert)

    conn.commit()

    print("Table created and populated.")
    cursor.close()
except Exception as e:
    print("Table creation failed.")
    cursor.close()
    conn.close()
    sys.exit(1)

加载文档

用户可以选择从Oracle数据库、文件系统或两者中加载文档。以下是利用OracleDocLoader从Oracle数据库表中加载文档的示例代码:

from langchain_community.document_loaders.oracleai import OracleDocLoader
from langchain_core.documents import Document

# 从Oracle数据库表中加载文档
loader_params = {
    "owner": "<owner>",
    "tablename": "demo_tab",
    "colname": "data",
}

# 创建加载器实例并加载文档
loader = OracleDocLoader(conn=conn, params=loader_params)
docs = loader.load()

# 验证加载结果
print(f"Number of docs loaded: {len(docs)}")
# print(f"Document-0: {docs[0].page_content}") # 内容

分割文档

用户可以根据需要将文档分割成更小的部分,以下是利用OracleTextSplitter进行分割的示例代码:

from langchain_community.document_loaders.oracleai import OracleTextSplitter
from langchain_core.documents import Document

# 分割参数示例
splitter_params = {"normalize": "all"}

# 获取分割器实例并分割文档
splitter = OracleTextSplitter(conn=conn, params=splitter_params)

list_chunks = []
for doc in docs:
    chunks = splitter.split_text(doc.page_content)
    list_chunks.extend(chunks)

# 验证分割结果
print(f"Number of Chunks: {len(list_chunks)}")
# print(f"Chunk-0: {list_chunks[0]}") # 内容

常见问题和解决方案

  1. 无法连接到数据库:确保您的用户名、密码、主机名和服务名是正确的。您可能需要检查数据库是否在运行。

  2. 表创建失败:在尝试创建表之前,可以先执行删除表的操作,以确保不存在同名表。

  3. 文档加载失败:检查loader_params参数,确保表名和列名正确无误。

总结和进一步学习资源

本文介绍了如何在Oracle AI Vector Search中使用文档处理功能,包括连接到Oracle数据库、创建并插入测试文档、加载文档和分割文档。通过这些步骤,您可以高效地处理和使用文档数据。

进一步学习资源:

参考资料

  1. Oracle AI Vector Search Guide
  2. Oracle Database Documentation
  3. LangChain Documentation

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---