Bloqlara qayıt
13.10.2026 9 dəqiqə

Java ilə Süni İntellekt — Part 1: Giriş və ilk AI tətbiqi

JavaSüni İntellektJava AIHttpClient
Java ilə Süni İntellekt — Part 1: Giriş və ilk AI tətbiqi

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ı

  1. Part 1: Giriş və ilk AI tətbiqi (bu məqalə)
  2. Part 2: Spring AI ilə chatbot
  3. 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ətNə üçünNə vaxt seçməli
Spring AISpring Boot üçün rəsmi AI modulu: chat, embedding, vector store, tool callingLayihəniz Spring Boot-dadırsa (Part 2 və 3-də bunu istifadə edəcəyik)
LangChain4jLangChain-in Java versiyası: agentlər, RAG, çoxlu model dəstəyiSpring-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ğusuPrinsipi 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

  1. API açarını koda yazmaq. Açar GitHub-a düşən kimi botlar onu tapır və hesabınızdan istifadə edir.
  2. Xətaları idarə etməmək. 429 (rate limit) cavabında bir neçə saniyə gözləyib yenidən cəhd edin.
  3. max_tokens-u çox böyük qoymaq. Cavab uzunluğu birbaşa xərcə təsir edir.
  4. 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.

Tədris proqramlarına baxın →

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.