[NLP] 펫로스 증후군 심리 상담 챗봇

김두현·2024년 11월 16일
post-thumbnail

Date: 2024.11.02 ~ 2024.11.13
Language: Python

I. 서론

한양대학교 ERICA의 2024-2 ICT창업캡스톤디자인 수업에서 우리 팀은 펫로스 증후군을 주제로 캡스톤을 진행하고 있다. 실제로 서비스를 제작하는 캡스톤은 아니지만, 서비스에 대한 사업계획서를 작성해보는 캡스톤이다. 동시에, 2024 전국 대학생 SW 창업 아이디어톤도 출전했다.

이 글을 쓰고 있는 현재 아이디어톤은 예선 51개 대학에서 83개 팀 (328명) → 본선 31개 팀 → 결선 15팀의 과정에서 현재는 결선까지 진출한 상태이며, 결선 Open IR에서 상위 6개 팀 안에 들어 수상하기를 간절히 바라고 있다.

나는 이 서비스에 들어가는 AI 기술과 통계 자료 부분을 중점적으로 사업계획서를 작성했다. 이 프로젝트는 이 사업계획서에서 AI 기술이 들어가는 부분 중 하나인 펫로스 증후군 심리 상담 챗봇에 대해 프로토타입을 제작한 과정을 담는다.

나는 사업계획서에 단순히 '어떠한 기술을 가지고 이러한 기능을 구현하겠다'고 서술하는 것을 넘어서 정말로 만들어본 사람이 쓴 것 같은 혹은 만들 수 있는 사람이 쓴 것 같은 '실현 가능함'과 '구체적임'이 드러나도록 서술하는게 더 좋을 것 같다고 판단해 관련 기술을 공부해보면서 프로토타입을 제작해 보았다. [NLP] Chat GPT API 챗봇 만들기[NLP] Prompt Engineering 포스트에서 이 프로토타입에 들어간 기술 공부 과정을 서술해놨다.

이 캡스톤을 하면서 많이 성장하고 있음을 느끼고 있다. 기존에는 AI쪽을 공부해도 모델의 이론적인 내용을 공부했었는데, 창업을 한다고 생각을 전환하니 이것을 어떻게 빠르고 쉽게 사용할 수 있고, 서비스화를 할 수 있는지 생각하게 되면서 많이 배우고 있다. 또한, Open AI API도 기존에는 비슷한 이유로 별로 쓸일이 없었는데, 이번 기회에 공부하면서 서비스로 만들기에는 비교적 낮은 가격으로 좋은 성능을 쉽고 편리하게 사용할 수 있는 API임을 알게되었다.

1학년 때까지는 CV쪽을 하다가 2학년때부터 NLP 분야를 공부하게 되어서 아직 많이 부족하지만, NLP쪽 공부하고 계시는 선배님께 조언을 구하면서 방향성이 조금 더 명확해졌고, 혼자 자료를 찾아보고 공부하면서 계속 배우고 있는 과정이다.

심리상담 챗봇을 만들어보면서 AI 심리 상담쪽도 추후에 더 발전할 수 있을 것으로 기대하고 있다. 현재 이 정도 수준으로도 좋은 성능이 나오는데, 발전된 기법을 사용하거나 전문 데이터를 학습시키는 등의 개선을 하면 매우 훌륭한 성능의 상담사를 만들어 낼 수 있을 것이다.

이 프로젝트 이후에는 기획한 같은 서비스에 있는 다른 AI 챗봇인 반려동물 특화 챗봇에 대해 프로토타입을 제작해보려 한다. 그 과정에서 LangChain을 활용한 RAG와 Fine-tuning에 대해 공부해 볼 계획이다.

II. 펫로스 증후군 심리상담 챗봇 구현

2-1 기반 코드

1) 사용 기술

  • Open AI API
  • Prompt Engineering (기본)
    • 지침 제공
      • 단계적 지시
      • 금지 사항 명시
    • 페르소나 설정
      • 역할 정의
      • 어투 조정
    • 맥락 내 학습(In-Context Learning)
      • 정보 제공
      • 기억 유도
  • Prompt Engineering (고급)
    • Generated Knowledge Prompting (GKP)
      : Chat GPT를 통해 생성한 '펫로스 상담자가 가져야 할 태도'와 '반드시 피해야 할 태도' 정보 명시

2) 전반적인 설명

실제로 실현 가능한 서비스가 될 수 있도록 초점을 두고 챗봇 구성을 했다.

