OpenAI API 기본 설정

ChatGPT API를 사용하기 위해 OpenAI의 Python 라이브러리를 설치하고 API 키를 설정하는 기본 코드이다.

import openai

openai.api_key = 'your-api-key'

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt="Hello, how are you?",
    max_tokens=50
)

print(response.choices[0].text.strip())

프롬프트 엔지니어링 기초

프롬프트에 따라 API가 생성하는 텍스트 결과가 달라질 수 있다. 다음은 다양한 프롬프트를 사용하는 예시이다.

prompt = "What is the capital of France?"

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=prompt,
    max_tokens=50
)

print(response.choices[0].text.strip())

대화형 요청 및 상태 관리

대화를 이어 나가기 위해 대화의 상태를 유지하는 예시이다.

conversation_history = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What is the weather like today?"}
]

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=conversation_history
)

conversation_history.append({"role": "assistant", "content": response['choices'][0]['message']['content']})

print(response['choices'][0]['message']['content'])

다중 모델 사용 전략

여러 모델을 동시에 사용하여 다양한 결과를 비교하거나 병렬로 작업을 처리할 수 있다.

models = ["text-davinci-003", "gpt-4"]

for model in models:
    response = openai.Completion.create(
        engine=model,
        prompt="Explain quantum computing in simple terms.",
        max_tokens=100
    )
    print(f"Model: {model}")
    print(response.choices[0].text.strip())
    print("\n")

오류 처리 및 예외 관리

API 호출 중 발생할 수 있는 오류를 처리하는 방법을 보여주는 예시이다.

import openai
import time

openai.api_key = 'your-api-key'

def call_openai_api(prompt):
    try:
        response = openai.Completion.create(
            engine="text-davinci-003",
            prompt=prompt,
            max_tokens=50
        )
        return response.choices[0].text.strip()
    except openai.error.RateLimitError:
        print("Rate limit exceeded. Retrying in 5 seconds...")
        time.sleep(5)
        return call_openai_api(prompt)  # 재시도
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

result = call_openai_api("Tell me a joke.")
print(result)

네트워크 오류 및 재시도 로직 구현

네트워크 오류가 발생할 경우 자동으로 재시도하는 로직을 구현하는 예시이다.

import requests
import time

def api_request_with_retry(url, max_retries=3):
    retries = 0
    while retries < max_retries:
        try:
            response = requests.get(url)
            response.raise_for_status()  # 상태 코드가 200이 아닌 경우 예외 발생
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"Request failed: {e}. Retrying...")
            retries += 1
            time.sleep(2)  # 재시도 간격
    return None

result = api_request_with_retry("https://api.example.com/data")
if result:
    print(result)
else:
    print("Failed to fetch data after retries.")

요청 파라미터 최적화

요청 시 사용하는 다양한 파라미터를 통해 결과를 최적화할 수 있다. 예를 들어, temperature 값은 생성되는 텍스트의 창의성을 제어한다.

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt="Write a creative story about a dragon and a knight.",
    max_tokens=150,
    temperature=0.7,  # 창의성 정도
    top_p=1,          # 확률 샘플링의 범위
    frequency_penalty=0.5,  # 반복 억제
    presence_penalty=0.5    # 새로운 주제 유도
)

print(response.choices[0].text.strip())

복잡한 프롬프트 작성 전략

복잡한 프롬프트를 사용하여 특정한 형식이나 패턴을 유도하는 전략이다.

prompt = """
You are a world-class editor. Edit the following paragraph for clarity and precision:
---
The quick brown fox jumps over the lazy dog. It is a sentence that contains every letter of the alphabet, 
which makes it useful for testing fonts and keyboards. The dog, however, does not seem to mind.
---
Please rewrite the paragraph to be more concise and engaging.
"""

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=prompt,
    max_tokens=150
)

print(response.choices[0].text.strip())

API 응답 데이터 파싱 및 처리

API 응답 데이터를 처리하고 필요한 부분만 추출하는 코드이다.

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt="Summarize the following text: The quick brown fox jumps over the lazy dog.",
    max_tokens=50
)

generated_text = response.choices[0].text.strip()
print(f"Summary: {generated_text}")

import json
print(json.dumps(response, indent=4))

다중 응답 생성 및 선택

여러 응답을 생성하고 그 중 하나를 선택하는 방법이다.

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt="Give me three different ways to explain AI to a 5-year-old.",
    max_tokens=150,
    n=3  # 3개의 응답 생성
)

for idx, choice in enumerate(response.choices):
    print(f"Option {idx+1}: {choice.text.strip()}")

대규모 요청 처리 및 Rate Limit 관리

대규모 요청을 처리하는 예시로, Rate Limit을 관리하는 방법을 포함한다.

import openai
import time

def call_openai_in_batches(prompts, batch_size=5):
    results = []
    for i in range(0, len(prompts), batch_size):
        batch = prompts[i:i+batch_size]
        try:
            responses = openai.Completion.create(
                engine="text-davinci-003",
                prompt=batch,
                max_tokens=100
            )
            results.extend([choice.text.strip() for choice in responses.choices])
        except openai.error.RateLimitError:
            print("Rate limit hit. Waiting for 10 seconds...")
            time.sleep(10)  # Rate limit을 초과할 경우 대기 후 재시도
        except Exception as e:
            print(f"An error occurred: {e}")
    return results

