llama3 + langchain 을 이용한 RAG 구축기. 신세계네요~!
7

Lv.1 7호선청담역 (218.♡.114.67)

2024년 4월 27일 PM 04:15 · 수정됨(17:06)

조회 821 공감 0

이번에 llm 을 이용한 RAG 시스템 구축 프로젝트를 하게 되었습니다.

업계 보안상 ChatGPT는 사용이 안된다네요 ㅠ

다행히 네이버 HyperClovaX는 보안 이슈를 잘 해결해서 사용이 가능했습니다.

근데 네이버가 한글 처리는 좋은데 RAG에 필수적인 임베딩 가능 토큰수와 llm에서 처리 가능한 토큰수 모두 ChatGPT에 비해 너무 작더군요.

그래서 고민하다가 이번에 meta에서 나온 llama3가 하도 좋다길래 써보니 아직 한글 처리가 불안하지만 json 출력, streaming 출력이 너무 잘되어서 병행해서 사용하기로 했습니다.

그리고 요즘 llm 모델 최적화 기술 덕분에 4bit 모델도 쓸만해져서 3090 2대에 llama3 70b 4bit도 잘 올라가더군요.


그리고 RAG를 구현하기 위에 오랜만에 langchain을 사용했는데 2023년도에서는 langchain이 너무 빠르게 발전해서 할때마다 개발해놓은 코드가 안돌아가서 짜증났는데 이번에 보니까 코드랑 메뉴얼이 매우 잘 정리되었더군요. 그리고 네이버는 아직 지원이 안되어서 따로 wrapping class를 만들어썼지만(커스텀 코드 만들기도 아주 좋게 되어 있습니다. python 상에서 상속도 신경 많이 써놓았고) llama3는 Ollama를 이용해서 올리면 langchain에서 쉽게 연동이 되더군요.


RAG의 성능을 높이기 위해서 병렬 처리를 통해 동시에 여러 문서를 검색하도록 했는데, 이럴 때 문제가 스트리밍 방식의 출력이었습니다. ChatGPT와 같이 대부분의 채팅 UI가 스트리밍을 지원하며 그렇지 않은 경우 체감속도가 엄청 떨어지는데 병렬처리 때에는 스트리밍 하는게 기획부터 어려웠습니다.

그런데 langchain에서는 input부터 output까지 전과정을 chain이라는 개념을 두고 이 chain 들에 대해 병렬 처리를 매우 쉽게 해주고 결과도 dictionary로 합해주는데, 스트리밍도 1개의 chain뿐만 아니라 병렬 처리 때에도 구분해서 처리를 해주는군요. 감동~!!


그리고 prompt 개발이라는 것이 참 어렵더군요. 개발이라고 하기에는 테스트/QA 요소가 많아서 일반적인 개발 방식으로 접근하면 결과가 잘 안나오더군요.

langchain으로 LLM을 이용한 prompt 작업을 하면서 2005~2008년도 AJAX가 한참 유행할때 개발자(대부분 백엔드)들이 javascript 작업을 코딩으로 볼건지 안볼건지 헷갈려할때 jquery가 나오면서 javascript 작업의 체계가 잡히면서 프런트엔드라는 영역이 만들어졌던게 생각이 나더군요.


댓글 (10)

  • 와싸다 Lv.1

    24.04.27 · 110.♡.98.240

    라마 좋아요. 누가 8b모델 262k 토큰으로 확장해놨는데 그것도 좋더라고요.
  • 버섯이

    버섯이 Lv.1

    24.04.27 · 211.♡.192.96

    CoT, CoV 관련해서 찾아보시면 좋을것 같네요!
  • 7

    7호선청담역 Lv.1 → 버섯이 작성자

    24.04.27 · 218.♡.114.67

    저도 이거랑 RAPTOR 등 여러가지를 고민해봤는데...
    처리 시간이 문제더군요. 혹시 처리 시간을 해결하면서 구현해보신걸까요?
  • 오비완

    오비완 Lv.1

    24.04.27 · 116.♡.202.126

    이런거 이해하고 구축할 수 있는 사람이 되고 싶습니다. 부럽네여.
  • Awacs

    Awacs Lv.1

    24.04.27 · 222.♡.249.156

    [https://r2.damoang.net/data/editor/2404/comment_3731749276_MDmSFk5U_47703d6b64a8290b834ab8782acb43df86e120f3.jpeg]
  • 동탄토깽이 Lv.1

    24.04.27 · 116.♡.174.160

    문서 기반 챗봇 솔루션을 최근 개발했었는데.. langchain 사용하는 것보단 직접 만드는게 좋더군요. 자유도가 높고 튜닝이 용이했습니다.
    라마3는 그대로 쓰기엔 한국어가 엉망인데 어떻게 쓰시는건지 궁금하긴하네요.

    검색 속도는 문서를 유형별로 나눠서 콜렉션-파티션을 생성하고 벡터 인덱싱하면 굉장이 빠르더군요.
  • 7

    7호선청담역 Lv.1 → 동탄토깽이 작성자

    24.04.27 · 218.♡.114.67

    저도 작년에 langchain 썼을때는 자유도 때문에 자체 코드로 했는데요
    올해 다시 보니까 웬만한건 준비가 되어 있고 필요한건 커스터마이징 해서 쓰면 되더군요.
    그리고 llama3는 한글을 직접적으로 이해하는거 외에 HTML, 테이블 구조 패턴 인식 등에 사용하고 있습니다.
    llama3를 한글로 제대로 파인튜닝 하기 전까지 단독으로 쓰기는 어렵지만 병행해서 쓰기는 괜찮네요.
  • 동탄토깽이 Lv.1 → 7호선청담역

    24.04.27 · 116.♡.174.160

    8b만 써봤는데 70b도 맛을 좀 봐야겠군요^^ 답변 감사합니다.
  • 7

    7호선청담역 Lv.1 → 동탄토깽이 작성자

    24.04.27 · 218.♡.114.67

    저는 속도 보다는 인식 정확도 때문에 명확히 meta 태그를 붙여서 vector DB에 저장해주고
    retrieve 할때 태그를 걸어서(그 태그에 해당하는거에서만 찾도록) 하도록 했습니다.
    그리고 vector DB 방식이 세부적인 검색에는 좋은데 넓은 범위에서는 잘 못해서 결국 elasticsearch를 앞단에 붙였습니다.
  • 동탄토깽이 Lv.1 → 7호선청담역

    24.04.27 · 116.♡.174.160

    맞습니다. 메타 데이터를 사용해야만 하더라구요. 저같은 경우는 문서명, 문서유형, 요약등을 사용해서 검색 정확도를 높였습니다. 결국 Re-Ranking을 잘해야하는 것 같습니다.

댓글을 작성하려면 이 필요합니다.