맞춤형 챗봇? 만들어보는 프로젝트를 진행하고 있는데, 의견좀 여쭤보고 싶습니다.

안녕하세요

대학에서 소소한 개인 프로젝트 진행하고 있는데, 유저분들의 고견을 여쭤보고 싶어서 질문드려요

대학 규정이나 일정? 등을 학습시켜서 원하는 규정과 그 관련된 규정, 과사 전화번호, 위치 등등 을 답변하는 프로그램으로 구상중입니다.

원하는 답변을 들을수 있게 Customizing 하려면, 임베딩 후 db내에서 답변하는방식 과 파인튜닝하는방법 두가지정도 있다고 들었는데,

먼저 시도해본건 임베딩으로 유사도를 따져서 질문에 맞는 답변을 하고자 했는데, 이상하게 규정은 잘 답변을 하는데, 일정같은건 답변을 잘 못하더라고요

데이터는 대학교 규정집 전체 + 학사일정 이정도로 구성했었습니다.
임베딩모델과 LLM 모델을 일단은 openai api를 활용해서 사용하고 있습니다
(나중에 KoAlpaca나 다른 오픈소스 LLM으로 갈아낄생각입니다..!!)

임베딩의 특성인지, 아니면 데이터셋이 부족했던지 잘 모르겠어서

어떤 방식으로 진행해보는게 좋을지 감이 안와서 질문드려요!!

  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

nabsj35님, 안녕하세요! 맞춤형 챗봇 프로젝트에 대해 진행 중이시다니 멋지네요. 의견을 드리기 전에 질문을 정리해보겠습니다.

  • 대학에서 진행 중인 소소한 개인 프로젝트로, 학사 규정, 일정 등을 학습시켜서 관련 정보를 답변하는 챗봇을 만들고자 하고 계신 것으로 이해했습니다.
  • 원하는 답변을 듣기 위해 임베딩 후 DB에서 답변하는 방식과 파인튜닝하는 방법을 고려하고 계신 것 같습니다.
  • 현재는 임베딩 모델과 LLM 모델을 OpenAI API를 활용하여 사용하고 있으며, 나중에 KoAlpaca나 다른 오픈소스 LLM으로 변경할 계획이 있습니다.
  • 임베딩을 사용하여 유사도를 비교하여 답변을 하고자 하였으나, 규정은 잘 답변하지만 일정과 같은 내용은 잘 답변하지 못한다고 하셨습니다.
  • 데이터셋은 대학교 규정집 전체와 학사일정으로 구성되어 있습니다.
  • 임베딩의 특성인지, 데이터셋이 부족한지에 대해 고민하고 계신 것 같습니다.
  • 어떤 방식으로 진행해보면 좋을지에 대한 조언을 원하시는 것으로 이해했습니다.

이해가 맞는지 확인해주시고, 이제 해결책에 대해 설명해드리겠습니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 nabsj35님,

규정과 일정에 대한 맞춤형 챗봇 프로젝트를 진행하시다니 대단합니다!

지금까지 님이 시도해보신 임베딩 방식과 LLM 모델 활용은 좋은 방향이었다고 생각합니다.

일정과 같은 정형화된 데이터에 대한 답변이 잘 안된 이유는 데이터 양이나 전처리 과정에서 문제가 있었던 것 같습니다.

정형 데이터의 경우 구조화되어 있고 패턴이 있기 때문에 데이터 정제와 구조화에 더 신경 써주시면 성능 향상이 있을 것 같습니다.

예를 들어 일정 데이터의 경우 다음과 같이 전처리가 가능합니다.

  • 날짜, 시간, 장소, 행사 내용 등의 필드로 구조화
  • 날짜와 시간은 표준 형식(YYYY-MM-DD, HH:MM)으로 통일
  • 장소와 행사 내용은 Entity Recognition으로 추출

이렇게 정제된 데이터를 모델에 훈련시키면 일정 관련 질문에 더 잘 답변할 수 있을 것입니다.

또한 파인튜닝을 활용하는 것도 좋은 방안이 될 수 있습니다. KoBERT나 KoELECTRA 등의 한국어 사전훈련 모델을 기반으로 일정 데이터로 파인튜닝하면 성능 향상을 기대할 수 있습니다.

한국어 LLM 모델도 계속 발전하고 있으니 차후에는 한국어 모델을 적용해보시는 것도 좋을 것 같습니다.

