밤빵's 개발일지
[TIL]20240828 인 컨텍스트 러닝(In-Context Learning) 본문
🤓인 컨텍스트 러닝(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 모델이 주어진 문맥에서 새로운 작업을 수행하는 방법을 스프링으로 이해하는게 더 잘 알 것 같아서 예시를 만들어봤는데, 파이썬으로 할 걸 그랬다.지금 팀원들과 기술매니저님까지 함께 모각코?해커톤? 을 하기로해서 알아보게 된 내용인데, 정리하면서 벌써 재밌다...!
'개발Article' 카테고리의 다른 글
[TIL]20240830 locust,nGrinder 부하테스트 (0) | 2024.08.31 |
---|---|
[TIL]20240829 웹훅(Webhook) (0) | 2024.08.29 |
[TIL]20240827 Spring batch (0) | 2024.08.27 |
[TIL]20240826 파인튜닝(Fine-Tuning) (0) | 2024.08.26 |
[WIL]20240825 결제 기능을 구현할 때 꼭 숙지해야 할 문제점 (0) | 2024.08.25 |