ChatGPT API 활용 소스 코드 공개: 지속적 대화 구현(AI 언어상담사 구현)

Posted by

인공지능 기술이 발전함에 따라, 우리는 일상에서 다양한 방식으로 AI를 활용하고 있다. OpenAI의 ChatGPT는 이러한 변화를 주도하는 중요한 예 중 하나이며, 이번 포스트에서는 Python을 사용하여 ChatGPT API를 활용해 지속적으로 대화를 이어가는 소스 코드를 소개하고자 한다.

개요

이 코드는 사용자의 입력을 받아 OpenAI의 ChatGPT 모델과 대화를 나누는 방식으로 작동한다. 특히, 이 코드는 한글 입력을 영어로 번역하여 처리하고, 모델의 응답을 다시 한글로 번역하여 사용자에게 제공한다. 또한, 대화가 진행될수록 이전 대화 내용을 기억하며, 사용자가 특정 시퀀스(예: “감사합니다”, “끝”)를 입력할 때까지 대화를 계속한다.

코드 특징

코드에서는 GPT-4와 GPT-3.5-turbo 모델을 나누어 사용하도록 구현하였으며, 그 이유는 각 모델의 특징, 요금정책, 최적화된 사용법 때문이다.

  • GPT-4(model: gpt-4): 이 모델은 복잡한 대화, 문맥 이해 및 풍부한 언어 생성 능력이 필요할 때 사용된다. 본 예제에서는 사용자와의 지속적인 대화 및 심층적인 질문에 대한 응답을 생성하는 데 사용된다.
  • GPT-3.5-turbo(model: gpt-3.5-turbo-1106): 이 모델은 빠른 응답 속도와 효율적인 텍스트 변환 기능을 제공한다. 따라서, 번역과 같은 상대적으로 간단한 작업에 적합하며, 본 코드에서는 사용자 입력과 모델의 응답을 한글과 영어 사이에서 빠르고 효율적으로 번역하는 데 사용한다.

이 두 모델의 조합은 사용자에게 빠르고 정확한 번역을 제공하며, 동시에 복잡한 대화와 문맥 이해에 최적화된 경험을 제공하고자 한다.

또한 GPT-4의 1k token당 사용 가격은 GPT-3.5 Turbo에 비해 30배가량 비싸기 때문에 번역 같은 단순한 작업 지시는 저렴하지만 성능이 나쁘지 않은 모델을 사용하며 API 가격 정책을 효율적으로 활용하고자 함이다.

주요 기능

  • 언어 감지 및 번역(GPT-3.5 Turbo 사용): 사용자의 입력이 한글인 경우, 자동으로 영어로 번역하여 GPT 모델에 질문하고, 모델의 영어 응답을 다시 한글로 번역한다.
  • 지속적인 대화(GPT-4 사용): 이전 대화 내용을 기반으로 지속적으로 대화를 이어간다.
  • 토큰 사용량 추적: API 요청으로 생성된 텍스트의 토큰 사용량을 추적한다.

코드 함수 설명

  • estimate_token_count: 생성된 텍스트의 길이를 기반으로 토큰 사용량을 추정한다.
  • update_total_tokens: 전역 변수 total_tokens_used를 업데이트하여 세션 전체에서 사용된 토큰 수를 추적한다.
  • is_korean: 주어진 텍스트에 한글 문자가 포함되어 있는지 확인한다.
  • translate_text: 주어진 텍스트를 지정된 대상 언어로 번역한다.
  • chat_with_gpt: OpenAI의 ChatGPT와 대화를 진행하며, 이전 대화 내용을 기억한다.

사용 방법

  1. OpenAI에서 API 키를 발급받는다.
  2. Python 환경에서 필요한 라이브러리(openai)를 설치한다.
  3. 아래의 코드를 실행하여 대화를 시작한다.
  4. “감사합니다” 혹은 “끝” 이라고 입력하면 대화를 종료하고 대화에 사용한 예상 총 토근 수를 출력한다.

아래 코드는 GitHub에서 프로젝트 전체를 확인 할 수 있다.

import openai
import os
import re

total_tokens_used = 0

def estimate_token_count(text):
    return len(text) // 4

def update_total_tokens(estimated_tokens):
    global total_tokens_used
    total_tokens_used += estimated_tokens

def is_korean(text):
    return bool(re.search("[가-힣]", text))

def translate_text(text, target_language, model="gpt-3.5-turbo-1106"):
    openai.api_key = os.getenv("OPENAI_API_KEY")

    translation_prompt = f"Translate the following text to {target_language}:\n\n{text}"
    response = openai.Completion.create(
        model=model,
        prompt=translation_prompt,
        max_tokens=60
    )

    translated_text = response.choices[0].text.strip()
    estimated_tokens = estimate_token_count(translation_prompt + translated_text)
    update_total_tokens(estimated_tokens)

    return translated_text

def chat_with_gpt(messages, model="gpt-4", stop_sequences=None):
    openai.api_key = os.getenv("OPENAI_API_KEY")

    request_data = {
        "model": model,
        "messages": messages,
        "max_tokens": 150,
        "temperature": 0.7,
        "top_p": 1,
        "stop": stop_sequences
    }

    response = openai.ChatCompletion.create(**request_data)
    response_text = response.choices[0].message["content"]

    messages.append({"role": "assistant", "content": response_text})
    estimated_tokens = estimate_token_count(response_text)
    update_total_tokens(estimated_tokens)

    return response_text, messages


messages = [{"role": "system", "content": "You are a compassionate and knowledgeable therapist. Listen carefully and provide thoughtful, empathetic responses."}]
user_input = ""
print("Hello! How are you feeling today?")


while True:
    user_input = input("You: ")
    
    original_language = "Korean" if is_korean(user_input) else "English"
    if original_language == "Korean":
        user_input = translate_text(user_input, "English")

    messages.append({"role": "user", "content": user_input})

    english_response, messages = chat_with_gpt(messages, stop_sequences=["Thank you", "End"])

    if original_language == "Korean":
        response = translate_text(english_response, "Korean")
    else:
        response = english_response

    print("Assistant:", response)

    if "Thank you" in user_input or "End" in user_input:
        break

print(f"Total estimated tokens used so far: {total_tokens_used}")

결론

이 코드는 ChatGPT API를 활용하여 언어 장벽을 넘는 지속적인 대화를 구현하는 간단하지만 강력한 예시이다. GPT-4와 GPT-3.5-turbo 모델의 조합을 통해 사용자는 빠르고 정확한 번역 서비스와 함께 풍부하고 깊이 있는 대화 경험을 누릴 수 있으며, 이를 고객 서비스, 교육, 엔터테인먼트 등 다양한 분야에서 활용할 수 있을 것이다.

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다