본 포스팅 시리즈에서는 최근 트랜드였던 ChatGPT에 대한 개요와 OpenAI에서 제공하는 AI 언어모델 API를 이용한 응용 사례들, OpenAI에서 제공하는 각종 모델의 특징들에 대해 안내하고 더 나아가 OpenAI에서 제공하는 AI 언어모델 API 사용법, 인공지능 모델에 목표를 부여하고 특정 방향성으로 응답하도록 하는 인공지능 튜닝방법 까지 소개할 예정입니다.
이번 포스트는 세번째 시리즈의 연속으로서, 지난 포스팅에 이어, 지난 포스팅의 예제로 파인튜닝한 데이터를 사용해 회사 전용 행정 챗봇을 만드는 예제를 다뤄보겠습니다.
챗봇을 통한 파인 튜닝 데이터 모델 사용 예시 #
챗봇 환경 및 구성도 #
Synology Chat과 OpenAI API 간의 통신을 활용하여 사용자의 질문을 OpenAI API 모델에 전달하고, 그에 대한 응답을 다시 Synology Chat으로 반환하는 챗봇 API를 개발하는 예제를 통해 튜닝된 모델에 대한 응용 예시를 확인해보겠습니다.
위의 구성과 같이 챗봇은 다음과 같은 순서로 동작합니다.
- Synology Chat에서 챗봇 API에 요청
- 챗봇 API에서 OpenAI API에 요청
- 챗봇 API에서 OpenAI API에게 받은 응답을 가공
- 가공한 응답을 Synology Chat에게로 전송
각 단계에서의 작업 상세 내용을 설명하겠습니다.
챗봇의 작업 상세 #
Synology Chat에서의 요청 #
Synology Chat에서는 봇 연동기능을 제공하고 있습니다.
사용자가 메시지를 입력하면, 이를 Synology Chat 서버로 전송하고, 그에 따른 요청이 챗봇 API로 전달됩니다.
POST /api/chatbot/message
{
"text": "점심시간",
"user_id": 9,
"username": 12345,
"post_id": 54321,
"thread_id": 0,
"timestamp": 1701332279284,
"token": "{봇 고유 토큰}"
}
위와 같은 형태로 Synology Chat은 사용자 ID와 메시지를 포함한 JSON 형식의 요청을 POST 방식으로 전송합니다.
챗봇 API에서 OpenAI API에 요청 #
OpenAI API는 파인 튜닝된 모델을 사용할 수 있으며, 몇까지 옵션값을 주어 모델의 동작방식의 약간의 변화를 줄 수 있습니다.
Synology Chat으로부터 받은 요청을 기반으로, 챗봇 API는 OpenAI API로 아래와 같은 형태의 데이터 구성으로 사용자의 메시지를 전달합니다. OpenAI API는 해당 메시지를 분석하고 응답을 생성한 후, 이를 다시 챗봇 API로 반환합니다.
POST https://api.openai.com/v1/chat/completions
{
"model": "ft:gpt-3.5-turbo-1106:innofactory::{모델 고유 ID}",
"messages": [
{"role": "system", "content": "너는 존댓말로 대답하는 회사의 행정 Q&A 챗봇 이노메이트. 너는 url이 포함된 응답을 할 때 {URL List} 의 url 중에서만 선택해서 대답할 수 있어. 너가 적절한 답변을 찾지 못했을 경우에는 경영기획팀으로 문의해 주세요 라고 답변해야해."},
{"role": "user", "content": "점심 시간"}
],
"temperature": null,
"max_tokens": 1024,
"top_p": 1,
"frequency_penalty": -1.0,
"presence_penalty": 0,
"stop": ["stop"]
}
챗봇 API에서 OpenAI API에게 받은 응답을 가공 #
챗봇 API로 반환된 OpenAI API의 응답은 다음과 같은 형태로 구성되어있습니다.
{
"id": "{작업 ID}",
"object": "chat.completion",
"created": 1701332972,
"model": "ft:gpt-3.5-turbo-1106:innofactory::{모델 고유 ID}",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "12:30부터 13:30까지 입니다."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 517,
"completion_tokens": 15,
"total_tokens": 532
}
}
챗봇 API는 응답 데이터인 choices > message > content 테이터를 추출하여 이를 Synology Chat으로 전송합니다.
가공한 응답을 Synology Chat에게로 전송 #
Synology Chat은 사용자가 입력한 채팅내용을 POST 방식으로 Synology Chat 서버를 통해 챗봇 API에게 보냈지만, 받는 데이터는 기본적으로 GET 방식만 허용합니다.
OpenAI API의 응답을 Synology Chat으로 전송하여 사용자에게 표시되도록 합니다.
GET Synology Chat
{
api:SYNO.Chat.External
method:chatbot
version:2
token:"{봇 고유 토큰}"
payload: {"text":"12:30부터 13:30까지 입니다.", "user_ids": [9]}
}
위의 작업 과정을 통해 사용자의 질문에 대한 응답이 Synology Chat에서 표시될 수 있습니다.
일련의 작업들을 통해 Synology Chat과 OpenAI API간의 챗 응답/요청을 중개해주는 챗봇 API를 완성할 수 있습니다.
해당 예제에서는 사내 행정용으로 Fine-tuning된 모델이 사용되었으며, 해당 챗봇을 다른 목적으로 변형하고자 한다면 새로운 모델을 원하는 방향으로 Fine-tuining해 사용하면 될 것입니다.