Create a Chatbot Trained on Your Own Data via the OpenAI API
챗봇을 만드는 이유는 무엇인가요?
AI가 정보 기술을 혁명적으로 변화시키면서, 많은 사람들이 OpenAI와 같은 API 제공업체를 사용하여 AI를 자신의 데이터에 통합하였습니다.
자신의 데이터에 AI를 활용하는 특히 좋은 방법은 자신만의 챗봇을 만드는 것입니다.
예를 들어, 당신이 수천 개의 회사 수익 보고서로 구성된 데이터셋을 가지고 있다고 상상해보세요. 이것을 탐색하고 분석하고 싶지만 많은 시간을 소비하고 싶지 않을 것입니다. 좋은 선택은 문서에 대해 가지고 있는 질문에 답변해 줄 수 있는 챗봇을 만드는 것입니다 — 이로써 당신이 직접 그것들을 검색하는 수고를 덜 수 있습니다.
예를 들어, “지난 분기에 어떤 회사가 가장 좋은 수익을 거뒀나요?”와 같은 질문을 할 수 있습니다 — 보통은 직접 데이터셋을 파헤치면서 이 질문에 답해야 합니다. 당신의 데이터로 훈련된 챗봇을 사용함으로써, 당신은 그 질문에 대한 답을 몇 초 안에 받을 수 있습니다.
OpenAI API 시작하기
자신만의 챗봇을 시작하기 위해 먼저 OpenAI API에 접근할 필요가 있습니다. OpenAI API 키를 얻으려면 OpenAI 웹사이트에 가입하세요. 그런 다음 홈페이지의 오른쪽 상단에 위치한 프로필 아이콘을 클릭하고, API 키 보기를 선택한 후 새로운 비밀 키 생성을 클릭하여 새 API 키를 생성하세요.
데이터 준비하기
이 튜토리얼에서는 컴퓨터와 그 역사에 대한 일반적인 질문에 답변할 수 있는 간단한 챗봇을 만들기 위해 컴퓨터에 대한 위키백과 페이지를 사용하겠습니다.
article’s GitHub repo에서 텍스트 형식의 데이터셋을 다운로드할 수 있습니다.
챗봇을 만들 폴더를 만듭니다. 그 다음 프로젝트 폴더 내에 chatbot_docs라는 폴더를 생성하고, 그 폴더 안에 데이터셋 파일을 붙여넣습니다. (폴더의 이름은 중요하지 않지만, 이 튜토리얼에서는 chatbot_docs라고 명명하는 것이 훨씬 쉽습니다.)
데이터에 간단한 챗봇 훈련 및 테스트하기
API 키와 데이터셋 파일을 준비하였다면, 실제 코드(embedings.py)를 시작할 수 있습니다.
프로젝트 폴더로 이동하여 새 프로젝트 폴더 안에 빈 파이썬 파일을 생성합니다.
그 작업을 완료하면, 터미널에서 다음을 실행하여 사용할 라이브러리들을 다운로드합니다:
pip3 install langchain flask llama_index gradio openai pandas numpy scikit-learn
마지막으로 필요한 모든 라이브러리를 설치한 후, Python 파일에 레포지토리에서 제공하는 파이썬 코드를 붙여넣습니다.
이 튜토리얼에서는 gpt-3.5-turbo OpenAI 모델을 사용하고 있습니다. 이 모델은 가장 빠르며 비용 효율적입니다. 코드를 살펴보았다면 알겠지만, 챗봇의 온도를 0으로 설정했습니다. 이는 챗봇을 가능한 한 사실적으로 정확하게 만들기 위함입니다. 온도 매개변수는 챗봇의 창의성을 결정합니다. 온도가 0이면 챗봇은 항상 사실적으로 정확하며, 온도가 1이면 창의성을 위해 정확하지 않은 답변과 세부 정보를 만들어 낼 수 있습니다. 온도가 높을수록 챗봇은 더 창의적이고 사실적으로는 덜 정확합니다.
이 코드 전반에 걸쳐 “embeddings“라는 단어를 언급하였습니다. 이것은 단순히 Wikipedia 문서에 있는 텍스트가 챗봇에 의해 이해되고 해석될 수 있도록 변환된 것입니다. 각 임베딩은 -1에서 1까지의 숫자로 구성된 목록이며, 정보의 각 부분이 다른 부분과 얼마나 밀접하게 관련되어 있는지를 나타냅니다. text-embedding-ada-002가 무엇을 의미하는지 궁금할 수 있는데, 이것은 임베딩을 생성하는 데 사용되는 모델의 이름일 뿐입니다. 왜냐하면 이 모델이 가장 비용과 시간 효율적이기 때문입니다.
이 코드는 chatbot_docs 폴더 내의 각 문서에 대한 임베딩 CSV 파일을 생성합니다. 이 튜토리얼의 목적으로는 하나의 파일만 있기 때문에 하나의 임베딩 파일만 생성됩니다. 그러나 더 많은 문서가 있었다면, 코드는 각 문서에 대한 임베딩 파일을 생성하게 될 것입니다. 이러한 방식은 챗봇을 보다 확장 가능하게 만듭니다.
또한 “chunks“에 관한 부분에 대해 궁금할 것입니다:
text_splitter = RecursiveCharacterTextSplitter(separators=["\n\n", "\n"], chunk_size=2000, chunk_overlap=250) texts = text_splitter.split_text(content) # Splitting the document content into chunks
이 코드는 Wikipedia의 컴퓨터에 관한 페이지를 여러 부분으로 나눕니다. 각 부분은 2000자로 구성되며, 각각의 부분 사이에는 250자의 중복 부분이 있습니다. 청크, 즉 이렇게 나누어진 부분의 크기를 크게 하면, 챗봇이 참조할 수 있는 내용의 범위가 넓어집니다. 그러나 이로 인해 처리 속도가 느려질 수 있기 때문에, 이번 튜토리얼에서는 최대 크기인 4096자와 최소 크기인 0자 사이에서 중간값인 2000자를 선택하였습니다.
청크의 중복에 관해서, 중복은 청크 사이에 일종의 연결고리를 제공합니다. ChatGPT는 이 중복 부분을 청크 크기의 10%에서 20% 사이로 설정하는 것이 좋다고 권장합니다. 이렇게 설정하면 각 청크 사이에 어느 정도의 연결성이 유지되며, 이전 청크와 너무 많은 중복 내용이 없도록 할 수 있습니다.
중복 부분이 작으면, 청크들 사이의 연결성이 약해집니다. 반대로 중복 부분이 크면, 청크들 사이의 연결성이 강해지지만, 같은 내용이 계속 반복될 위험이 있습니다.
간단히 말하자면, 이 코드는 컴퓨터에 관한 긴 Wikipedia 글을 작은 부분들로 나누어 챗봇이 이해하고 대응할 수 있게 만드는 방식을 사용합니다.
이 코드는 또한 문서를 단락별로 분할합니다 — 다음 줄(\n 또는 \n\n)이 나타날 때마다 텍스트를 분할합니다. 이렇게 하면 청크가 단락 중간에서 분할되지 않도록 하여 청크의 일관성을 유지합니다.
embedings.py 코드는 다음 작업들을 수행합니다:
- 라이브러리 및 모듈 임포트: 필요한 다양한 라이브러리 및 모듈을 가져옵니다. 일부는 이 시점에서는 필요하지 않을 수 있지만 나중에 사용될 것입니다.
- OpenAI API 키 설정:
os.environ
및openai.api_key
를 사용하여 OpenAI API 키를 설정합니다.- OpenAI 모델 설정: ChatOpenAI 클래스의 인스턴스를 생성하고 사용할 모델로 “gpt-3.5-turbo”를 설정합니다.
- 문서 디렉토리 읽기:
chatbot_docs
디렉토리에서 모든 파일을 읽어옵니다.- 문서 내용 저장: 모든 문서를 읽어서 내용을
content
변수에 저장합니다.- 텍스트 분할: RecursiveCharacterTextSplitter를 사용하여 문서 내용을 여러 청크로 분할합니다.
- Embedding 함수 정의: OpenAI API를 사용하여 텍스트 청크의 임베딩을 생성하는 함수를 정의합니다.
- CSV 파일 처리:
- 빈 CSV 파일(임베딩을 저장하기 위한 것)을 읽습니다.
- 분할된 텍스트 청크를 ‘combined’ 열에 추가합니다.
- 텍스트 청크에 큰따옴표를 추가하여 텍스트 내의 따옴표로 인한 구문 오류를 방지합니다.
get_embedding
함수를 사용하여 각 텍스트 청크의 임베딩을 생성하고 ’embedding’ 열에 추가합니다.- 임베딩 포맷 조정: 임베딩이 챗봇에서 읽을 수 있는 리스트 형태로 되어 있는지 확인합니다.
- 최종 CSV 파일 저장: 완성된 임베딩 데이터를 CSV 파일로 저장합니다.
이 코드는 OpenAI GPT-3 모델을 사용하여 주어진 문서들의 임베딩을 생성하고 이를 CSV 파일에 저장하는 작업을 수행합니다. 이 임베딩은 챗봇이 응답을 생성할 때 사용될 것입니다.
챗봇 제작하기
코드를 실행한 후에는 이제 챗봇에 의해 사용될 데이터를 준비했습니다. 이는 실제 챗봇(chatbot.py)을 제작할 수 있음을 의미합니다.
당신이 방금 실행한 Python 파일은 챗봇이 작동하는 데 필요한 임베딩을 생성했지만, 이제 실제 챗봇을 위한 또 다른 Python 파일을 제작해야 합니다. 이 파일은 질문을 입력으로 받아 챗봇이 만든 답변을 출력할 것입니다.
새로운 Python 파일을 만든 후, 저장소에서 이 Python 코드를 추가하십시오. 이제 챗봇을 실행하면, 몇 초의 처리 후 다음과 같은 출력을 얻어야 합니다.
이제 챗봇을 갖게 되었으니 다양한 질문으로 실험해 볼 수 있습니다! 또한 다른 청크와 청크 중첩, 그리고 온도(챗봇이 100% 사실적으로 정확할 필요가 없다면)와 같은 다양한 설정으로도 실험해 볼 수 있습니다.
- 질문 실험:
- 개방적인 질문과 구체적인 질문을 비교해보세요.
- 동일한 내용의 질문을 다양한 방식으로 표현해보며 챗봇의 반응을 확인해보세요.
- 데이터셋의 범위 내에서 다양한 주제로 질문하여 챗봇의 한계를 확인해보세요.
- 청크 크기 및 중복 조정:
청크 크기
를 조절하여 챗봇이 답변을 생성하기 위해 사용하는 컨텍스트의 양을 확인해보세요.청크 중복
을 조절하여 인접한 두 청크의 정보가 어떻게 관련되는지 알아보세요.- 온도 조절: llm = ChatOpenAI(temperature=0, model_name=”gpt-3.5-turbo”)
온도
파라미터는 챗봇의 답변의 무작위성(또는 창의성)을 조절합니다.- 높은 값은 더 창의적인, 그러나 정확도가 떨어지는 답변을 생성할 수 있습니다.
- 낮은 값은 챗봇이 사실적인 정보에 집중하여 답변을 생성하도록 합니다.
- 데이터셋 확장:
- 챗봇의 지식에 빈틈이 있다면 데이터셋에 문서를 더 추가해보세요.
- 피드백 루프:
- 챗봇의 응답에 대한 피드백을 수집하세요. 이를 통해 챗봇의 접근법을 미세 조정할 수 있습니다.
- 다른 시스템과의 통합:
- 웹사이트, 모바일 앱 또는 음성 활성화 시스템과 같은 다른 플랫폼 또는 서비스와 챗봇을 통합하는 것을 생각해보세요.
- 지속적인 훈련 및 업데이트:
- 모델 또는 도구의 새로운 버전을 지속적으로 확인하세요.
챗봇 구축은 과학만큼이나 예술입니다. 실험, 반복 및 피드백은 성능을 최적화하는 데 핵심적입니다.
chatbot.py 코드는 사용자로부터 입력받은 질문에 대한 응답을 생성하는 챗봇을 위한 코드입니다. 주요 기능과 작업 단계는 다음과 같습니다.
- 라이브러리 및 모듈 임포트: 다양한 라이브러리와 모듈들을 임포트합니다.
- API 키 설정: OpenAI API 키를 환경 변수로 설정합니다.
- 임베딩 함수 정의: 주어진 텍스트의 임베딩을 생성하기 위한 함수
get_embedding
을 정의합니다.- 로직 함수 정의:
logic(question)
: 사용자의 질문을 입력으로 받아 해당 질문에 대한 응답을 생성합니다.- 해당 함수 내에서, 임베딩 CSV 파일을 로드하고 임베딩 데이터를 리스트 형태로 포맷팅합니다.
- 사용자의 질문에 대한 임베딩을 생성하고, 기존 데이터와의 유사성을 계산합니다.
- 유사성 점수를 기반으로 텍스트 청크를 정렬하고, 가장 관련성 높은 청크를 선택합니다.
- 선택된 청크와 사용자의 질문을 기반으로 LLM (Language Model)을 사용하여 응답을 생성합니다.
- 챗봇 호출 및 출력:
logic
함수를 호출하여 사용자의 질문 “제일 처음 만들어진 컴퓨터는? 한글로 답해죠”에 대한 응답을 생성하고, 그 결과를 출력합니다.이 코드는 주어진 문서 집합 내에서 사용자의 질문과 가장 관련성 있는 정보를 찾아내고, 그 정보를 기반으로 OpenAI의 LLM을 사용하여 응답을 생성하는 로직을 구현합니다.
챗봇을 웹 앱에 구현하기
간단한 챗봇을 갖는 것도 좋지만, 전 세계의 사용자들이 이용할 수 있는 챗봇의 UI를 갖는 진짜 제품을 원하실 것입니다.
챗봇 웹 앱을 시작하기 위해 프로젝트 디렉토리 안에 templates 폴더를 생성하세요. 그 안에 bot.html이라는 HTML 파일과 style.css라는 CSS 파일을 생성하세요.
또한 프로젝트 디렉토리 안에 chat 폴더를 비워두세요. 이것은 백엔드-프론트엔드 통신에 사용될 것입니다.
이제 style.css 파일에 이 css 코드를 추가하세요. 그 다음, bot.html 파일에 이 HTML을 추가하세요. 이제 웹 페이지에서 요청을 받고 Flask를 사용하여 응답을 다시 보내기 위해 Python 챗봇 스크립트를 변경해야 합니다. Python 스크립트를 이 코드로 변경하세요. 이제 챗봇 웹 앱을 테스트해 봅시다! Python 파일을 실행하고 localhost:8001을 엽니다. 이제 아래와 같이 웹 페이지를 볼 수 있어야 합니다.
Flask를 사용하여 웹 앱에 챗봇을 구현하는 방법
- Flask로 웹 앱 환경 설정: Flask는 Python의 마이크로 웹 프레임워크로 웹 앱을 쉽게 만들 수 있습니다.
- 디렉토리 구조: 다음과 같은 구조로 디렉토리를 생성합니다:
/프로젝트_디렉토리 /templates bot.html style.css /chat chatbot.py
- CSS & HTML:
style.css
안에는 챗봇 UI에 대한 스타일링을 추가합니다.bot.html
에서는 챗봇 웹 페이지의 구조와 레이아웃을 정의합니다.
- 백엔드를 위한 Python 스크립트:
chatbot.py
는 서버로 작동합니다. Flask를 사용하여 HTML 및 CSS를 제공하며, 사용자 메시지를 보내고 챗봇 응답을 받는 POST 요청을 처리합니다. 간단한 예제를 보여드리겠습니다:from flask import Flask, render_template, request, jsonify app = Flask(__name__) @app.route('/') def home(): return render_template('bot.html') @app.route('/ask', methods=['POST']) def ask(): user_message = request.form['user_message'] # 여기서는 챗봇 모델을 사용하여 응답을 받을 수 있습니다. # 간단하게, 사용자의 메시지를 그대로 반영하겠습니다. bot_response = "에코: " + user_message return jsonify({'bot_response': bot_response}) if __name__ == '__main__': app.run(port=8001)
- 웹 앱 실행:
chatbot.py
,bot.html
, 및style.css
를 설정한 후에는chatbot.py
스크립트를 실행합니다:python chatbot.py이제 웹 브라우저를 열고
localhost:8001
로 이동하면 챗봇 UI를 볼 수 있습니다. 사용자는 질문을 입력하고 챗봇이 응답합니다.
- 다음 단계: 여기서부터는 UI를 더 개선하거나, 더 고급 챗봇 응답을 추가하거나, Heroku나 AWS와 같은 플랫폼에 챗봇 웹 앱을 배포하여 다른 사람들이 온라인으로 액세스 할 수 있도록 할 수 있습니다.
챗봇을 웹 애플리케이션에 통합하는 것은 시작에 불과합니다. 더 많은 기능을 추가하거나 UI/UX를 향상시키거나 데이터베이스를 통합하여 챗봇을 더욱 상호 작용적이고 효율적으로 만들 수 있습니다.
Now if you enter a question, you should see a loading animation while the chatbot is processing it.
Finally, after a few seconds, you should get a response from the chatbot, as pictured below.
web_app.py 코드는 웹 기반의 챗봇 응용 프로그램을 실행하기 위한 것입니다. Flask를 사용하여 웹 서버를 설정하고, 사용자의 질문에 대한 응답을 생성하기 위해 여러 OpenAI 라이브러리 및 모듈을 활용합니다.
- 라이브러리 및 모듈 임포트: 다양한 라이브러리와 모듈들을 임포트합니다.
- API 키 설정: OpenAI API 키를 환경 변수로 설정합니다.
- 임베딩 함수 정의: 주어진 텍스트의 임베딩을 생성하기 위한 함수
get_embedding
을 정의합니다.- 로직 함수 정의: 사용자의 질문에 대한 응답을 생성하는 주요 로직을 담고 있는
logic
함수를 정의합니다.- Flask 앱 설정: Flask 웹 애플리케이션을 생성하고, 기본 경로와 채팅 경로를 설정합니다.
home()
: 웹 페이지를 렌더링합니다.chat()
: POST 요청을 통해 사용자로부터 질문을 받아 응답을 생성하고 반환합니다. 만약 기본 질문에 대한 응답이 충분하지 않다면, 이전 질문을 활용하여 다시 응답을 생성하려고 시도합니다.
- 애플리케이션 실행: Flask 웹 애플리케이션을
localhost
의8001
포트에서 실행합니다.요약하면, 이 코드는 사용자의 질문을 받아들이고, 해당 질문에 대한 응답을 생성하여 웹 페이지에 보여주는 웹 기반 챗봇 응용 프로그램을 구현합니다.