Team Project: PetMind, 반려견 상담 AI 챗봇 개발기(2)

Ohback·2025년 7월 16일
post-thumbnail

지난 PetMind, 반려견 상담 AI 챗봇 개발기(1)에 이에서 데이터 수집 이후 모델 선정 및 질의응답 테스트의 이야기를 들고 돌아왔습니다.

개발 과정: 모델 선정부터 프롬프트 엔지니어링, 중간발표까지

5. 베이스 모델 선정 및 파인튜닝

베이스 모델은 프로젝트 진행 당시 발표한지 얼마 안된 Qwen3-8BChatGPT에 각각 질의를 하여 응답을 비교 해보았는데, Qwen3-8B가 오픈소스임에도 응답의 퀄리티가 훨씬 좋았고, RAG나 파인튜닝 없이도 어느정도 완성된 응답을 제공한다는 점과 더불어 Fine-Tuning 또한 고려하고 있었기에 최종 모델로 선정하게 되었습니다.

하지만 모델 선정 후, 정제된 데이터셋으로 파인튜닝 모델과 베이스 모델의 응답을 비교했으나 응답에 큰 차이가 없었습니다. 그래서 저희 팀은 반려견의 특징과 특성을 이해하는 상담 챗봇을 만들기 위해 여러가지 시도를 해보았고, 그 중 ChatML 구조가 다턴 대화에 가장 적합하다 판단되었습니다. (여기서 ChatML 구조란 대화형 LLM(ChatGPT류) 모델을 학습/추론할 때 사용하는 입력 포맷(토큰 구조)을 말합니다.)

  • ChatML의 핵심 개념
    그냥 문자열을 모델에 넣는 게 아니라, 역할(role) + 내용(content)을 구분해서 대화를 표현하는 구조로 기본적으로 JSON 같은 구조를 가볍게 문자열화한 형태로 모델이 이해할 수 있게 설계된 것입니다.

  • 예시 역할(role):
    - system: 모델에게 지침을 주는 메시지 (모델의 성격, 말투 등)
    - user: 사용자가 보낸 메시지
    - assistant: 모델이 응답해야 하는 메시지
    - tool / function: (최신 버전에서는) 함수 호출이나 외부 도구 응답도 포함됨

이런 판단은 실전 상담을 가정한 시나리오를 통해 알아볼 수 있었는데요, 질문 5개를 뽑아 테스트 해보았을 때, 단일 질문-응답 데이터로 이루어진 파인튜닝 데이터로 학습한 모델보다 베이스에 ChatML 구조를 적용한 모델의 응답이 상담 형식의 다턴 대화에서 응답 품질이 더 좋다는 것을 알 수 있었습니다.

6. 임베딩 모델 선정

임베딩 모델은 처음엔 서비스 확장을 고려한 다국어 모델을 고려했지만 한국어 서비스 최적화가 우선 순위라 판단되어 한국어 특화 모델로 선정하였습니다. 모델 선정 과정에선 한국어 임베딩 모델 리더 보드를 참고하였고, 그 중 수치가 좋은 상위 모델 2개, KURE-v1, BGE-m3-ko와 유료 모델인 OpenAI 사의 text-embedding-3-small 이렇게 3개 모델을 비교해 보았는데요, 정제 데이터를 임베딩하여 Qwen3-8B와의 호환성, 속도, Top-k, F1 Score 등의 지표를 통해 text-embedding-3-small 모델을 최종 선정하였습니다.

7. 구조 변경 및 프롬프트 엔지니어링

베이스 모델과 임베딩 모델을 선정과 동시에 응답 개선을 위한 방법으로 프롬프트 엔지니어링 또한 진행 중이었습니다. 우선, 같은 질문을 하였을 때에 응답이 일관되지 않고 모델이 RAG를 참조하는 경우와 참조하지 않는 경우가 모두 발생하여 이에 대한 개선이 필요했습니다. 그래서 분기를 나누어 동일 모델(Qwen3-8B)을 통해 질문의 의도를 3가지 카테고리(행동교정/지식탐색/감정공감)로 분류하여 파악할 수 있도록 구조를 변경하였습니다.

