Spring AI là một module của Spring giúp chúng ta dễ dàng làm việc với các ứng dụng có sử dụng AI, có tích hợp sử dụng các AI provider như OpenAI, Azure OpenAI, Google Gemini, … Trong bài viết này, mình sẽ giới thiệu với các bạn các kiến thức cơ bản về Spring AI để các bạn có thể sử dụng nó trong các ứng dụng có tích hợp sử dụng các AI provider các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project để làm ví dụ:

Mình sẽ làm một ứng dụng nhỏ tích hợp với OpenAI để truy vấn thông tin nên mình sẽ khai báo sử dụng Spring AI cho OpenAI dependency như sau:
|
1 2 3 4 5 |
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai</artifactId> <version>1.1.2</version> </dependency> |
|
1 |
Các khái niệm AI cơ bản
Trước khi đi vào implement ví dụ, có một số khái niệm về AI mà các bạn cần nắm như sau:
Model là các thuật toán để xử lý thông tin request của người dùng và generate output phù hợp với request. Các thuật toán này sẽ sử dụng một số lượng lớn dữ liệu được input trước đó để đưa ra các dự đoán, chữ, hình ảnh và các output khác.
Prompts có thể nói nôm na là các input request từ người dùng, thông thường có thể là text input, để AI model dựa vào đó để generate output.
Prompt Templates là các template dùng để tạo các prompt. Chúng ta sẽ cần phải thay thế các placeholder được định nghĩa trong template bằng các giá trị mà chúng ta muốn để tạo được prompt từ các giá trị này.
Embeddings là các đối tượng sẽ transform các prompt của user thành các đối tượng vector dưới dạng các chữ số cho phép các AI model có thể sử dụng để process request.
Tokens là đơn vị ngôn ngữ cơ bản mà AI model sử dụng để process các prompt. Lúc input, thì AI model sẽ convert các từ ngữ qua các tokens, lúc output thì AI model sẽ convert tokens qua các từ ngữ.
Hiểu các khái niệm cơ bản trên, các bạn sẽ hình dung ở mức high level cách mà một ứng dụng AI hoạt động sẽ như thế nào đó các bạn!
Spring AI cơ bản
Để integrate với các AI provider, Spring AI định nghĩa một interface tên là Model với ModelRequest và ModelResponse:
|
1 2 3 |
public interface Model<TReq extends ModelRequest<?>, TRes extends ModelResponse<?>> { TRes call(TReq request); } |
Có 7 sub-interface từ interface Model là:
- ChatModel
- ImageModel
- DocumentEmbeddingModel
- TextToSpeechModel
- TranscriptionModel
- ModerationModel
- và EmbeddingModel
Tương ứng với từng AI provider thì sẽ có implementation riêng các bạn nhé!
Cho OpenAI, các implementation cho 6 interface ChatModel, ImageModel, TextToSpeechModel, TranscriptionModel, ModerationModel và EmbeddingModel lần lượt là OpenAiChatModel, OpenAiImageModel, OpenAiAudioSpeechModel, OpenAiAudioTranscriptionModel, OpenAiModerationModel, OpenAiEmbeddingModel.
Cho ví dụ của mình, mình sẽ sử dụng class ChatModel để làm việc với OpenAI các bạn nhé!
Hiện thực ví dụ
Để integrate với OpenAI, trước tiên, các bạn cần tạo mới một API key trong OpenAI platform bằng cách đi đến trang https://platform.openai.com/api-keys và click vào nút “Create new secret key” như sau:

API key này dùng để authenticate với OpenAI API đó các bạn! Hãy lưu thông tin API key này ở đâu đó để có thể sử dụng lại sau này các bạn nhé!
Các bạn cũng cần thêm Credit:

