ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringAI] 간단한 Ollama 채팅 클라이언트 만들기
    AI 2025. 5. 22. 21:52

    Ollama 및 LLM 설치

    https://yeolmok.tistory.com/47 참고하시면 됩니다.

     

    Springboot 프로젝트 코드

    build.gradle

    plugins {
        id 'java'
        id 'org.springframework.boot' version '3.4.5'
        id 'io.spring.dependency-management' version '1.1.7'
    }
    
    dependencies {
        implementation 'org.springframework.ai:spring-ai-starter-model-ollama'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
    }

     

    application.properties

    spring.application.name=ai-chat
    
    spring.main.web-application-type=none
    
    spring.ai.ollama.base-url=http://localhost:11434
    spring.ai.ollama.chat.model=gemma3:12B

    애플리케이션 타입을 설정하고, Ollama 관련 설정을 합니다. 기본적으로 Ollama 로컬 API 서버는 11434 포트를 사용합니다.

     

    AiChatApplication.java

    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.ai.ollama.OllamaChatModel;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    import java.util.Scanner;
    
    @SpringBootApplication
    public class AiChatApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AiChatApplication.class, args);
        }
    
        @Bean
        public CommandLineRunner run(OllamaChatModel ollamaChatModel) {
            return args -> {
                System.out.println("------------------------------------");
                ChatClient chatClient = ChatClient.builder(ollamaChatModel)
                        .defaultSystem("You are useful assistant")
                        .build();
    
                try (Scanner scanner = new Scanner(System.in)) {
                    while (true) {
                        System.out.print("\nUser: ");
                        System.out.println("\nAssistant: " +
                                chatClient
                                        .prompt(scanner.nextLine())
                                        .call()
                                        .content());
                    }
                }
            };
        }
    }

     

    Ollama 외에도 OpenAi, Anthropic 등 ChatModel은 많습니다. 여러 AI 모델로 작업한다면 ChatClient Bean을 각각 정의하고, @Qualifier로 구분해서 사용하면 됩니다.

     

    AiChatApplicationTests.java

    @SpringBootTest
    class AiChatApplicationTests {
    
        //@Test
        //void contextLoads() {
        //}
    
    }

    빌드시 테스트에서 Scanner 오류가 발생하지 않도록 주석처리 했습니다. 

     

    실행

    프로젝트 루트로 가서 다음 명령어로 빌드합니다.

    ./gradlew build

     

     

    그 다음, Ollama를 실행하고 jar 파일 경로로 가서 실행해주면 됩니다.

    ollama serve
    
    cd build/libs
    java -jar ai-chat-0.0.1-SNAPSHOT.jar

     

    실행 결과

    -----------------------------------
    
    User: 역대 월드컵 개최지를 알려줘.
    
    Assistant: 네, 역대 월드컵 개최지는 다음과 같습니다.
    
    1.  **1930년:** 우루과이 (몬테비데오)
    2.  **1934년:** 이탈리아 (로마, 밀라노, 토리노, 나폴리, 제노바, 팔레르모)
    3.  **1938년:** 프랑스 (파리, 마르세유, 릴, 보르도, 투르, 몽펠리에, 스트라스부르, 툴루즈)
    4.  **1950년:** 브라질 (리오데자네이루, 상파울루, 쿠리치바, 포르투알레그레, 벨루오리존치)
    5.  **1954년:** 스위스 (베른, 취리히, 바젤, 로잔, 윈터투어)
    6.  **1958년:** 스웨덴 (스톡홀름, 예테보리, 말뫼, 하파르스베리, 링크비, 칼마르)
    7.  **1962년:** 칠레 (산티아고, 발파라이소, 콘셉시온, 탈카후아노)
    8.  **1966년:** 잉글랜드 (런던, 버밍엄, 런던, 선덜랜드, 뉴캐슬, 노팅엄, 셰필드)
    9.  **1970년:** 멕시코 (멕시코시티, 과달라하라, 몬테레이, 푸에블라, 레오폴도수아레스)
    10. **1974년:** 서독 (뮌헨, 함부르크, 쾰른, 슈투트가르트, 프랑크푸르트, 뒤셀도르프, 하이델베르크)
    11. **1978년:** 아르헨티나 (부에노스아이레스, 로사리오, 코르도바, 라플라타, 멘도사, 산후안)
    12. **1982년:** 스페인 (마드리드, 바르셀로나, 빌바오, 세비야, 발렌시아, 산세바스티안, 라코루냐)
    13. **1986년:** 멕시코 (멕시코시티, 과달라하라, 몬테레이, 푸에블라, 티후아나, 레오폴도수아레스)
    14. **1990년:** 이탈리아 (로마, 나폴리, 토리노, 밀라노, 볼로냐, 제노바, 팔레르모, 안코나)
    15. **1994년:** 미국 (샌프란시스코, 시애틀, 워싱턴D.C., 이스트러더포드, 달라스, 캔자스시티, 잭슨빌, 덴버, 오클라호마시티, 애틀랜타)
    16. **1998년:** 프랑스 (파리, 마르세유, 리옹, 보르도, 세트, 릴, 툴루즈, 몽펠리에, 생에티엔, 로렌)
    17. **2002년:** 대한민국, 일본 (대한민국: 서울, 부산, 대전, 광주; 일본: 요코하마, 도쿄, 오사카, 후쿠오카, 사이타마, 니혼가와)
    18. **2006년:** 독일 (베를린, 뮌헨, 슈투트가르트, 함부르크, 도르트문트, 프랑크푸르트, 겔젠키르헨, 라이프치히, 뉘른베르크, 쾰른)
    19. **2010년:** 남아프리카 공화국 (요하네스버그, 케이프타운, 포트엘리자베스, 프리토리아, 네덜란드, 드반, 블로에만테)
    20. **2014년:** 브라질 (상파울루, 리우데자네이루, 벨루오리존치, 쿠리치바, 브라질리아, 포르투알레그레, 살바도르, 마나우스, 나탈, 고이아니아)
    21. **2018년:** 러시아 (모스크바, 상트페테르부르크, 소치, 칼리닌그라드, 볼고그라드, 니즈니노브고로드, 사마라, 예카테린부르크, 로스토프온도누, 카잔)
    22. **2022년:** 카타르 (도하, 알라얀, 알와크라, 알코르, 루사일, 알차트, 막데)
    23. **2026년:** 미국, 캐나다, 멕시코 (미국: 애틀랜타, 시애틀, 댈러스, 캔자스시티, 샌프란시스코, 로스앤젤레스; 캐나다: 토론토, 밴쿠버; 멕시코: 멕시코시티, 몬테레이, 과달라하라)
    
    혹시 특정 연도나 개최 국가에 대해 더 궁금한 점이 있으신가요?

     

     


    참고

    Spring doc

    (https://docs.spring.io/spring-ai/reference/api/chatclient.html)

     

    'AI' 카테고리의 다른 글

    [SpringAI] Tool Calling (2) - DB 접근  (0) 2025.06.20
    [SpringAI] Tool Calling (1)  (0) 2025.05.24
    Ollama 설치 및 실행  (0) 2025.05.16

    댓글

Designed by Tistory.