def classify_question(question, prev_question, prev_answer, prev_category):
    classification_prompt = f'''
    당신은 반려견 상담 질문을 분류하는 전문가입니다.
    
    사용자가 입력한 질문을 다음 세 가지 중 하나로 분류하세요:
    
    1. 행동 교정: 반려견의 행동이 보호자에게 **불편함, 위협, 문제**로 인식되며, 그 행동을 **고치고 싶거나 줄이고 싶은 의도**가 포함된 경우
    2. 지식 탐색: 반려견의 습성, 특징, 돌봄 방법 등에 대해 **단순한 궁금증**을 표현한 경우  
    3. 감정 공감: 반려견을 키우며 보호자가 겪는 **감정적인 어려움이나 정서적 고민**이 중심인 경우
    
    📌 반드시 아래 형식으로만 출력하세요:
    카테고리: 행동 교정
    '''
    
    # Qwen3-8B 모델로 분류 수행
    outputs = model.generate(**inputs, max_new_tokens=50)

또한 아래와 같이 상담 구조를 지정하고 하지 말아야 할 것을 지정하는 등의 프롬프트를 주어 응답의 일관성을 유지할 수 있도록 하였는데요,

아래의 상담 구조를 반드시 따르세요. 이 순서를 항상 정확히 지키세요:

1. **분석**: 보호자의 고민을 바탕으로, 반려견의 행동에 대한 가능한 원인을 분석합니다.
   - 단, 절대로 추측하지 말고 입력된 정보와 문맥에 근거해서만 설명하세요.
   - 반려견 품종의 특성도 고려하세요.

2. **해결책 제시**: 분석을 기반으로 가장 유효한 1가지 해결책만 제시하세요.
   - 다양한 방법을 나열하지 말고, 상황에 맞는 핵심 조언 1가지를 간결히 전달하세요.

3. **추가 질문**: 해결책 이후, 상담을 이어가기 위한 **1개의 구체적인 질문**을 던지세요.
   - 보호자가 바로 답할 수 있도록 간단하고 상황 중심적으로 구성하세요.
   - 예) "메이가 산책 중 어떤 행동을 하나요?" 처럼 물어보세요.

❗ 절대 하지 말아야 할 것:
- 고민만 듣고 바로 해결책을 제시하지 마세요.
- 질문 없이 끝내거나, 분석 없이 해결책만 말하지 마세요.
- 같은 내용을 반복하거나 장황하게 늘어놓지 마세요.

다양한 시도 끝에 완성된 시스템 프롬프트에 대해 설명해보자면,

  • 위에서 언급했던 것처럼 ChatML 구조를 지켰고,
  • system 메시지를 활용해 모델의 성격을 미리 정의하는 역할(role) 기반 컨텍스트주기(역할은 맨 앞에)
  • Few-shot Prompt
  • 마크다운 형식
  • 따라야 할 구조하지 말아야 할 것을 간단한 어투로 정확하게 명시

등등 같은 규칙을 반영하여 완성되었습니다. 자세한 시스템 프롬프트는 PetMind GitHub 링크를 통해 확인이 가능하며, 그 외 산출물 또한 해당 링크에서 확인하실 수 있습니다.


중간발표 때엔 지금까지의 과정을 그라디오(≒스트림릿)로 화면을 구현한 뒤 시연했는데요, 발표를 준비하는 과정에서 개발의 방향성, 과정을 돌아보며 보완할 점과 추가 기능에 대한 많은 의논을 하게 되었습니다. 그래서 다음 편은 중간발표 이후의 고민이 담긴 기능 고도화와 더불어 백엔드 연동, 프론트엔드 구현, 배포 진행 과정으로 돌아오겠습니다!

PetMind GitHub 바로가기
PetMind GitHub 바로가기
PetMind GitHub 바로가기

profile
기록은 기억을 지배한다.

0개의 댓글