Prompt 란
프롬프트란 생성 인공지능 분야에서 거대 언어 모델로부터 응답을 생성하기 위한 입력값입니다.
Propmt Engineering 이란
거대 언어 모델로부터 높은 품질의 응답을 얻어낼 수 있는 이러한 **프롬프트 입력 값들의 조합을 찾는 작업을 의미합니다.
✅ 프롬프트는 instruction으로 시작하고, context와 instruction을 구분하자.
[instruction] 내가 요구하고자 하는 사항이 무엇인지 프롬프트의 제일 첫 부분에 명시하기.
###을 사용해 context를 분리해 보다 AI가 더 잘 인지할 수 있도록 한다.
- instruction : 모델이 수행하기를 원하는 특정 태스크 또는 지시 사항
- context : 모델이 보다 더 나은 답변을 하도록 유도하는 외부 정보 또는 추가 내용
✅ 최대한 명확하게 작성해야 한다.
내가 어떠한 답변을 원하는지 명확하고 자세하게 작성하고,
내가 원하는 답변의 스펙에 대해서도 최대한 자세하게 작성한다.
ex) 답변의 길이, 형식, 스타
Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a {famous poet}
✅ 예시를 사용하자.
Extract the important entities mentioned in the text below. First extract all company names, then extract all people names, then extract specific topics which fit the content and finally extract general overarching themes
Desired format:
Company names: <comma_separated_list_of_company_names>
People names: -||-
Specific topics: -||-
General themes: -||-
Text: {text}
✅Zero-Shot -> Few-Shot -> fine-tune 순으로 진행하자.
- Zero-Shot Prompting은 추가 학습 또는 예제 데이터 없이 답변을 생성하게 하는 프레임워크로, 거대 언어 모델에게 아무런 instruction 없이 완수할 태스크를 주는 것을 의미한다.
- Few-Shot Prompting은 두 개에서 다섯 개의 예제를 바탕으로 답변을 생성하게 하는 기법으로, 프롬프트 앞단에 One-Shot Prompting 기법 보다 조금 더 AI에게 직접적으로 원하는 답변에 도달할 수 있도록 유도한다.
- gpt-3.5-turbo
- 대화형 AI 모델로, 텍스트에 기반한 질문과 답변, 자유로운 대화, 요약, 번역 등 다양한 자연어 처리 작업에 사용
- text-davinci-003
- 더 크고 더 강력한 AI 모델로, 복잡한 자연어 이해와 생성 작업에 사용된다.
- 다양한 분야의 글 작성, 기사 생성, 스토리 텔링, 문장 완성 등에 적합하다.
Chat GPT와 같이 대화형 모델을 사용하길 원한다면,
text-davinci-003 대신 gpt-3.5-turbo 모델을 사용하는 것이 더 좋다.
Chat GPT 모델 별 API 호출 가격
Chat GPT Token
- 사용자가 입력한 프롬프트 메시지는 ‘Token’ 단위로 나뉩니다. 이러한 토큰은 단어 또는 단어의 일부가 될 수 있습니다.
- Token에는 한도가 있습니다. 모델이 지원하는 Token에 따라서 프롬프트 값과 응답받은 값의 합에 따라 한도가 정해집니다.
https://platform.openai.com/docs/introduction
Tokenizer을 통해서 문자 별 토큰의 개수를 확인할 수 있음
Chat GPT Context Window
✔️ Chat GPT가 이전의 대화 내용을 얼마나 기억할 수 있는지를 나타내는 값을 의미합니다.
➖ 만약에 모델이 Context Window가 2048 개의 토큰이다 하면, Chat GPT는 최근 2048개의 토큰의 대화를 기억하고 이를 기반으로 새로운 응답을 생성합니다.
Chat GPT Temperauter
✔️ 생성된 텍스트의 다양성을 조절하는 매개변수입니다.
➖ 값이 낮을수록 일관되고, 예상 가능한 답변을 제공합니다.
➖ 값이 높을수록 창의적인 답변을 제공합니다.
Fine-Tuning을 위한 Prompt 구성⭐
- role : system → Chat 봇의 특성을 정의
- role : user → 사용자가 입력할 프롬프트를 설정
- role : assistant → Chat 봇의 대답을 설정
⇒ 하나의 Message에 system, user, assistant로 구성하여,
여러 개의 프롬프트 작성하기 / 최소 10개 이상의 prompt가 필요함
Springboot & GPT API 개발환경 구조
1. User → Controller
- 사용자는 API로 Prompt를 입력하여 API Call을 수행합니다.
2. Controller → Service
- Controller에서 해당 Endpoint를 받아주고 Service를 호출합니다.
3. Service → ServiceImpl → ChatGPT3
- ServiceImpl에서는 RestTemplate을 이용하여 ChatGPT로 SecretKey와 함께 주요 정보를 전달합니다.
4. ChatGPT3 → ServiceImpl → Controller → User
- 처리된 응답 결과를 반환해 줍니다.
ChatGPT Config
- RestTemplate을 사용하기 위한 객체를 구성
- HttpHeader에서 JWT 토큰으로 Bearer Token 값을 입력하여 전송하기 위한 공통 Header를 구성
@Configuration
public class ChatGPTConfig {
@Value("${openai.secret-key}")
private String secretKey;
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public HttpHeaders httpHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + secretKey);
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
}
application.yml
openai:
model: gpt-3.5-turbo
api:
url: <https://api.openai.com/v1/chat/completions>
key: {발급 받은 API key}
DTO - Message, Request, Response
ChatGPT DTO
- 요청 및 응답 값에 대해 객체로 Prompt로 호출하는 Request DTO와 Response DTO 필요
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatMessage {
private String role;
private String content;
}
@Data
public class ChatRequest {
private String model;
private List<ChatMessage> messages;
private int n;
public ChatRequest(String model, String prompt) {
this.model = model;
this.messages = new ArrayList<ChatMessage>();
this.messages.add(new ChatMessage("user", prompt));
this.n = 1;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatResponse {
private List<Choice> choices;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class Choice {
private int index;
private ChatMessage message;
}
}
ChatGPTService
@Service
@RequiredArgsConstructor
public class ChatGPTService {
private final ChatGPTConfig chatGPTConfig;
@Value("${openai.model}")
private String model;
@Value("${openai.url}")
private String url;
public String prompt(String prompt) {
// 토큰 정보가 포함된 Header 가져오기
HttpHeaders headers = chatGPTConfig.httpHeaders();
// Create request
ChatRequest chatRequest = new ChatRequest(model, prompt);
// 통신을 위한 RestTemplate 구성하기
HttpEntity<ChatRequest> requestEntity = new HttpEntity<>(chatRequest, headers);
RestTemplate restTemplate = new RestTemplate();
ChatResponse response = restTemplate.postForObject(url, requestEntity, ChatResponse.class);
if (response == null || response.getChoices() == null || response.getChoices().isEmpty()) {
throw new RuntimeException();
}
return response.getChoices().get(0).getMessage().getContent();
}
}
실행결과
Request에 Open ai 전달할 값을 정보를 추가하여 원하는 AI의 대답을 만들 수 있습니다.
저는 n, max_tokens를 지정하여 반환받는 대답의 개수와 최대 토큰의 개수를 지정하여 대답의 길이를 수정하였습니다.
Chat GPT API에 대해 좀 더 알아보기
- RestTemplate header, request, response 확인하기
curl <https://api.openai.com/v1/chat/completions> \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $OPENAI_API_KEY" \\
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hello!"
}
]
}'
Chat GPT Open API를 사용하기 위해서는 위와 같은 형태로 데이터를 전송해 주어야 합니다.
- "https"//api.openai.com/v1/chat/completions" 주소에 api 요청을 보냅니다.
- -H는 Header를 의미하며, "Authorization: Bearer $OPENAI_API_KEY"을 헤더에 담아 전달해 주어야 합니다.
- model에는 사용하는 모델명을 작성합니다.
- messages에는 전달한 프롬프트 전달합니다.
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"model": "gpt-3.5-turbo-0613",
"system_fingerprint": "fp_44709d6fcb",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "\\n\\nHello there, how may I assist you today?",
},
"logprobs": null,
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
- API를 요청을 하면 GPT로부터 위와 같은 형태로 값을 전달받습니다.
- 답변은 choices 데이터 작성되어 있습니다.
https://platform.openai.com/docs/api-reference/chat/create