문화
래블업의 이야기를 확인해보세요.
개요
2024년 5월, 래블업의 페이스북에 올라온 인턴 모집 게시글을 통해 인턴십 프로그램에 지원하게 되었다. 지원서를 영어로 작성하며 힘들었던 기억이 아직도 생생하다. (한글, 영어 모두 상관없다고 되어 있었지만, 왠지 영어로 작성해야만 할 것 같았다.) 래블업이 오픈소스 기반의 소프트웨어인 Backend.AI를 개발하는 회사인만큼 래블업에 지원하기 위해서는 개발 역량이 중요하다고 생각했지만, 내가 여태껏 학습한 내용은 모두 AI 연구와 관련된 내용이었기에 고민이 있었다. 약간의 고민 끝에 당당하게 '리서치팀'에 지원하기로 결정했다.
면접에는 리서치팀 소속인 세르게이님과 은진님, devops팀 소속인 규진님이 들어왔고, 3:1 영어 면접 방식으로 진행되었다. 포트폴리오에 있는 프로젝트를 프리스타일 영어로 최대한 열심히 설명했는데, 정신을 차려보니 40분이 훌쩍 지나있었다. 영어 회화 실력이 부족하다고 생각했기 때문에 준비했던 내용들을 충분히 전달하지 못한 것 같아 무척이나 아쉬웠고, 사실 결과에 큰 기대를 하지 않고 있었다. 그러나 정말 운 좋게도 3일 뒤 합격 메일을 받게 되었다.
그렇게 7월부터 나를 포함한 총 4명의 인턴분들과 인턴십 생활을 시작하게 되었다. 래블업은 나에게 인생 첫 회사였는데, 그러다 보니 최대한 단정한 옷차림과 용모로 출근하려고 했다. 한여름에 긴팔 셔츠와 슬랙스를 입고 출근했는데, 10시가 되기 조금 전 도착한 오피스에는 캐주얼한 반바지에 운동화를 신은 종은님만 계셨다. 종은님은 “우리 회사는 따로 정해진 자리가 없으니 편한 곳에 앉으시면 된다” 라고 말씀해주시며 다른분들은 재택근무 중이라고 하셨다. 그리고 나는 10시 all-hands meeting에서 종은님의 화면을 통해 구성원들과 인사할 수 있었다. 평소 생각했던 회사라는 이미지와는 너무 다른 모습에 적잖게 당황했지만 이후 자기소개 시간, coffee chat 등의 기회를 통해 여러 구성원들과 얘기하며 래블업만의 분위기에 적응해 나갈 수 있었다.
업무
Developing domain adaptive language model
온보딩 Backend.AI 설치 이후, 리서치팀에 합류하며 본격적으로 업무를 시작하게 되었다. 리서치팀에서의 첫번째 업무는 무역 도메인에 특화된 언어모델을 개발하는 것이었다.
큰 흐름은 위의 그림과 같다. 언어모델이 무역 도메인과 관련된 이메일 대화로부터 키워드와 요약본을 추출할 수 있도록 학습시키고, 학습된 언어모델이 키워드와 요약본을 추출하면 고객이 이들을 바탕으로 견적서를 생성할 수 있도록 하는 것이었다. 모델 개발 및 평가에 관한 자세한 내용은 래블업 블로그 에서 확인할 수 있다.
이러한 언어모델을 개발하기 위해 [데이터셋 수집 및 전처리] - [모델 학습] - [평가] 의 일련의 과정이 필요했다. 중간중간 궁금한 점도 많았고, 처음에는 Backend.AI 환경에서의 작업도 익숙치 않아 구성원들에게 이것저것 도움을 많이 구했던 기억이 있다. 인턴 기간은 고작 두 달이었기에 하루하루가 소중했는데, 삽질을 하는 경우가 생기면 소중한 하루가 통째로 날아갈 수도 있어 조금이라도 모르는 것이 생기면 지체하지 않고 도움을 청해야만 했다.
래블업의 문화에서 가장 좋았던 점을 꼽자면, 비동기적 소통 방식의 지향이었다. 내가 모르는 내용을 사내 메신저에 던져놓으면, 지금 당장이 아니더라도 언젠가는 누군가 질문에 대한 답변을 해주는 방식이다. 채널에 있는 모든 구성원이 내 질문을 본다는 것이 처음에는 약간 부담스러웠지만, 삽질로 시간을 날리는 것이 더 큰 압박이었기에 채널에 질문을 남길 수 밖에 없었다. 다행히 어떤 구성원이든 친절하게 질문에 답해주었고, 질문에 답변이 달리는 시간 동안 나는 다른 업무를 처리할 수 있어 시간도 아낄 수 있었다. 오픈소스 기반으로 성장해 온 회사의 문화적인 장점을 느낄 수 있었다.
Evaluating agent Helmsman with LLM
앞서 말했듯, 래블업은 Backend.AI라는 소프트웨어를 개발하는 회사이다. Backend.AI에는 정말 많은 CLI (Command Line Interface) 기반 명령어들이 존재하는데, 사용자가 이러한 명령어를 모두 외우는 것은 사실상 어려운 일이다. 이런 사용자들을 위해 GUI (Graphic User Interface)기반으로 작업할 수 있는 Backend.AI WebUI가 존재하지만, Backend.AI를 처음 사용하는 사용자에게는 이 또한 익숙하지 않을 수 있다.
Helmsman은 이러한 문제점을 해결할 수 있는 LLM agent이다. 사용자가 채팅 기반 인터페이스를 통해 Helmsman 에게 자연어로 요구사항(e.g. 세션을 만들어줘, llama 7b 모델을 학습시키고 싶어)을 전달하면, Helmsman이 요구사항에 맞는 적절한 CLI 명령어를 제공하거나 명령어를 실행해주기도 한다. 사용자 입장에서는 채팅으로만 요구사항만 전달하면 에이전트가 세션 생성, 데이터셋 다운로드, 모델 학습까지 실행해주니 이보다 더 편할 수는 없을 것이다.
하지만 Helmsman이 언제나 정확한 답변을 하는 것은 아니었다. Helmsman 또한 Backend.AI의 CLI 문서들과 명령어를 기반으로 답변하는 로직이었기 때문에 문서가 오래되었거나, 잘못된 정보를 포함한 경우에는 잘못된 답변을 할 수 있었다. 또한 Helmsman은 LLM 기반 에이전트이기 때문에 LLM 고유의 문제인 환각 현상(hallucination)이 발생할 수 있었다. 따라서, 다양한 지시사항에 대해 Helmsman이 얼마나 올바른 답변을 하는지, 실제로 문서에 잘못된 부분은 없는지 확인하는 과정이 필요했다. 연구팀의 세르게이님, 은진님과 회의를 거쳐 아래와 같은 구조의 LLM 기반 평가 시스템을 구축하기로 했다.
1. LLM1: Instruction Generator
첫 번째 단계는 Instruction Generator LLM이 수행한다. 해당 LLM은 Backend.AI의 문서를 분석하여 사용자가 실제로 Backend.AI에서 사용할만한 요구사항(Instruction)을 생성한다. 예를 들어, "4CPU core, 16GB of memory의 session을 만들어줘"와 같은 요구사항을 생성하게 된다.
2. LLM2: CLI Command Generator
두 번째 단계는 CLI Command Generator LLM이 수행한다. 이 LLM은 첫 번째 LLM이 생성한 Instruction과 CLI 문서, 그리고 몇 가지 예제(Few-shot Examples)를 기반으로 CLI 명령어를 생성한다. 예를 들어, 아래와 같은 명령어를 생성할 수 있다.
'[Backend.AI](http://backend.ai/) session create
--name cli-test-session --resources cpu=4
--resources mem=16g --resources cuda.shares=2 ,…’
3. CLI Command 실행 및 로깅
생성된 CLI 명령어는 실제로 실행되며, 그 결과는 아래와 같이 기록된다
- 성공/실패 여부: 명령어가 의도대로 작동했는지 확인.
- 에러 로그: 실패 시 발생한 에러 메시지 기록.
- 참고 문서: 명령어를 생성하는 데 사용된 문서 정보 기록. 이 과정을 통해 사용자는 명령어의 작동 결과를 확인할 수 있을 뿐만 아니라, 문제가 발생한 경우 이를 해결하기 위한 추가 정보를 확보할 수 있다.
결과 분석
에러의 원인은 크게 세종류로 분류할 수 있다.
첫 번째, Instruction Error는 사용자가 에이전트에게 충분한 정보를 제공하지 않아 에러가 발생한 경우이다. 이 경우 에이전트의 특성상 사용자와 소통하며 에러를 해결할 수 있다.
두번째는 Docs Error이다. 결과를 확인했을 때 극소수의 경우에 불과했지만 에러가 발생했을 때 사용자와 에이전트의 소통으로 디버깅할 수 없고 같은 에러가 계속해서 반복될 수 있기 때문에 해당 에러를 발생시킨 문서를 확인해야 한다.
마지막으로 Hallucination Error이다. 이 경우는 few-shots를 추가하여 어느정도 해결이 가능한데, 모든 command에 few-shots를 추가하게 되면 prompt가 지나치게 길어질 우려가 있으므로 실행하는 명령어 별로 few-shots를 추가한 뒤 해당 명령어에 맞는 few-shots를 가져와 프롬프트에 추가하는 방법이 해결책이 될 수 있다.
시간이 부족하여 결과 분석 이후의 작업들은 미래에 해결해야 하는 업무로 남게 되었다.
마치며
원래 나의 인턴십은 2개월짜리 프로그램이었다. 하지만 중간에 인턴십을 연장하여 총 6개월이라는 시간 동안 래블업에서 함께할 수 있었다. 돌이켜보니, '래블업에서의 2개월은 짧았을 수 있었겠다'라는 생각이 든다. 실제로 근무해보니 래블업은 재택근무가 자유로운 분위기라 2개월 동안 모든 구성원을 만나기도 쉽지 않았고, Backend.AI의 기술적인 깊이가 얕지도 않았기 때문에 6개월 동안 인턴을 할 수 있었다는 것이 행운이었다는 생각이 든다. 2개월이라는 기간은 생각보다 짧아서 Backend.AI에 기여하지도 못하고 공부만 하다가 나갈 수도 있는 시간이었을 것이다.
래블업은 질문에 관대한 회사다. 모르는 점을 채널에 남기면 언제든 누구든 답변해준다. 모르는 점, 잘못된 점을 혼자 오랫동안 고민하게 놔두지 않는다. 이런 점을 잘 알고 활용한다면 래블업에서의 2개월은 성장하기에 충분한 시간이 될 것이다.
래블업에 반년이나 있었던 만큼, 업무 이외의 다양한 경험들도 할 수 있었다. 파이콘, 래블업 컨퍼런스 등 다양한 행사에도 함께 참여했다. 특히 래블업 컨퍼런스에서는 인턴임에도 발표할 수 있는 좋은 기회를 얻어 컨퍼런스에서 발표를 해보기도 했다. 끝나고 보니 아쉬운 점이 너무 많았지만, 개인적으로 정말 좋은 경험이었다고 생각한다.
래블업은 독특한 사람이 많은 회사다. 개개인의 캐릭터가 너무나 뚜렷해서 퇴사하는 날까지 나는 내가 제일 평범한 사람이라 생각했다. 하지만 그만큼 개개인의 장점이 뚜렷하고 좋은 사람도 많은 곳이었다. 많이 질문하고, 많은 얘기를 듣고, 많은 도움을 받고, 많이 웃기도 했다. 그래서 그런지 남들 다 힘들다고 하는 출근이 힘들지 않고 재미있었다. 모든 구성원에게 일일이 감사 인사를 드리지는 못했지만, 이 글을 통해서나마 감사한 마음을 전하고 싶다.
래블업에서 머물렀던 시간은 단순히 업무적인 성장 뿐만이 아니라, 사람들과의 교류와 새로운 경험을 통해 개인적으로도 매우 의미있는 시간이었다. 앞으로도 이곳에서 배운 가치들을 기억하며 더 나은 모습으로 성장해 나가고 싶다.