CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-springframework-ai--spring-ai-spring-boot-autoconfigure

Spring AI Spring Boot Auto Configuration modules providing automatic setup for AI models, vector stores, MCP, and retry capabilities

Overview
Eval results
Files

rag-pattern.mddocs/guides/

RAG Pattern Guide

Step-by-step guide for implementing Retrieval-Augmented Generation (RAG) with Spring AI.

What is RAG?

RAG combines:

  1. Retrieval: Finding relevant documents from a vector store
  2. Augmentation: Adding retrieved context to the prompt
  3. Generation: Using AI model to generate answer based on context

Basic RAG Implementation

Step 1: Add Dependencies

<dependencies>
    <!-- Chat model -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
        <version>1.1.2</version>
    </dependency>
    
    <!-- Vector store -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
        <version>1.1.2</version>
    </dependency>
</dependencies>

Step 2: Configure Components

# Chat model
spring.ai.openai.api-key=${OPENAI_API_KEY}
spring.ai.openai.chat.options.model=gpt-4

# Vector store
spring.ai.vectorstore.pgvector.initialize-schema=true
spring.ai.vectorstore.pgvector.index-type=HNSW
spring.datasource.url=jdbc:postgresql://localhost:5432/vectordb

Step 3: Implement RAG Service

@Service
public class RAGService {
    private final ChatClient chatClient;
    private final VectorStore vectorStore;
    
    public RAGService(
            ChatClient.Builder chatClientBuilder,
            VectorStore vectorStore) {
        this.chatClient = chatClientBuilder.build();
        this.vectorStore = vectorStore;
    }
    
    public String answerQuestion(String question) {
        // 1. Retrieve relevant documents
        List<Document> docs = vectorStore.similaritySearch(
            SearchRequest.query(question)
                .withTopK(3)
                .withSimilarityThreshold(0.7)
        );
        
        // 2. Build context
        String context = docs.stream()
            .map(Document::getContent)
            .collect(Collectors.joining("\n\n"));
        
        // 3. Generate answer
        return chatClient.prompt()
            .user("""
                Context: %s
                
                Question: %s
                
                Answer based on the context above:
                """.formatted(context, question))
            .call()
            .content();
    }
}

Step 4: Index Documents

@Service
public class DocumentIndexer {
    private final VectorStore vectorStore;
    private final TextSplitter textSplitter;
    
    public DocumentIndexer(VectorStore vectorStore) {
        this.vectorStore = vectorStore;
        this.textSplitter = new TokenTextSplitter(500, 100);
    }
    
    public void indexDocument(String content, Map<String, Object> metadata) {
        List<Document> chunks = textSplitter.apply(
            List.of(new Document(content, metadata))
        );
        
        vectorStore.add(chunks);
    }
}

Advanced RAG Patterns

Re-Ranking Results

public String answerWithReranking(String question) {
    // 1. Retrieve more candidates
    List<Document> candidates = vectorStore.similaritySearch(
        SearchRequest.query(question).withTopK(10)
    );
    
    // 2. Re-rank using AI
    List<Document> reranked = rerankDocuments(question, candidates);
    
    // 3. Use top results
    String context = reranked.stream()
        .limit(3)
        .map(Document::getContent)
        .collect(Collectors.joining("\n\n"));
    
    return generateAnswer(question, context);
}

Metadata Filtering

public String answerWithFilter(String question, String category) {
    List<Document> docs = vectorStore.similaritySearch(
        SearchRequest.query(question)
            .withTopK(5)
            .withFilterExpression(
                Filter.expression("category == '" + category + "'")
            )
    );
    
    // Generate answer from filtered docs
    return generateAnswer(question, buildContext(docs));
}

See Real-World RAG Examples →

Install with Tessl CLI

npx tessl i tessl/maven-org-springframework-ai--spring-ai-spring-boot-autoconfigure@1.1.0

docs

index.md

tile.json