跳到主要内容

Couchbase

https://www.couchbase.com/

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 类的 addaddAll 方法存储在 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();