[NLP] 챗봇 프로젝트

지승훈·2025년 1월 3일
0

0. 프로젝트 개요

'너 자신을 알라' 는 소크라테스의 말, 다들 한 번쯤은 들어보셨을 겁니다. 그런데, '나'라는 세계는 생각보다 훨씬 더 복잡하고 미묘합니다. 특히 '무의식' 이라는 거대한 그림자는, 꿈을 통해 모습을 드러내죠. 저는 가끔 꿈이 마치 '내면의 메시지' 처럼 느껴질 때가 있습니다. 그래서 '내 무의식과 더 깊이 대화할 수 있는 방법은 없을까?' 생각했습니다. 그렇게 프로이트의 '정신분석학' 과 카를 융의 '심리역동학' 을 바탕으로, 꿈에 관한 이야기를 나눌 수 있는 챗봇을 만들면 좋겠다고 생각했습니다.

간단한 사전지식

프로이트 (Sigmund Freud): 인간의 마음속 무의식을 탐구한 정신분석학의 창시자. 억압된 욕망과 어린 시절의 경험이 행동에 큰 영향을 미친다고 보았고, 꿈 분석과 자유 연상으로 심층 심리를 밝히려 했다.

카를 융 (Carl Gustav Jung): 프로이트의 제자. 개인 무의식뿐만 아니라 인류의 집단 무의식 개념을 제시하며 독자적인 심리역동학을 발전시켰다. 융은 꿈과 상징을 통해 내면 성장을 탐구하는 것에 주목했다.

1. 챗봇 구현 로드맵 + 사용 기술

프로이트와 융의 정신분석학적 지식이 필요하기때문에 RAG는 필수!
Langchain으로 벡터 DB를 생성했고, 그중에서도 FAISS를 사용했습니다.

챗봇 및 벡터 임베딩 : Open AI API
모델 : langchain
벡터 DB : FAISS
배포 : Streamlit

RAG 데이터 전처리 과정


구글 스칼라에서 프로이트와 융과 관련한 데이터를 수집했습니다.
인용수 1천 이상의 검증된 데이터만 수집했습니다.
임베딩 과정에서 API 사용이 과할수 있기 때문에 학자 별로 3가지의 레퍼런스를 수집했습니다.

모은 PDF를 PyPDF로 모두 병합했습니다.

markitdown 라이브러리를 사용하여 PDF를 마크다운 형식으로 변환했습니다. 이번 경우에는 txt 파일이여도 상관없었겠지만, 추후 확장을 고려했습니다.

마크다운 형식으로 만들면 좋은 점

  • 문서의 본질적인 구조를 보존하고 표현하는데 용이
  • 헤더 구조를 통해 문맥과 의미를 더 잘 전달할 수 있어 LLM이 내용을 더 정확하게 이해가능 -> LLM 친화적
  • 호환성, 및 연산속도 증가

langchain 벡터 DB 구현


Open Ai API 활용해서 전부 빌드하면 나중에 모델을 변경하려고 해도 코드 전체를 변경해야해서 번거롭기 때문에 langchain을 사용해서 모델만 갈아끼우는 형태로 구성했습니다.(사실 그냥 편해서...)


FAISS가 Chroma DB등 다른 라이브러리 보다 사용 메모리가 낮아서 추후 엣지 디바이스 이식시에 유리할것 같아, FAISS를 사용했습니다. 임베딩은 gpt-3.5를 사용했습니다.

RAG chain


저장한 벡터 DB를 로드.

gpt가 RAG를 검색할때 시스템 프롬프트를 추가하여 역할극에 더 몰입할수 있도록 했습니다.

streamlit을 사용하여 배포



두개는 RAG 추가 전의 4o mini 버전


아래는 RAG 추가 후의 4o mini 버전


프롬프트 인젝션을 시도해 보았습니다.


사용한 api의 가격

문제점

  • RAG 기반 답변과 실제 프롬프트 답변이 각각 출력되는 문제
    -> 두개 나눠서 해결

0개의 댓글