diff --git a/langchain4j-weaviate/pom.xml b/langchain4j-weaviate/pom.xml index 474222e5a..3fcf2f510 100644 --- a/langchain4j-weaviate/pom.xml +++ b/langchain4j-weaviate/pom.xml @@ -44,6 +44,14 @@ 1.16.0 + + dev.langchain4j + langchain4j-core + tests + test-jar + test + + org.junit.jupiter junit-jupiter-engine diff --git a/langchain4j-weaviate/src/test/java/dev/langchain4j/store/embedding/weaviate/WeaviateEmbeddingStoreIT.java b/langchain4j-weaviate/src/test/java/dev/langchain4j/store/embedding/weaviate/WeaviateEmbeddingStoreIT.java index 271855c8a..be02e8245 100644 --- a/langchain4j-weaviate/src/test/java/dev/langchain4j/store/embedding/weaviate/WeaviateEmbeddingStoreIT.java +++ b/langchain4j-weaviate/src/test/java/dev/langchain4j/store/embedding/weaviate/WeaviateEmbeddingStoreIT.java @@ -1,209 +1,38 @@ package dev.langchain4j.store.embedding.weaviate; -import dev.langchain4j.data.embedding.Embedding; import dev.langchain4j.data.segment.TextSegment; import dev.langchain4j.model.embedding.AllMiniLmL6V2QuantizedEmbeddingModel; import dev.langchain4j.model.embedding.EmbeddingModel; -import dev.langchain4j.store.embedding.CosineSimilarity; -import dev.langchain4j.store.embedding.EmbeddingMatch; import dev.langchain4j.store.embedding.EmbeddingStore; -import dev.langchain4j.store.embedding.RelevanceScore; -import org.junit.jupiter.api.Test; +import dev.langchain4j.store.embedding.EmbeddingStoreWithoutMetadataIT; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; -import java.util.List; - import static dev.langchain4j.internal.Utils.randomUUID; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.data.Percentage.withPercentage; @EnabledIfEnvironmentVariable(named = "WEAVIATE_API_KEY", matches = ".+") -class WeaviateEmbeddingStoreIT { +class WeaviateEmbeddingStoreIT extends EmbeddingStoreWithoutMetadataIT { EmbeddingStore embeddingStore = WeaviateEmbeddingStore.builder() .apiKey(System.getenv("WEAVIATE_API_KEY")) .scheme("https") - .host("test3-bwsieg9y.weaviate.network") + .host("test-am8ocede.weaviate.network") .objectClass("Test" + randomUUID().replace("-", "")) .build(); EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel(); - @Test - void should_add_embedding() { - - Embedding embedding = embeddingModel.embed(randomUUID()).content(); - - String id = embeddingStore.add(embedding); - assertThat(id).isNotNull(); - - List> relevant = embeddingStore.findRelevant(embedding, 10); - assertThat(relevant).hasSize(1); - - EmbeddingMatch match = relevant.get(0); - assertThat(match.score()).isCloseTo(1, withPercentage(1)); - assertThat(match.embeddingId()).isEqualTo(id); - assertThat(match.embedding()).isEqualTo(embedding); - assertThat(match.embedded()).isNull(); + @Override + protected EmbeddingStore embeddingStore() { + return embeddingStore; } - @Test - void should_add_embedding_with_id() { - - String id = randomUUID(); - Embedding embedding = embeddingModel.embed(randomUUID()).content(); - - embeddingStore.add(id, embedding); - - List> relevant = embeddingStore.findRelevant(embedding, 10); - assertThat(relevant).hasSize(1); - - EmbeddingMatch match = relevant.get(0); - assertThat(match.score()).isCloseTo(1, withPercentage(1)); - assertThat(match.embeddingId()).isEqualTo(id); - assertThat(match.embedding()).isEqualTo(embedding); - assertThat(match.embedded()).isNull(); + @Override + protected EmbeddingModel embeddingModel() { + return embeddingModel; } - @Test - void should_add_embedding_with_segment() { - - TextSegment segment = TextSegment.from(randomUUID()); - Embedding embedding = embeddingModel.embed(segment.text()).content(); - - String id = embeddingStore.add(embedding, segment); - assertThat(id).isNotNull(); - - List> relevant = embeddingStore.findRelevant(embedding, 10); - assertThat(relevant).hasSize(1); - - EmbeddingMatch match = relevant.get(0); - assertThat(match.score()).isCloseTo(1, withPercentage(1)); - assertThat(match.embeddingId()).isEqualTo(id); - assertThat(match.embedding()).isEqualTo(embedding); - assertThat(match.embedded()).isEqualTo(segment); - } - - @Test - void should_add_multiple_embeddings() { - - Embedding firstEmbedding = embeddingModel.embed(randomUUID()).content(); - Embedding secondEmbedding = embeddingModel.embed(randomUUID()).content(); - - List ids = embeddingStore.addAll(asList(firstEmbedding, secondEmbedding)); - assertThat(ids).hasSize(2); - - List> relevant = embeddingStore.findRelevant(firstEmbedding, 10); - assertThat(relevant).hasSize(2); - - EmbeddingMatch firstMatch = relevant.get(0); - assertThat(firstMatch.score()).isCloseTo(1, withPercentage(1)); - assertThat(firstMatch.embeddingId()).isEqualTo(ids.get(0)); - assertThat(firstMatch.embedding()).isEqualTo(firstEmbedding); - assertThat(firstMatch.embedded()).isNull(); - - EmbeddingMatch secondMatch = relevant.get(1); - assertThat(secondMatch.score()).isBetween(0d, 1d); - assertThat(secondMatch.embeddingId()).isEqualTo(ids.get(1)); - assertThat(secondMatch.embedding()).isEqualTo(secondEmbedding); - assertThat(secondMatch.embedded()).isNull(); - } - - @Test - void should_add_multiple_embeddings_with_segments() { - - TextSegment firstSegment = TextSegment.from(randomUUID()); - Embedding firstEmbedding = embeddingModel.embed(firstSegment.text()).content(); - TextSegment secondSegment = TextSegment.from(randomUUID()); - Embedding secondEmbedding = embeddingModel.embed(secondSegment.text()).content(); - - List ids = embeddingStore.addAll( - asList(firstEmbedding, secondEmbedding), - asList(firstSegment, secondSegment) - ); - assertThat(ids).hasSize(2); - - List> relevant = embeddingStore.findRelevant(firstEmbedding, 10); - assertThat(relevant).hasSize(2); - - EmbeddingMatch firstMatch = relevant.get(0); - assertThat(firstMatch.score()).isCloseTo(1, withPercentage(1)); - assertThat(firstMatch.embeddingId()).isEqualTo(ids.get(0)); - assertThat(firstMatch.embedding()).isEqualTo(firstEmbedding); - assertThat(firstMatch.embedded()).isEqualTo(firstSegment); - - EmbeddingMatch secondMatch = relevant.get(1); - assertThat(secondMatch.score()).isBetween(0d, 1d); - assertThat(secondMatch.embeddingId()).isEqualTo(ids.get(1)); - assertThat(secondMatch.embedding()).isEqualTo(secondEmbedding); - assertThat(secondMatch.embedded()).isEqualTo(secondSegment); - } - - @Test - void should_find_with_min_score() { - - String firstId = randomUUID(); - Embedding firstEmbedding = embeddingModel.embed(randomUUID()).content(); - embeddingStore.add(firstId, firstEmbedding); - - String secondId = randomUUID(); - Embedding secondEmbedding = embeddingModel.embed(randomUUID()).content(); - embeddingStore.add(secondId, secondEmbedding); - - List> relevant = embeddingStore.findRelevant(firstEmbedding, 10); - assertThat(relevant).hasSize(2); - EmbeddingMatch firstMatch = relevant.get(0); - assertThat(firstMatch.score()).isCloseTo(1, withPercentage(1)); - assertThat(firstMatch.embeddingId()).isEqualTo(firstId); - EmbeddingMatch secondMatch = relevant.get(1); - assertThat(secondMatch.score()).isBetween(0d, 1d); - assertThat(secondMatch.embeddingId()).isEqualTo(secondId); - - List> relevant2 = embeddingStore.findRelevant( - firstEmbedding, - 10, - secondMatch.score() - 0.01 - ); - assertThat(relevant2).hasSize(2); - assertThat(relevant2.get(0).embeddingId()).isEqualTo(firstId); - assertThat(relevant2.get(1).embeddingId()).isEqualTo(secondId); - - List> relevant3 = embeddingStore.findRelevant( - firstEmbedding, - 10, - secondMatch.score() - ); - assertThat(relevant3).hasSize(2); - assertThat(relevant3.get(0).embeddingId()).isEqualTo(firstId); - assertThat(relevant3.get(1).embeddingId()).isEqualTo(secondId); - - List> relevant4 = embeddingStore.findRelevant( - firstEmbedding, - 10, - secondMatch.score() + 0.01 - ); - assertThat(relevant4).hasSize(1); - assertThat(relevant4.get(0).embeddingId()).isEqualTo(firstId); - } - - @Test - void should_return_correct_score() { - - Embedding embedding = embeddingModel.embed("hello").content(); - - String id = embeddingStore.add(embedding); - assertThat(id).isNotNull(); - - Embedding referenceEmbedding = embeddingModel.embed("hi").content(); - - List> relevant = embeddingStore.findRelevant(referenceEmbedding, 1); - assertThat(relevant).hasSize(1); - - EmbeddingMatch match = relevant.get(0); - assertThat(match.score()).isCloseTo( - RelevanceScore.fromCosineSimilarity(CosineSimilarity.between(embedding, referenceEmbedding)), - withPercentage(1) - ); + @Override + protected void ensureStoreIsEmpty() { + // TODO fix } } \ No newline at end of file