10기에서 Langchain으로 local RAG를 구축한 적이 있어서, 이번엔 LlamaIndex로 local RAG를 구축해서 둘을 비교해 보려는 마음이 생겼습니다. 둘을 비교하는 콘텐츠들을 몇 가지 읽어보긴 했는데 어느 것이 더 성능이 좋을지 실제로 사용해보면서 비교해 보고 싶었거든요.
사실 최종적으로 하고 싶은 프로젝트는 1테라 정도되는 교육 컨텐츠를 담고 있는 웨인박스라는 디바이스를, 인터넷이 없는 환경에서도 와이파이를 사용해서 생성형 AI가 돌아갈만한 저렴한 노트북과 연결하여, 채팅 기능을 구동하고 RAG를 활용하여, 선생님들이 디바이스에 있는 교육자료를 가지고 학습자료를 만들거나 교육과정을 디자인하도록 도우려는 프로젝트인데, 일단 LlamaIndex로 RAG의 기본적인 기능을 돌려보자는 심산이었습니다.
이 웨인박스 안에 있는 콘텐츠는 World Possible이라는 NGO에서 방대한 오픈소스 교육자료들을 RACHEL(Remote Area Community Hotspot for Education and Learning)이라는 이름으로 모아놓은 것으로, 웨인박스의 와이파이를 이용하면 로컬 URL로 액세스가 가능하니, 로컬 RAG을 사용하면 인터넷이 없어도 오픈 LLM을 사용하여 교육과정을 디자인하거나 강의 실러버스를 만들도록 돕는 것이 가능하리라는 계산인거지요.
다른 분들이 모두 공식다큐먼트들을 잘 활용하시는 것을 보고 저도 따라해 보기로 했습니다. docs.llamaindex.ai 로 들어가 둘러보니 비개발자인 저에게는 팍! 부담이 왔습니다. 놀랜 가슴을 진정시키며 차근차근 보다가 Llama3 Cookbook with Ollama and Replicate 라는 제목이 눈에 들어왔습니다. 그 중 제일 그럴듯 해 보여서 이걸 따라해 보기로 하고… 하나씩 하나씩 해나가는데… 이게 여러 단계로 되어 있네요.
Basic completion / chat
Basic RAG (Vector Search, Summarization)
Advanced RAG (Routing, Sub-Question)
Text-to-SQL
Structured Data Extraction
Chat Engine + Memory
Agents
이중 3단계까지만 해보면 대충 목적한 프로젝트에 대한 아이디어가 잡힐 것이라는 생각이어서 제출 전까지 여기까지 해보자는 생각이었는데…
필요한 패키지들 설치하고
api_key 설정하고
Llm Instance 생성해 주고
Llm_replicate instance 생성 (llm_replicate가 왜 필요한지는 잘 모르겠더라구요)
HuggingFaceEmbedding instance 생성
인스턴스를 적용해 세팅해 주고
일단 공식다큐먼트에서 제공하는 데이터를 다운로드해서 사용해 보기로 하고
그래서 다운로드 받은 데이터를 로딩하여 llama_parse로 parsing하는 것 까지는 챗지피티의 도움을 받으며 잘 나갔는데 …
그 다음이 넘어가 주지 않네요. LLM API를 호출하여 chat을 시도해 봤는데 에러가 발생하는 겁니다. (챗지피티도 별 도움이 되지 않네요. 그래서 챗지피티와 씨름한 이야기를 해보려구요.)
챗지피티한테 물어보니 다음과 같이 llama_server를 작동시키라고 해서
그래서 vs_code terminal에서 똑같이 따라서 서버를 실행했더니
그래서 jupyter notebook 셀 안에서 다음과 같이 실행했더니 돌아가는 것 같기는 한데 이상한 문자들이 뜨네요… 제대로 돌아간 게 아닌 것 같지요?
404에러가 뜨는 걸 다시 챗지피티에게 보여줬더니
다음과 같이 URL을 설정하라고 해서...
시키는대로 llm, llm_replicate 인스턴스 작성할 때 api_url을 추가했는데
그래도 똑같이 무시무시한 404 에러가 뜨는 겁니다.
그런데 localhost:11434에 가보면 ollama가 떡하니 작동을 하고 있으니...
이게 웬 조화일까요?
결국 제출 시간 안에 해결하기는 힘들다 판단이 되고 여러 선생님들의 조언을 들어야 해결될 일인 것 같아서 이번 글은 이렇게 마무리 하려고 합니다.
일단 여기까지 마무리해서 제출하고 난 후, 혹시나 하고 클로드를 열었습니다. 먼저 주피터노트북 형태로 셀 단위로 흩어져 있는 코드를 하나의 파이썬 파일로 다 때려 넣었습니다. 그리고 좀 정리를 했지요. 그런 다음 클로드에 붙여넣기 하고 에러도 같이 복붙했더니 몇 가지 제안을 하더군요.
첫번째로 서버를 실행하라는 제안을 보자마자 머리를 한 대 엊어맞은 느낌이더군요. … 이런 바보같이 … ollama를 사용하는 건데 이걸 실행을 안 하다니…
두번째 제안도 보다 구체적이고 실제적이네요
사소한 제안은 건너뛰고 다음으로 중요한 제안은
이건 쳇GPT-4o에선 언급조차 없었던 건데 말입니다.
그리고 실행을 하니… 서버가 실행되어 활성화된 상태로 되었는데, 그 다음에 어떻게 해야 하는지 잘 모르겠어서 다시 클로드에게 보여줬더니
응? 다른 터미널을 열어? 터미널을 두 개를 여는거야? 조금 헤메다가 겨우 새 터미널을 열어서 파일을 실행시키니… 우와… 된다~! 성공! 챗GPT-4o 대 클로드 3.5 소넷 대결에서 클로드 3.5 소넷의 완승입니다.
이제 기본적인 것은 되었으니 지금부터가 고난의 길이겠지요? 다음 주까지는 어떻게든 해 볼 계획인데 무슨 일이 기다리고 있을지... 살짝 기대가 되기도 하네요. 이렇게 하나 하나 생성형 AI로 문제를 풀어가는 재미에 조금씩 중독이 되어 간다고나 할까요? ^^
#11기랭체인