어린이날 연휴 동안 임베딩, 키워드 검색 그리고 오픈소스 PR까지 한 어른이 메이커로그
다들 어린이날 연휴 잘 보내셨나요? 저는 지난 한 달을 정신없이 지내다가 5월에 연휴가 즐비하다는 소식을 듣고 지난주부터 급히 스터디하고 싶은 것들을 정리했습니다. 덕분에 이번 연휴는 3일 동안 꽤 밀도 높게 보낼 수 있었고 오랜만에 메이커로그를 남겨보고자 합니다. 😎
하고 싶었던 것들
요즘은 끝내주는 기술을 사용하는 것보다 좋을 기술을 적절하게 활용하는 것에 관심이 많습니다. 그럼에도 불구하고 이미 사용하고 있는 기술보다 새로운 기술들을 배울 때 더 큰 즐거움을 느끼는 것은 어쩔 수 없는 것 같습니다. 그래서 이번 연휴 기간에는 앞으로 업무에 더 활용할 수 있는 기술 스택을 스터디하는 것으로 결정하였습니다.
1. 새로운 웹/앱 스택
Apollo Client
Supabase
푸시 알림 고도화
사이드 프로젝트로 앱을 만들고 있지만 처음으로 만든 서비스인지라 별 고민없이 남들이 많이 사용하는 기술을 적용하여 아쉬움이 많은 편입니다. 제가 짠 코드이지만 특히 데이터베이스 구조와 스키마는 충격과 공포이기도 하고요. 😱 새로운 앱에 대한 아이디어도 생겨서 오랜만에 신규 서비스를 런칭하면 재미있을 것 같았습니다.
2. 임베딩과 RAG
Vector Store
시멘틱 검색 활용 방법
작년 추석 즈음에도 빠르게 성장하는 LLM에 막연한 두려움을 느끼며 LangChain을 공부한 적이 있습니다. Open AI와 Next.js에서 제공해주는 라이브러리를 이용해 간단한 채팅 앱을 구현했지만 아주 좁은 도메인에 적용하기에는 무리가 있고 더 많은 커스터마이징이 필요하다고 느꼈습니다. 그리고 약 1년이 지난 지금, 더 가파르게 성장하는 LLM 기술들을 어떻게 활용할 수 있을지 궁금해졌습니다.
3. 클라우드 서비스
AWS
GCP
제가 Vercel을 좋아하는 이유는 프론트엔드 인프라를 쉽고 명확하게 구성할 수 있기 때문입니다. 개인적으로 클라우드 서비스를 좋아하지 않는 이유는 1. 콘솔이 너무 복잡하고, 2. 잘 모르는 설정을 정해야하고, 3. 그로 인해 비용이 발생하기 때문입니다. 사실 제대로 사용해보지도 않았고 아직까지는 활용할 일이 없다고 생각했지만, 회사 업무에서도 이로 인해 막히는 것들이 너무 많고 Vercel도 사실 AWS를 랩핑해놓은 것이라고 생각하니 한 번 쯤은 파보아야겠다는 생각이 들었습니다.
실제로 한 것들
1. 로컬 Vector Store를 활용한 시멘틱 검색
실행
특정 도메인에 LLM을 적용할 수 있는 방법 중 하나로 RAG(검색 증강 생성)가 있습니다. 간단하게 말하면 LLM에게 정답이 있을만한 데이터(chunk)들을 함께 보내주어 답변 정확도를 높일 수 있는 방법입니다.
사이드 프로젝트를 진행하는 장점 중 하나는 써보고 싶은 기술을 실제 사용자 데이터를 사용하여 도입해볼 수 있다는 점입니다. (잘 안되면 제가 기능을 삭제해버리면 됩니다 🤩) 지난 1년 반 동안 주짓수를 정말 열심히 했는지 어느덧 200개가 넘는 일기가 작성되었습니다. 현재는 “기술 별로 일기를 조회”할 수는 있지만 “실제 연관있는 기술을 묶어서 조회”하는 것을 불가능합니다. 그래서 제가 낸 아이디어는 “사용자 별로 Vector Store를 구축해주면 어떨까?”입니다.
실제 테스트 예시는 아래와 같습니다.
Firebase Firestore에서 일기 데이터를 JSON으로 뽑아와서
LangChain을 기반으로 Open AI의 임베딩 모델을 사용하여
FAISS를 사용하여 로컬 Vector Store를 구현하였습니다.
위 이미지는 “사이드 탈출”을 질문으로 보냈을 때 5개의 연관성 높은 일기를 받은 결과입니다. 주짓수를 하지 않으면 어떤 내용인지 감이 잘 안오시겠지만 (ㅎㅎ) “사이드 탈출” 뿐만 아니라 “탈출”과 관련된 일기들도 함께 보여주고 있습니다. 의미를 기반으로 검색된 것이 맞고 아직 튜닝이 안된 스토어이므로 정확도도 낮지만 “이게 내가 원하는 결과가 맞나?”라는 생각이 들었습니다.
깨달은 것
개인 일기장 데이터의 양과 형식이 RAG 기술에 적합한가?
RAG를 사용한 예시나 관련 영상들을 보면 기업, 기관의 가진 방대한 문서(pdf)를 기반으로 사내 직원들의 생산성을 높이려는 시도가 많습니다. 200개의 일기가 많다고 느껴질 수도 있지만 근본적으로 JSON 형태로 잘 정제되어 있는 이 데이터를 RAG라는 어렵고 불확실성이 높은 기술에 시간을 쏟을 가치가 있을까?에 대해 조금 더 고민해보게 되었습니다.
사용자는 질문에 대해 정확한 결과(키워드 검색)와 유사한 의미의 결과(시멘틱 검색) 중 어떤 것을 선호할까에 대한 근본적인 궁금증이 생겼습니다. 물론 Ensemble Retriever를 활용하면 두 검색을 적절하게 조합할 수 있지만 실제 두 가지 선택지가 있었을 때의 경향성도 비교해보고 싶어졌습니다.
2 Algolia를 활용한 키워드 검색
실행
아직 키워드 검색을 구현해본 적이 없지만 Firebase에서는 자사의 서비스와 쉽게 통합하여 사용할 수 있는 익스텐션들을 제공합니다. 저는 이 중에서 가장 다운로드 수가 많고 업무에도 활용 가능한 Algolia를 채택하였습니다.
또한 자체적으로 제공하는 클라이언트 라이브러리도 많기 때문에, react-native 예시 컴포넌트들을 활용하여 아래 기능들을 몇시간 내로 구현할 수 있었습니다. (프론트 개발은 익숙하다보니 다른 업무보다 빠르게 진행됩니다 😎)
검색
무한 스크롤
검색 쿼리 하이라이트
레슨런
사실 Algolia의 키워드 검색을 완전하게 사용해보지는 못했고 그 이유는 다음 섹션에서 다룰 예정입니다. Algolia 검색을 구현하는 개발자 입장에서 느낀 점은 아래와 같습니다.
Firebase가 제공하는 기능들이 생각보다 강력함
올해 초 SQL DB로 넘어가기 위해 Supabase 마이그레이션을 고민했었지만 이번에 Algolia를 구현하면서 Google의 따스함을 느낄 수 있었습니다. Google이 가진 Cloud Functions, Gemini 등 다양한 기술들을 묶어놓은 익스텐션을 보며 추상화된 서비스를 빠르게 사용해볼 수 있겠다는 생각이 들었습니다.
사이드 프로젝트에서는 무료 플랜을 적극적으로 활용하자
시간이라는 자원을 서비스에 쏟다보니 돈도 함께 소모하고 싶지 않다는 앱 운영 철학이 있었습니다. 그러나 열심히 비용 계산을 해보면서 느낀 점은 1. 이정도 규모는 무료 플랜으로도 충분하다, 2. 웬만하면 예산을 벗어나면 alert 설정이 가능하므로 걱정하지 않아도 된다 입니다.
3 Cloud Functions와 오픈소스
실행
Firebase의 Algolia 익스텐션을 설치하면 Firestore의 변경내역을 감지하여 클라우드 함수를 실행할 수 있도록 Cloud Functions가 설치됩니다.
처음에는 이 함수를 그냥 가져다쓰면 된다고 생각했지만 제가 원하는 방식대로 커스터마이징하다보니 엄청난 오류가 발생했습니다.
결국 실제 오픈소스 코드를 하나하나 까보면서 문제가 발생한 곳을 찾게 되었고 코드 몇 줄을 간단하게 수정해서 PR를 올려두었습니다. 과연 첫 오픈소스 기여가 가능할지…! 굉장히 설렙니다.
레슨런
서버리스 함수 생각보다 안어려움
Algolia에 데이터가 들어가기 전 변환해주는 함수를 직접 구현하고 배포해보았습니다. 클라우드 서비스를 사용할 일이 없을 것이라 생각했는데 막상 구현해보니 꽤 쓸모있고 좋은 서비스라는 생각이 듭니다.
추상화된 서비스일수록 무엇이 문제인지 찾기 어려움
익스텐션으로 추상화된 서비스여서 에러가 발생할 때 무엇이 문제인지 찾기 상당히 어려웠습니다. 결국 GCP의 에러 로그와 깃허브 소스코드를 하나하나 까보면서 핸들링을 했는데, 문제의 근본적인 원인을 찾기 위해서는 로우레벨을 확인해야겠다는 것을 다시 각인하였습니다.
마무리하며
이렇게 정리하니 참 많은 일을 한 것 같은데요 실제로는 잘 놀고 쉬기도 하였습니다. 금요일 저녁에 주짓수를 한 뒤 맥주를 마시기도 하고, 새로 산 헤드셋과 함께 기타를 치기도 하고, 쏨땀을 먹으면서 치앙마이를 회상하기도 하고, 누워서 쇼츠를 많이 시청하기도 했습니다 ㅎㅎ. 연휴가 시작하기 전 할 일을 잘 정리해두었더니 전부는 아니더라도 하고 싶은 일들을 대부분 실행해볼 수 있어 좋았습니다. 다음에도 재미있는 글로 찾아뵐게요. 긴 글 읽어주셔서 감사합니다.
댓글
로그인 후 댓글을 남길 수 있습니다.
supabase 맛을 못보셔서 아쉽네요! 저는 지난해 처음 이용 후 열렬한 팬이 되었습니다👍 클라우드는 nextjs에 디펜던시가 있다면 아직까진 vercel이 가장 편한건 사실인것 같습니다. 좋은 글 감사합니다🙇♂️🙇♂️
열렬한 팬이시라니..! Supabase를 테스트로 잠깐 써보긴 했는데 프로덕션에서도 사용해봐야겠네요 ㅎㅎ
서경님 메이커로그가 이번주 뉴스레터에 소개되었어요 :) https://stib.ee/khMC
신나요 🤩🤩🤩