|
1 | 1 | import dev.langchain4j.community.store.embedding.neo4j.Neo4jEmbeddingStore;
|
| 2 | +import dev.langchain4j.data.document.Metadata; |
2 | 3 | import dev.langchain4j.data.embedding.Embedding;
|
3 | 4 | import dev.langchain4j.data.segment.TextSegment;
|
4 | 5 | import dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel;
|
|
12 | 13 |
|
13 | 14 | public class Neo4jEmbeddingStoreExample {
|
14 | 15 |
|
| 16 | + private static EmbeddingStore<TextSegment> minimalEmbedding; |
| 17 | + private static final EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); |
| 18 | + |
15 | 19 | public static void main(String[] args) {
|
16 |
| - try (Neo4jContainer<?> neo4j = new Neo4jContainer<>("neo4j:5")) { |
| 20 | + try (Neo4jContainer<?> neo4j = new Neo4jContainer<>("neo4j:5.26")) { |
17 | 21 | neo4j.start();
|
| 22 | + minimalEmbedding = Neo4jEmbeddingStore.builder() |
| 23 | + .withBasicAuth(neo4j.getBoltUrl(), "neo4j", neo4j.getAdminPassword()) |
| 24 | + .dimension(embeddingModel.dimension()) |
| 25 | + .build(); |
18 | 26 |
|
19 |
| - EmbeddingModel embeddingModel = new AllMiniLmL6V2EmbeddingModel(); |
20 |
| - |
21 |
| - EmbeddingStore<TextSegment> embeddingStore = Neo4jEmbeddingStore.builder() |
| 27 | + searchEmbeddingsWithSingleMaxResult(minimalEmbedding); |
| 28 | + searchEmbeddingsWithAddAllAndSingleMaxResult(); |
| 29 | + searchEmbeddingsWithAddAllWithMetadataMaxResultsAndMinScore(); |
| 30 | + |
| 31 | + // custom embeddingStore |
| 32 | + Neo4jEmbeddingStore customEmbeddingStore = Neo4jEmbeddingStore.builder() |
22 | 33 | .withBasicAuth(neo4j.getBoltUrl(), "neo4j", neo4j.getAdminPassword())
|
23 | 34 | .dimension(embeddingModel.dimension())
|
| 35 | + .indexName("customidx") |
| 36 | + .label("CustomLabel") |
| 37 | + .embeddingProperty("customProp") |
| 38 | + .idProperty("customId") |
| 39 | + .textProperty("customText") |
24 | 40 | .build();
|
| 41 | + searchEmbeddingsWithSingleMaxResult(customEmbeddingStore); |
| 42 | + } |
| 43 | + } |
25 | 44 |
|
26 |
| - TextSegment segment1 = TextSegment.from("I like football."); |
27 |
| - Embedding embedding1 = embeddingModel.embed(segment1).content(); |
28 |
| - embeddingStore.add(embedding1, segment1); |
| 45 | + private static void searchEmbeddingsWithSingleMaxResult(EmbeddingStore<TextSegment> minimalEmbedding) { |
| 46 | + |
| 47 | + TextSegment segment1 = TextSegment.from("I like football."); |
| 48 | + Embedding embedding1 = embeddingModel.embed(segment1).content(); |
| 49 | + minimalEmbedding.add(embedding1, segment1); |
29 | 50 |
|
30 |
| - TextSegment segment2 = TextSegment.from("The weather is good today."); |
31 |
| - Embedding embedding2 = embeddingModel.embed(segment2).content(); |
32 |
| - embeddingStore.add(embedding2, segment2); |
| 51 | + TextSegment segment2 = TextSegment.from("The weather is good today."); |
| 52 | + Embedding embedding2 = embeddingModel.embed(segment2).content(); |
| 53 | + minimalEmbedding.add(embedding2, segment2); |
33 | 54 |
|
34 |
| - Embedding queryEmbedding = embeddingModel.embed("What is your favourite sport?").content(); |
35 |
| - EmbeddingSearchRequest embeddingSearchRequest = EmbeddingSearchRequest.builder() |
36 |
| - .queryEmbedding(queryEmbedding) |
37 |
| - .maxResults(1) |
38 |
| - .build(); |
39 |
| - List<EmbeddingMatch<TextSegment>> matches = embeddingStore.search(embeddingSearchRequest).matches(); |
40 |
| - EmbeddingMatch<TextSegment> embeddingMatch = matches.get(0); |
| 55 | + Embedding queryEmbedding = embeddingModel.embed("What is your favourite sport?").content(); |
| 56 | + final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder() |
| 57 | + .queryEmbedding(queryEmbedding) |
| 58 | + .maxResults(1) |
| 59 | + .build(); |
| 60 | + List<EmbeddingMatch<TextSegment>> relevant = minimalEmbedding.search(request).matches(); |
| 61 | + EmbeddingMatch<TextSegment> embeddingMatch = relevant.get(0); |
41 | 62 |
|
42 |
| - System.out.println(embeddingMatch.score()); // 0.8144289255142212 |
43 |
| - System.out.println(embeddingMatch.embedded().text()); // I like football. |
44 |
| - } |
| 63 | + System.out.println(embeddingMatch.score()); // 0.8144289255142212 |
| 64 | + System.out.println(embeddingMatch.embedded().text()); // I like football. |
| 65 | + } |
| 66 | + |
| 67 | + private static void searchEmbeddingsWithAddAllAndSingleMaxResult() { |
| 68 | + |
| 69 | + TextSegment segment1 = TextSegment.from("I like football."); |
| 70 | + Embedding embedding1 = embeddingModel.embed(segment1).content(); |
| 71 | + |
| 72 | + TextSegment segment2 = TextSegment.from("The weather is good today."); |
| 73 | + Embedding embedding2 = embeddingModel.embed(segment2).content(); |
| 74 | + |
| 75 | + TextSegment segment3 = TextSegment.from("I like basketball."); |
| 76 | + Embedding embedding3 = embeddingModel.embed(segment3).content(); |
| 77 | + minimalEmbedding.addAll( |
| 78 | + List.of(embedding1, embedding2, embedding3), |
| 79 | + List.of(segment1, segment2, segment3) |
| 80 | + ); |
| 81 | + |
| 82 | + Embedding queryEmbedding = embeddingModel.embed("What are your favourites sport?").content(); |
| 83 | + final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder() |
| 84 | + .queryEmbedding(queryEmbedding) |
| 85 | + .maxResults(1) |
| 86 | + .build(); |
| 87 | + List<EmbeddingMatch<TextSegment>> relevant = minimalEmbedding.search(request).matches(); |
| 88 | + |
| 89 | + relevant.forEach(match -> { |
| 90 | + System.out.println(match.score()); // 0.8144289255142212 |
| 91 | + System.out.println(match.embedded().text()); // I like football. || I like basketball. |
| 92 | + }); |
| 93 | + |
| 94 | + } |
| 95 | + |
| 96 | + private static void searchEmbeddingsWithAddAllWithMetadataMaxResultsAndMinScore() { |
| 97 | + |
| 98 | + TextSegment segment1 = TextSegment.from("I like football.", Metadata.from("test-key-1", "test-value-1")); |
| 99 | + Embedding embedding1 = embeddingModel.embed(segment1).content(); |
| 100 | + |
| 101 | + TextSegment segment2 = TextSegment.from("The weather is good today.", Metadata.from("test-key-2", "test-value-2")); |
| 102 | + Embedding embedding2 = embeddingModel.embed(segment2).content(); |
| 103 | + |
| 104 | + TextSegment segment3 = TextSegment.from("I like basketball.", Metadata.from("test-key-3", "test-value-3")); |
| 105 | + Embedding embedding3 = embeddingModel.embed(segment3).content(); |
| 106 | + minimalEmbedding.addAll( |
| 107 | + List.of(embedding1, embedding2, embedding3), |
| 108 | + List.of(segment1, segment2, segment3) |
| 109 | + ); |
| 110 | + |
| 111 | + Embedding queryEmbedding = embeddingModel.embed("What are your favourite sports?").content(); |
| 112 | + final EmbeddingSearchRequest request = EmbeddingSearchRequest.builder() |
| 113 | + .queryEmbedding(queryEmbedding) |
| 114 | + .maxResults(2) |
| 115 | + .minScore(0.15) |
| 116 | + .build(); |
| 117 | + List<EmbeddingMatch<TextSegment>> relevant = minimalEmbedding.search(request).matches(); |
| 118 | + relevant.forEach(match -> { |
| 119 | + System.out.println(match.score()); // 0.8144289255142212 |
| 120 | + System.out.println(match.embedded().text()); // I like football. || I like basketball. |
| 121 | + }); |
45 | 122 | }
|
46 | 123 | }
|
0 commit comments