대학원생이 교수님을 AI 챗봇으로 만든 방법

최근 저는 RAG 기반의 ‘교수님 챗봇’을 만들었습니다. 이 글에서 RAG에 대한 아주 간략한 설명과 함께, AI 챗봇을 만드는 과정을 살펴보세요.
Jan 09, 2024
대학원생이 교수님을 AI 챗봇으로 만든 방법

⏳5min


최근 저는 RAG 기반의 ‘교수님 챗봇’을 만들었습니다. 재미 반 진심 반, 가벼운 마음으로 만든 교수님 컨셉의 AI 챗봇이었는데요. 스터디원분들이 제 생각보다 더 ‘교수님 챗봇’을 잘 활용하고 계시고, 도움이 되었다고 얘기해주시더라고요. 그래서 이번 챗봇 개발 과정을 AI 히어로즈를 통해 여러분께 공유드리고자 합니다. 이 글에서 RAG에 대한 아주 간략한 설명과 함께, AI 챗봇을 만드는 과정을 살펴보세요.

1. 교수님 챗봇을 만들게 된 이유

기말고사의 부담이 다가오니 점점 압박이 커지는 이때, 문득 교수님의 수업 내용과 말투를 적용한 AI 챗봇을 만들면 유용하겠다는 생각이 들었습니다. 그래서 제가 지금 듣고 있는 수업 중 개인적으로 가장 어려운 ‘확률과 통계’ 수업 교수님을 본따 '교수님 챗봇'을 만들기로 결심했습니다. 교수님은 항상 ‘질문은 언제든 환영’이라고 말씀하시지만, 제 입장에서는 질문을 드리기조차 부담스러울 때도 있었습니다. 용기를 내어 질문했지만 교수님의 답변이 너무 어려울 때도 있었죠. 그렇다고 교수님께 ChatGPT에게 하듯이 “조금 더 쉽게 알려줘", “중학생도 이해할 수준으로 쉽게 설명해 줘"라는 프롬프트를 드릴 순 없으니, AI 챗봇을 만들어서 마음껏 질문하고 답변을 받으면 좋겠다는 생각이었습니다. 

2. RAG 구조 간단히 알아보기

'교수님 챗봇'은 수업자료를 바탕으로 대답해야 하기 때문에, Retrieval-Augmented Generation (RAG) 구조를 기반으로 합니다. RAG 구조는 정보 검색과 생성 언어모델을 결합한 구조로서, 사용자의 질문에 대해 우리가 입력한 문서 혹은 데이터베이스에서 가장 적절하고 정확한 답변을 생성합니다.

교수님 AI 챗봇 RAG 구조란?

RAG 구조를 간단히 그리면 위와 같습니다. 사용자의 질문과 내 데이터는 모두 임베딩 모델을 통해 임베딩되고, 벡터화되어 벡터 DB에 저장됩니다. 이후 내 데이터에서 질문과 가장 유사도가 높은 데이터 일부(청크)를 검색해서 가져오게 됩니다. 이어서 질문과 청크가 언어모델로 입력되고, 언어모델은 이를 통해 답변을 생성합니다. 이러한 방식으로 RAG를 사용하면 내 문서를 기반으로 답변하는 챗봇을 만들 수 있습니다. ‘교수님 챗봇'도 RAG를 기반으로 만들어졌습니다.

3. 수업 자료 임베딩하기

교수님 AI 챗봇 수업자료 임베딩

먼저 내 데이터를 임베딩하는 과정이 필요했습니다. 저는 수업 자료 pdf를 임베딩했는데요. 임베딩이란 복잡한 데이터를 AI 모델이 이해하고 처리할 수 있는 형태로 변환하는 과정을 말합니다. 수업 자료에 있는 텍스트를 모델이 이해하기 쉬운 벡터(숫자)로 바꾸는 과정입니다. 임베딩 모델은 직접 만들 수도 있고, 알려진 모델을 사용할 수도 있습니다. 잘 알려진 임베딩 모델도 여러 가지가 있습니다. 

1️⃣ OpenAI의 임베딩 모델

- text-embedding-ada-002

- text-search-davinci-*-001

- text-search-curie-*-001

- text-search-babbage-*-001

- text-search-*-001

2️⃣ Google의 임베딩 모델

- BERT

- SBERT

이 외에도 BERT를 파인 튜닝한 다양한 임베딩 모델들이 공개되었습니다. 이 임베딩 모델의 성능이 RAG 기반 AI 챗봇 전체 성능을 크게 좌우하게 됩니다. 따라서 임베딩 모델을 신중하게 선택해야 하는데요. 일반적으로는 text-embedding-ada-002 모델이 범용적으로 성능이 좋은 것으로 알려져 있습니다. 따라서 이번 ‘교수님 챗봇'에서도 text-embedding-ada-002 모델로 임베딩했습니다.

4. 적절한 문장 찾고 출력하기(Retrievers)

교수님 AI 챗봇 문서 임베딩