để có thể sử dụng OpenAI API mà không bị giới hạn gì các bạn nhé!
Để cấu hình thông tin OpenAI với Spring AI, các bạn có thể sử dụng class OpenAiApi.
Constructor để khởi tạo đối tượng của class OpenAiApi này có nội dung như sau:
|
1 |
public OpenAiApi(String baseUrl, ApiKey apiKey, MultiValueMap<String, String> headers, String completionsPath, String embeddingsPath, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) |
Trong đó:
- baseUrl của OpenAI để truy vấn thông tin. baseUrl của OpenAI API mặc định là “https://api.openai.com” nha các bạn!
- apiKey là API key mà chúng ta vừa tạo ở trên,
- headers là thông tin các headers mà các bạn cần truyền trong request tới OpenAI API,
- completionsPath và embeddingsPath dùng để định nghĩa context path của OpenAI API cho lần lượt là chat hoặc text generation và text embedding. Mặc định thì giá trị của 2 context path này lần lượt là “/v1/chat/completions” và “/v1/embeddings” các bạn nhé!
- restClientBuilder, webClientBuilder và responseErrorHandler cho phép chúng ta định nghĩa các cấu hình liên quan đến request tới OpenAI và handle lỗi lúc nhận được response từ OpenAI.
Các bạn cũng thể sử dụng class OpenAiApi.Builder để khởi tạo đối tượng của class OpenAiApi, đơn giản như mình như sau:
|
1 2 3 4 5 6 |
@Bean OpenAiApi openAiApi() { return new OpenAiApi.Builder() .apiKey("<YOUR_API_KEY_HERE>") .build(); } |
Ở đây, chúng ta sẽ sử dụng các cấu hình mặc định của Spring AI dành cho OpenAI API, chỉ có API key là chúng ta cần phải cấu hình riêng biệt thôi các bạn nhé!
Bây giờ, chúng ta sẽ khởi tạo bean của class ChatModel từ đối tượng của class OpenAiApi như sau:
|
1 2 3 4 5 6 7 8 9 10 |
@Bean ChatModel chatModel(OpenAiApi openAiApi, ToolCallingManager toolCallingManager, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { OpenAiChatOptions openAiChatOptions = OpenAiChatOptions.builder() .model(OpenAiApi.ChatModel.GPT_5_NANO) .build(); return new OpenAiChatModel(openAiApi, openAiChatOptions, toolCallingManager, retryTemplate, observationRegistry); } |
với bean của các đối tượng RetryTemplate, ToolCallingManager, ObservationRegistry mình khởi tạo đơn giản như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@Bean RetryTemplate retryTemplate() { return new RetryTemplate(); } @Bean ToolCallingManager toolCallingManager() { return new ToolCallingManager() { @Override public List<ToolDefinition> resolveToolDefinitions(ToolCallingChatOptions chatOptions) { return List.of(); } @Override public ToolExecutionResult executeToolCalls(Prompt prompt, ChatResponse chatResponse) { return null; } }; } @Bean ObservationRegistry observationRegistry() { return ObservationRegistry.create(); } |
Các bạn có thể chọn OpenAI Model mà các bạn muốn sử dụng. Ở đây, mình đang khai báo sử dụng model “gpt-5-nano” với cost rẻ để tiết kiệm chi phí.
Với khai báo trên, Spring sẽ tự động khởi tạo đối tượng OpenAiApi, sau đó là đối tượng của interface ChatModel là OpenAiChatModel trong Spring container, chúng ta chỉ cần ingest vào và sử dụng mà thôi:
|
1 2 3 4 |
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( AppConfiguration.class); ChatModel chatModel = context.getBean(ChatModel.class); |
Bây giờ thì chúng ta có thể sử dụng class ChatModel để truy vấn thông tin từ OpenAI rồi đó các bạn.
Ví dụ của mình như sau:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.huongdanjava.springai; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Application { static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( AppConfiguration.class); ChatModel chatModel = context.getBean(ChatModel.class); ChatResponse chatResponse = chatModel.call( new Prompt("Do you know about Huong Dan Java website?")); System.out.println(chatResponse.getResult()); } } |
Các bạn hãy thử kiểm tra kết quả như thế nào nhé!
Kết quả của mình như sau:

