AI Chatbot 만들다!

Chatbot 응답을 AI(LLM)가 해주도록 API 연결하기(2) - API 실제로 연결

wy-family 2024. 11. 9. 20:07

1. 일단 OpenAI API key 를 가지고 와야 한다.

여러가지 AI/LLM API가 있겠지만, 나는 공부용으로 잠깐 사용할 것이니까 돈이 조금은 쓰이더라도 MSVScode에서 편하게 사용가능한 openAI를 사용할 것이다.

이 key 라는게 있어야, API를 사용할 수 있다. 그리고 잘 지켜야 한다. 혹시나 이걸 누가 알게 되면, 내 key로 결제를 막 해버릴 수도 있으니까.

너무 신기한건, 처음 key를 생성할 때에만 key를 보여주고 그 다음에는 보여주지 않는다는 것.


2. OpenAI 라이브러리를 다운로드하자.

MS VScode에

pip install openai 를 하면 된다.

그리고 나서 chatGPT가 알려주는대로 했다.

utils.py 라는 파일을 새로 만들어서 코드를 넣었다.

이번에는 gpt-3.5-turbo 를 사용한다.

그리고 max_token = 100으로 되어 있는데,

나는 이걸 공부용이니까 100이면 충분하지 않을까 싶다.

저기서, temperature = 0.7 이라고 하는 부분이 있다.

저기서 온도라는 건, 창의성의 수준을 조정하는 걸로 나온다.

 

1. max_tokens가 의미하는 것은?

max_tokens는 생성될 응답의 최대 길이를 토큰 단위로 설정하는 옵션입니다.

  • 토큰(Token): 토큰은 단어 또는 단어의 일부(접사 포함)를 의미합니다. 영어의 경우, 한 단어는 보통 1~2개의 토큰으로 구성됩니다. 한국어나 다른 언어에서는 한 글자가 1개의 토큰으로 처리되기도 하지만, 텍스트의 의미와 맥락에 따라 토큰 수는 달라질 수 있습니다.
    • 예를 들어, "안녕하세요"라는 한글 문장은 5개의 글자지만 1~3개의 토큰으로 처리될 수 있습니다.
  • 사용법: max_tokens=100이면 최대 100개의 토큰으로 제한하겠다는 의미입니다. 토큰이 많을수록 더 긴 응답을 얻을 수 있지만, API 사용 비용이 높아질 수 있습니다.

2. temperature가 의미하는 것?

temperature는 모델의 응답의 창의성을 조절하는 매개변수입니다. 0부터 1 사이의 값을 주로 사용하며, 값에 따라 모델의 응답 방식이 달라집니다.

  • 낮은 값(예: 0~0.3): 응답이 더 일관성 있고 예측 가능하게 됩니다. 창의적이기보다는 사실적이고, 고정된 답변을 주는 경향이 있습니다.
  • 중간 값(예: 0.5~0.7): 비교적 균형 잡힌 응답을 줍니다. 응답이 다소 창의적이지만 여전히 예측 가능성도 유지됩니다.
  • 높은 값(예: 0.8~1): 응답이 더욱 창의적이며 변동성이 큽니다. 응답이 더욱 다양하고 예상치 못한 답변이 나올 가능성이 있습니다.

보통 한국어 대화에서는 0.7 정도로 설정하여 자연스럽고 창의적인 응답을 얻는 것이 적합합니다.


이제 view 코드에서, chatroom의 뷰까지 수정했다. 이제 runserver해서 확인해보자.

에러가 발생했다.

흐음....

 

근데, 에러가 발생하면 그걸 처리하는게 사실 당연히 있는 일. 어떤 개발자가, 본인 업무의 50% 이상이 에러 처리라고 했던 것 같다. 에러가 발생한 걸 확인했으면 고쳐야지.

 

openAI 라이브러리의 버전이 업데이트 되어서라고 한다.

 

2가지 해결책을 제시하고 있다.

첫번째는 라이브러리 버전을 다운그레이드 시키는 방법,

두번째는 최신 버전에 맞게 코드를 변경하는 것.

 

당연히, 최신 버전에 맞춰야 하는게 아닐까 싶다.

현업에서는 어떤 판단을 내릴려나.


실제 현업에서도 최신 버전에 맞추는 것이 일반적인 접근 방식입니다. 이를 통해 최신 보안 패치, 기능 개선, 최적화된 성능을 유지할 수 있기 때문입니다. 그러나 프로젝트의 상황에 따라 다음과 같은 다양한 요소가 고려됩니다.

최신 버전에 맞추는 장점
보안과 안정성: 최신 버전은 알려진 취약점이 수정되고 보안이 강화되어 있어, 유지보수와 보안 측면에서 더 안전합니다.
새로운 기능: 최신 버전은 더 많은 기능을 제공할 가능성이 있으며, 성능도 개선되어 효율성이 높아집니다.
장기적인 호환성: 최신 버전에 맞춰 개발해 두면, 다른 시스템 또는 의존성 패키지와의 호환성을 유지하기 쉽습니다.