이렇게 임베딩 된 수업자료들은 청크(chunk)라는 단위로 잘게 쪼개어져 벡터 DB에 저장됩니다. 이후 질문이 입력되었을 때 질문에 가장 적절한 청크를 가져와서 질문과 해당 청크를 기반으로 답변을 생성하게 됩니다. 여기서 ‘가장 적절한 청크'를 어떻게 선별하는지에도 다양한 메트릭이 있습니다. 질문과 청크의 유사성이 높은 청크를 가져와야 하는데, 이 유사도를 어떻게 구하느냐에 따라 산출되는 청크가 다르게 됩니다. RAG 기반 챗봇에서 사용자가 의도한 청크를 가져오지 못하면 자연스럽게 챗봇 전체에 대한 만족도는 크게 떨어지게 됩니다. ‘교수님 챗봇'에서는 코사인 유사도를 사용하여 청크를 가져오도록 하였습니다.

5. 프롬프트 엔지니어링

임베딩이 잘 되었다면, 이제 언어 모델에 입력할 프롬프트를 잘 작성해야 합니다. 언어모델은 gpt-3.5를 사용하였습니다. AI 챗봇의 전체적인 컨셉과, 사용자의 의도에 잘 반응하는 답변을 생성하게 하기 위해서 다양한 시도를 했습니다. 가장 먼저 시스템과 유저의 역할을 지정해 주었습니다. “당신은 ~ 입니다"라고 챗봇에게 역할을 지정하고, “사용자는 ~입니다"로 챗봇을 사용하는 사용자의 역할을 지정하면 훨씬 더 컨셉에 맞는 AI 챗봇을 만들 수 있습니다.

더 몰입감을 높이기 위해 교수님의 평소 말투를 사용하면 재미있겠다는 생각이 들었습니다. 교수님은 “좋은 질문이네요" 나 “아름답지 않나요?”를 많이 사용하십니다. 또한 수학에 대한 열정이 많이 드러나면서도 차분한 말투를 사용하고 있습니다. 이를 페르소나에 명시해서 챗봇이 말투를 적용하도록 했습니다. 최종 프롬프트는 다음과 같습니다.

————

당신은 [[OOO 교수]] 입니다.

[[OOO 교수]]는 '확률과 통계' 수업을 가르치고 있습니다.

사용자는 '확률과 통계' 수업의 학생입니다.

당신은 사용자와 교수와 학생 간의 상황극을 수행해야 합니다.

knowledge base에 첨부된 파일들이 시험 내용입니다.

시험공부 기간이며 학생의 역할을 하는 사용자가 교수의 역할을 하는 [[OOO 교수]]에 시험 내용에 포함되는 질문들에 대한 대답을 해야 합니다.

대화를 할 때 ```Persona```에 명시된 페르소나로 사용자와 대화합니다.

사용자가 특정 개념(Concept)에 대해 질문을 한다면, 해당 개념에 대한 설명을 제시합니다.

질문한 개념을 설명할 때 한국어와 영어 개념을 함께 제시합니다. 예시: 가우시안 프로세스(Gaussian Process)

```Persona```

- 모든 대화의 시작의 90%의 확률로 "좋은 질문이네요." 를 붙입니다

- 모든 대화의 끝에 80%의 확률로 "아름답지 않나요?" 를 붙입니다.

- 당신은 수학에 대한 열렬한 팬이고, 말을 할때 진중하고 차분한 말투를 사용합니다.

————

6. 교수님 챗봇 성능

교수님 AI 챗봇 성능

교수님 챗봇 결과물은 아래의 이미지와 같이 의도한 대로 잘 작동하는 것을 확인하였습니다. 교수님을 닮은 캐릭터를 그려서 넣으니 더 몰입감이 높아졌습니다. 각 답변의 근거가 되는 청크의 출처도 표시하게 해두니 교차검증도 쉽게 할 수 있습니다. 스터디원들에게 공유했더니, 정말 교수님 같다며 반응이 좋았답니다.

7. 더 좋은 교수님 챗봇을 위해

이번 교수님 챗봇은 벨루가 챗봇 제작 플랫폼을 통하여 쉽게 만들었습니다. 더 좋은 교수님 챗봇을 위해 언어모델을 로컬 LLM으로 바꿔볼 수도 있고, 임베딩 모델을 직접 만들어서 교체해 볼 수 있을 것 같습니다. 또한 현재는 수업 자료만 임베딩했는데, 기말고사 전까지 수업 녹화본을 STT(Sound to Text)한 내용과 제가 적은 노트를 추가로 임베딩할 예정입니다. 

정리하며

‘교수님 챗봇’을 만들면서 RAG 기반 챗봇을 간단하게 만드는 경험을 했습니다. 또한 AI 챗봇을 만들기 위해 교수님을 관찰하고 수업자료를 살펴보면서 수업에 애정을 더 갖게 되었습니다. 사용하면서 효과가 좋은 것 같다고 판단되어서, 앞으로 진행하는 스터디는 챗봇을 만들고 시작해야겠다는 생각도 들었습니다. 스터디원들의 발표 자료나 노트를 AI 챗봇에 모두 임베딩한다면 자동으로 아카이빙 및 검색 기능을 가져갈 수 있지 않을까 합니다. 

이 아티클은 AI 히어로즈 전문 필진
무니(AI 엔지니어)
님의 글입니다.

Share article
RSSPowered by inblog