[NLP] Chat GPT API 챗봇 만들기

김두현·2024년 11월 2일
post-thumbnail

Date: 2024.11.02.

I. Chat GPT API의 이모저모✨

Chat GPT API를 활용하면 간단하고 값싸게 잘 학습된 LLM 모델을 서비스에 적용할 수 있다.

Chat GPT API는 유료 서비스라 사용시 토큰 당 요금을 내야하는데, 우리가 직접 동일한 성능의 LLM 모델을 만들어 사용한다고 보고 비용을 비교하면 훨씬 싸기 때문에 실제 서비스에도 많이 활용되고 있다. 특히나 스타트업이나 중소, 중견 기업 같은 자체 AI 모델을 연구하거나 구축할 만한 환경이 되지 않는 경우에 Chat GPT API를 활용해 값싸고 편리하게 좋은 AI 모델을 서비스에 적용하여 활용하고 있다.

다만, 직접 모델을 구축한다거나 오픈 되어있는 LLM 모델을 활용하는 것이 Fine-tuning 등을 할 때 더 자유도가 높고, 보안 부분에서 사내 정보를 유출하는 게 부담되는 경우, 내가 필요한 만큼만 리소스를 사용하고 싶은 경우 등에는 더 좋은 선택일 것이다.

https://openai.com/api/pricing/

여기서 각 모델의 토큰 당 요금을 알 수 있다.

Chat-GPT API는 정말 간단하게 사용할 수 있도록 잘 만들어두었다. 공식 문서에도 잘 되어 있고, 추가적으로 서칭해보면서 한 몇 시간만에 기본적인 사용법을 어느 정도 익힐 수 있었다.

https://platform.openai.com/docs/api-reference/introduction

II. Chat GPT API 사용 설정

2-1 결제 수단 등록

일단 API를 사용하려면 결제 수단을 등록해야한다.

API 홈페이지 → 우측 위 Settings → Billing → Payment methods → Add payment methods

결제 카드를 등록 할 수 있다. 아마 해외 결제가 되는 카드여야 할 것 같다. 처음이면 10$를 충전하는 게 좋을 것 같다. 최소 balance가 되면 충전하는 조건을 설정해야 하던데, 5$ 미만이면 10$ 충전하는게 minimum 이였고, 5$ 충전이 minimum이어서 적어도 6$ 이상은 해야 어느정도 테스트 해보고 사용해보지 않을까 싶다. 나는 넉넉히 10$를 충전하여 사용해봤다.

2-2 API Key 발급

다음으로, API KEY를 발급받아야 한다.

API keys → Create new secret key

해당 창에서 간단히 API KEY를 발급받을 수 있다. API KEY를 발급 받으면 복사 버튼이 있으므로 복사해서 파일에 옮겨 놓는다.

나는 API key를 먼저 받고, Billing을 충전했을 때 제대로 반영이 안된 모양인지, 오류가 났다. 그러므로, Billing 을 먼저 충전하고, API key를 만드는 것을 추천하고, 만약 오류가 나더라도 API Key를 새로 만들어서 프로젝트에 적용하니 문제가 없었다.

III. Chat GPT API 사용하기

3-1 기초 뼈대

API Key를 발급받았다면, 이제 부터 Chat GPT를 내 코드에서 활용할 수 있다.

# pip install
! pip install openai

# Import
import openai

# Settings
OPEN_API_KEY= "YOUR API KEY"
openai.api_key = OPEN_API_KEY

model = "gpt-4o-mini"

messages=[{"role": "system", "content": "You are a helpful assistant."},
          {"role": "user", "content": "Hello!"}]

# chat
response = openai.chat.completions.create(model = model, messages = messages)
answer = response.choices[0].message.content

print(answer)

이렇게 간단하게 사용할 수 있다. 여기서 세부적인 것들만 추가해주면 자신이 원하는대로 Chat GPT API를 서비스에 활용할 수 있다.

먼저, 뼈대의 각 요소에 대해서 이해해보자.

1) Settings

OPEN_API_KEYS

OPEN_API_KEY에는 발급받은 API KEY 값을 넣어주면 된다.

model

model은 정말 다양한 모델을 지원한다.

def listOfModels():
    client = openai.OpenAI(api_key=OPEN_API_KEY)

    for i in client.models.list():
        print(i.id)

listOfModels()

이 함수는 현재 지원하는 모델들의 이름을 모두 한 줄씩 출력한다. 따라서, 그 중에 사용할 모델의 이름을 model 변수에 넣어주면 된다. 나는 그 중 'gpt-4o-mini'를 사용했다. sLLM이다보니 GPT4 turbo 같은 모델들에 비해서 훨씬 저렴하다. 하지만, 답변 속도도 GPT4에 비해 더 빠르고, 사용해보니 어느정도 성능도 좋아서 만족할만한 수준이라고 생각된다. 일반적인 챗봇 환경 정도에서는 GPT4o mini 를 추천한다.

messages

https://platform.openai.com/docs/api-reference/chat/create

messages는 API 사용에 있어 중요한 부분 중 하나이다. list 형이고, 안의 element는 dictionary 형태이다.

