본문 바로가기
학교수업[프로젝트]/졸업 프로젝트

파이썬으로 langchain을 활용한 RAG, generative ai 구현하기

by wcwdfu 2024. 10. 13.

그래서, 우리 서비스의 코어 기능이라고 여겨지는 부분을 구현해야한다.

 

나포함 팀원4명 중에서 2명만이 학교에서 AI관련 수업을 들었으나 그들도 학교수업 만으로는 명쾌히 해답을 제시해주지 못하였고, 당시 나도 AI에는 완전히 일자무식이였기에 우리가 넣어주는 음성파일 스크립트 기반으로 질의응답이 가능하게끔 구현 가능한지에 대한 가능성에 대해 알아봐야 했다.

 

초기에는 파인튜닝 방법을 고려했던것 같다. 하지만,

오픈소스 LLM을 학습시키는 것은 많은 컴퓨팅 리소스와 많은 학습 데이터가 필요했기에 부적합하다고 생각되었고, 다른 방안을 찾아보던중 다행히 RAG에 대해서 알게 되었다. RAG는 간단히 말해 생성형 AI에서 별도의 파인튜닝 없이도 사용자가 제공해주는 정보들(ex. pdf등등)을 기반으로 응답을 생성할 수 있도록 하는 기법을 말한다.

 

그래서 구글 코랩 환경에서 파이썬으로 langchain라이브러리를 통해 우선 구현해본 후, 얼마나 잘 되는지 테스트해보았다.

https://colab.research.google.com/drive/1rpLAK6J_t6mXpUnWCn8Vhc8eezbVxHh9?usp=sharing

 

REAP Service Test Code 게시용.ipynb

Colab notebook

colab.research.google.com

대화스크립트는 mongDB에 저장되어있다.

그리고 LLM 은 chat gpt api를 사용한다. 모델명은 4o-mini.

임베딩 모델도 open ai에서 제공하는걸 사용한다.

벡터DB는 chroma DB를 사용한다.

 

(궁극적으로 서비스 성격의 관점에서 본다면 chroma DB는 사실 적절한 선택지는 아니다. chroma DB는 기본적으로 인메모리 방식으로 작동하기 때문에 만약 대량의 유저를 상대로 시행되는 서비스라는 관점에서 본다면 고려대상이 아니라고 생각한다. 하지만 지금 프로젝트에서는 실 출시를 목적으로 하는 프로젝트는 아닐뿐더러 작은 규모에서 빠른성능적인 이점을 고려함과 동시에 chroma db가 처음 vector db로써 사용하는데 자주 채택되는 듯 하여 경험상의 목적으로 채택해 사용하였다.)

 

(또한 reap service의 아이디어 자체는 매우 훌륭하다고 생각되지만, 사용자 개인개인이 본인의 정보를 외부의 서버로 전달되어 db에 저장되는것은  전혀 달갑지 않은 사실임에 분명하다 생각한다. 요즘 ondevice형 AI가 부상을 하고 있던데, 우리 서비스는 사실 외부db에서 저장되는 성격이 아니라 개인 디바이스내에서 작동하는 방식이 훨씬훨씬 최적절하다고 생각된다. 따라서 우리의 서비스는 가까운 미래에 온디바이스 방식으로 사용자 개별 디바이스에 저장된 정보에 기반하여 음성 비서마냥 사용이 가능한 서비스로 분명히 등장하지 않을까 추측하고 있다.)

 

따라서 위 코드에는 민감한 값들은 모두 제외되어있다.

 

또한 위 코드 내용중 일부분은,

 ai에도 관심이 매우매우 있고, 관련 개발도 반드시 할 줄 알아야겠다는 생각에 기반지식을 다지고자 인프런에서 방학동안에 수강하던  ai 관련 강의에서 커리큘럼을 순차적으로 진행하던 도중 RAG 파트를 듣게되면서 예제코드 등을 통해 접해볼 수 있었다.

 

gen ai 모델의 고질병(?) 인 모르는 내용을 아는척하며 대답하는 '할루시네이션'에 대해서도 알 수 있었고, 덕분에 간혹 gpt를 쓰다가 말도안되는 소리를 아는척하며 내놓을때 감정적으로 화가나던 부분에 대해 굉장히 큰 내구성을 가질 수 있게 되었다ㅋㅋ.

 

하여튼 우리 팀은 두번째 회의 내용을 테스트 데이터로 사용하였고, 간단히 요약하면 다음과 같다.

 

1. 성능은 매우 놀라웠다. 답변의 정확도가 이전 파인튜닝 따위와는 비교할 수 없는듯 하다.

2. 하나의 큰 문서를 여러 소문서(?)로 자르는 과정이 있는데 이는 검색 기능에서 보다 더 정확성을 올려줄 수 있기 위함이다.

3. 할루시네이션 현상또한 프롬프트에 '모르는것은 모른다고 대답하라' 라는 지시문장 하나로 해결이 가능했다.

4. gpt 4o mini 는 가격대비 성능이 매우매우 우수하다.

 

그래서 이거를 api서버와 통합을 해야하는데 두가지 방안이 있다.

 

1. spring AI를 통하여 spring 내에서 해결.

2. fast api 등으로 파이썬 서버를 하나 더 열고, api서버와 상호 통신하게 할것.

 

전자는 비교적 최신기능이라 래퍼런스가 적어서 구현이 조금 쉽지않을것 같고

후자는 유사 프로젝트를 진행중인 동기가 이미 해본결과 생각보다 통신시간이 길어져서 오래 걸린다더라 라고 했다. 수치상으로도 2배 이상 차이가 났던듯 하다.

 

(올해 여름방학 시즌에 동기들끼리 송도에서 열린 gdg 개발자 컨퍼런스에 다녀왔었다. 들으려했던 가장 마지막 세션 내용이 spring AI 파트였는데 다들 집을 가고 싶다 하여... 나라도 혼자 듣고싶었지만 또 혼자가면 심심해서 그냥 같이 가버렸는데 ... 이걸 쓸 일이 있음을 진작 알았더라면 난 결코 혼자 남아서 그파트를 다 듣고 집에 갔을것이다. 지금 몹시 가슴이 아프다 ....)

 

일단 해보자.