序
本文主要研究一下如何使用langchain4j对接Chroma向量数据库
步骤
安装Chroma
docker run -d \
--name chromadb \
-p 8000:8000 \
-v "$(pwd)/chroma_data:/chroma/chroma" \
-e IS_PERSISTENT=TRUE \
-e ANONYMIZED_TELEMETRY=TRUE \
docker.1ms.run/chromadb/chroma:latest
pom.xml
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-chroma</artifactId>
<version>1.0.0-beta1</version>
</dependency>
example
public class JlamaChromaExample {
public static void main(String[] args) {
String chromaEndpoint = "http://localhost:8000";
EmbeddingStore<TextSegment> embeddingStore = ChromaEmbeddingStore
.builder()
.baseUrl(chromaEndpoint)
.collectionName("test1_collection")
.logRequests(true)
.logResponses(true)
.build();
EmbeddingModel embeddingModel = JlamaEmbeddingModel.builder()
.modelName("intfloat/e5-small-v2")
.build();
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);
Embedding queryEmbedding = embeddingModel.embed("What is your favourite sport?").content();
List<EmbeddingMatch<TextSegment>> relevant = embeddingStore.findRelevant(queryEmbedding, 1);
EmbeddingMatch<TextSegment> embeddingMatch = relevant.get(0);
System.out.println(embeddingMatch.score()); // 0.8144288493114709
System.out.println(embeddingMatch.embedded().text()); // I like football.
}
}
这里使用了Jlama提供的JlamaEmbeddingModel,官方示例的AllMiniLmL6V2EmbeddingModel在mac下会报错ai.djl.engine.EngineException: Unexpected flavor: cpu
输出如下
WARNING: Using incubator modules: jdk.incubator.vector
INFO c.g.tjake.jlama.model.AbstractModel - Model type = F32, Working memory type = F32, Quantized memory type = F32
WARN c.g.t.j.t.o.TensorOperationsProvider - Native operations not available. Consider adding 'com.github.tjake:jlama-native' to the classpath
INFO c.g.t.j.t.o.TensorOperationsProvider - Using Panama Vector Operations (OffHeap)
0.8279024262570531
I like football.
小结
langchain4j提供了langchain4j-chroma模块用于访问Chroma。需要注意的是
- Chroma无法根据字母数字元数据的大于或小于进行过滤,仅支持整数和浮点数。
- Chroma的过滤方式并非如下:如果你按“key”不等于“a”进行过滤,实际上会返回所有“key”值不等于“a”的记录,但不会返回没有“key”元数据的记录
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。