主题
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>1
2
3
4
5
6
2
3
4
5
6
API
OracleEmbeddingStoreOracleChatMemoryStore
示例
用量
本存储的实例可通过配置一个 builder 来创建。该 builder 要求提供一个 DataSource 和一个嵌入表。两个向量之间的距离 使用余弦相似度计算, 它衡量两个向量之间夹角的余弦值。
建议配置一个能池化连接的 DataSource,例如 Universal Connection Pool 或 Hikari。连接池可避免反复创建新数据库连接的延迟。
如果你的数据库中已存在嵌入表,请提供表名。
java
EmbeddingStore embeddingStore = OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable("my_embedding_table")
.build();1
2
3
4
2
3
4
如果该表尚不存在,可以通过向 builder 传入一个 CreateOption 来创建它。
java
EmbeddingStore embeddingStore = OracleEmbeddingStore.builder()
.dataSource(myDataSource)
.embeddingTable("my_embedding_table", CreateOption.CREATE_IF_NOT_EXISTS)
.build();1
2
3
4
2
3
4
默认情况下,嵌入表会有以下列:
| 名称 | 类型 | 描述 |
|---|---|---|
| id | VARCHAR(36) | 主键。用于存储 UUID 字符串,这些字符串在嵌入存储时生成 |
| embedding | VECTOR(*, FLOAT32) | 存储嵌入 |
| text | CLOB | 存储文本片段 |
| metadata | JSON | 存储元数据 |
如果你现有表的列与预定义的列名不匹配, 或你想使用不同的列名,可以使用一个 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();1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
该 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();1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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();1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
关于 Oracle AI Vector Search 的更多信息,参见文档。
聊天记忆
OracleChatMemoryStore 可用于在 Oracle Database 中持久化聊天记忆。
创建一张表:
sql
CREATE TABLE chat_memory (
memory_id VARCHAR2(255) PRIMARY KEY,
content CLOB NOT NULL
);1
2
3
4
2
3
4
在聊天记忆中使用它:
java
ChatMemoryStore store = OracleChatMemoryStore.builder()
.dataSource(myDataSource)
.tableName("chat_memory")
.build();
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.id("conversation-1")
.maxMessages(10)
.chatMemoryStore(store)
.build();1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
OracleChatMemoryStore 为每个 memory id 存储一行,将所有消息以 JSON 序列化后存入 content 列。