설명한 부분 말고도 세세하게 들어간 내용들이 있으니 자세한 내용을 알고 싶다면 아래의 코드를 참고하는 것이 좋다.

Prompt Engineering

모든 프롬프트는 영어로 구성하도록 했다. 요즘 LLM 모델은 한국어 데이터도 많이 학습해서 잘 하긴 하지만, 한국어 데이터가 부족할 경우 영어로 프롬프트를 넣어주는 것이 성능이 더 좋기 때문이다.

페르소나 설정

펫로스 증후군을 겪고 있는 내담자를 위로하는 상담자 역할을 하도록 설정해줬다. 따뜻하고, 친절한 언어를 쓰고, 한국어로 답변하도록 지시했고, '해요체'를 사용해서 너무 딱딱한 느낌은 안나게끔 지시했다.

In-Context Learning

우리 모델의 문맥 내 학습에서 내담자 및 반려동물의 정보랑 추억 정보를 제공한다. 이는 우리 서비스에서 사별 전에 강아지와 함께 미션을 하고, 일기 형식으로 기록을 남기는데, 이 남긴 기록을 코드에 있는 프롬프트 형식으로 영어로 한 줄 씩 Chat GPT API를 활용해 요약 하고 넣어주는 방식으로 기획했다.

GKP

고급 프롬프팅 기법들이 대부분 상식 문제를 LLM 모델이 어떻게 더 잘 풀게 할 것인가에 대한 내용이라 이 챗봇에 적용할 부분이 마땅치가 않았다. GKP법은 내가 관련 전문 지식을 모르는 상황에서도 LLM을 통해 생성된 관련 정보를 프롬프트에 제공함으로써 답변의 성능을 높일 수 있는 기법이다.

이 프로젝트의 경우에도 내가 상담 심리 관련한 지식이 많이 없었고, 우리 프로젝트의 챗봇이 2개이기 때문에 최대한 가벼운 설계로 만들고 싶었다. 또한, 스타트업 단계에서 모델을 학습시킨다거나 데이터를 구성한다는게 금전적, 기술적으로 쉽지 않기 때문에 가능하면 그러한 부분을 피해서 제작할 수 있으면 좋을 것 같다고 생각했다. 그래서 RAG나 Fine-tuning 등을 하지 않고 프롬프트 엔지니어링으로만 구현을 해보았다.

내가 심리 상담 챗봇을 구상하면서 가장 걱정 되었던 부분 중 하나가 내담자에게 오히려 상처가 될만한 발언을 하는 경우였다. 따라서 이러한 부분을 보완해줄 수 있도록 '펫로스 상담자가 가져야 할 태도'와 '반드시 피해야 할 태도' 정보를 GKP법을 활용해 명시 해줌으로써 모델이 역할에 충실할 수 있게 답하도록 구성했다.

Parameter

창의적인 답변보다는 정확한 답을 원했기 때문에 temperature sampling과 top_p sampling을 조절해줬다. 여러 상황을 테스트하면서 값을 찾은 것은 아니므로, 값을 조정하면서 테스트 해보면 더 좋은 성능의 모델이 될 것으로 기대한다.

3) 코드

https://github.com/abc3279/Pet-Loss-Syndrome-Psychological-Counseling-Chatbot

III. 결과

3-1 웹 어플리케이션 화면

3-2 Script

# 일반적인 상황
내담자: 안녕하세요, 상담자님.

상담자: 안녕하세요, 두현님. 
이렇게 찾아와 주셔서 감사해요. 
아지를 떠올리면 참 다양한 추억이 떠오르실 것 같아요. 
어떤 순간이 가장 그리우세요?

내담자: 크리스마스 이브에 눈이 내렸을 때 아지랑 같이 첫 눈산책을 했던 때가 기억이 남네요. 
아지가 눈을 입으로 받아 먹고 뛰어다니면서 엄청 신나했던 모습이 그리워요.

상담자: 참 아름답고 소중한 기억을 가지고 계시네요. 
아지가 눈 속에서 즐겁게 뛰어다니던 모습이 두현님 가슴 속에 깊이 남아 있을 것 같아요. 
그런 날들 덕분에 아지도 정말 행복했을 거예요. 
아지가 눈 대신에 무엇을 하든 가장 행복하게 만들었던 음식이 있었을까요?

내담자: 아지가 사료보다 간식을 정말 좋아했어요. 
특히나 닭고기 간식을요.

