Couchbase
Maven 依赖
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-couchbase</artifactId>
<version>1.0.0-beta3</version>
</dependency>
API
CouchbaseEmbeddingStore
示例
Couchbase 嵌入存储
Couchbase langchain4j 集成将每个嵌入存储在单独的文档中,并使用 FTS 向量索引对存储的向量执行查询。目前,它支持存储嵌入及其元数据,以及移除嵌入。在编写本教程时,尚不支持通过元数据过滤向量搜索选择的嵌入。请注意,嵌入存储集成仍在积极开发中,它附带的默认配置不建议用于生产环境。
连接到 Couchbase 集群
可以使用构建器类初始化 couchbase 嵌入存储。初始化需要以下参数:
- 集群连接字符串
- 集群用户名
- 集群密码
- 应存储嵌入的存储桶名称
- 应存储嵌入的作用域名称
- 应存储嵌入的集合名称
- 嵌入存储要使用的 FTS 向量索引名称
- 要存储的向量的维度(长度)
以下示例代码说明了如何初始化连接到本地运行的 Couchbase 服务器的嵌入存储:
CouchbaseEmbeddingStore embeddingStore = CouchbaseEmbeddingStore.builder()
.clusterUrl("localhost:8091")
.username("Administrator")
.password("password")
.bucketName("langchain4j")
.scopeName("_default")
.collectionName("_default")
.searchIndexName("test")
.dimensions(512)
.build();
示例源代码使用 testcontainers 库启动专用的 Couchbase 服务器:
CouchbaseContainer couchbaseContainer =
new CouchbaseContainer(DockerImageName.parse("couchbase:enterprise").asCompatibleSubstituteFor("couchbase/server"))
.withCredentials("Administrator", "password")
.withBucket(testBucketDefinition)
.withStartupTimeout(Duration.ofMinutes(1));
CouchbaseEmbeddingStore embeddingStore = CouchbaseEmbeddingStore.builder()
.clusterUrl(couchbaseContainer.getConnectionString())
.username(couchbaseContainer.getUsername())
.password(couchbaseContainer.getPassword())
.bucketName(testBucketDefinition.getName())
.scopeName("_default")
.collectionName("_default")
.searchIndexName("test")
.build();
向量索引
嵌入存储使用 FTS 向量索引来执行向量相似度查找。如果提供了集群上不存在的向量索引名 称,存储将尝试根据提供的初始化设置创建具有默认配置的新索引。建议手动检查创建的索引的设置,并根据特定用例进行调整。有关向量搜索和 FTS 索引配置的更多信息,请参见 Couchbase 文档。
嵌入文档
该集成自动为所有存储的嵌入分配基于 UUID 的唯一标识符。以下是嵌入文档的示例(为了可读性,向量字段值被截断):
{
"id": "f4831648-07ca-4c77-a031-75acb6c1cf2f",
"vector": [
...
0.037255168,
-0.001608681
],
"text": "text",
"metadata": {
"some": "value"
},
"score": 0
}
这些嵌入是由开发人员选择的嵌入模型生成的,生成的向量值是特定于模型的。
在 Couchbase 中存储嵌入
使用嵌入模型生成的嵌入可以使用 CouchbaseEmbeddingStore 类的 add 和 addAll 方法存储在 couchbase 中:
EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel();
TextSegment segment1 = TextSegment.from("I like football.");
Embedding embedding1 = embeddingModel.embed(segment1).content();
embeddingStore.add(embedding1, segment1);
TextSegment segment2 = TextSegment.from("The weather is good today.");
Embedding embedding2 = embeddingModel.embed(segment2).content();
embeddingStore.add(embedding2, segment2);
Thread.sleep(1000); // 确保嵌入已被持久化
查询相关嵌入
将一些嵌入添加到存储后,可以使用查询向量在存储中查找与之相关的嵌入。 在这里,我们使用嵌入模型为短语"what is your favorite sport?"生成一个向量。然后使用获得的向量在数据库中查找最相关的答案:
Embedding queryEmbedding = embeddingModel.embed("What is your favourite sport?").content();
EmbeddingSearchRequest searchRequest = EmbeddingSearchRequest.builder()
.queryEmbedding(queryEmbedding)
.maxResults(1)
.build();
EmbeddingSearchResult<TextSegment> searchResult = embeddingStore.search(searchRequest);
EmbeddingMatch<TextSegment> embeddingMatch = searchResult.matches().get(0);
然后可以将所选答案的相关性分数和文本打印到应用程序输出:
System.out.println(embeddingMatch.score()); // 0.81442887
System.out.println(embeddingMatch.embedded().text()); // I like football.
删除嵌入
Couchbase 嵌入存储还支持通过其标识符移除嵌入,例如:
embeddingStore.remove(embeddingMatch.id())
或者,要移除所有嵌入:
embeddingStore.removeAll();