跳到主要内容

Oracle

Oracle Embedding Store 与 Oracle Database 的 AI Vector Search 功能集成。

Maven 依赖

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-oracle</artifactId>
<version>1.18.1-beta28</version>

</dependency>

API

  • OracleEmbeddingStore
  • OracleChatMemoryStore

示例

用法

可通过配置构建器创建该存储的实例。构建器 要求提供 DataSource 和嵌入表。两个向量之间的距离 使用余弦相似度计算, 它测量两个向量夹角的余弦值。

建议配置可池化连接的 DataSource,例如 Universal Connection Pool 或 Hikari。连接池可避免 反复创建新数据库连接带来的延迟。

如果数据库中已存在嵌入表,请提供表名。

EmbeddingStore embeddingStore = OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable("my_embedding_table")
.build();

如果表尚不存在,可通过向构建器传入 CreateOption 来创建。

EmbeddingStore embeddingStore = OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable("my_embedding_table", CreateOption.CREATE_IF_NOT_EXISTS)
.build();

默认情况下,嵌入表将具有以下列:

NameTypeDescription
idVARCHAR(36)Primary key. Used to store UUID strings which are generated when the embedding store
embeddingVECTOR(*, FLOAT32)Stores the embedding
textCLOBStores the text segment
metadataJSONStores the metadata

如果现有表的列与预定义列名不匹配, 或者你希望使用不同的列名,可以使用 EmbeddingTable 构建器来配置嵌入表。

OracleEmbeddingStore embeddingStore =
OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable(EmbeddingTable.builder()
.createOption(CREATE_OR_REPLACE) // use NONE if the table already exists
.name("my_embedding_table")
.idColumn("id_column_name")
.embeddingColumn("embedding_column_name")
.textColumn("text_column_name")
.metadataColumn("metadata_column_name")
.build())
.build();

构建器允许你通过提供 Index 类的实例,在 EmbeddingTable 的 嵌入列和元数据列上创建索引。有两个构建器可用于 创建 Index 类的实例:IVFIndexBuilder 和 JSONIndexBuilder。

IVFIndexBuilder 允许你在 EmbeddingTable 的嵌入列上配置 IVF(Inverted File Flat) 索引。

OracleEmbeddingStore embeddingStore =
OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable(EmbeddingTable.builder()
.createOption(CreateOption.CREATE_OR_REPLACE) // use NONE if the table already exists
.name("my_embedding_table")
.idColumn("id_column_name")
.embeddingColumn("embedding_column_name")
.textColumn("text_column_name")
.metadataColumn("metadata_column_name")
.build())
.index(Index.ivfIndexBuilder().createOption(CreateOption.CREATE_OR_REPLACE).build())
.build();

JSONIndexBuilder 允许你在 EmbeddingTable 元数据列的键上配置 基于函数的索引

OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable(EmbeddingTable.builder()
.createOption(CreateOption.CREATE_OR_REPLACE) // use NONE if the table already exists
.name("my_embedding_table")
.idColumn("id_column_name")
.embeddingColumn("embedding_column_name")
.textColumn("text_column_name")
.metadataColumn("metadata_column_name")
.build())
.index(Index.jsonIndexBuilder()
.createOption(CreateOption.CREATE_OR_REPLACE)
.key("name", String.class, JSONIndexBuilder.Order.ASC)
.key("year", Integer.class, JSONIndexBuilder.Order.DESC)
.build())
.build();

有关 Oracle AI Vector Search 的更多信息,请参阅文档

聊天记忆

OracleChatMemoryStore 可用于在 Oracle Database 中持久化聊天记忆。

创建表:

CREATE TABLE chat_memory (
memory_id VARCHAR2(255) PRIMARY KEY,
content CLOB NOT NULL
);

在聊天记忆中使用:

ChatMemoryStore store = OracleChatMemoryStore.builder()
.dataSource(myDataSource)
.tableName("chat_memory")
.build();

ChatMemory chatMemory = MessageWindowChatMemory.builder()
.id("conversation-1")
.maxMessages(10)
.chatMemoryStore(store)
.build();

OracleChatMemoryStore 按 memory id 存储一行,所有消息以 JSON 形式序列化在 content 列中。