GPT 프롬프트 엔지니어링 기초 개념

유정민·2024년 10월 14일

GPT Prompt Engineering

목록 보기
1/5

1. 패키지 설치

우선 openaipython-dotenv 패키지를 설치해줍니다

! pip install openai python-dotenv

잘 설치 되었는지 확인하기 위해 openai 라이브러리의 버전을 확인해봅시다

import openai

print(openai.__version__)

'1.48.0'

1.48.0버전이 잘 설치 되었습니다.

2. Api Key 로드

from dotenv import load_dotenv

load_dotenv()

True

load_dotenv() 함수를 사용해 .env 파일에 저장된 환경 변수를 로드합니다.
결과가 True라면, 이는 .env 파일이 성공적으로 로드되었음을 의미합니다.
아래 두 코드를 통해 OpenAI API 키를 설정하고 출력할 수 있습니다.

import os

api_key = os.getenv("OPENAI_API_KEY")
print(api_key)
import openai

openai.api_key = "Example-Api-Key"
print(openai.api_key)

3. Client 객체 생성

우선 OpenAI 라이브러리에서 OpenAI 클래스를 가져와서, 이를 통해 API에 접근할 수 있는 client 객체를 생성합니다.

from openai import OpenAI

client = OpenAI()

그 후 ChatCompletion 객체를 생성해줍니다.

completion = client.chat.completions.create(
    model='gpt-3.5-turbo',
    messages=[
        {
            'role': 'user',
            'content': '캐나다의 수도를 알려주세요'
        }
    ],
    temperature=0.7,
    max_tokens=200
)

-model : 사용할 모델의 이름
-messages : 대화의 맥락을 담고 있는 메시지 리스트
-temperature : 생성되는 텍스트의 창의성 정도
-max_tokens : 응답에서 생성할 최대 토큰 수

print(completion)

응답을 출력 해보겠습니다.

ChatCompletion(
    id='chatcmpl-AIHA1Wbpb6toLQRRWbXx9RTEd727D',
    choices=[
        Choice(
            finish_reason='stop',
            index=0,
            logprobs=None,
            message=ChatCompletionMessage(
                content='캐나다의 수도는 오타와(Ottawa)입니다.',
                refusal=None,
                role='assistant',
                function_call=None,
                tool_calls=None
            )
        )
    ],
    created=1728919233,
    model='gpt-3.5-turbo-0125',
    object='chat.completion',
    service_tier=None,
    system_fingerprint=None,
    usage=CompletionUsage(
        completion_tokens=20,
        prompt_tokens=21,
        total_tokens=41,
        completion_tokens_details=CompletionTokensDetails(reasoning_tokens=0),
        prompt_tokens_details={
            'cached_tokens': 0
        }
    )
)

매우 길고 복잡한 구조입니다.
우리는 여기서 답변만 출력하기 위해 content를 출력 해줍니다.

print(completion.choices[0].message.content)

캐나다의 수도는 오타와(Ottawa)입니다.

답변이 잘 출력 되었습니다.

4. Chat Completions 기능 확인

이제부터 Chat Completions 기능을 확인해보겠습니다.

4.1 n

n은 생성할 응답의 개수입니다.
예를 들어, n=1은 하나의 응답, n=3은 세 개의 응답을 의미합니다.

4.2 response_format

response_format은 생성된 응답의 형식을 지정하는 옵션입니다.
예를 들어, JSON 형식으로 응답을 받을 수 있으며, 특정 구조나 필드를 포함하도록 설정할 수 있습니다.
물론입니다! 다음은 4.3과 4.4에 대한 설명입니다.

4.3 seed

seed는 생성된 응답의 무작위성을 제어하는 값입니다.
특정 시드를 사용하면 동일한 입력에 대해 항상 같은 출력을 생성할 수 있습니다.

4.4 temperature

temperature는 생성된 응답의 창의성을 조절하는 매개변수입니다.
일반적으로 0과 1 사이의 값을 가지며, 낮은 값(예: 0.2)은 더 결정적인 출력을 생성하고,
높은 값(예: 0.8)은 더 다양한 응답을 생성합니다.

4.5 예시

prompt = """
11월 11일에 태어난 연예인 세명을 알려줘.
JSON 출력 포맷으로 출력해줘

# JSON 출력 포맷
-이름
-생년월일
"""

completion = client.chat.completions.create(
    model='gpt-3.5-turbo',
    messages=[
        {
            'role': 'system',
            'content': prompt
        },

    ],
    n=3, # 세 개의 응답을 생성
    response_format={'type': 'json_object'} # 응답 형식을 JSON 객체로 설정
    seed=12, # 특정 시드를 사용하여 결과의 일관성을 보장
    temperature=1 # 높은 값으로 창의적이고 다양한 응답을 생성
)

5. Streaming으로 출력하기

stream 출력은 응답을 기다리지 않고 단어가 생성되자마자 받을 수 있습니다.
긴 텍스트 생성이나 실시간 애플리케이션에서 유용합니다.

completion = client.chat.completions.create(
    model='gpt-3.5-turbo',
    messages=[
        {
            'role': 'system',
            'content': '당신은 요리사입니다.'
        },
        {
            'role': 'user',
            'content': '짜파게티 레시피를 알려줘'
        }
    ],
    stream=True # 응답을 실시간으로 받음
)

이제 for문을 사용하여 결과를 받아 보겠습니다.

for chunk in completion:
    print(chunk.choices[0].delta.content, end='', flush=True)

end='' 출력할 때 기본적인 줄바꿈('\n')을 없애줍니다.
flush=True 출력 버퍼를 즉시 비워서, 출력이 지연되지 않고 바로 화면에 표시되도록 합니다.

재료:

  • 짜장면 소스 1개
  • 스파게티면 200g
  • 양파 1/2개
  • 양배추 1/4개
    .
    .
    .

화면으로는 확인할 수 없지만 답변이 실시간으로 출력되는 것을 확인할 수 있습니다.

profile
초보 개발자 공부 기록

0개의 댓글