Skip to main content
Open In ColabOpen on GitHub

Oracle AI 向量搜索:文档处理

Oracle AI 向量搜索专为人工智能(AI)工作负载设计,允许您基于语义而非关键字查询数据。 Oracle AI 向量搜索的最大优势之一是,可以在一个系统中将非结构化数据的语义搜索与业务数据的关系搜索结合起来。 这不仅功能强大,而且显著更有效,因为您不需要添加专门的向量数据库,消除了多个系统之间数据分散的痛点。

此外,您的向量可以从Oracle数据库的所有最强大功能中受益,例如以下内容:

本指南演示了如何在Oracle AI向量搜索中使用文档处理功能,分别使用OracleDocLoader和OracleTextSplitter来加载和分块文档。

如果您刚开始使用Oracle数据库,可以考虑探索免费的Oracle 23 AI,它为您提供了一个很好的入门指南,帮助您设置数据库环境。在使用数据库时,通常建议避免默认使用系统用户;相反,您可以创建自己的用户以增强安全性和定制性。有关用户创建的详细步骤,请参阅我们的端到端指南,该指南还展示了如何在Oracle中设置用户。此外,了解用户权限对于有效管理数据库安全至关重要。您可以在官方的Oracle指南中了解更多关于管理用户帐户和安全的信息。

先决条件

请安装Oracle Python客户端驱动程序以使用Langchain与Oracle AI向量搜索。

# pip install oracledb

连接到Oracle数据库

以下示例代码将展示如何连接到Oracle数据库。默认情况下,python-oracledb以“Thin”模式运行,该模式直接连接到Oracle数据库。此模式不需要Oracle客户端库。然而,当python-oracledb使用它们时,一些额外的功能是可用的。当使用Oracle客户端库时,python-oracledb被称为处于“Thick”模式。两种模式都具有支持Python数据库API v2.0规范的全面功能。请参阅以下指南,该指南讨论了每种模式下支持的功能。如果您无法使用thin模式,您可能希望切换到thick模式。

import sys

import oracledb

# please update with your username, password, hostname and service_name
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,
"If the answer to any preceding questions is yes, then the database stops the search and allocates space from the specified tablespace; otherwise, space is allocated from the database default shared temporary tablespace.",
),
(
2,
"A tablespace can be online (accessible) or offline (not accessible) whenever the database is open.\nA tablespace is usually online so that its data is available to users. The SYSTEM tablespace and temporary tablespaces cannot be taken offline.",
),
(
3,
"The database stores LOBs differently from other data types. Creating a LOB column implicitly creates a LOB segment and a LOB index. The tablespace containing the LOB segment and LOB index, which are always stored together, may be different from the tablespace containing the table.\nSometimes the database can store small amounts of LOB data in the table itself rather than in a separate LOB segment.",
),
]
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数据库、文件系统或两者加载文档。有关这些参数的详细信息,请参阅Oracle AI Vector Search Guide

使用OracleDocLoader的一个显著优势是其能够处理超过150种不同的文件格式,消除了为不同文档类型使用多个加载器的需求。有关支持的格式的完整列表,请参阅Oracle Text支持的文档格式

以下是一个示例代码片段,展示了如何使用 OracleDocLoader

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

"""
# loading a local file
loader_params = {}
loader_params["file"] = "<file>"

# loading from a local directory
loader_params = {}
loader_params["dir"] = "<directory>"
"""

# loading from Oracle Database table
loader_params = {
"owner": "<owner>",
"tablename": "demo_tab",
"colname": "data",
}

""" load the docs """
loader = OracleDocLoader(conn=conn, params=loader_params)
docs = loader.load()

""" verify """
print(f"Number of docs loaded: {len(docs)}")
# print(f"Document-0: {docs[0].page_content}") # content
API Reference:OracleDocLoader | Document

分割文档

文档的大小可能各不相同,从小到非常大。用户通常更喜欢将文档分成较小的部分,以便于生成嵌入。此分割过程提供了广泛的定制选项。有关这些参数的详细信息,请参阅Oracle AI Vector Search Guide

以下是一个示例代码,展示了如何实现这一点:

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

"""
# Some examples
# split by chars, max 500 chars
splitter_params = {"split": "chars", "max": 500, "normalize": "all"}

# split by words, max 100 words
splitter_params = {"split": "words", "max": 100, "normalize": "all"}

# split by sentence, max 20 sentences
splitter_params = {"split": "sentence", "max": 20, "normalize": "all"}
"""

# split by default parameters
splitter_params = {"normalize": "all"}

# get the splitter instance
splitter = OracleTextSplitter(conn=conn, params=splitter_params)

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

""" verify """
print(f"Number of Chunks: {len(list_chunks)}")
# print(f"Chunk-0: {list_chunks[0]}") # content

端到端演示

请参考我们的完整演示指南Oracle AI Vector Search End-to-End Demo Guide,借助Oracle AI Vector Search构建端到端的RAG管道。


这个页面有帮助吗?