인공지능 기술이 발전함에 따라, 우리는 일상에서 다양한 방식으로 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와 대화를 진행하며, 이전 대화 내용을 기억한다.
사용 방법
- OpenAI에서 API 키를 발급받는다.
- Python 환경에서 필요한 라이브러리(
openai
)를 설치한다. - 아래의 코드를 실행하여 대화를 시작한다.
- “감사합니다” 혹은 “끝” 이라고 입력하면 대화를 종료하고 대화에 사용한 예상 총 토근 수를 출력한다.
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 모델의 조합을 통해 사용자는 빠르고 정확한 번역 서비스와 함께 풍부하고 깊이 있는 대화 경험을 누릴 수 있으며, 이를 고객 서비스, 교육, 엔터테인먼트 등 다양한 분야에서 활용할 수 있을 것이다.