바야흐로 대 LLM의 시대..
필자도 졸작 심사 통과를 위해선 졸작에 LLM 사용이 필수 불가결했는데..
그래서 간단하게 LLM에 대한 공부 겸, 우리가 사용할 기술인 RAG에 대해
공부해보고자 이 글을 적는다.
(이 방법을 쓰라는 교수님의 강력 추천도 있었다.)
LLM이란, 요새 흔히 말하는 지능형 챗봇 이나 자연어 처리 앱을 지원하는 핵심 인공 지능 기술이다.
흥미로운 건 이 LLM이라는 놈도 신뢰할 수 있는 모종의 지식 소스, 그러니까 대충 어딘가에 적힌 정보, 내용을 참고해서 답변한다는 것이다.
그리고, 이 녀석의 훈련 데이터는 정적이기에, 자신이 학습했던 이후에 생긴 일에 대한 내용은 모른다.
(대충 과거에 챗 지피티로 비교적 최신 백준 문제를 물어봤다가, 데이터에 없다고 풀이를 거부당한 적이 있다.)
그 외 추가적인 문제점들은 아래와 같다.
답변이 없을 때 허위 정보를 제공한다.
➡️ 여러분도 당해본 경험이 좀 있을 것이다. 일명 할루시네이션 효과(Hallucination) 없는 일을 있는 것처럼 그럴싸하게 만들어서 말한다던가..
사용자가 구체적인 정보 혹은 최신의 정보를 원할 때, 구식이거나 일반적인 정보를 제공한다.
➡️ 우리 모두가 챗봇을 감정 쓰레기통으로 만들게 되는 이유 중 하나다.
신뢰할 수 없는 출처로부터 응답을 생성한다.
➡️ 이것도 1번과 유사한 느낌인듯 하다. 정보의 출처를 정확히 알 수 없다.
용어 / 언어 혼동으로 인한 응답이 정확하지 않다.
➡️ 다양한 훈련 소스가 동일한 용어를 사용하여 서로 다른 내용을 설명하기에..이 놈도 헷갈리나 보다..
아무튼, 우리는 챗봇이 질문의 의도와 정확한 답변을 원하지, 구식이거나 이미 알고있는 내용을 답변받고 싶지는 않다..
RAG는 이런 문제 중의 일부를 해결하기 위한 하나의 접근 방식이라고 한다!
일단 약자 먼저 알아보자.
Retrieval-Augmented Generation
이라서 RAG 다.
그래서 이 RAG는 무엇이냐면, 위에서 간단히 설명한 LLM의 응답을 생성하기 전, 이미 이 LLM 녀석이 학습해둔 데이터 외에 신뢰할 수 있는 지식 베이스를 참조하도록 하는 일종의 프로세스이다!
사실 이렇게 설명해도 잘 이해가 안 될 수도 있다.
뭐 파인튜닝과 차이도 궁금하실 수도 있고..
먼저 졸작을 마치고 조언을 구한 선배님의 예시를 잠시 빌려서 여기에 사용해보면,
동일한 AI 모델이 있고, 하나의 시험을 본다고 생각할 때
파인튜닝은 모델이 스스로 공부를 좀 더 한 것이다.
반면에 RAG는 모델에게 작은 커닝 페이퍼 하나가 주어지는 셈이다.
대충 이런 느낌으로 생각하면 그나마 이해하기 쉬울 것 같다..
이해가 어려우셨다면..죄송합니다 저도 사실 그렇게 잘 아는 편은 아니에요😢
아무튼, 파인튜닝과 RAG에 대해서 더 알아본 내용은 다음과 같다.
파인튜닝은 새로운 데이터로 모델을 일부 수정, 업데이트하는 작업인 것 같다.
RAG는 모델에 대규모 코퍼스(커닝 페이퍼)를 추가해서, 주어진 입력을 기반으로 관련 문서, 정보를 가져온다.
➡️ 이것을 통해서 모델을 따로 수정, 새로 학습할 필요가 없다. 다만, 딸려있는 이 코퍼스에서 데이터를 검색하는 비용이 추가로 든다.(커닝 페이퍼에서 유사한 내용을 찾는 시간)
RAG는 이와 같은 이점을 가진다!
비용이 효율적이다.
➡️ 챗봇은 보통 FM(파운데이션 모델)이라는 LLM을 이용하여 개발된다. 근데, 이눔을 다시 학습시키는 데에는 비용이 많이 드는 반면, RAG는 이에 비하면 새 데이터를 모델에 도입하기 훨씬 간편하다.
최신 정보를 지속적으로 갱신할 수 있다.
➡️ 위와 유사한 이유로, 새 데이터를 도입하기 쉬워진만큼 모델의 데이터 추가 주기도 더 짧아질 수 있다!
개발자의 모델 제어가 더 쉬워진다.
➡️ RAG를 사용해 테스트가 효율적이게 된다! LLM이 잘못된 정보 소스를 참조하는 등의 문제를 해결하고, 수정할 수도 있다.
그렇다면, RAG는 어떻게 작동하는 걸까?
기존의 LLM은 사용자에게 입력을 받고, 훈련한 정보 또는 이미 알고 있던 정보를 기반으로 응답을 만들지만,
RAG는 이 과정 중간에 사용자 입력으로 먼저 코퍼스에서 정보를 가져오는 작업이 추가됬다고 생각하면 된다.
이제, 이 RAG의 작동 방식을 분석해보면 아래와 같다.
외부 데이터 생성
➡️ 모델 외부에 존재하는 데이터 소스들(EX: API, DB, 문서 등)을 정제해서 데이터(EX: 특정한 형식의 파일, DB 레코드, 긴 형식의 텍스트)로 만듦. 혹은 임베딩 언어 모델이라는 방법을 이용해 데이터를 수치로 변환하고, 벡터 DB에 저장한다.
관련 정보 검색
➡️ 사용자가 입력한 데이터가 벡터 표현으로 바뀌고, 벡터 DB와 매칭되게 된다. (EX: 직원이 제 연차 며칠 남았죠? 라는 질문을 통해 검색하면, 개별 직원의 과거 휴가 기록과 연차 휴가 정책 문서를 검색하는 방식)
즉 사용자가 입력한 내용과 매우 연관 있는 데이터를 검색, 반환한다.
LLM 프롬프트 확장
➡️ RAG 모델이 검색을 통해 받아온 데이터들을 컨텍스트에 추가하여 사용자 입력을 보강한다.(신속한 엔지니어링 기술을 이용한다는데, 이건 개발하는 사람 기량 차이인가? 잘 모르겠다.) 이후는 기존 LLM과 동일하게 프롬프트를 기반으로 응답을 생성한다.
외부 데이터 업데이트
➡️ 아예 동적으로, RAG의 데이터들을 비동기 방식으로 업데이트하는 방식을 채택할 수 있다. (자동화 실시간 프로세스 혹은 주기적 배치 처리)
RAG의 기반이 되는 데이터의 변경 관리라고 생각하면 편하다!
RAG를 이용한 LLM의 FLOW
사실.. AI에는 큰 관심이 없던 무지한 개발자 지망생으로써 공부하는데 좀 거리낌이 있었지만..잘 정리된 문서를 보면서 읽어보며 이해하다 보니 어느정도 감이 잡힌 것 같다!
(아예 이해 못한 것 보단 훨씬 수확이 있다고 생각한다!!)
이 글의 참고 문서
https://aws.amazon.com/ko/what-is/retrieval-augmented-generation/
혹시나 오늘도 이 긴 글을 읽어주신 분들께
정말 감사드립니다..! 좋은 하루 되세용😀