예외적으로 구 버전을 유지하는 경우
프로젝트의 안정성: 기존 시스템이 오래된 코드와 맞물려 복잡하게 돌아가는 경우, 업데이트가 전체 시스템에 영향을 줄 수 있어 신중한 접근이 필요합니다.
시간과 비용 문제: 최신 버전으로 전환할 때 테스트 및 QA 작업이 추가되므로, 시급한 문제 해결이 우선이라면 구 버전 유지도 고려할 수 있습니다.
의존성 문제: 프로젝트의 다른 의존성들이 최신 버전과 충돌할 수 있는 경우도 있습니다.

결론
일반적으로는 최신 버전으로 유지하는 것이 좋지만, 프로젝트의 일정, 리소스, 안정성을 종합적으로 고려하여 결정합니다. 특히 현업에서는 테스트 환경에서 최신 버전으로의 전환을 미리 검토한 후 실제 환경에 적용하는 방식을 자주 사용합니다.

우리는 그러면, 시간과 비용 문제, 프로젝트의 안정성의 이유를 들어서, 구 버전을 유지하는 선택을 해보자.

올해 있었던 보안 사건 중에, 마이크로소프트 전세계 블루스크린 사태가 있었다. 그 때, 윈도우의 구버전, 굉장히 오래된 9x년도의 윈도우 버전을 쓰던 곳들은 아무 이슈가 없었다는 이야기를 들었던 걸로 기억한다.

재미난 이야기다.

아무튼, 가보자.

 

또 에러가 뜸.

돈을 안 냈으니, 쓸 수가 없다는 뜻.

암튼, 결제도 했다. 일단 5달러만...ㅎ

자동 충전 기능이 있으니, 꼭 off 시켜놓으시길!


확실히, AI가 답해주는거니까 느낌이 다르다.

느낀 점.

1. gpt 3.5 - turbo 이긴한데, gpt를 유료결제해서 평상시에도 사용하고 있어서 그런지, 성능면에서 차이가 좀 심하다는 생각이 들었다. gpt3를 처음 접했을 때 받았던 충격이 있었던 것 같은데 이제는 성능 격차가 심하다는 생각이 든다.

2. max_token = 100 으로 설정했기 때문에 저렇게 짧게 답을 해주는구나 라는 걸 알게 되었다.

어쨌든, 잘 작동하고 있구나. 굿굿.

이거를 배포하게 될때에는,

max_token을 제한했다는 안내 문구, gpt3.5-turbo 모델을 쓰고 있어서 gpt 최신 모델에 익숙하신 분들에게는 성능이 별로다라는 생각이 들 수도 있다는 점을 알려주자.

 

답변을 받고 난 뒤에, OpenAI API dashboard에서 확인해보니까, usage에 사용량이 표시되었다. 신기하고 재밌구만.

 


어떻게 보면, 아직 배포하기 전 단계지만, 완성이 되었다. 내가 AI chatbot을 만들었다. 허허..

 

AI LLM API Structure 에 대한 이해를 해보면,

역할을 지정해줄수가 있다. 예를 들어서, "내가 한국어로 말하면 영어로 해석해주는 역할을 해줘"

이거를 Master Prompt 라고 해서, AI의 성격, 특성을 결정지어줄 수 있는 것 같다.

이제 Master Prompt에 대해 말씀드릴게요. Master Prompt 또는 System Prompt는 AI 모델의 초기 설정을 지정하는 특별한 메시지입니다. 이를 통해 AI의 성격, 역할, 응답 방식 등을 설정할 수 있습니다. OpenAI의 API 구조에서 messages 파라미터를 이용해 다양한 역할을 부여할 수 있습니다. 여기에는 세 가지 주요 역할이 있습니다:

  • System: AI에게 어떤 역할을 수행해야 하는지 설정하는 역할입니다.
  • User: 실제 사용자가 입력하는 메시지를 전달합니다.
  • Assistant: AI 모델이 생성한 응답을 나타내며, AI가 어떤 방식으로 응답해야 할지 지침을 줄 수 있습니다.

구조를 이용한 예제 코드

한국어 입력을 받아 영어, 중국어, 일본어로 번역하는 역할을 설정해보겠습니다. System 메시지에서 AI에게 이 번역 작업의 역할을 지정할 수 있습니다.

import openai

def get_ai_response(user_message):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "You are a multilingual translator. When the user inputs a message in Korean, translate it into English, Chinese, and Japanese."},
            {"role": "user", "content": user_message}
        ],
        max_tokens=100,
        n=1,
        stop=None,
        temperature=0.7,
    )
    
    # 응답에서 텍스트 추출
    return response['choices'][0]['message']['content'].strip()

설명

  • System 메시지: AI에게 사용자의 한국어 메시지를 영어, 중국어, 일본어로 번역하라고 지정했습니다. 이를 통해 AI는 자신이 번역가 역할을 수행해야 한다는 인식을 갖게 됩니다.
  • User 메시지: 사용자가 입력한 메시지 (user_message)를 전달합니다.
  • Response: AI는 지정된 언어로 번역한 내용을 반환합니다.

이 설정을 통해, AI가 한국어 입력을 받으면 영어, 중국어, 일본어로 자동 번역된 응답을 반환할 것입니다.

 

오호~~ 제대로 잘 작동하고 있다. 굿굿 해냈어! 사랑합니다.