prompts = ["Explain AI.", "What is the capital of France?", "How does a car engine work?"]
responses = call_openai_in_batches(prompts)
print(responses)

캐싱을 활용한 성능 최적화

같은 요청에 대한 결과를 캐싱하여 성능을 최적화하는 방법이다.

import openai
import hashlib

cache = {}

def get_response_with_cache(prompt):
    prompt_hash = hashlib.md5(prompt.encode()).hexdigest()

    # 캐시 확인
    if prompt_hash in cache:
        print("Returning cached result.")
        return cache[prompt_hash]

    # API 호출
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=100
    )

    # 캐시에 저장
    result = response.choices[0].text.strip()
    cache[prompt_hash] = result
    return result

response1 = get_response_with_cache("Tell me a joke.")
print(response1)

response2 = get_response_with_cache("Tell me a joke.")
print(response2)

자동화된 고객 지원 시스템 구현

ChatGPT API를 사용하여 자동화된 고객 지원 챗봇을 구현하는 기본 예시이다.

conversation_history = [{"role": "system", "content": "You are a customer support bot for an online store."}]

def get_customer_support_response(user_input):
    conversation_history.append({"role": "user", "content": user_input})

    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=conversation_history
    )

    # 대화 기록에 봇의 응답 추가
    bot_response = response['choices'][0]['message']['content']
    conversation_history.append({"role": "assistant", "content": bot_response})

    return bot_response

user_input = "I need help with my order."
bot_response = get_customer_support_response(user_input)
print(bot_response)

생성된 텍스트 기반 데이터 분석

생성된 텍스트 데이터를 분석하여 유용한 정보를 추출하는 방법을 보여준다.

import openai

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt="Generate a paragraph about the benefits of exercise.",
    max_tokens=100
)

generated_text = response.choices[0].text.strip()

from collections import Counter
import re

# 단어 추출
words = re.findall(r'\b\w+\b', generated_text.lower())
word_count = Counter(words)

# 가장 자주 등장한 단어 출력
print(word_count.most_common(5))

대화형 봇 제작

사용자와의 대화 흐름을 관리하는 대화형 봇을 제작하는 코드이다.

import openai

conversation_history = [{"role": "system", "content": "You are a friendly chatbot."}]

def chatbot(user_input):
    conversation_history.append({"role": "user", "content": user_input})

    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=conversation_history
    )

    bot_message = response['choices'][0]['message']['content']
    conversation_history.append({"role": "assistant", "content": bot_message})

    return bot_message

# 사용자와 대화 시뮬레이션
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        break
    bot_response = chatbot(user_input)
    print(f"Bot: {bot_response}")

비용 효율적인 API 사용 전략

API 사용량을 줄이면서 효율적인 방법으로 결과를 얻는 전략이다. max_tokens, temperature 등의 파라미터를 적절하게 조절하여 비용을 절감할 수 있다.

def generate_text(prompt, max_tokens=50, temperature=0.5):
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=max_tokens,   # 생성할 토큰 수 제한
        temperature=temperature  # 창의성 조절
    )
    return response.choices[0].text.strip()

# 최대 30개의 토큰만 생성
result = generate_text("Describe the importance of sleep.", max_tokens=30)
print(result)

유닛 테스트 및 통합 테스트

API 호출을 테스트하는 유닛 테스트 작성법이다.

import unittest
from unittest.mock import patch
import openai

class TestOpenAIAPI(unittest.TestCase):

    @patch('openai.Completion.create')
    def test_generate_text(self, mock_create):
        # 가짜 응답 정의
        mock_create.return_value = {
            'choices': [{'text': 'Hello, world!'}]
        }

        result = openai.Completion.create(
            engine="text-davinci-003",
            prompt="Say hello",
            max_tokens=5
        )

        self.assertEqual(result['choices'][0]['text'], 'Hello, world!')

if __name__ == '__main__':
    unittest.main()

API 응답 시간 최적화

API 응답 시간을 최적화하기 위한 방법으로, 필요한 최소한의 파라미터만 사용하고 요청 크기를 줄이는 방법을 제시한다.

def optimized_request(prompt):
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=50,
        temperature=0.3,  # 낮은 창의성으로 빠른 응답
        n=1,              # 응답 1개만 생성
        stream=False      # 스트리밍 비활성화
    )
    return response.choices[0].text.strip()

# 최적화된 요청 실행
result = optimized_request("Explain the concept of gravity in simple terms.")
print(result)

지속적 통합(CI) 및 지속적 배포(CD) 설정

CI/CD 파이프라인에서 API를 사용하는 테스트를 설정하는 기본 방법이다.

# .github/workflows/test_openai_api.yml

name: Test OpenAI API

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.8'
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
      - name: Run tests
        run: |
          python -m unittest discover -s tests