主题
Chroma
Maven 依赖
xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-chroma</artifactId>
<version>1.22.0-beta32</version>
</dependency>1
2
3
4
5
2
3
4
5
API
ChromaEmbeddingStore
示例
支持的 API 版本
Chroma 有多个 REST API 版本:
- 直到 0.5.16 版本:仅支持 API V1
- 0.5.16 到 0.6.3 版本:支持 API V1 和 V2(V1 API 在 0.6.2 前后引入了一些 bug)
- 0.7.0 之后的版本:仅支持 API V2,因此你需要选择正确的版本 在配置
ChromaEmbeddingStore时:
java
ChromaEmbeddingStore.builder()
.apiVersion(ChromaApiVersion.V2)
.baseUrl(...)
.tenantName(...)
.databaseName(...)
.collectionName(...)
.build();1
2
3
4
5
6
7
2
3
4
5
6
7
距离度量
创建 Chroma 集合时会指定一个距离度量,它决定如何衡量两个嵌入之间的距离。Chroma 支持 cosine、l2(平方欧氏)与 ip(内积),除非另行请求,否则默认使用 l2。
当 ChromaEmbeddingStore 创建集合时,它以 cosine 距离度量创建。 当集合已存在时,则按其创建时所用的距离度量原样使用:
java
ChromaEmbeddingStore store = ChromaEmbeddingStore.builder()
.baseUrl("http://localhost:8000")
.collectionName("my-collection")
.build();1
2
3
4
2
3
4
EmbeddingMatch.score() 返回的相关性分数始终落在 [0, 1] 区间,1 表示最 相关。它由集合的距离度量推导而来,因此来自具有不同 距离度量的集合所得到的分数彼此不可比较。同样的道理也适用于 EmbeddingSearchRequest 的 minScore,它是与集合自身度量的分数相比较的。
对于 ip,只有当嵌入被归一化时分数才准确,而大多数嵌入模型都是如此。
当前限制
- Chroma 无法按字母数字元数据的大于/小于进行过滤,仅支持 int 和 float
- Chroma 的 not 过滤行为如下:如果你按 "key" 不等于 "a" 过滤, 那么实际上会返回所有 "key" != "a" 的条目,但不包含没有 "key" 元数据的条目!