diff --git a/pom.xml b/pom.xml index 6f000e45e463..714702c183ce 100644 --- a/pom.xml +++ b/pom.xml @@ -761,7 +761,7 @@ spring-actuator spring-ai spring-ai-2 - spring-ai-3 + spring-ai-3 spring-aop spring-aop-2 spring-batch @@ -1150,7 +1150,7 @@ spring-actuator spring-ai spring-ai-2 - spring-ai-3 + spring-ai-3 spring-aop spring-aop-2 spring-batch diff --git a/spring-ai-2/README.md b/spring-ai-2/README.md new file mode 100644 index 000000000000..512b64d9b27e --- /dev/null +++ b/spring-ai-2/README.md @@ -0,0 +1,2 @@ +## Relevant Articles + diff --git a/spring-ai-3/README.md b/spring-ai-3/README.md new file mode 100644 index 000000000000..ae92e6521af1 --- /dev/null +++ b/spring-ai-3/README.md @@ -0,0 +1,2 @@ +## Relevant Articles +- [Building a RAG App Using MongoDB and Spring AI](https://www.baeldung.com/spring-ai-mongodb-rag) diff --git a/spring-ai-3/docker-compose.yml b/spring-ai-3/docker-compose.yml new file mode 100644 index 000000000000..2b4b28761035 --- /dev/null +++ b/spring-ai-3/docker-compose.yml @@ -0,0 +1,29 @@ +services: + postgres: + image: pgvector/pgvector:pg17 + environment: + POSTGRES_DB: vectordb + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + ports: + - "5434:5432" + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U postgres" ] + interval: 10s + timeout: 5s + retries: 5 + + ollama: + image: ollama/ollama:latest + ports: + - "11435:11434" + volumes: + - ollama_data:/root/.ollama + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:11435/api/health" ] + interval: 10s + timeout: 5s + retries: 10 + +volumes: + ollama_data: \ No newline at end of file diff --git a/spring-ai-3/pom.xml b/spring-ai-3/pom.xml index 33ecbf36265f..6070046f9d00 100644 --- a/spring-ai-3/pom.xml +++ b/spring-ai-3/pom.xml @@ -26,15 +26,72 @@ + + + + org.springframework.ai + spring-ai-bom + ${spring-ai.version} + pom + import + + + + org.springframework.boot spring-boot-starter-web + + org.springframework.ai + spring-ai-markdown-document-reader + + + org.springframework.ai + spring-ai-mcp-client-spring-boot-starter + + + org.springframework.ai + spring-ai-mcp-server-webmvc-spring-boot-starter + + + org.springframework.ai + spring-ai-ollama-spring-boot-starter + + + org.springframework.ai + spring-ai-chroma-store-spring-boot-starter + + + org.springframework.ai + spring-ai-anthropic-spring-boot-starter + + + org.springframework.ai + spring-ai-bedrock-converse-spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.ai + spring-ai-openai-spring-boot-starter + + + org.hsqldb + hsqldb + runtime + + + org.springframework.ai + spring-ai-pgvector-store-spring-boot-starter + org.springframework.ai spring-ai-starter-model-openai - ${spring-ai.version} + ${spring-ai-start-model-openai.version} @@ -43,14 +100,99 @@ spring-boot-starter-test test + + org.springframework.ai + spring-ai-spring-boot-testcontainers + test + + + org.testcontainers + chromadb + test + + + org.testcontainers + ollama + test + + + org.springframework.boot + spring-boot-docker-compose + ${spring-boot-docker-compose.version} + + + org.springframework.ai + spring-ai-starter-vector-store-mongodb-atlas + ${spring-ai-mongodb-atlas.version} + - transcribe + chromadb true + + com.baeldung.springai.chromadb.Application + + + + assistant + + com.baeldung.spring.ai.om.OrderManagementApplication + + + + anthropic + + com.baeldung.springai.anthropic.Application + + + + deepseek + + com.baeldung.springai.deepseek.Application + + + + evaluator + + com.baeldung.springai.evaluator.Application + + + + hugging-face + + com.baeldung.springai.huggingface.Application + + + + mcp-server + + com.baeldung.springai.mcp.server.ServerApplication + + + + mcp-client + + com.baeldung.springai.mcp.client.ClientApplication + + + + amazon-nova + + com.baeldung.springai.nova.Application + + + + pgvector + + com.baeldung.springai.semanticsearch.Application + + + + transcribe com.baeldung.springai.transcribe.Application @@ -77,8 +219,12 @@ + 1.0.0-M7 + 5.9.0 + 3.1.1 3.4.5 - 1.0.0-M7 + 1.0.0-M6 + 1.0.0-M7 - \ No newline at end of file + diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java similarity index 95% rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java index 4571dfc5fb6a..2b0190d52985 100644 --- a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java +++ b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/configuration/AdvisorConfiguration.java @@ -11,6 +11,6 @@ public class AdvisorConfiguration { @Bean public QuestionAnswerAdvisor questionAnswerAdvisor(VectorStore vectorStore) { - return new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()); + return new QuestionAnswerAdvisor(vectorStore, SearchRequest.builder().build()); } } diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java similarity index 100% rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/controller/WikiDocumentsController.java diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java similarity index 100% rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/dto/WikiDocument.java diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java similarity index 89% rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java index afde24ff5a51..89cb9a568137 100644 --- a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java +++ b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/repository/WikiDocumentsRepository.java @@ -33,16 +33,16 @@ public void saveWikiDocument(WikiDocument wikiDocument) { public List findSimilarDocuments(String searchText) { return vectorStore - .similaritySearch(SearchRequest + .similaritySearch(SearchRequest.builder() .query(searchText) - .withSimilarityThreshold(0.87) - .withTopK(10)) + .similarityThreshold(0.87) + .topK(10).build()) .stream() .map(document -> { WikiDocument wikiDocument = new WikiDocument(); wikiDocument.setFilePath((String) document .getMetadata().get("filePath")); - wikiDocument.setContent(document.getContent()); + wikiDocument.setContent(document.getText()); return wikiDocument; }) diff --git a/spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java b/spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java similarity index 100% rename from spring-ai/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java rename to spring-ai-3/src/main/java/com/baeldung/springai/rag/mongodb/service/WikiDocumentsServiceImpl.java diff --git a/spring-ai/src/test/docker/mongodb/docker-compose.yml b/spring-ai-3/src/test/docker/mongodb/docker-compose.yml similarity index 100% rename from spring-ai/src/test/docker/mongodb/docker-compose.yml rename to spring-ai-3/src/test/docker/mongodb/docker-compose.yml diff --git a/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java b/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java similarity index 100% rename from spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java rename to spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/RAGMongoDBApplicationManualTest.java diff --git a/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java b/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java new file mode 100644 index 000000000000..eee28c92f967 --- /dev/null +++ b/spring-ai-3/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java @@ -0,0 +1,25 @@ +package com.baeldung.springai.rag.mongodb.config; + +import org.springframework.ai.autoconfigure.vectorstore.mongo.MongoDBAtlasVectorStoreProperties; +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.mongodb.atlas.MongoDBAtlasVectorStore; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.core.MongoTemplate; + +@Configuration +public class VectorStoreConfig { + @Bean + public MongoDBAtlasVectorStore vectorStore(MongoTemplate mongoTemplate, + @Qualifier("openAiEmbeddingModel") EmbeddingModel embeddingModel, + MongoDBAtlasVectorStoreProperties properties) { + + return MongoDBAtlasVectorStore.builder(mongoTemplate, embeddingModel) + .collectionName(properties.getCollectionName()) + .pathName(properties.getPathName()) + .vectorIndexName(properties.getIndexName()) + .initializeSchema(properties.isInitializeSchema()) + .build(); + } +} diff --git a/spring-ai/src/test/resources/application.yml b/spring-ai-3/src/test/resources/application.yml similarity index 100% rename from spring-ai/src/test/resources/application.yml rename to spring-ai-3/src/test/resources/application.yml diff --git a/spring-ai/README.md b/spring-ai/README.md index 873cbd9da898..5db6224d8faf 100644 --- a/spring-ai/README.md +++ b/spring-ai/README.md @@ -1,7 +1,6 @@ ## Relevant Articles - [Introduction to Spring AI](https://www.baeldung.com/spring-ai) - [A Guide to Structured Output in Spring AI](https://www.baeldung.com/spring-artificial-intelligence-structure-output) -- [Building a RAG App Using MongoDB and Spring AI](https://www.baeldung.com/spring-ai-mongodb-rag) - [Create a RAG (Retrieval Augmented Generation) Application with Redis and Spring AI](https://www.baeldung.com/spring-ai-redis-rag-app) - [Create a ChatGPT Like Chatbot With Ollama and Spring AI](https://www.baeldung.com/spring-ai-ollama-chatgpt-like-chatbot) - [Function Calling in Java and Spring AI Using the Mistral AI API](https://www.baeldung.com/spring-ai-mistral-api-function-calling) diff --git a/spring-ai/pom.xml b/spring-ai/pom.xml index e2e97bfc2f84..6d068c0db336 100644 --- a/spring-ai/pom.xml +++ b/spring-ai/pom.xml @@ -78,10 +78,6 @@ org.springframework.ai spring-ai-pdf-document-reader - - org.springframework.ai - spring-ai-mongodb-atlas-store-spring-boot-starter - org.springframework.ai spring-ai-ollama-spring-boot-starter diff --git a/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java b/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java deleted file mode 100644 index 3cdcc26a22e2..000000000000 --- a/spring-ai/src/test/java/com/baeldung/springai/rag/mongodb/config/VectorStoreConfig.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.springai.rag.mongodb.config; - -import org.springframework.ai.autoconfigure.vectorstore.mongo.MongoDBAtlasVectorStoreProperties; -import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.vectorstore.MongoDBAtlasVectorStore; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.mongodb.core.MongoTemplate; -import org.springframework.util.StringUtils; - -@Configuration -public class VectorStoreConfig { - @Bean - public MongoDBAtlasVectorStore vectorStore(MongoTemplate mongoTemplate, - @Qualifier("openAiEmbeddingModel") EmbeddingModel embeddingModel, - MongoDBAtlasVectorStoreProperties properties) { - MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.Builder builder = MongoDBAtlasVectorStore.MongoDBVectorStoreConfig.builder(); - if (StringUtils.hasText(properties.getCollectionName())) { - builder.withCollectionName(properties.getCollectionName()); - } - - if (StringUtils.hasText(properties.getPathName())) { - builder.withPathName(properties.getPathName()); - } - - if (StringUtils.hasText(properties.getIndexName())) { - builder.withVectorIndexName(properties.getIndexName()); - } - - MongoDBAtlasVectorStore.MongoDBVectorStoreConfig config = builder.build(); - return new MongoDBAtlasVectorStore(mongoTemplate, embeddingModel, config, properties.isInitializeSchema()); - } -}