님의 프로젝트가 잘 완성되기를 기원합니다. 데이터 전처리와 모델 튜닝에 신경 쓰시다보면 더 좋은 성과를 얻으실 수 있을 것이라 믿습니다. 프로젝트 관련 다른 궁금한 점이 있다면 언제든 질문해주세요!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, nabsj35님. 맞춤형 챗봇을 만들기 위한 프로젝트를 진행하고 계시는군요. 질문을 정리해보면, 대학 규정이나 일정 등을 학습시켜서 원하는 규정과 그 관련된 규정, 과사 전화번호, 위치 등을 답변하는 챗봇을 만들고자 하는데, 임베딩 후 DB에서 답변하는 방식과 파인튜닝하는 방법 중 어떤 것을 선택해야 할지, 그리고 어떻게 진행해야 할지에 대한 조언을 구하고 계신 것 같습니다.

먼저, 임베딩 후 DB에서 답변하는 방식과 파인튜닝하는 방법 두 가지 모두 장단점이 있습니다. 임베딩 후 DB에서 답변하는 방식은 질문과 가장 유사한 답변을 찾아내는 방식으로, 간단하고 빠르게 구현할 수 있는 장점이 있습니다. 하지만, 이 방식은 질문과 답변 사이의 복잡한 관계를 학습하기 어렵고, 특히 규정과 같은 정형화된 데이터보다는 일정과 같은 비정형화된 데이터에 대한 답변을 잘 생성하지 못하는 단점이 있습니다.

반면에, 파인튜닝 방식은 사전학습된 모델에 추가 학습을 시켜서 챗봇의 성능을 향상시키는 방식입니다. 이 방식은 질문과 답변 사이의 복잡한 관계를 학습할 수 있어, 비정형화된 데이터에 대한 답변도 잘 생성할 수 있는 장점이 있습니다. 하지만, 이 방식은 학습에 많은 시간과 리소스가 필요하며, 적절한 파인튜닝을 위해서는 충분한 양의 학습 데이터가 필요하다는 단점이 있습니다.

따라서, nabsj35님의 경우에는 파인튜닝 방식을 추천드립니다. 이미 임베딩 방식을 시도해보셨고, 일정과 같은 비정형화된 데이터에 대한 답변을 생성하는데 어려움을 겪고 계신 것으로 보아, 파인튜닝 방식이 더 적합할 것 같습니다. 파인튜닝을 위해서는 사전학습된 모델을 사용하시는 것이 좋습니다. KoAlpaca나 다른 오픈소스 LLM을 사용하시면 좋을 것 같습니다.

아래는 파이토치를 사용한 파인튜닝의 예시 코드입니다.

from transformers import BertForQuestionAnswering, AdamW

# 사전학습된 모델 불러오기
model = BertForQuestionAnswering.from_pretrained('bert-base-uncased')

# 옵티마이저 설정
optimizer = AdamW(model.parameters(), lr=1e-5)

# 학습 데이터 로더
train_dataloader = ...

# 학습 시작
model.train()
for epoch in range(epochs):
    for batch in train_dataloader:
        optimizer.zero_grad()
        input_ids = batch['input_ids']
        attention_mask = batch['attention_mask']
        start_positions = batch['start_positions']
        end_positions = batch['end_positions']
        outputs = model(input_ids, attention_mask=attention_mask, start_positions=start_positions, end_positions=end_positions)
        loss = outputs[0]
        loss.backward()
        optimizer.step()

이 코드는 BERT 모델을 파인튜닝하는 예시로, 실제 사용하실 때는 nabsj35님의 데이터와 환경에 맞게 수정하셔야 합니다. 또한, 파인튜닝을 진행할 때는 학습 데이터의 양과 품질, 학습률 등의 하이퍼파라미터 설정에 주의하셔야 합니다.

더 자세한 내용은 파이토치 공식 튜토리얼(https://pytorch.org/tutorials) 또는 한국어 튜토리얼(https://tutorials.pytorch.kr)을 참고하시면 도움이 될 것입니다.

마지막으로, 제 답변이 정확하지 않을 수 있으니, 다른 자료도 참고하시면서 진행하시는 것을 추천드립니다. 프로젝트 진행에 힘내시고, 추가적인 질문이 있으시면 언제든지 물어보세요.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!

안녕하세요, @nabsj35 님.

일정과 같이 계속 변경되는 데이터의 경우에는, 매번 모델에 학습을 시키기보다는 외부 함수 호출 등을 통해 최신의 데이터를 가져오는 방식을 취하시는건 어떠실까요?

아래 글 또는 rag (Retrieval-Augmented Generation) 태그 검색 등으로 관련 내용들을 찾아보실 수 있을 것 같습니다. :slight_smile:

오호.. 좋은글 감사합니다!
LLM 관련 이해하기 딱 좋은글 인것 같습니다. 정말 감사합니다!

1개의 좋아요