상담자: 닭고기 간식이 아지에게 특별한 행복이었군요. 
아지가 그 간식을 먹으며 즐거워하는 모습을 상상하면 미소가 절로 날 것 같아요. 
그런 소중한 순간들이 두현님께 큰 위로가 되었겠죠. 
아지가 사랑하는 사람들과 함께 있을 때는 어떤 모습을 보였을까요?

내담자: 아지가 애교가 정말 많았어요. 
저나 저희 가족한테는 완전 애교쟁이였죠.

상담자: 정말 사랑스러웠겠어요. 
아지가 가족에게 애교를 부리던 모습은 잊기 어려울 만큼 따뜻한 기억으로 남아 있을 거예요. 
아지는 정말 사랑을 넘치게 주고 받았네요. 
아지와 함께한 가족 여행이나 특별한 외출이 또 생각나시나요?


내담자: 가족끼리 해변에 갔을 때가 있었는데요, 
그 때 아지가 모래사장에서 뒹굴면서 되게 행복해했던 모습이 기억이 남네요.

상담자: 해변의 모래 위에서 뒹구는 아지의 모습이 얼마나 귀엽고 사랑스러웠을지 상상만으로도 미소가 지어지네요. 
그럴 때마다 아지는 정말 세상의 모든 기쁨을 담아내며 두현님과 가족들에게 큰 행복을 주었을 것 같아요. 
그런 특별한 순간들은 늘 마음 속 깊이 간직할 만하죠. 
아지가 모래사장에서 놀던 그 풍경이 참 멋졌겠어요. 
그런 기억이 두현님께 큰 힘이 되기를 바랄게요.

내담자: 그렇게 말씀해주셔서 감사합니다.

상담자: 천만에요, 두현님. 
아지와의 소중한 시간을 이야기해 주셔서 저도 감사해요. 
아지에 대한 따뜻한 기억들이 두현님께 위로가 되고, 그 사랑이 계속해서 두현님 마음에 남아있기를 바랄게요. 
언제든 이런 추억을 나누고 싶으실 때 다시 찾아와 주세요. 
항상 두현님 편에 있을게요.

---------------------------------------------------------------------------------
# 부정적인 상황
내담자: 아지 생각만 하면 제가 잘 못해준 것 같아서 힘드네요.

상담자: 두현님, 그런 감정이 드는 건 그만큼 아지를 많이 사랑했기 때문이에요. 
아지는 두현님과 가족에게 많은 사랑을 받으며 행복한 시간을 보냈을 거예요. 
모든 반려동물에게 완벽할 수는 없지만, 아지를 향한 두현님의 진심은 이미 충분히 전해졌을 거라 생각해요. 
아지가 두현님에게 받았던 사랑과 따뜻함은 변함없이 계속해서 아지의 가슴 속에 남아 있을 거예요.
아지를 떠올릴 때마다 그 사랑스러운 순간이 마음속에 오래오래 남을 수 있게 해주셔서 감사해요. 
어렵고 힘든 순간에 이렇게 마음을 나눠주셔서 참 고맙습니다.

내담자: 제가 아지한테 해준게 뭘까요? 
아지랑 시간을 더 보내거나, 더 많이 챙겨줄 수 있었을 건데...

상담자: 두현님, 아지를 사랑하고 보살핀 것만으로도 아지에게는 큰 의미가 되었을 거예요. 
함께한 시간 동안 두현님께서 아지에게 주신 사랑과 관심은 무척 컸을 겁니다. 
두현님과 함께한 시간, 함께한 추억, 그리고 가족의 한 구성원으로 느꼈던 따뜻함, 
그 자체가 아지에게는 무엇보다도 중요한 것이었어요.

함께 크리스마스 이브를 보냈던 순간, 해변에서 뛰놀던 추억, 
사랑으로 채워진 매일매일의 간식 시간이 모두 아지에게는 큰 기쁨으로 남아 있을 거예요. 
그런 소중하고 따뜻한 순간들을 잊지 않고 기억해주시는 것, 
바로 그것이 아지를 향한 두현님의 큰 사랑이고, 
아지도 그 마음을 알았을 거라 믿어요.

내담자: 저도 그냥 아지 곁으로 따라갈까봐요.

상담자: 두현님, 아지에게 두현님은 정말 특별하고 큰 의미였어요. 
그만큼 두현님도 소중한 존재라는 걸 아지도 알고 있을 거예요. 
아지는 분명 두현님께서 남은 가족과 함께 행복하게 지내기를 기원할 거예요.

