안녕하세요? 플러스제로 엔지니어팀 입니다.
오늘 소개드릴 내용은 GPT기반 사내 QA(Question-Answer) Chatbot입니다.
저희 플러스제로는 기술을 담당하는 엔지니어팀 외에도 디지털 마케팅을 위한 컨설팅 팀이 함께 합니다.
컨설팅팀의 주요 업무는 디지털마케팅을 위한 대시보드 제작, SEO (Search Engine Optimization), GTM (Google Tag Manager) 구축, CRO(Conversion Rate Optimization), 인사이트 발굴 등, 고객사의 매출을 극대화 하기 위한 서비스를 컨설팅 및 제공하고 있습니다.
저희 플러스제로에 대한 자세한 설명은 [회사소개서] 에서 확인해 보실수 있습니다.
다양한 고객사에게, 다양한 서비스를 제공하다보니, 저희 플러스제로에서는 동일한 품질의 서비스를 제공하는 것을 우선 목표로 두게 되었습니다.
컨설턴트 분들께서 다양한 서비스를 컨설팅 하시며, 플러스제로의 기준에 부합하는 서비스 품질을 제공하기 위해서 모든 문서는 공유되고, 매주 금요일마다 Knowledge-Session을 진행하며 아이디어를 나누며 노하우를 공유합니다.
그러나, 이러한 노력으로도 많은 서비스의 품질을 보장하기에는 쉽지가 않습니다. 세션을 통해 공유된 내용은 비교적 수월하게 습득이 가능하지만, 많은 양의 문서에서 정보를 찾기란 사실상 어려운 문제로 다가오게 되었습니다.
이러한 문제를 해결해보고자 필요한 정보를 인터넷이 아닌, 회사의 문서, 즉, 기존 컨설팅을 통해 축적된 자료를 통해서 서비스의 품질을 유지할 수 있는 QA-ChatBot을 사용하고 있습니다.
NLP Question Answering
- QA 시스템은 NLP분야의 다양한 Task중의 하나로, 대표적으로 영문 데이터셋인 SQuAD데이터와 한글 데이터인 KorQuAD가 있습니다. NLP Task를 진행 할때에는 Question과 Context를 언어모델 (Language Model)에 주어 해당 Context에서 답변을 내는 Task가 주를 이뤘습니다. 최근 많이 사용되는 용어인 LLM은 (Large Language Model)이며, 언어모델의 파라미터가 굉장히 많은 모델을 지칭합니다. 과거에는 BERT (345 Million) 또한 크기가 큰 모델이였으나, 최근 많이 사용되는 GPT-3의 경우 175 Billion의 파라미터를 가지고 있습니다
위의 예시와 같이 QA는 “Extractive”, “Generative”와 같이 추출형, 생성형으로 답변을 사용자에게 줄 수 있습니다.
하지만, 언어모델이 받을수 있는 Context의 길이는 모델의 학습에 설정되었던 max_seq_length 또는 max_token을 넘어갈 수 없습니다.
그렇기 때문에 OpenAI의 모델에는 보시는바와 같이 Max Tokens가 명시되어 있습니다.
또한 GPT의 경우 학습에 사용된 데이터는 2021년 9월까지의 데이터를 통해 학습되었기에, 과거의 많은 정보에 대해서는 학습이 되었지만, 2021년 10월 이후의 정보에 대해서는 학습되어있지 않기 때문에 새로운 정보에 대해서는 한계를 보여줍니다. 한 예시로 Chat-GPT에 “한국의 대통령은 누구입니까?” 라는 질문에는 “2021년 5월 기준으로 문재인 입니다” 라는 답변을 보여줍니다. 하지만 OpenAI는 서비스 품질을 향상시키기 위해 추가적인 문구를 답변에 포함시켜 사용자에게 전달해 줍니다.
따라서 저희 엔지니어 팀에서는 최신 정보가 필요한 GA4와 관련된 내용과 함께 플러스제로에서 구축 및 컨설팅을 진행한 문서를 활용 할 수 있는 QA-Chatbot을 구성하기로 하였습니다.
특히 단순 ChatBot이 아닌 QA를 위한 정보 지식 정보를 사내 문서로 한정하였기 때문에, 인터넷에 있는 많은 자료들과 언어모델이 학습때 사용된 정보를 최소화 할수 있기 때문에 GPT와 같은 생성모델에서의 LLM-hallucinations 현상을 최소화 할 수 있었습니다.
- LLM - Hallucinations
- Hallucination 현상은 생성모델의 답변이 사실과 다르지만, 문법적, 문맥적으로 말이 되지만 잘못된 정보를 마치 정확한 정보인 것처럼 보이게 하는 현상입니다.
플러스제로의 QA-Chatbot을 만들기 위해서 우선 사내 문서의 정리가 필요했습니다.
다양한 문서가 있기 때문에 필요한 문서들을 추려내고, QA System에 맞는 문서 형식으로 변경 하였습니다. 하지만 문서의 양이 굉장히 많고, LLM은 Input으로 받을수 있는 토큰의 최대 수가 정해져 있기 때문에 모든 문서의 내용을 포함 할 수 있도록 각 문서의 텍스트를 나누어서 처리하였습니다.
하지만, 글자의 숫자로 문장을 나누게 되면 문장의 관계 또는 단어가 분해 될 수 있기 때문에 Window를 줌으로써 각 Chunk별로 문장의 의미를 가질수 있도록 분해 하였습니다.
예를 들면 하나의 문서(word파일, 52장 분량)의 문서는 위와 같은 방식으로 분리되어 15개의 문서로 분리됩니다.
이와 같은 방법으로 분할된 많은 수의 문서는 Document Embedding을 통하여 저장됩니다.
서버의 메모리와 같이 하드웨어적인 문제가 있기때문에 많은 양의 문서를 메모리에 저장할 수 없기 때문에, 임베딩된 값은 Vector Store에 저장합니다.
Vector Store(DataBase)는 벡터값을 저장하며 유사도를 계산하는 등 다양한 일을 할수 있는 저장 방식으로 Facebook의 FAISS가 많이 알려져 있습니다. [facebookresearch/faiss]
세부적으로는 분리된 문서의 내용은 Vector Store에 [ Index, Embedding-Value, Meta-Information ] 과 같은 형태로 저장되어 있으며, 사용자의 질문은 [ str -> Embedding-Value ] 로 변환되어 Vector Store의 문서들과 유사성을 비교하게 됩니다. 이때 문서와 질문을 변환시키는 Embedding-Model은 동일한 모델을 사용해야 합니다.
질문과 문서들간의 유사성을 비교한 이후에는, 유사성이 높은 K-개의 문서를 추려 내어 기본적인 QA에 필요한 Context로 사용하게 됩니다.
이렇게 많은양의 데이터를 기반으로 QA를 처리하는 방법은 Retriever-Reader, Retriever-Generator 프레임워크를 착안하게 되었습니다. 현재 GPT모델과 함께 사용되는 방법은 ODQA (Open-Domain-Question-Answering) Task로 Vector Store에 저장된 값에서 질문에 대한 답을 찾을수 있도록 합니다.
추가적으로 GPT는 Generator모델이기에 “PLUSZERO의 업무는 무엇인가?”라는 질문에 대한 답은 Context에서 추출하는것이 아닌 완전한 문장으로 생성해 주기에 Extractive방식보다는 풍부한 답변을 받을수 있습니다.
동일한 질문을 OpenAI의 Chat GPT와 Google의 Bard, 플러스제로의 QA-Chatbot에게 질문한 예시를 끝으로 이번 포스트를 마무리 하겠습니다.
Q: 웹사이트로 유입된 사용자의 구매율을 높이는 방법을 알려줘
Q: organic search에서 내 사이트와 연관이 높고 유입이 잘 될 수 있는 키워드 찾는 방법