Spring AI Embeddings Tutorial

author:Sai K



Introduction

Embeddings transform text into numerical arrays or vectors, enabling AI models to process and interpret

language data. This transformation from text to numbers and back is crucial for how AI interact with

and understands human languages. As a Java develpoer exploring AI, it's not necessary to comprehend the

intricate mathematical theories or the specific implementations behind these vector representation. A basic

understanding of their role and function within AI system suffices, particularly when you're intergrating

AI functionalities into your applications.


Emdeddings are particularly relevant in practical applications like the Retrieval Augmented Generation (RAG)

pattern. They represent data as points in a semantic space, where the proximity of points reflects similarity in

meaning.This aids in tasks like text classification,semantic search,and product recommendations, as it allows the

AI to discern and group related concepts based on their 'location ' in this expanded semantic landscape.

What are Spring AI Embeddings?

Embedding APIs can convert words, sentences, documents, or images into embeddings. An embedding is a

vector representation of these elements. For example:

  • word "Apple" might be represented as a vector [0.1, 0.2, 0.3, 0.4, 0.5].

  • A sentence "I love Apple" might be represented as a vector [0.1, 10.3, -10.2, 90.3, 2.4, -0.5].

Spring AI provides an EmbeddingClient interface to convert text or documents into embeddings.You can use

any of the supported EmbeddingClient implementations like OpenAiEmbeddingClient, OllamaEmbeddingClient,

AzureOpenAiEmbeddingClient,VertexAiEmbeddingClient,etc.

How to use Spring Ai Embeddings

1. Setting Up the Project

Step 1: Create a New Spring Boot Project

Use Spring Initializr to create a new Spring Boot project. Include dependencies for Spring Web and Spring AI.

Using Spring Initializr:

  • Go to start.spring.io

  • Select

    • Project: Maven Project

    • Language: Java

    • Spring Boot: 3.0.0 (or latest)

    • Dependencies: Spring Web

  • Generate the project and unzip it.

Step 2: Add Dependencies

In your project's pom.xml, add the necessary dependencies for Spring AI.

add_dependencies_image

Step 3: Configure API Key

Add your OpenAI API key to application.properties or application.yml.

For application.properties:

add_dependencies_image

Step 4: Configure Spring Beans

Create a configuration class to set up the necessary Spring beans, including the OpenAiClient.


    package com.example.demo.config;

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.ai.openai.OpenAiClient;
    import org.springframework.ai.openai.OpenAiEmbeddingClient;
    import org.springframework.ai.embeddings.EmbeddingClient;
    
    @Configuration
    public class AppConfig {
    
        @Bean
        public OpenAiClient openAiClient() {
            return new OpenAiClient();
        }
    
        @Bean
        public EmbeddingClient embeddingClient(OpenAiClient openAiClient) {
            return new OpenAiEmbeddingClient(openAiClient);
        }
    }

Step 5:Create a Service For Embeddings

Create a service to generate embeddings for given text inputs.

package com.example.demo.service;

    import org.springframework.ai.embeddings.EmbeddingClient;
    import org.springframework.ai.embeddings.EmbeddingRequest;
    import org.springframework.ai.embeddings.EmbeddingResponse;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    @Service
    public class EmbeddingService {
    
        private final EmbeddingClient embeddingClient;
    
        @Autowired
        public EmbeddingService(EmbeddingClient embeddingClient) {
            this.embeddingClient = embeddingClient;
        }
    
        public List generateEmbedding(String text) {
            EmbeddingRequest request = new EmbeddingRequest();
            request.setInput(text);
    
            EmbeddingResponse response = embeddingClient.createEmbedding(request);
            return response.getData().get(0).getEmbedding();
        }
    }

Step 6:Create a Controller to Expose the service

Create a controller to expose an endpoint for generating embeddings.

package com.example.demo.controller;

        import com.example.demo.service.EmbeddingService;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RequestParam;
        import org.springframework.web.bind.annotation.RestController;
        
        import java.util.List;
        
        @RestController
        public class EmbeddingController {
        
            private final EmbeddingService embeddingService;
        
            @Autowired
            public EmbeddingController(EmbeddingService embeddingService) {
                this.embeddingService = embeddingService;
            }
        
            @GetMapping("/generateEmbedding")
            public List generateEmbedding(@RequestParam String text) {
                return embeddingService.generateEmbedding(text);
            }
        }

Step 7: Using ChatClient with Embeddings

To use embeddings within a chat interaction, you can integrate the ChatClient as follows:


            package com.example.demo.service;

import org.springframework.ai.embeddings.EmbeddingClient;
import org.springframework.ai.embeddings.EmbeddingRequest;
import org.springframework.ai.embeddings.EmbeddingResponse;
import org.springframework.ai.openai.ChatClient;
import org.springframework.ai.openai.model.ChatMessage;
import org.springframework.ai.openai.model.ChatRequest;
import org.springframework.ai.openai.model.ChatResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ChatEmbeddingService {

    private final EmbeddingClient embeddingClient;
    private final ChatClient chatClient;

    @Autowired
    public ChatEmbeddingService(EmbeddingClient embeddingClient, ChatClient chatClient) {
        this.embeddingClient = embeddingClient;
        this.chatClient = chatClient;
    }

    public String chatWithEmbedding(String text) {
        EmbeddingRequest request = new EmbeddingRequest();
        request.setInput(text);

        EmbeddingResponse embeddingResponse = embeddingClient.createEmbedding(request);
        List embedding = embeddingResponse.getData().get(0).getEmbedding();

        ChatMessage userMessage = new ChatMessage("user", text);
        ChatMessage embeddingMessage = new ChatMessage("system", "Embedding: " + embedding.toString());

        ChatRequest chatRequest = new ChatRequest();
        chatRequest.setMessages(List.of(userMessage, embeddingMessage));

        ChatResponse chatResponse = chatClient.sendMessage(chatRequest);
        return chatResponse.getReply();
    }
}
          

Testing the Integration

Step 1: Run the Application

Acess the Embedding EndPoint

Use Postman, curl, or your browser to test the endpoint. For example:


            http://localhost:8080/generateEmbedding?text=Artificial Intelligence is transforming the world.
          

Step 3:Access the Chat With Embedding EndPoint


    
http://localhost:8080/chatWithEmbedding?text=Explain the concept of embeddings.

You should receive responses with the numerical array (vector) representing the embedding of the provided text

and the AI's response to the chat request.

Conclusion

This tutorial demonstrated how to set up and use embeddings in a Spring Boot application with Spring AI. You

learned how to configure Spring AI, generate embeddings for text inputs, and expose endpoints to interact with

the AI model. Integrating embeddings with chat interactions further enhances the capabilities of your AI

applications. Explore further customization and enhancements to leverage the full potential of embeddings

in your Spring Boot projects.