Kembali ke Beranda
Programming

Menjalankan AI Lokal dengan Ollama: Membuat Endpoint Ask Sederhana di Java

Ollama memungkinkan kita menjalankan model AI di komputer atau server sendiri. Artikel ini menunjukkan cara mengirim pertanyaan ke Ollama dan membuat endpoint `/api/ask` sederhana menggunakan Spring Boot.

Banyak contoh aplikasi AI dimulai dengan memanggil layanan model melalui internet. Namun, untuk belajar dan membuat prototipe internal, kita juga bisa menjalankan model secara lokal menggunakan Ollama.

Dalam tutorial ini, kita akan membuat alur sederhana:

  1. Pengguna mengirim pertanyaan ke aplikasi Spring Boot.
  2. Spring Boot meneruskan pertanyaan ke Ollama.
  3. Ollama menghasilkan jawaban.
  4. Spring Boot mengembalikan jawaban kepada pengguna.

Contohnya sengaja dibuat kecil agar alur komunikasi antara aplikasi Java dan model AI mudah dipahami.

1. Siapkan Ollama dan model

Instal Ollama melalui situs resminya. Setelah Ollama berjalan, unduh model yang ingin digunakan:

ollama pull llama3.1:8b

Nama model pada contoh berikut adalah llama3.1:8b. Jika Anda menggunakan model lain, ganti nama tersebut di konfigurasi aplikasi.

Untuk memastikan model dapat menjawab, coba jalankan:

ollama run llama3.1:8b

Ketik sebuah pertanyaan, misalnya:

Apa itu REST API?

Jika model menjawab, kita siap mengaksesnya dari Java.

2. Kenali API chat Ollama

Ollama menyediakan endpoint POST /api/chat. Kita mengirim nama model dan daftar pesan, lalu mengambil teks jawaban dari message.content. Pada contoh ini, stream diatur ke false agar Ollama mengirim satu respons JSON lengkap. Lihat dokumentasi API chat Ollama.

Coba panggil langsung dari terminal:

curl http://localhost:11434/api/chat \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.1:8b",
    "messages": [
      {
        "role": "user",
        "content": "Jelaskan REST API dalam dua kalimat."
      }
    ],
    "stream": false
  }'

Responsnya memuat beberapa informasi, tetapi bagian yang kita perlukan adalah:

{
  "message": {
    "role": "assistant",
    "content": "REST API adalah ..."
  }
}

3. Buat proyek Spring Boot

Buat proyek Spring Boot dengan dependency Spring Web. Contoh kode di bawah menggunakan RestClient, sehingga gunakan Spring Boot 3.2 atau lebih baru dan Java 17 atau lebih baru.

Tambahkan konfigurasi berikut pada src/main/resources/application.properties:

ollama.base-url=http://localhost:11434
ollama.model=llama3.1:8b

Jika Ollama berjalan di server lain, ubah ollama.base-url ke alamat server tersebut.

4. Buat service untuk memanggil Ollama

Buat file OllamaService.java:

package com.example.ollamademo;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestClient;

@Service
public class OllamaService {

    private final RestClient restClient;
    private final String model;

    public OllamaService(
            @Value("${ollama.base-url}") String baseUrl,
            @Value("${ollama.model}") String model) {
        this.restClient = RestClient.builder()
                .baseUrl(baseUrl)
                .build();
        this.model = model;
    }

    public String ask(String question) {
        Map<String, Object> request = Map.of(
                "model", model,
                "messages", List.of(
                        Map.of("role", "user", "content", question)
                ),
                "stream", false
        );

        OllamaResponse response = restClient.post()
                .uri("/api/chat")
                .contentType(MediaType.APPLICATION_JSON)
                .body(request)
                .retrieve()
                .body(OllamaResponse.class);

        if (response == null
                || response.message() == null
                || response.message().content() == null) {
            throw new IllegalStateException("Ollama tidak mengembalikan jawaban.");
        }

        return response.message().content();
    }

    public record OllamaResponse(Message message) {
    }

    public record Message(String content) {
    }
}

RestClient mengirim permintaan HTTP ke Ollama. Spring akan membaca respons JSON dan mengisi OllamaResponse. Karena kita hanya memerlukan message.content, field lain dalam respons Ollama tidak perlu ditulis dalam record Java.

5. Buat endpoint /api/ask

Buat file AskController.java:

package com.example.ollamademo;

import java.util.Map;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;

@RestController
@RequestMapping("/api")
public class AskController {

    private final OllamaService ollamaService;

    public AskController(OllamaService ollamaService) {
        this.ollamaService = ollamaService;
    }

    @PostMapping("/ask")
    public Map<String, String> ask(@RequestBody AskRequest request) {
        if (request.question() == null || request.question().isBlank()) {
            throw new IllegalArgumentException("Pertanyaan tidak boleh kosong.");
        }

        String answer = ollamaService.ask(request.question());

        return Map.of("answer", answer);
    }

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Map<String, String>> handleBadRequest(
            IllegalArgumentException exception) {
        return ResponseEntity.badRequest()
                .body(Map.of("error", exception.getMessage()));
    }

    @ExceptionHandler(RestClientException.class)
    public ResponseEntity<Map<String, String>> handleOllamaError(
            RestClientException exception) {
        return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
                .body(Map.of("error", "Gagal menghubungi Ollama. Periksa server dan nama model."));
    }

    public record AskRequest(String question) {
    }
}

Endpoint ini menerima JSON berisi question dan mengembalikan JSON berisi answer. Jika pertanyaan kosong atau Ollama tidak dapat dihubungi, aplikasi mengembalikan pesan kesalahan yang lebih jelas.

6. Jalankan dan uji

Jalankan aplikasi Spring Boot, lalu kirim pertanyaan:

curl -X POST http://localhost:8080/api/ask \
  -H "Content-Type: application/json" \
  -d '{
    "question": "Apa perbedaan machine learning dan deep learning?"
  }'

Contoh bentuk respons:

{
  "answer": "Machine learning adalah ..."
}

Isi jawaban dapat berbeda pada setiap permintaan karena dihasilkan oleh model.

Jika muncul kesalahan koneksi, pastikan Ollama sedang berjalan dan dapat diakses pada http://localhost:11434. Jika Ollama berada di mesin yang berbeda dari aplikasi Spring Boot, ingat bahwa localhost di konfigurasi Java menunjuk ke mesin tempat aplikasi Java berjalan.

Apa yang sebenarnya kita bangun?

Endpoint /api/ask ini adalah pintu masuk sederhana dari aplikasi Java menuju model AI lokal. Kita belum memberikan dokumen perusahaan, riwayat percakapan, atau akses ke database. Karena itu, model menjawab berdasarkan kemampuan dan konteks pesan yang kita kirim pada permintaan tersebut.

Langkah berikutnya adalah menambahkan RAG: mencari informasi yang relevan dari dokumen atau tiket terlebih dahulu, lalu menyertakannya saat bertanya kepada model. Untuk sistem seperti asisten helpdesk, pendekatan ini memungkinkan jawaban merujuk pada SOP dan riwayat penyelesaian tiket yang tersedia.

Ollama membantu kita memulai dari fondasi paling penting: membuat aplikasi kita dapat berbicara dengan model AI yang berjalan di lingkungan sendiri.

ollamaai lokaljavaspring bootllmrest apitutorial ai
Nirantara Logo

Published by Nirantara

Nirantara is an Indonesian Enterprise AI company specializing in Enterprise AI, RAG, Intelligent Search, and AI Automation. Article written by jsturana.

Learn more about Nirantara