Skip to content
LangChain4j 文档版本 1.22.0 源快照 f15054d4 更新于 2026-10-14

Oracle

Oracle 嵌入存储集成了 Oracle Database 的 AI Vector Search 特性。

Maven 依赖

xml
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-oracle</artifactId>
    <version>1.22.0-beta32</version>

</dependency>

API

  • OracleEmbeddingStore
  • OracleChatMemoryStore

示例

用量

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

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

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

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

如果该表尚不存在,可以通过向 builder 传入一个 CreateOption 来创建它。

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

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

名称类型描述
idVARCHAR(36)主键。用于存储 UUID 字符串,这些字符串在嵌入存储时生成
embeddingVECTOR(*, FLOAT32)存储嵌入
textCLOB存储文本片段
metadataJSON存储元数据

如果你现有表的列与预定义的列名不匹配, 或你想使用不同的列名,可以使用一个 EmbeddingTable builder 来配置你的嵌入表。

java
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();

该 builder 允许你通过在 EmbeddingTable 的 embedding 与 metadata 列上提供 Index 类的实例来创建索引。 两个 builder 可用于创建 Index 类的实例:IVFIndexBuilder 与 JSONIndexBuilder。

IVFIndexBuilder 允许你在 EmbeddingTable 的 embedding 列上配置一个 IVF(倒排文件扁平,Inverted File Flat) 索引。

java
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 的 metadata 列的键上配置一个基于函数的索引。

java
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 中持久化聊天记忆。

创建一张表:

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

在聊天记忆中使用它:

java
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 列。

BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。