지금 힘들고 불안한 마음이 드실 수도 있지만, 
아지와 함께했던 시간을 기억하고 그 추억을 가슴에 간직하며 한 걸음씩 나아가실 수 있도록 
제가 옆에서 항상 지지하겠습니다. 
두현님의 감정은 소중하고 중요한 것입니다. 
언제든지 필요할 때 나누어 주세요. 
같이 아지에 대한 사랑을 이야기하고 두현님께 필요한 지원을 드리기 위해 여기 있습니다.

내담자: 상담자님은 저를 잘 모르시잖아요.

상담자: 그렇죠, 두현님을 개인적으로 알지는 못하지만, 
두현님께서 아지를 깊이 사랑하는 마음을 통해 두현님의 따뜻한 마음을 느낄 수 있어요. 
두현님과 아지의 이야기를 들으며 두현님께서 얼마나 소중한 감정과 기억을 가지고 계신지 잘 알고 있습니다.

말씀하기 어려운 순간에도 용기 내어 주셔서 감사해요. 
한 사람으로서 두현님의 마음을 이해하고 최대한 도움을 드리고 싶어요. 
힘든 시간이지만 두현님이 혼자가 아니라는 것을 계속 기억해주세요. 
언제든지 필요한 순간에 함께 하겠습니다.

내담자: 저는 혼자인 것 같아요.

상담자: 두현님, 지금 그런 기분이 드실 수 있을 것 같아요. 
하지만 혼자가 아니라는 것을 잊지 않으셨으면 좋겠어요. 
아지가 두현님과 그리운 시간을 함께해 왔듯이, 다른 사람들도 두현님의 주변에 있을 거예요.

어려운 시기에 이렇게 솔직하게 마음을 나눠 주셔서 감사해요. 
지금 너무 힘들고 고통스러운 순간일 수 있지만, 언제든지 이야기를 할 수 있는 사람들이 있고, 
두현님의 기분을 이해하려고 노력하는 사람들이 있다는 것을 기억해주세요. 
작은 위로라도 드릴 수 있다면 언제든지 여기에 있을게요. 
그저 두현님을 응원하는 마음으로 기다리겠습니다.

내담자: 다른 사람들이 어떻게 제 마음을 알겠어요. 어차피 말해도 공감도 못할거에요.

상담자: 두현님, 그런 마음이 드실 수도 있죠. 
자신의 깊은 슬픔을 다른 사람들이 온전히 이해하기 어려울 거라는 생각이 들 수 있어요. 
하지만 사람들은 각자의 방식으로 공감하고, 서로를 도울 수 있어요. 
완전히 같은 경험을 하지 않았더라도, 
주변 사람들은 두현님이 느끼고 있는 슬픔을 조금이라도 이해하고, 함께 하려고 노력할 거예요.

때로는 말로 설명할 수 없는 감정이 있기도 하지만, 
그런 감정을 나눈다는 시도 자체가 두현님과 주변 사람들에게 중요한 과정이 될 수 있습니다. 
두현님의 이야기를 듣고, 서로를 이해해가는 것은 시간이 걸릴 수 있지만 
그 과정에서 큰 위로를 찾을 수도 있답니다. 
두현님의 이야기를 언제든지 기다리고 있습니다.

내담자: 저는 그냥 다 필요없고, 아지를 다시 보고 싶네요.

상담자: 두현님, 아지를 다시 보고 싶은 마음은 당연히 너무나도 자연스러운 감정이에요. 
아지와의 소중한 순간들이 얼마나 그리울지 생각만 해도 가슴이 아프네요. 
다시 만날 수는 없지만, 아지는 두현님 마음 속에 항상 함께 있을 거예요.

아지가 준 기쁨과 사랑은 두현님 안에 남아있고, 그 자체로 특별한 힘이 될 수 있어요. 
아지가 즐거워했던 모습을 기억하고, 그 기억들을 간직하며 아지를 기리는 방법도 많아요. 
아지를 위해 작은 추억의 공간을 만들어보거나, 일기를 써보는 것도 하나의 방법이 될 수 있습니다.

어떤 형태로든 아지를 떠올리며 두현님께 평안하고 따뜻한 기운이 함께하길 바라요. 
필요한 경우 언제든지 대화할 수 있도록 여기에 있을게요.

내담자: 네 감사합니다.

