2024.09.22 - [RAG Project] - [RAG Project] GlobalMacro QA chatbot - Reranker&more Evaluation (9)
[RAG Project] GlobalMacro QA chatbot - Reranker&more Evaluation (9)
2024.09.20 - [RAG Project] - [RAG Project] GlobalMacro QA chatbot - Question Process&Evaluation (8) [RAG Project] GlobalMacro QA chatbot - Question Process&Evaluation (8)2024.09.17 - [RAG Project] - [RAG Project] GlobalMacro QA chatbot - Retriever&Evaluat
hibyeys.tistory.com
이전 포스팅에서 Reranker를 붙이고 RAGAS와 Langsmith를 통해 Evaluation을 진행하여 Advanced RAG chain을 완성하였다.
이번 포스팅에서는 여태까지 한 과정에 대해 짧은 후기를 작성하고 다음에 해야 할 것들을 정의해 볼 것이다.
(포스팅에 관련된 코드는 github에 업로드되어있다)
중간 후기
대략 8월 초부터 시작해서 한 달반정도 되는 시간 동안 RAG를 학습하고 프로젝트를 수행하였다.
사실 기간을 한 달 정도 잡고 포트폴리오를 만들 계획이었는데 생각보다 할게 많아 시간을 더 할애하게 되었다.
그럼에도 아직 테스트해 볼 부분이 산더미 같아 행복(?)하다.
이 프로젝트는 취업용 포트폴리오 용도도 있지만 내가 직접 활용할 것이기 때문에 꾸준히 업데이트해 나갈 것이기 때문에
도전 정신이 불타오른다.
현재 RAG에는 총 3개의 카테고리가 있다. (RAG의 짧은 역사 훑어보기)
- Naive RAG
- Advanced RAG
- Modular RAG
현재까지는 Advanced RAG까지 구축하였고 다음 단계인 Modular RAG를 수행할 예정이다.
하지만 Modular RAG는 아직 초기 단계이고 LangGraph 등 사전학습이 필요하기 때문에 구축하기 위해서는 시간이 꽤 소요될 것이다.
이 프로젝트는 포트폴리오 용도도 있기 때문에 Modular RAG를 구축하기 전 Advanced RAG를 마무리하는 중간 후기를 작성하고
다음 단계를 정의해 볼 것이다.
(다른 글들에도 프로젝트를 진행하면서 부딪친 문제나 느낀 점을 서술해 두었지만 여기서는 큰 틀에서 느낀 점을 작성해 보았다.)
RAG는 경험치
유튜브에 RAG를 검색하면 10분 만에 RAG를 구축하는 영상들이 수두룩하다.
하지만 실제로 그런 마법은 존재하지 않는다. 물론 langchain, llamaindex 등 프레임워크가 잘 나와 있는 건 사실이지만
실제로 내 상황에 적용해 보면 영상들처럼 스무스하게 진행되지 않는다.
문서 하나를 처리하는데 고려해야 할 점도 많아도 성능도 생각만큼 잘 나오지 않는다.
그렇기 때문에 더욱 다양한 상황에서 다양한 데이터 형식과 전략을 경험해 보아야 한다고 느꼈다.
아직은 필요한 노가다 작업
데이터를 정제하기 위해 많은 비용과 시간을 썼지만 결국 인간이 개입해야 하는 부분이 생길 수밖에 없었다.
처음에는 전부 자동화하기 위해 과정을 쪼개고 prompt를 바꿔가며 LLM을 테스트했지만 비용만 들고 직접 수정하였다.
물론 이전에 비하면 비약적인 발전을 이루어졌다 할 수 있겠다.
현재시점에서 어느 정도의 막일 작업은 감수하자! (비용과 시간만 낭비할 뿐이다.)
SLM의 등장으로 더욱 부각되는 RAG
프로젝트를 수행할 때, GPT-4o-mini를 적극활용하였다.
가격이 말도 안 되게 싸고 Context Length 도 128,000이나 되어 prompt 길이나 문서수를 걱정할 일은 없었다.
또한 복잡하기 않은 Task의 경우 성능도 괜찮았다. 요약이나 문장교정 같은 Task를 상위 모델과 비교해 보았는데 별 차이가 없었다.
오히려 prompt를 어떻게 주느냐에 따라 성능이 크게 달라졌다.
만약 mini 가 없었으면 프로젝트 수행이 불가능했을 정도이다. (비용문제로 테스트를 제대로 못했을 것이다)
물론 llama 3.1 8B 같은 오픈 소스 모델을 사용할 수 있었겠지만 context length나 hardware 제약 문제가 있어서
이만큼의 성능을 내지는 못했을 것이다. (그래도 해보지 않고는 모르기에 다음에 Local Model을 구축해보고 싶다.)
또한 Retrieve 된 문서와 함께 생성한 답변 퀄리티가 꽤 훌륭했다.
물론 상위 모델과의 퀄리티 차이가 존재하긴 한다. gpt-4o-mini와 sonnet 3.5를 주로 사용하였는데
문장의 매끄러움이나 추가적인 정보에서 차이가 나지 핵심적인 내용은 잘 대답해 주었다.
하지만 좀 더 복잡한 질문에 대해서는 더 많은 차이가 나보이 긴 했다. (이것도 prompt engineering으로 극복가능하다고 생각한다.)
장황하게 말했지만 결론은 RAG를 붙이면 작은 모델도 괜찮을 성능을 낼 수 있다는 것을 확인했다는 것이다.
큰 모델이건 작은 모델이건 없는 데이터에 대해서 대답 못하는 것은 매한가지이지만
비용 측면에서 굉장히 효율적이다. 비용과 성능의 trade-off를 생각해서 적절히 섞어 사용하는 게 제일 좋아 보인다.
RAG 시스템 평가의 한계점 (테스트 데이터셋 생성)
Machine Learning 분야에서 Evaluation 은 중요한 분야 중 하나다.
어떤 Model을 만들어 놓고 이 모델을 개선하고 다른 모델들과 비교하려면
주관적인 성능 평가가 아니라 객관적이고 일관성 있는 평가가 필요하다.
RAG 시스템에서도 마찬가지다. 이번에 여러 chain을 테스트해보려 했지만 생각대로 되지는 않았다.
바로 데이터셋 구축 때문이다. 실제 데이터셋을 구축하기 위해서는 많은 시간이 소요된다.
그래서 평가 프레임워크들에서 데이터 생성 모듈을 제공하지만 결과물이 좋지 않았다. 특히 한국어는 더 심했다.
어쩔 수 없이 조금이라도 테스트를 진행해 보고자 직접 10개 정도의 테스트 셋을 만들어 실험했다. (시간이 너무 소요돼서 너무 복잡한 질문은 생략했다)
데이터셋이 적어서인지 chain 별로 평가하였을 때 지표들이 들쭉날쭉해서 이 chain이 best다라고 단정 짓기 어려웠다.
그래서
결과를 절대적인 것으로 받아들이기보다는 전체적인 평가 과정의 한 부분으로 고려하고 다양한 지표들을 테스트해보았다.
결론은 현실적으로 제대로 테스트하기에는 비용과 시간이 많이 들어가기 때문에 정성적인 평가와 병행해 다양한 정량적 평가를 시도해서
평가를 수행하자.
LLM 모델 활용의 한계점
유튜브에 LLM을 사용하면 이제 개발자가 필요 없어지지 않느냐는 식의 글이나 영상들을 종종 접하게 된다.
어느 정도 동의하는 부분이 있었지만 이번 프로젝트로 그런 생각은 싹 사라졌다.
그냥 생산성을 크게 올려주는 Tool일 뿐이다. (이것만으로도 충분히 대단한 일이긴 하지만..)
필자는 cursor IDE에 sonnet 3.5를 붙여서 사용하는데, 자잘하게 코드를 변형하거나 디버깅할 때 큰 도움을 받았다.
하지만 최신 기술에 대한 사용법이나 에러는 기존의 검색방식 (github issue, documentation 등등)을 이용할 수밖에 없었다.
이러한 점들을 이해하고 적절히 활용해야겠다는 생각이 들었다.
Prompt Engineering의 중요성
현재 시점으로 o1-preview 모델이 등장했다.
openAI에서 공개한 추론에 특화된 모델인데 resoning token이라는 것을 사용하여 내부적으로 추론과정을 거쳐 결론을 도출한다.
그러면서 프롬프팅에 대한 조언을 적어 두었는데 기존의 프롬프팅 방법을 쓰지 않는 것이 좋다고 서술되어 있다. (구조화는 여전히 도움이 되는 것 같다) 결국 모델이 발전할수록 prompt engineering은 쓸모가 없어진다는 것을 알 수 있다. (링크)
이번에 프로젝트를 진행하면서 prompt를 어떻게 작성하느냐에 따라서 결과물이 많이 달라지는 것을 체감했다. (작은 모델일수록 더더욱)
후에 대부분의 모델이 prompt engineering이 필요 없는 시기가 올 테지만 당장에는 꽤 중요한 부분을 차지하고 있다고 생각한다.
사실 이전에 prompt engineering에 필요성을 느끼고 프롬프트 엔지니어 강수진 박사님의 오프라인 강의를 신청했다.
위에 서술한 이유들 때문에 수강을 취소할지 고민을 하였다. (가격이 꽤 비싼 강의다.)
결론적으로 그냥 수강하기로 결심했다. o1-preview와 mini 가 나왔다고 해서 이 방법론이 언제 다른 모델에 적용될지도 모르고
당장에는 필요한 지식이기 때문이다. 수강 후 prompt engineering의 마스터가 되어 돌아오겠다.
Next Step
다음으로는 LangGraph를 이용해서 Advanced RAG에서 Modular RAG로 전환하는 것이 목표이다.
또한 아래 그림과 같이 Web Search를 통해 Context를 보충하는 Agent와 단계별로 판단하는 Agent를 추가해 볼 것이다.
(나중에는 각각의 관점별로 보고서를 작성해 주는 Agent를 붙여 조금 더 자동화된 프로세스를 만들고 싶다)
이전에 시도하지 못한 것들
- Query Expansion 모듈을 붙이지는 않았는데 나중에 한번 테스트해보고 싶다.
- 전체 APP에 대한 System prompt를 비교 테스트 하지 못하였는데 나중에 Agent에 prompt를 할당하면서 같이 테스트해볼 것이다.
- 데이터 업데이트 파이프라인을 구축해 놓을 것이다.
- Neo4 j database를 통해 Graph RAG를 테스트해볼 것이다.