This Spring Boot, CLI, application demonstrates how to create an AI-powered chatbot with domain-specific knowledge (in this case, about Hurricane Milton) using Spring AI, Retrieval-Augmented Generation RAG and Conversational Memory.
Application uses the Hurricane_Milton wikipage saved as wikipedia-hurricane-milton-page.pdf
.
quick build run the app.
./mvnw clean install
./mvnw spring-boot:run
By default, this project uses OpenAI's Spring Boot starter (spring-ai-openai-spring-boot-starter
).
However, you can easily switch to any other supported AI model.
The pom.xml
file prvidew few alternative AI model dependencies. (Note: Most models, except Ollama/Llama3.2, require an API key for access.)
Configure your API key and other model properties in the application.properties
file.
The Chat Model API lists all supported modesl.
The project is configured to use Chroma (spring-ai-chroma-store-spring-boot-starter
) as a vector store, running locally:
A docker-compose.yaml
file is provided to start a local Chroma instance.
The project is configured with Spring Boot Docker Compose integration for easy setup. (e.g. you don't have to start the docker-compose manually).
Find more about Vector Stores
PDF document reading capability is enabled through the spring-ai-pdf-document-reader
dependency.
Find more about the Spring AI document indexing support
CommandLineRunner
created by the cli
Bean, is a Spring Boot interface for running code after the application context is loaded.
This is the entry point of our chatbot the application.
vectorStore.add(new TokenTextSplitter().split(new PagePdfDocumentReader(hurricaneDocs).read()));
This line reads a PDF document about Hurricane Milton, splits it into tokens, and adds it to a vector store. This is part of the RAG setup, allowing the chatbot to retrieve relevant information.
var chatClient = chatClientBuilder
.defaultSystem("You are useful assistant, expert in hurricanes.")
.defaultAdvisors(new MessageChatMemoryAdvisor(new InMemoryChatMemory()))
.defaultAdvisors(new QuestionAnswerAdvisor(vectorStore))
.build();
Here, a ChatClient
is built with the following configurations:
- A system prompt defining the assistant's role
- A
MessageChatMemoryAdvisor
for maintaining conversation history - A
QuestionAnswerAdvisor
that uses the vector store for RAG capabilities
try (Scanner scanner = new Scanner(System.in)) {
while (true) {
System.out.print("\nUSER: ");
System.out.println("\nASSISTANT: " +
chatClient.prompt(scanner.nextLine())
.call()
.content());
}
}
This creates an infinite loop that:
- Prompts the user for input
- Sends the user's input to the chatbot
- Prints the chatbot's response
The chatbot uses the configured ChatClient
, which incorporates the conversation history and RAG capabilities to generate responses.
- RAG Implementation: The application uses a vector store to implement RAG, allowing the chatbot to retrieve relevant information from the loaded document.
- Conversation Memory: The
MessageChatMemoryAdvisor
enables the chatbot to remember previous interactions within the conversation. - PDF Document Processing: The application can read and process PDF documents, making the information available to the chatbot.
- Interactive Console Interface: The application provides a simple console-based interface for interacting with the chatbot.