Java ilə süni intellekt artıq yalnız Python proqramçılarının sahəsi deyil. Bankların, telekom şirkətlərinin və böyük e-ticarət platformalarının backend sistemlərinin böyük hissəsi Java ilə yazılıb və bu sistemlərə AI imkanları əlavə etmək üçün dili dəyişmək lazım deyil. Bu üç hissəlik seriyada sıfırdan başlayıb Java AI tətbiqləri quracağıq: əvvəlcə sadə API sorğusu, sonra Spring AI ilə chatbot, sonda isə öz datanızla işləyən RAG sistemi.
Bu məqalədə nə öyrənəcəksiniz
- Java-nın süni intellekt layihələri üçün niyə yaxşı seçim olduğunu
- Java AI ekosistemini: Spring AI, LangChain4j və DJL
- Heç bir kitabxana olmadan, Java-nın öz
HttpClient-i ilə ilk AI sorğusunu - API açarını təhlükəsiz saxlamağı və cavabı JSON-dan oxumağı
📚 "Java ilə Süni İntellekt" seriyası
- Part 1: Giriş və ilk AI tətbiqi (bu məqalə)
- Part 2: Spring AI ilə chatbot
- Part 3: RAG, öz datanla işləyən AI
Niyə Java ilə süni intellekt?
Süni intellekt modelləri adətən Python-da öyrədilir. Amma modeli öyrətmək ilə onu real məhsulda istifadə etmək fərqli işlərdir. Bu gün şirkətlərin əksəriyyəti hazır böyük dil modellərindən (LLM) API vasitəsilə istifadə edir. Belə layihələrdə əsas iş backend-dədir: sorğuların idarəsi, təhlükəsizlik, verilənlər bazası, yüksək yüklənmə. Bu isə Java-nın ən güclü olduğu sahədir.
- Mövcud sistemlər Java-dadır. AI funksiyasını ayrıca Python servisi qurmadan birbaşa mövcud Spring Boot layihəsinə əlavə edə bilərsiniz.
- Performans və etibarlılıq. JVM uzun müddət işləyən, çoxlu paralel sorğu qəbul edən servislər üçün sınanmış platformadır. Java 21-in virtual thread-ləri AI API-lərinə gedən minlərlə gözləyən sorğunu ucuz başa gətirir.
- Güclü tiplər. AI-ın cavabını birbaşa Java
record-una çevirmək, səhvləri kompilyasiya zamanı tutmaq mümkündür. - Bazar tələbi. Vakansiyalarda "Java + AI inteqrasiyası" bacarığı getdikcə daha çox tələb olunur.
Java AI ekosistemi: hansı alət nə üçündür
| Alət | Nə üçün | Nə vaxt seçməli |
|---|---|---|
| Spring AI | Spring Boot üçün rəsmi AI modulu: chat, embedding, vector store, tool calling | Layihəniz Spring Boot-dadırsa (Part 2 və 3-də bunu istifadə edəcəyik) |
| LangChain4j | LangChain-in Java versiyası: agentlər, RAG, çoxlu model dəstəyi | Spring-dən asılı olmayan və ya Quarkus layihələri |
| DJL (Deep Java Library) | Modeli JVM daxilində işə salmaq (PyTorch, ONNX) | Modeli öz serverinizdə, internetsiz işlətmək lazımdırsa |
| java.net.http.HttpClient | İstənilən AI API-sinə birbaşa HTTP sorğusu | Prinsipi anlamaq üçün və kiçik layihələrdə (bu məqalə) |
Hazırlıq: nə lazımdır
- JDK 21 və ya daha yeni versiya
- Bir LLM provayderinin API açarı (Anthropic, OpenAI və ya Google Gemini). Nümunələrdə Anthropic Claude API-sini istifadə edirik, amma prinsip hamısında eynidir.
- İstənilən IDE: IntelliJ IDEA, VS Code və ya Eclipse
Java versiyanızı terminalda yoxlayın:
java -version
# openjdk version "21.0.4" və ya daha yeni olmalıdır
API açarını heç vaxt kodun içinə yazmayın və GitHub-a yükləməyin. Onu mühit dəyişəni (environment variable) kimi saxlayın.
# macOS / Linux
export ANTHROPIC_API_KEY="sk-ant-..."
# Windows (PowerShell)
$env:ANTHROPIC_API_KEY="sk-ant-..."
İlk Java AI proqramı: HttpClient ilə sorğu
Əvvəlcə heç bir kitabxana istifadə etmədən işin necə qurulduğunu görək. LLM API-si sadə bir HTTP endpoint-dir: ona JSON göndəririk, JSON cavab alırıq. Java 11-dən bəri dildə olan HttpClient bunun üçün kifayətdir.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class IlkAiSorgusu {
private static final String API_URL = "https://api.anthropic.com/v1/messages";
public static void main(String[] args) throws Exception {
String apiKey = System.getenv("ANTHROPIC_API_KEY");
// Java 15+ text block: çoxsətirli JSON-u rahat yazırıq
String body = """
{
"model": "claude-sonnet-5-5",
"max_tokens": 500,
"messages": [
{"role": "user", "content": "Java-da interfeys nədir? 3 cümlə ilə izah et."}
]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(API_URL))
.header("x-api-key", apiKey)
.header("anthropic-version", "2023-06-01")
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
try (HttpClient client = HttpClient.newHttpClient()) {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println(response.body());
}
}
}
Proqramı işə salın:
java IlkAiSorgusu.java
Java 11-dən bəri tək fayllı proqramı javac olmadan birbaşa java ilə işə salmaq olur. Cavab təxminən belə görünəcək:
{
"id": "msg_01...",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Java-da interfeys sinifin nə etməli olduğunu təyin edən müqavilədir..."
}
],
"usage": { "input_tokens": 24, "output_tokens": 87 }
}
Cavabı JSON-dan oxumaq
Bizə bütün JSON yox, yalnız content[0].text lazımdır. Real layihədə JSON üçün Jackson kitabxanasından istifadə edirik. Maven layihəsinə bu asılılığı əlavə edin:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
İndi sorğunu da, cavabı da Java obyektləri ilə idarə edən kiçik, təkrar istifadə olunan bir sinif yazaq:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.List;
import java.util.Map;
public class AiKomekci {
private final HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
private final ObjectMapper mapper = new ObjectMapper();
private final String apiKey = System.getenv("ANTHROPIC_API_KEY");
public String sorus(String sual) throws Exception {
// Map-dən JSON düzəldirik: dırnaq və xüsusi simvollar avtomatik escape olunur
Map<String, Object> body = Map.of(
"model", "claude-sonnet-5-5",
"max_tokens", 800,
"system", "Sən Azərbaycan dilində cavab verən Java müəllimisən.",
"messages", List.of(Map.of("role", "user", "content", sual))
);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.anthropic.com/v1/messages"))
.timeout(Duration.ofSeconds(60))
.header("x-api-key", apiKey)
.header("anthropic-version", "2023-06-01")
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(mapper.writeValueAsString(body)))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() != 200) {
throw new IllegalStateException("AI API xətası: " + response.statusCode() + " " + response.body());
}
JsonNode json = mapper.readTree(response.body());
return json.path("content").get(0).path("text").asText();
}
public static void main(String[] args) throws Exception {
AiKomekci ai = new AiKomekci();
System.out.println(ai.sorus("ArrayList ilə LinkedList arasındakı fərq nədir?"));
}
}
Bu sinifdə real layihələrdə vacib olan bir neçə detal var:
- Timeout-lar: AI cavabı bir neçə saniyə çəkə bilər, amma sonsuza qədər gözləmək olmaz.
- System prompt: modelə "rol" veririk. Bu misalda Java müəllimi rolu.
- Status kodu yoxlanışı: 401 (açar səhvdir), 429 (limit aşılıb) və 5xx xətalarını mütləq idarə edin.
- JSON-u əl ilə yığmırıq: istifadəçinin sualında dırnaq işarəsi olsa belə JSON pozulmur.
Söhbət tarixçəsi: model əvvəlki mesajları necə "xatırlayır"
LLM API-ləri yaddaşsızdır (stateless): hər sorğu ayrıca işlənir. Chatbot-un əvvəlki sualları "xatırlaması" üçün bütün söhbəti hər dəfə yenidən göndəririk:
record Mesaj(String role, String content) {}
List<Mesaj> tarixce = new ArrayList<>();
tarixce.add(new Mesaj("user", "Mənim adım Leyladır."));
tarixce.add(new Mesaj("assistant", "Salam, Leyla! Sizə necə kömək edə bilərəm?"));
tarixce.add(new Mesaj("user", "Mənim adım nə idi?"));
// "messages" sahəsinə bütün tarixçəni göndəririk, model cavab verir: "Sizin adınız Leyladır."
Tarixçə uzandıqca hər sorğu daha çox token, yəni daha çox pul tələb edir. Bunu idarə etmək, söhbəti yadda saxlamaq, cavabı Java obyektinə çevirmək kimi işləri əl ilə yazmaq yorucudur. Məhz bunun üçün Spring AI kimi framework-lər var və onlara növbəti hissədə keçəcəyik.
Ən çox edilən səhvlər
- API açarını koda yazmaq. Açar GitHub-a düşən kimi botlar onu tapır və hesabınızdan istifadə edir.
- Xətaları idarə etməmək. 429 (rate limit) cavabında bir neçə saniyə gözləyib yenidən cəhd edin.
max_tokens-u çox böyük qoymaq. Cavab uzunluğu birbaşa xərcə təsir edir.- Modelin cavabına kor-koranə güvənmək. LLM səhv edə bilər. Kritik məlumatları (qiymət, tarix) həmişə öz bazanızdan götürün. Part 3-də bunu RAG ilə həll edəcəyik.
Java-nı sıfırdan peşəkar səviyyəyə qədər öyrənmək istəyirsiniz? ITBrains-in Back End (Java) proqramında Core Java, Spring Boot, verilənlər bazası və real layihələr üzərində təcrübəli təlimçilərlə işləyirsiniz.
Tez-tez verilən suallar
Java ilə süni intellekt yazmaq olarmı?
Bəli. Hazır LLM-lərdən (Claude, GPT, Gemini) API vasitəsilə istifadə etmək üçün Java tam uyğundur. Spring AI və LangChain4j kimi kitabxanalar chatbot, RAG və AI agentlərini Java-da qurmağı asanlaşdırır. Modeli JVM daxilində işlətmək üçün isə DJL var.
Java AI üçün Python-dan geri qalırmı?
Model öyrətmək və elmi tədqiqat üçün Python daha populyardır. Amma hazır modelləri real məhsula inteqrasiya etmək, yəni backend, təhlükəsizlik və yüksək yüklənmə tərəfində Java çox güclüdür. Şirkətlərin əksəriyyətinə məhz bu lazımdır.
Java ilə AI öyrənmək üçün nəyi bilməliyəm?
Core Java (OOP, kolleksiyalar, istisnalar), HTTP və JSON anlayışı, sonra isə Spring Boot. Bu bilikləri hansı ardıcıllıqla öyrənəcəyinizi Java Roadmap 2026 məqaləmizdə ətraflı yazmışıq.
AI API-ləri pulludurmu?
Əksər provayderlər istifadə olunan token sayına görə ödəniş alır. Öyrənmə mərhələsində xərc adətən çox kiçikdir. Tamamilə pulsuz variant üçün Ollama ilə açıq modelləri öz kompüterinizdə işə sala bilərsiniz (Part 3-də istifadə edəcəyik).
Növbəti addım
Bu hissədə Java ilə AI API-sinə necə müraciət etdiyimizi, cavabı necə oxuduğumuzu və söhbət tarixçəsinin necə işlədiyini gördük. Part 2: Spring AI ilə chatbot hissəsində eyni işi Spring Boot-da bir neçə sətirlə edəcək, cavabı axınla (streaming) göstərəcək və AI-a öz Java metodlarımızı çağırmağı öyrədəcəyik.