배경 및 목적
우리는 살아가면서 다양한 문제에 직면하며 이를 해결하기 위해 필요한 것이 정보, 지식, 지혜입니다. 하지만 이러한 지식을 저장하는 것도, 저장된 것을 탐색하는 것도 쉽지 않죠
[정성스럽게 필기를 해도]
[찾기 쉽지 않은 나의 기억들]
전 수년 전부터 제가 알고 있는 지식을 기억하고, 빠르게 탐색하여 가공해줄 수 있는 서포터에 대한 갈망이 있었습니다. RAG와 LLM의 결합은 분산된 데이터를 자연어로 쉽고 빠르게 탐색하고 가공하는 매우 영리한 도구라고 생각했습니다. 이에 라마인덱스 스터디에 참여하여 RAG를 활용한 텔레그램 기반의 챗봇(Agent 멍)을 만들어 저의 생산성을 높여 보기로 결심하였습니다.
Agent 멍 : '멍멍'이 가진 지식을 관리하고 빠른 접근을 통해 신속하게 문제를 해결 할 수 있도록 정보를 제공하며, 업무 및 일상생활에 도움을 주는 Bot
'Agent 멍' 이름의 유래
RAG의 R은 Retriever, 즉 '되찾아오다'임. RAG의 정보를 통해 정답을 가져오는 리트리버 '멍'
'멍멍'의 지식을 불완전 하게 가져갔기 때문에 반쪽의 의미인 '멍
'멍멍'의 일을 도와 멍 때릴 수 있는 시간을 더 많이 만들어 주기 때문에 '멍'
※ 사실 라마인덱스 스터디장인 '빅라마'님이 붙여주신 코드네임임
[ 똑똑한 리트리버 '멍]
[다양한 기능을 수행하는 다재다능 '멍']
참고 자료
RAG 우리가 절대 쉽게 결과물을 얻을 수 없는 이유(이경록, TEDDY)
손영진, 임유경, 박민정, & 채상미. (2024). 효과적인 RAG Document Data 구조화 전략. ASK 2024 학술발표대회 논문집, 31(1), 807-809.
지피터스 사례 게시글 크롤링(1차 작성)(지피터스 이른아침에님, 크롤링에 대한 학습지원)
연애 해도 고민 안해도고민...? 연애상담 챗봇으로 해결해보자!! 2편!!(지피터스 고구마최고님, 유튜브크롤링 ,크로마DB, 캐릭터 성격부여에 대한 프롬프트 학습지원)
LLama Index를 활용한 더 지니어스 게임 AI로 제작 (캐릭터간 대화)(지피터스 류정현님, 일레븐랩스 API 활용 및 사례 학습을 통한 아이데이션에 큰 도움이 되었습니다)
클로드, GPT(코드 작성 지원)
활용 툴
GPT와 Claude
학습: RAG개념(파이썬의 함수, 들여쓰기, 싱글턴/멀티턴, 임베드, 벡터, DB 사용의 장단점, RAG의 작성 및 업데이트 개념과 방식, API 등), 함수 등의 학습을 지원했습니다.
기획: 프로그램의 기능 구현 방식, 제안한 기능을 구현 할 때의 문제점, 추가 고려 사항이나 대안적 구현 방식 등을 논의하는 데 이용했습니다.
코딩: 엑셀 if문 외에는 사용할 줄 모르기 때문에 전적으로 GPT와 Claude에 의존했습니다.
텔레그램: 이미 많이 사용하기도 하고, bot생성과 이용이 용이하여 선택, 움직이는 GIF, 텔레그램 GUI(버튼) 등의 보조 옵션이 많아 제작 범위를 줄일 수 있었습니다.
네이버 키보드: 텔레그램에서 음성 지원(STT)을 제공하지 않아 네이버 키보드를 활용해 STT를 이용했습니다.
네이버 API: 뉴스레터 작성 시 네이버 API를 활용하여 키워드 뉴스를 가져왔습니다.
구글 스프레드시트: 네이버 API로 가져온 뉴스를 저장하는 데 이용했습니다.
일레븐랩스: API를 이용해 TTS를 구현하는데 활용했습니다.
make.com: 크롤링된 뉴스레터를 2차 가공하고 텔레그램으로 발송하는 데 활용했습니다.
.
실행 과정
지식을 저장하고 꺼내어 쓰는 것 외에, 간혹 긴급하게 요청되는 자료(파일)에 접근할 수 있도록 저장소에 대한 접근 및 파일 전송 기능을 추가하고, 관심 있는 뉴스레터를 생성하는 기능, 핫딜 사이트의 최신 게시물을 크롤링하고 검색(키워드)하는 기능을 추가하였습다.
진행과정 : 코딩은 할 줄 모르기 때문에 Claude, GPT에 전적으로 의존했고 쉬운 것부 터 동작시킨 후, 기능을 하나씩 추가하는 과정을 반복했습니다
라마인덱스를 사용해서 RAG저장소를 만들고 질의를 주고 받는 기초 연습
텔레그램을 통해 봇을 생성하고 메시지를 주고받는 연습을 진행했습니다.
(봇 생성을 위해 텔레그램에서 @botfather에게 접근하여 봇을 만들고 봇 토큰을 받아야 합니다. 아래의 링크를 참고해주세요)
텔레그램을 이용해 Open AI api를 연결하여 메시지를 주고 받도록 했습니다.
OpenAI API 호출 시 RAG 정보를 전달하고 답변을 받도록 기능을 구현했습니다.
(사용하다 보니) 단어의 동음이의어(도메인 침범, '구매규정 ; S사의 구매규정, D사의 구매규정), 이음동의어('검수원 ; 사업PM, 원청사 담당자)로 인해 답변이 정확하지 않은 이슈가 발생했습니다.
[같지만 다른 동음이의어]
[이음동의어 : 다르지만 비슷한 책상과 테이블]
이를 해결하기 위해 문서의 전처리, 청크의 개념, 오버랩, 형태소 분석기의 필요성, 메타데이터의 활용 등에 대해 학습했습니다.
동음이의어, 이음동의어 이슈 처리를 위해 단어사전 작성(단어의 정의, 유사어, 상/하위 관계표현) 이 결과에 긍정적인 영향을 준다는 것을 확인했습니다.
문서의 유형에 따라 청크의 크기, 오버랩 크기 등이 어떻게 영향을 주는지 학습했습니다.
→ 효과적인 질의/답변 결과를 얻기 위해 문서를 전처리하고, RAG를 여러 개 작성하여 관리하는 방식을 채택했습니다.
[단어사전 작성 예)]
**FAQ, 단어사전 작성
5. RAG의 효과적인 관리를 위해 RAG를 폴더별로 구분하여 관리(신규 작성, 업데이트, 백업, 삭제)하고, 문서를 임베딩할 때 문서의 유형에 따라 옵션을 선택할 수 있는 RAG 관리 도구을 Streamlit으로 만들었습니다.
RAG설정
기존 RAG중 선택(업데이트, 삭제)
새 RAG 만들기(RAG 신규 생성)
RAG 삭제 : 선택된 RAG 삭제
문서 유형 선택 : 문서의 유형(기술문서, 서술형 등)에 따라 chunk size, overlap 요소 설
문서 업로드 : RAG 생성(임베드)하고 싶은 문서를 Drag&drop
RAG 생성/업데이트
신규 RAG 생성시 : 폴더 생성 후 신규 RAG를 생성(docstore)
이미 존재하는 RAG 생성시 : RAG를 업데이트 하며, 업데이트 직전에 기존에 존재하는 RAG를 폴더명+날짜시간으로 Backup
5에서 작성된 RAG를 텔레그램 접속 시 선택하여 동음이의어가 서로의 도메인을 침범하는 사례를 줄였고, 단어의 정의, 이음동의어(유사어)를 정의하여 검색 결과의 품질을 높일 수 있었(던 건 같)습니다.(일단 데이터의 양이 많지 않았기 때문인 것도 크게 작용한 것으로 추측됩니다).
첫 입장 후 '/start'를 입력하여 RAG를 선택할 수 있게 하였습니다
기본적인 채팅은 가능하게 되었으나 싱글턴 방식으로 진행되어 대화 내용 의 단절이 이루어졌습니다. GPT, Claude와 상의하여 세션상 10쌍의 대화를 기억하고 대답할 수 있도록 멀티턴 대화를 구현했습니다.
[싱글턴 방식은 이전 대화를 기억하지 못함]
멀티턴 대화를 구현하였지만 대화의 문맥이 바뀌는 경우(규정을 물어보다가 갑자기 시스템 사용법을 물어보면 대답을 못함) 대화의 세션 초기화가 필요하여 대화 기록을 초기화하는 기능을 추가했습니다(/reset)
[멀티턴을 구현했지만 주제가 바뀌면 횡설수설 함]
※ ChatMemoryBuffer
와 ContextChatEngine
챗봇과 소통하면서 친근감을 느낄 수 있도록, 프롬프트를 조정하여 친근한 어투로 대답하게 설정하고, 랜덤 함수와 GIF 기능을 활용해 가끔씩 대답할 때 움짤을 출력하도록 했습니다. 또
한 답변에 대해서 일레븐랩스 API를 활용해 TTS 기능을 추가했습니다.
[말을 할 수 있게 된 'agent멍']
본 프로젝트의 목적은 지식에 대한 빠르고 신속한 접근과 가공 뿐만 아니라, 각종 요청 사항들에 대해 빠르게 처리할 수 있도록 도움을 주 봇을 제작하는 것이었기 때문에 추가 기능을 구현했습니다.
파일전송 기능 : 간혹 긴급하게 요청되는 자료(규정집, 견적서, 계약서 등)에 빠르게 접근할 수 있도록 텔레그램의 메뉴버튼으로 파일에 접근하고 탐색하여 전송(FTP → 멍멍)할 수 있도록 했습니다.
뉴스레터 기능 : 뉴스레터를 생성하고 전달할 수 있도록 구현했습니다.
(기존에 만들어 놓은 스크립트 실행 → 구글스프레드 시트에 저장)
핫딜 크롤링 및 검색 : 자주 찾는 핫딜 사이트의 최신 게시물을 크롤링하여 각각의 게시물을 탐색하거나 통합 검색 결과에 대한 탐색 및 검색이 가능하도록 구현했습니다.
→ 이 기능들은 텔레그램의 GUI(버튼) 기능을 활용 했습니다.(/menu)
결과 및 인사이트
RAG를 이용해 다양한 가능성을 발견했고, 개인이 가진 지식의 효과적인 관리 방안에 대해 고찰해보는 시간을 가질 수 있었습니다. 파이썬에 대한 막연한 두려움이 있어 한 번도 다뤄본 적이 없었지만, 약 2주간의 시간 동안 무수히 많은 오류와 코드를 보면서 어렴풋이 문법과 코드 작성 방식을 이해할 수 있었습니다.
Claude, GPT의 도움 덕분에 앞으로도 즐겁게 여러가지를 만들어 볼 수 있을 것 같아 매우 즐겁고 유쾌한 시간이었습니다.