role은 채팅에서의 역할인데, system, user, assistant, tool, function이 있다. 일반적인 챗봇을 쓰기에 중요하다고 생각되는 요소는 system, user, assistant이다.

system은 gpt에게 사전에 주는 명령이라고 할 수 있다. 이 system에 명령을 잘 주면 fine-tuning이나 LangChain 방법론을 사용하지 않아도 할 수 있는 영역이 꽤 되기 때문에 잘 활용하는 것이 좋다. 이 system 에 뭘 주냐에 따라 prompt engineering을 할 수 있다. prompt engineering은 LLM이 내가 원하는 작업을 하도록 최적의 프롬프트를 설계하는 방법론이다. fine-tuning, Langchain를 활용하고도 prompt engineering을 사용해 적합한 출력을 낼 수 있으므로 중요하다. 프롬프트 엔지니어링에 대해서는 다음 포스트에서 더 자세히 다뤄보려고 한다.

user는 채팅에서 사용자가 입력하는 메세지이다.

assistant는 맥락 같은 정보를 넣어줄 수 있어서 이전 채팅에서의 답변등을 넣을 수 있다.

따라서, 위의 있는 코드는 맥락도 기억하지 않고, 그저 Chat GPT에 'Hello!' 한번 입력 하는 것과 다를 게 없다.

2) Chat

https://platform.openai.com/docs/api-reference/chat/create

선택한 model과 만든 message를 넣어서 답변을 생성하고 있다.
completions.create() 에는 다양한 parameter가 들어갈 수 있다. 필요하면 조정하면 되고, 일반적으로는 기본값이 세팅되어 있어서 라이트하게 쓸거면 조정하지 않아도 된다. 각 파라미터는 위의 링크의 공식 문서에서 자세히 설명되어 있다.

자주 쓸만한 create의 optional parameter

parametervaluedescription
frequency_penalty-2.0 ~ 2.0동일한 문구가 반복되는 것을 제약을 주는 파라미터. 0이면 제약이 없는 상태이다. 양수이면 동일한 단어를 사용하지 않는 방향이고, 음수이면 동일한 단어를 사용하도록 하는 방향이다.
max_compltetion_tokens1 ~ 모델 마다 상이모델이 생성하는 응답의 최대 토큰 제한
presence_penalty-2.0 ~ 2.0동일한 주제가 반복되는 것을 제약을 주는 파라미터. 0이면 제약이 없는 상태이다. 양수이면 동일한 주제를 사용하지 않는 방향이고, 음수이면 동일한 주제를 사용하도록 하는 방향이다.
streambooleanFalse이면, 답변을 다 만들어야 return. True이면 답변이 만들어지는 과정을 보여준다.
temperature0.0 ~ 2.00에 가까울 수록 가장 높은 단어를 선택해 정형화된 답변을 하고, 2에 가까울수록 창의적인 답변을 할 수 있다. 1(기본값)
top_p0.0 ~ 1.0temperature과 비슷하게, 0에 가까울수록 정형화된 답변, 1에 가까울수록 창의적인 답변을 한다. 고려할 단어의 범위를 조절한다는 차이점.

3-2 맥락을 기억하는 채팅

# chat
while (True):
    query = input()

    if query == "0":
        break

    print("user: ", query)

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

    response = openai.chat.completions.create(model = model, messages = messages)
    answer = response.choices[0].message.content

    print("GPT:", answer)

    messages.append({"role": "assistant",
                    "content": answer})

output

user:  안녕하세요.
GPT: 안녕하세요! 반갑습니다. 무엇을 도와드릴까요?
user:  Chat GPT에 대해서 알려주세요.
GPT: ChatGPT는 OpenAI에서 개발한 대화형 인공지능 모델로, 자연어 처리(NLP) 기술을 기반으로 하고 있습니다. 이 모델은 사람과의 대화에서 자연스럽고 유용한 응답을 생성할 수 있도록 설계되었습니다. 아래에 ChatGPT의 주요 특징을 정리해 드릴게요:

1. **대화 능력**: ChatGPT는 다양한 주제에 대해 대화할 수 있으며, 질문에 답하거나 정보를 제공하는 데 능숙합니다.

2. **학습 기반**: 대량의 텍스트 데이터를 학습하여 언어의 패턴과 구조를 이해하고, 이를 바탕으로 응답을 생성합니다.

3. **적응성**: 사용자의 질문이나 요구에 따라 적절한 정보를 제공할 수 있으며, 대화의 맥락을 이해하고 유지할 수 있습니다.

4. **다양한 용도**: 고객 지원, 교육, 콘텐츠 생성, 언어 번역 등 여러 분야에서 활용될 수 있습니다.

5. **제한 사항**: 완벽하지 않으며, 때때로 부정확한 정보나 비논리적인 응답을 제공할 수 있습니다. 특정 윤리적 기준을 준수하기 위해 일부 주제에 대해서는 제한이 있을 수 있습니다.

더 궁금한 점이나 특정 질문이 있으시면 언제든지 말씀해 주세요!
user:  이 답변을 영어로 번역해주세요.
GPT: Sure! Here’s the translation of the response into English:

---

