타입을 지정해서 원하는 답을 AI에서 직접 얻어내기 위해 사용.
Text generation
프롬프트를 사용하여 텍스트를 생성하는 방법.
OpenAI는 ChatGPT를 사용하는 것처럼 프롬프트에서 텍스트를 생성할 수 있는 간단한 API를 제공한다.
프롬프트를 기반으로 모델은 코드, 수학 방정식, 구조화된 JSON 데이터, 인간과 같은 문장 등 거의 모든 유형의 텍스트 응답을 생성할 수 있다.
Quickstart
텍스트를 생성하려면 REST API의 Chat Completions 엔드포인트를 사용할 수 있다.
밑 예제는 HTTP 클라이언트를 사용하여 REST API를 직접 호출하거나 OpenAI의 공식 SDK를 활용하여 원하는 프로그래밍 언어에서 사용할 수 있다.
- Ex. 텍스트 생성하기 (Prose 생성) [JS]
import OpenAI from "openai";
const openai = new OpenAI();
const completion = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "developer", content: "You are a helpful assistant." },
{
role: "user",
content: "프로그래밍의 재귀(recursion)에 대한 하이쿠를 작성해줘.",
},
],
store: true,
});
console.log(completion.choices[0].message);
모델 선택하기:
- 텍스트 생성 요청을 보낼 때, 가장 먼저 선택해야 하는 것은 사용할 모델이다. (필자는 gpt-4o 을 사용할 예정이다.)
- 선택 모델에 따라 출력 결과뿐만 아니라 비용에도 영향을 미친다.
- gpt-4o: 높은 수준의 지능과 강력한 성능을 제공하지만, 토큰당 비용이 높다.
- gpt-4o-mini: 성능이 조금 낮지만, 속도가 빠르고 비용이 저렴하다.
- o1 계열 모델: 보다 심층적인 추론, 코딩, 다단계 계획을 수행할 수 있지만 속도가 느리고 더 많은 토큰을 사용한다.
- 비용은 실제 chatgpt를 사용할 때 나오는 비용이 나오는지 않기에 일반 프로젝트에서는 큰 걱정을 할 필요는 없다.
프롬프트 작성하기:
- 프롬프트 엔지니어링은 모델이 원하는 출력을 생성하도록 프롬프트를 구성하는 과정이다.
- 명확한 지침, 예제, 컨텍스트 정보를 제공하면 모델의 응답 품질을 향상시킬 수 있다.
- 메시지와 역할
- Chat Completions API에서는 배열 형식의 메시지를 전달하여 프롬프트를 구성한다.
- 각 메시지는 특정 역할을 가지고, 모델이 입력을 해석하는 방식에 영향을 미친다.
user 사용자가 모델에게 요청하는 메시지 "프로그래밍에 대한 하이쿠를 써줘." developer 모델의 기본 동작을 설정하는 지침 (이전 ‘시스템 메시지’와 유사) "너는 프로그래밍 질문에 대해 미국 남동부 출신의 여성처럼 답변하는 도움이 되는 조수야." assistant 모델이 생성한 응답 메시지 (이전 대화 기록 포함 가능) "프로그래밍은 마치 신비한 주문 같아. 반복되는 재귀 속에서 답을 찾지." - 메시지 역할을 적절히 활용하면 모델이 더욱 정밀한 응답을 생성하도록 유도할 수 있다.
- Ex. 개발자 메시지를 사용하여 모델의 응답 스타일 변경하기 [JS]
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
"role": "developer",
"content": [
{
"type": "text",
"text": `너는 프로그래밍 질문에 대해 미국 남동부 출신의 여성처럼 답변하는 도움이 되는 조수야.`
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "JavaScript에서 세미콜론(;)은 필수인가?"
}
]
}
],
store: true,
});
- 출력
오우, 귀여운 질문이네! JavaScript에서는 세미콜론이 꼭 필요하지는 않지만,
마치 진주 목걸이처럼 있으면 코드가 훨씬 깔끔해 보이지.
자동 세미콜론 삽입(ASI) 기능이 있어서 모델이 자동으로 추가해주지만,
완벽하지 않아서 예기치 못한 오류가 발생할 수도 있단다.
추가 정보 제공 (RAG 기법 활용하기)
모델의 학습 데이터에 포함되지 않은 정보를 추가하여 정확도를 높일 수 있다.
예를 들어, 데이터베이스 쿼리 결과나 텍스트 문서를 제공하여 모델이 보다 정확한 응답을 생성하도록 유도할 수 있다.
이러한 기법을 Retrieval Augmented Generation (RAG) 이라고 한다.
대화 및 컨텍스트 유지:
OpenAI의 API는 기본적으로 요청을 개별적으로 처리하지만, 다중 턴(Turn) 대화를 유지할 수도 있다.
예를 들어, "Knock knock" 농담을 유지하려면 이전 메시지를 포함하여 API에 전달하면 된다.
const response = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{
"role": "user",
"content": [{ "type": "text", "text": "knock knock." }]
},
{
"role": "assistant",
"content": [{ "type": "text", "text": "누구세요?" }]
},
{
"role": "user",
"content": [{ "type": "text", "text": "오렌지." }]
}
],
store: true,
});
텍스트 생성 최적화:
텍스트 생성 시 다음 요소를 최적화하면 더욱 효과적인 사용이 가능하다.
정확도 향상 | 모델이 필요한 정보를 충분히 제공받도록 프롬프트 엔지니어링, RAG, 모델 미세 조정을 활용 |
비용 절감 | 적은 토큰을 사용하거나 작은 모델을 활용하여 비용 절감 |
지연 시간 단축 | 프롬프트 최적화 및 병렬 처리 기법을 활용하여 응답 속도 향상 |
추가 EXAMPLE
- JS
import OpenAI from "openai";
const openai = new OpenAI();
async function generateText() {
const completion = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "developer", content: "너는 도움이 되는 AI 조수야." },
{ role: "user", content: "프로그래밍의 재귀에 대한 하이쿠를 작성해줘." }
],
store: true,
});
console.log(completion.choices[0].message.content);
}
generateText();
- TS
- TypeScript는 자동으로 completion.choices[0].message.content의 타입을 추론하지만, 필요하면 명시적으로 타입을 지정할 수도 있다.
import OpenAI from "openai";
const openai = new OpenAI();
async function generateText(): Promise<void> {
const completion = await openai.chat.completions.create({
model: "gpt-4o",
messages: [
{ role: "developer", content: "너는 도움이 되는 AI 조수야." },
{ role: "user", content: "프로그래밍의 재귀에 대한 하이쿠를 작성해줘." }
],
store: true,
});
console.log(completion.choices[0].message.content);
}
generateText();