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

Spring AI를 활용하여 RAG generative ai 구현하기

by wcwdfu 2024. 11. 6.

 그래서 Spring AI 라는 비교적 최신 툴을 이용해서 spring framework 내에서 chat gpt 4o-mini를 이용한 RAG 구현을 해보게 되었다.

 

내가 구현할 RAG 기능작동에 대한 도식화는 위와 같다.

1. 하나의 큰 문서를 textsplitter를 통해 작은 단위로 자른다.

2. 어떤 유저의 문서인지 구분하기위한 메타데이터를 추가한뒤 엠베딩하여 벡터 db에 저장한다.

3. 질문에대한 응답시에 유사도검색을 진행하되, 동일한유저의 문서내에서만 검색되도록 한다.

4. 그렇게 검색된 가장 유사한 문서2개를 기반으로 답변을 생성한다.

 

 

내가 한 내용들은 다음과 같다.

 - customTextSplitter의 구현

spring ai를 통해 어느정도 구현하고 난 후 답변퀄리티를 테스트하는 과정에서 이전 파이썬으로 구현했을때보다 퀄리티가 떨어지는것을 발견했다. 원인을 찾던 도중 하나의 큰 문서를 일정크기의 소문서로 잘라주는 과정에서 차이가 있는것을 발견하였는데 파이썬에서 사용한 라이브러리의 경우 200단어씩 오버랩하는 부분이 있었고 spring ai의 tokenTextSplitter는 오버랩하는 부분이 없는것을 발견, 200단어씩 오버랩 가능하게 구현하였다. (마치 슬라이딩 윈도우같이 분할된다고 생각하면 된다)

 

 - 메타 데이터, 메타데이터 필터를 통한 유저마다 접근가능한 벡터데이터의 분

우리 서비스의 컨셉은 여러 사용자가 있다. 따라서 만약 A사용자가 업로드한 문서를 a, B사용자가 업로드한 문서를 b라고 한다면 A사용자가 질의를 할때는 철저하게 a문서만을 참조해야지 b문서를 참조해서는 안된다. 해당 부분을 메타데이터와 메타데이터 필터를 통해 구현하였다.

 

 - 원문 수정, 삭제에 따른 벡터데이터의 수정, 삭제

우리 서비스는 stt사용 후 생성된 대화스크립트에 대하여 수정이나 삭제가 가능하다. 따라서 우선 삭제하는경우 벡터db에서 해당 문서에대한 데이터를 똑같이 삭제해줘야 하고, 수정의 경우에는 기존의 데이터를 삭제한 후 다시 임베딩해서 벡터 db에 저장하는 식으로 구현하였다. 

 

- 작성 진행중 -