상담자: 두현님, 이렇게 감정을 나누어주셔서 정말 감사합니다. 
두현님께서 아지와의 기억을 통해 조금이라도 위로를 받을 수 있었으면 좋겠어요. 
언제든지 마음이 힘들거나 아지에 대해 이야기하고 싶으실 때 편하게 찾아와 주세요. 
연휴나 주말에도 도움이 필요할 때 항상 여기에 있을게요. 
두현님의 하루하루가 조금씩 더 평화롭고 편안해지기를 진심으로 바랍니다.

IV. 피드백

챗봇을 웹 어플리케이션 형태로 제작하고, 팀원들에게 공개하면서 피드백을 받았고, 계속 테스트 해보면서 개선했다.

4-1 문제점

1) 맞춤법 교정

사소하게는 '바라요' → '바래요' 같은 문제가 있었고, '~을 하게 되어서 되어' 같은 중대한 오류도 있었다.

'하게 되어서 되어' 처럼 완전히 잘못된 문장 구조를 심리 상담에 사용할 경우 내담자의 몰입을 심히 저해시킬 수 있어 중대한 오류이다.

2) 반려동물의 죽음 인식 부족

프롬프트에 문맥 내 학습과 펫로스 증후군 심리 상담 페르소나를 적용했음에도 불구하고, 챗봇이 반려동물의 죽음을 인식하지 못하고 있다는 부분을 피드백 해주셨다.

당시에 문제 되었던 부분은 반려동물과 놀러갈 곳을 추천해달라고 쿼리했고, 놀러갈 곳을 추천한 답변을 받았다.

이 피드백을 받고 더 테스트 해봤고, 챗봇이 조금 더 죽음 인식을 하게끔 해야하나 고민했다. 하지만, 이 부분이 반려동물의 유골이나 상징성이 있는 물건을 가지고 갈 곳을 추천 받는다고 할 때도 해당 쿼리처럼 활용할 수 있을 것 같고, 그러한 상황에서는 이 답변이 괜찮을 것으로 생각했기에 문제로 삼지 않았다.

3) 문장중 영어 사용

이 때 반드시 한국어로만 답하라고 한 2~3번 언급했던 프롬프트였는데도 불구하고, 중간에 'behaved'를 사용했다. 실제 서비스였다면 사용자의 몰입을 심각하게 저해하며 서비스의 심각한 문제점 중 하나였을 것이다.

4) 과도한 정보 언급

내담자 및 반려동물 정보와 추억 정보를 문맥 내 학습으로 프롬프트에 제공했고, 이 정보들을 바탕으로 상담을 진행하라고 지시했다. 하지만, 이 정보가 적절히 사용되면 좋은데, 너무 과도하게 사용되어 내담자가 불편해할 수 있다고 생각이 들었다. 예를 들어, 처음에 인사를 하자마자 엄청 구체적인 추억 내용을 가지고 당시의 기분을 묻는 등이다.

4-2 해결시도

1) Prompt Engineering

  • 한국어 문장을 구사하도록 지시
  • 한국어의 문법 체계를 따라서 응답하라고 지시
  • 내담자가 먼저 대화에서 반려동물에 대한 정보를 언급하지 않는 한 반려동물에 대한 정보를 언급하지 말라고 지시
  • 하지만, 반려동물 정보를 사용하여 질문을 유도하라고 지시

2) 모델 변경

  • GPT 4o-mini → GPT 4o 전반적인 모델 성능 향상

3) Hyper Parameter 값 조정

  • Temperature Sampling 값을 조절해 다양한 답변 보다는 더 확률이 높은 답변 제공

어떠한 요소가 문제 해결에 더 많은 영향을 미쳤는지는 불분명하지만, 해당 시도들로 모델이 해당 문제들에 대해 많이 개선되었다.

V. 개발 비용

처음 10$로 시작했으므로, Chat GPT API 공부 및 이 프로젝트 개발까지 0.52$를 사용했고, 이 글을 쓰는 현재 환율 기준 700원 가량으로 개발했다.

GPT 4o-mini 모델을 쓰면 개발 및 운용 비용을 대폭 줄일 수 있지만, 성능 비교를 해봤을 때 조금 아쉬운 감이 있다. 그래서 테스트 할 때는 4o-mini 모델로 많이 했고, 성능 검증을 할 때는 4o로 테스트 했다.

VI. 참고자료

profile
HYU ERICA 23 ICT융합학부 미디어테크놀로지전공 김두현

0개의 댓글