ChatGPT is a conversational AI model developed by OpenAI, based on natural language processing (NLP) technology. This model is designed to generate natural and useful responses in conversations with humans. Here are the main features of ChatGPT:

1. **Conversational Ability**: ChatGPT can engage in conversations on a variety of topics and is skilled at answering questions or providing information.

2. **Learning-Based**: It learns from a large amount of text data to understand the patterns and structures of language, generating responses based on this understanding.

3. **Adaptability**: It can provide appropriate information based on the user's questions or needs and can understand and maintain the context of the conversation.

4. **Variety of Uses**: ChatGPT can be utilized in various fields such as customer support, education, content creation, and language translation.

5. **Limitations**: It is not perfect and may sometimes provide inaccurate information or illogical responses. There may also be restrictions on certain topics to adhere to specific ethical standards.

If you have any more questions or specific inquiries, feel free to ask!

--- 

Let me know if you need anything else!

맥락을 기억하지 못한다면 답변을 영어로 번역하라고 했을 때 기억하지 못한다. 이전 답변을 assistant에 넣어줘서 맥락을 잘 기억하고 있는 모습을 확인할 수 있다.

3-3 프롬프트 엔지니어링의 간단한 사례

friendName = "김두현"

messages=[]

messages.append({"role": "system", 
                 "content": "당신은 사용자와 20년지기 친구입니다. 반드시 한국어로 문장을 작성하고, 높임말을 쓰지 말고 친근한 말투를 사용하세요."})

messages.append({"role": "system", 
                 "content": "사용자의 이름은" + friendName + "입니다. 이를 고려해서 대화하세요."})

위의 코드는 system에게 사용자와 20년 지기 친구인 맥락을 줬고, 반드시 한국어로 문장을 작성하고, 높임 표현을 쓰지 않는 친근한 말투로 대화하라고 지시했다. 그리고, 사용자의 이름을 추가 맥락 정보로 주었고, 이를 고려해서 대화하라고 지시했다.

위와 같이 message에 같은 role이라도 계속 정보를 추가해줄 수 있다.

output

user:  안녕
GPT: 안녕, 두현아! 잘 지내?
user:  응 잘 지내지. 너는 요즘 별 일 없나?
GPT: 나도 별일 없어. 그냥 평범하게 지내고 있어. 요즘 뭐 재밌는 일 없었어?

해당 프롬프트 엔지니어링을 통해 나쁘지 않은 출력 결과를 얻을 수 있었다. 더 많은 정보를 주거나, 예시 등을 주면 더 좋은 성능을 이끌어 낼 수 있을 것이다. 이것이 프롬프트 엔지니어링의 매력이다.

이 프롬프트 엔지니어링을 어떻게 잘 할 수 있는가는 다른 자료를 찾아보는 것이 좋다. OpenAI의 프롬프트 엔지니어링 가이드라인도 있으며, 프롬프트 엔지니어링으로 답변 성능을 높이기 위한 다양한 연구들이 진행되고 있다.
ex. Zero/One/Few-shot Learning, In Context Learning, 구체적 지시, 단계 나누기, 생각할 시간 주기 등

IV. 정리

이 정도의 기능만 알아도 기본적인 사용자와 대화가 되는 챗봇이 되는게 정말 좋은 것 같다. 다양하게 시도해봤을 때, prompt engineering을 어떻게 잘 해주냐에 따라 답변 성능이 차이가 난다. 여기서 고급 기법들을 사용해 fine-tuning을 해서 도메인 최적화를 한다거나, LangChain RAG를 써서 도메인 최적화와 함께 Hallusination 위험을 줄인다거나, API 안에서도 다양한 파라미터를 조정한다거나 등을 통해서 더 좋은 성능을 이끌어 낼 수 있을 것이다.

Prompt Engineering을 더 공부하여 다음 포스트에서 요즘 하고 있는 챗봇 프로젝트에 적용한 내용을 집필할 계획이다.

V. 추가

5-1 stream

create 함수 내의 parameter 중 stream이 있다. 이 부분이 직관적이지 않아서 직접 결과를 비교해봤다.

1) stream 을 적용한 chating

# chat
while (True):
    query = input()

    if query == "0":
        break

    print("user: ", query)

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

    response = openai.chat.completions.create(model = model, messages = messages, stream=True)

    answer = ""
    print("GPT: ", end='')

    for chunk in response:
        if chunk.choices[0].delta.content is not None:
            print(chunk.choices[0].delta.content, end='')
            answer += chunk.choices[0].delta.content

    print()

    messages.append({"role": "assistant",
                    "content": answer})

답변을 다 만들고 출력하는게 아니라 중간 중간 출력하기 때문에 말뭉치 단위로 끊어서 주는 것 같다. 그래서 chunk 변수로 중간 중간 값을 받아서 출력한다. 따라서 코드가 약간 수정된다.

stream을 사용하면 GPT 서비스가 하는 것처럼 생성 중에도 한자 한자씩 나오게 된다. 그래서 더 자연스러운 대화가 가능하다.

stream = True)

stream = False)

profile
HYU ERICA 23 ICT융합학부 미디어테크놀로지전공 김두현

0개의 댓글