Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240828 인 컨텍스트 러닝(In-Context Learning) 본문

개발Article

[TIL]20240828 인 컨텍스트 러닝(In-Context Learning)

최밤빵 2024. 8. 28. 22:03

🤓인 컨텍스트 러닝(In-Context Learning)과 Spring Boot 활용!

인 컨텍스트 러닝은 최근 자연어 처리(NLP) 분야에서 주목받고 있는 개념으로, AI 모델이 학습된 데이터 이외의 추가적인 학습 없이도 특정 문맥(context) 내에서 제공되는 예제를 기반으로 새로운 작업을 수행할 수 있게 하는 방법이다. 전통적인 머신러닝과 딥러닝 모델에서는 학습을 위해 데이터셋과 레이블을 활용한 모델 훈련이 필요하지만, 인 컨텍스트 러닝은 별도의 재학습 없이도 주어진 문맥에서 새로운 작업에 적응할 수 있다는 점이 특징이다.

 

▶인 컨텍스트 러닝이란?

인 컨텍스트 러닝은 미리 학습된  AI 모델이 주어진 문맥(Context)에 대한 이해를 기반으로, 새로운 작업을 수행하는 능력을 말한다. 예를 들어, GPT-3나 GPT-4 같은 언어 모델은 추가적인 학습 없이도 사용자가 입력한 텍스트를 통해 주어진 예제를 이해하고, 이를 바탕으로 새로운 작업을 예측하고 수행할 수 있다.

이런 능력은 학습된 데이터의 다양성과 풍부함, 그리고 모델의 크기와 성능 덕분에 가능해진다. 모델은 이미 방대한 양의 데이터를 학습했기 때문에 다양한 형태의 문제를 해결할 수 있는 능력을 갖추고 있다. 따라서 주어진 문맥이나 예시를 통해 모델이 문맥에 적응하고, 이에 맞춰 반응할 수 있게 된다.

 

▶인 컨텍스트 러닝의 주요 특징

 

→ 재학습 불필요:

인 컨텍스트 러닝에서는 별도의 추가 학습 과정이 필요하지 않다. 모델은 이미 충분히 학습된 상태이기 때문에, 새로운 데이터를 학습할 필요 없이 주어진 문맥만으로도 작업을 수행할 수 있다.

→ 적응력:

모델은 입력된 문맥을 바탕으로 다양한 작업에 적응할 수 있다. 예를 들어, 텍스트 분류, 감정 분석, 번역, 요약 등과 같은 여러 작업에 대해 인 컨텍스트 러닝을 통해 동일한 모델을 활용할 수 있다.

→ 높은 유연성:

전통적인 모델 학습에서는 모델이 특정 데이터에만 최적화되는 경향이 있다. 하지만 인 컨텍스트 러닝은 다목적용으로 활용될 수 있는 유연성을 제공한다.

 

▶ Spring Boot와 OpenAI를 사용한 인 컨텍스트 러닝 구현 예시

다음은 Spring Boot 애플리케이션에서 OpenAI API를 사용하여 인 컨텍스트 러닝을 수행하는 예시이다. 이는 Python으로 작성된 예시와 달리, Java Spring Boot 환경에서 AI 모델을 활용하는 방법을 보여준다. (파이썬을 이용해야하지만 Spring Boot로 보는게 내가 더 잘 이해할 수 있을 것 같아서 수정!)

 

▷ Application Properties 설정

먼저, application.properties 파일에서 OpenAI API 키와 기본 설정을 구성한다.

# application.properties
openai.api.key=your-api-key-here
openai.api.url=https://api.openai.com/v1/completions
openai.model=davinci
openai.max.tokens=10

→ 위 설정 파일에서 openai.api.key에는 OpenAI API 키를 입력해야 한다. openai.api.url은 OpenAI API 엔드포인트 URL, openai.model은 사용할 모델, openai.max.tokens는 예측 시 생성할 최대 토큰 수를 정의한다.

 

▷ REST Controller 구현

Spring Boot의 RestController를 사용하여 OpenAI API 호출을 수행하는 엔드포인트를 만든다.

package com.example.incontextlearning.controller;

import com.example.incontextlearning.service.OpenAiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/in-context-learning")
public class InContextLearningController {

    private final OpenAiService openAiService;

    @Autowired
    public InContextLearningController(OpenAiService openAiService) {
        this.openAiService = openAiService;
    }

    @PostMapping("/predict")
    public ResponseEntity<String> predict(@RequestBody String prompt) {
        String prediction = openAiService.generateText(prompt);
        return ResponseEntity.ok(prediction);
    }
}

→ 이 컨트롤러 예시는 /api/in-context-learning/predict 엔드포인트를 통해 POST 요청으로 예측할 prompt를 받아서 OpenAI API를 호출한다.

 

▷ 서비스 클래스 구현

다음으로, OpenAI API와 통신하는 서비스 클래스를 작성한다.

package com.example.incontextlearning.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
        import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Service
public class OpenAiService {

    @Value("${openai.api.key}")
    private String apiKey;

    @Value("${openai.api.url}")
    private String apiUrl;

    @Value("${openai.model}")
    private String model;

    @Value("${openai.max.tokens}")
    private int maxTokens;

    private final RestTemplate restTemplate;

    public OpenAiService() {
        this.restTemplate = new RestTemplate();
    }

    public String generateText(String prompt) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setBearerAuth(apiKey);

        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("model", model);
        requestBody.put("prompt", prompt);
        requestBody.put("max_tokens", maxTokens);

        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);

        ResponseEntity<Map> responseEntity = restTemplate.exchange(
                apiUrl,
                HttpMethod.POST,
                requestEntity,
                Map.class
        );

        if (responseEntity.getStatusCode() == HttpStatus.OK) {
            Map<String, Object> responseBody = responseEntity.getBody();
            if (responseBody != null && responseBody.containsKey("choices")) {
                return ((Map<String, String>) ((List<?>) responseBody.get("choices")).get(0)).get("text");
            }
        }

        throw new RuntimeException("Failed to generate text from OpenAI API");
    }
}

→ API 키 및 URL 설정: @Value 어노테이션을 사용하여 application.properties 파일의 설정을 가져온다.

→ RestTemplate 사용: OpenAI API와 통신하기 위해 RestTemplate을 사용하여 POST 요청을 전송한다.

→ Request Body 구성: 모델 이름, 프롬프트, 최대 토큰 수를 포함한 요청 본문을 JSON 형태로 생성한다.

→ API 호출 및 응답 처리: OpenAI API를 호출하고, 응답을 받아 예측된 텍스트를 반환한다.

 

▷ 의존성 추가

build.gradle 에 다음 의존성을 추가하여 RestTemplate 사용 및 API 호출이 가능하도록 한다.

// build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

 

→ 위의 Spring Boot 애플리케이션을 실행하고, Postman을 사용하여 다음과 같이 POST 요청을 보낸다.

 

POST 요청 예시:

URL: http://localhost:8080/api/in-context-learning/predict

{
    "prompt": "Translate the following words from English to French: 1. cat - chat 2. dog - chien 3. house - ?"
        }

→ 응답: maison

 

▶ 내용 요약

인 컨텍스트 러닝(In-Context Learning)의 개념과 주요 특징, 예시를 통해 AI 모델이 주어진 문맥에서 새로운 작업을 수행하는 방법을 스프링으로 이해하는게 더 잘 알 것 같아서 예시를 만들어봤는데, 파이썬으로 할 걸 그랬다.지금 팀원들과 기술매니저님까지 함께 모각코?해커톤? 을 하기로해서 알아보게 된 내용인데, 정리하면서 벌써 재밌다...!