Home [AI 도구] Ollama와 LangChain4j - 로컬 LLM 구축 및 Java 연동
Post
Cancel

[AI 도구] Ollama와 LangChain4j - 로컬 LLM 구축 및 Java 연동

1. Ollama 정의

개념

로컬 PC에서 복잡한 설정 없이 LLM을 실행하는 런타임

비유: Docker for LLM

1
2
3
4
5
# Docker: 컨테이너로 애플리케이션 실행
docker run nginx

# Ollama: 로컬에서 LLM 모델 실행
ollama run llama3.1

Docker가 애플리케이션 배포를 단순화한 것처럼, Ollama는 LLM 실행을 단순화함

특징

  • 자동 REST API 제공: localhost:11434 엔드포인트 자동 생성
  • 모델 관리 자동화: 모델 다운로드 및 실행 자동 처리
  • 설정 최소화: 복잡한 GPU 설정, 환경 변수 설정 불필요

2. LangChain vs LangChain4j

LangChain (Python)

파이썬 생태계의 LLM 오케스트레이션 프레임워크 표준

  • LLM 호출, 프롬프트 체이닝, 메모리 관리 등 제공
  • OpenAI, Anthropic, Hugging Face 등 다양한 LLM 지원

LangChain4j (Java)

LangChain의 개념을 Java/Spring 생태계에 맞게 포팅한 라이브러리

  • Spring AI의 강력한 경쟁자
  • Java/Spring 개발자 친화적 API
  • Ollama, OpenAI, Anthropic 등 다양한 LLM 지원

비교

구분LangChainLangChain4j
언어PythonJava
생태계Python ML 생태계Java/Spring 생태계
사용 시나리오데이터 분석, ML 파이프라인엔터프라이즈 애플리케이션 통합

3. 아키텍처 흐름

전체 구조

1
2
3
4
5
6
7
8
9
Java Application (Client)
    ↓
LangChain4j (Library)
    ↓
HTTP Request
    ↓
Ollama Server (localhost:11434)
    ↓
LLM Model (GPU/CPU)

컴포넌트 역할

  • Java Application: 비즈니스 로직 실행
  • LangChain4j: LLM 호출 추상화, 프롬프트 체이닝
  • Ollama: LLM 모델 실행 및 API 제공
  • LLM Model: 실제 추론 수행

4. Ollama 설치 및 실행

Step 1: 설치 (Mac)

1
brew install ollama

Step 2: 서비스 실행

1
ollama serve

서비스 실행 시 localhost:11434에서 REST API 자동 제공

Step 3: 모델 다운로드 및 실행

1
2
# Llama 3.1 8B 모델 다운로드 및 실행
ollama run llama3.1

최초 실행 시 모델 자동 다운로드

Step 4: API 테스트

1
2
3
4
curl http://localhost:11434/api/generate -d '{
  "model": "llama3.1",
  "prompt": "Why is the sky blue?"
}'

REST API를 통한 LLM 호출 확인


5. LangChain4j 통합

의존성 추가

1
2
3
4
5
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-ollama</artifactId>
    <version>0.29.1</version>
</dependency>

기본 사용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import dev.langchain4j.model.ollama.OllamaChatModel;
import dev.langchain4j.model.chat.ChatLanguageModel;

public class OllamaExample {
    public static void main(String[] args) {
        // Ollama 서버 연결
        ChatLanguageModel model = OllamaChatModel.builder()
            .baseUrl("http://localhost:11434")
            .modelName("llama3.1")
            .build();
        
        // LLM 호출
        String response = model.generate("Why is the sky blue?");
        System.out.println(response);
    }
}

Spring Boot 통합

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class OllamaConfig {
    
    @Bean
    public ChatLanguageModel chatLanguageModel() {
        return OllamaChatModel.builder()
            .baseUrl("http://localhost:11434")
            .modelName("llama3.1")
            .temperature(0.7)
            .build();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class AIService {
    
    private final ChatLanguageModel chatModel;
    
    public AIService(ChatLanguageModel chatModel) {
        this.chatModel = chatModel;
    }
    
    public String generateResponse(String prompt) {
        return chatModel.generate(prompt);
    }
}

6. 장점

비용 절감

  • API 비용 0원: 외부 LLM API 호출 비용 없음
  • 인프라 비용 최소화: 로컬 PC에서 실행

보안

  • 데이터 외부 전송 없음: 민감한 데이터를 외부로 전송하지 않음
  • 온프레미스 실행: 회사 내부 네트워크에서만 동작

개발 환경

  • 오프라인 개발 가능: 인터넷 연결 없이도 LLM 개발 가능
  • 빠른 반복 개발: API 호출 지연 없이 즉시 테스트

유연성

  • 다양한 모델 지원: Llama, Mistral, CodeLlama 등 선택 가능
  • 모델 교체 용이: 코드 변경 없이 다른 모델로 전환 가능

7. 실전 활용 예시

예시 1: 코드 리뷰 자동화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Service
public class CodeReviewService {
    
    private final ChatLanguageModel chatModel;
    
    public String reviewCode(String code) {
        String prompt = String.format("""
            다음 Java 코드를 리뷰해줘:
            
            %s
            
            다음 관점에서 분석해줘:
            1. 성능 이슈
            2. 보안 취약점
            3. 코드 품질
            """, code);
        
        return chatModel.generate(prompt);
    }
}

예시 2: 문서 자동 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service
public class DocumentationService {
    
    private final ChatLanguageModel chatModel;
    
    public String generateDocumentation(String className, String code) {
        String prompt = String.format("""
            다음 Java 클래스를 분석하여 Javadoc을 생성해줘:
            
            클래스명: %s
            코드:
            %s
            """, className, code);
        
        return chatModel.generate(prompt);
    }
}

8. 주의사항

성능 고려사항

  • 로컬 리소스 사용: CPU/GPU 리소스 직접 사용
  • 모델 크기: 큰 모델은 메모리 부족 가능
  • 응답 시간: 클라우드 API 대비 느릴 수 있음

모델 선택

  • Llama 3.1 8B: 일반적인 용도, 메모리 8GB 이상 권장
  • Mistral 7B: 코드 생성에 특화
  • CodeLlama: 코드 관련 작업에 최적화

프로덕션 환경

  • 로컬 환경: 개발/테스트 환경에 적합
  • 프로덕션: 서버 배포 시 리소스 모니터링 필요

9. 정리

핵심 포인트

  • Ollama: 로컬 LLM 실행을 단순화하는 런타임
  • LangChain4j: Java/Spring 생태계의 LLM 오케스트레이션 라이브러리
  • 비용 절감: API 비용 없이 로컬에서 LLM 활용
  • 보안: 데이터 외부 전송 없이 온프레미스 실행

활용 시나리오

  • 개발 환경에서 LLM 기능 테스트
  • 민감한 데이터를 다루는 애플리케이션
  • 오프라인 개발 환경 구축
  • API 비용 절감이 필요한 프로젝트

다음 단계

  • LangChain4j의 고급 기능 (메모리 관리, 프롬프트 체이닝)
  • Spring AI와의 비교 및 선택 가이드
  • 프로덕션 환경 배포 전략
This post is licensed under CC BY 4.0 by the author.