한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.
AI 기술의 발전 속도는 따라가기 벅찰 정도로 빠른데, 말 그대로 LLM 춘추전국시대다. 나 또한 ChatGPT Pro로 첫 과금을 시작해서 Claude Sonnet 3.7 발표를 기점으로 Claude Pro를 적극적으로 활용하기 시작했다. LLM도 특화된 모델이 중요한 게 나뿐만 아니라 많은 개발자가 코드 생성에 좋은 성능을 보인다는 소식을 듣고 이 무렵 Claude로 많이 갈아탔던 걸로 기억한다. 그 이후 Cursor와 Windsurf처럼 에이전트가 내장된 IDE를 사용하면서 과금을 이쪽에서 하기 시작했고, Gemini 2.5 Pro 모델에 대한 호기심과 개발 외적으로도 NotebookLM를 활용해 보고 싶은 마음에 현재는 Google AI Pro를 사용 중이다. 결론적으로 지금은 Windsurf Pro와 Gemini 2.5 Pro를 주로 사용하는 편이다. 이 글을 쓰고 있는 이번 주에 Gemini CLI가 오픈소스로 공개되면서 이 또한 활용해 보고 있는데, Gemini 2.5 Pro를 분당 60회 요청과 일일 1000회 요청이 가능하기에 사실상 개인 사용자라면 무료로도 무리 없이 이용할 수 있는 셈이다. 과금을 갈아타는 이 모든 과정이 꽤 오래된 것처럼 느껴지지만, 불과 1년 사이에 일어난 일이다. 더 나은 모델, 더 합리적인 요금제, 더 사용자와 밀접한 서비스를 내세우며 경쟁하는 지금, 흔한 말이지만 인터넷과 모바일 혁명을 잇는 AI 혁명의 시대가 아닌가 싶다. 이런 발전 속도 덕분에 고작 1~2년 뒤조차 예측하기가 어렵다.
이런 급변하는 환경 속에서 랭체인이 관심을 갖게 된 건 단순히 LLM을 만들고 싶었던 게 아니라 좀 더 이해하고 싶어서였다. 빠르게 발전하고 변화하는 AI 트렌드를 온전히 하나하나 체득하기엔 한계가 있으니 프레임워크를 통해 구현해 본다면, 혹은 구현의 과정을 이해한다면 좀 더 LLM 자체를 깊이 있게 이해하는 데에 도움이 될 것 같다는 생각이었다.
물론 만만한 책이 아니었다. 그런데도 이 책을 꾸준히 따라 읽어갈 수 있었던 건, 2개의 챕터를 할애해 기초 AI 지식과 랭체인 내에서의 기본 LLM 사용법을 안내하고 있기 때문이었다. 물론 400페이지 남짓한 분량에서 모든 내용을 다 늘어놓을 순 없지만, 부족한 정보는 공식 문서나 다른 아티클을 통해 보충하더라도 일단 기본적인 틀을 잡고 학습의 진입장벽을 넘는 데에 도움이 되었다. 게다가 모든 코드 설명을 Python과 더불어 JavaScript로도 동시에 제공하여 JavaScript에 익숙한 사람이라도 코드의 흐름을 이해하기 용이하다.
이 책은 LLM의 핵심 구성 요소인 토크나이저(Tokenizer)에 대한 설명을 시작으로, LLM 작동 방식에 대한 이해를 돕는다. GPT-3.5의 토크나이저가 공백 문자를 _
로 표현하고 자주 사용되는 단어를 하나의 토큰으로 인코딩하는 반면, 덜 흔하거나 영어가 아닌 단어는 여러 개의 토큰으로 인코딩한다는 점은 토큰화의 효율성과 문맥 이해의 중요성을 먼저 보여주고 있다.
또한, 기본적인 LLM이 다음 단어나 누락 단어의 예측을 기반으로 하기 때문에 ‘The capital of England’와 같은 문장에는 응답할 수 있지만, ‘What is the capital of England?’와 같은 질문에는 명확한 응답을 얻기 어렵다. ‘The capical of England is London’이라는 문장은 수없이 학습해서 다음 단어를 예측할 수 있지만, 질문-답변 패턴은 학습되지 않았기 때문이다. 이는 LLM의 기본적인 한계 요인과 함께 파인튜닝(Fine-tuning)의 필요성을 강조한다. 현재 사용하는 많은 모델이 막대한 시간과 비용을 투자하여 고도화되었음을 알 수 있는 대목이었다.
이후 프롬프트(Prompt)에 대한 다양한 전략을 소개하는데, 이제는 꽤 여러 매체에서 소개되어 다소 익숙한 제로샷(Zero-shot) 프롬프트, 퓨샷(Few-shot) 프롬프트, 그리고 사고의 연쇄(Chain-of-Thought, CoT)와 같은 기법들을 통해 LLM의 추론 능력을 향상시키는 방식에 관해 이야기한다.
책에서 비중 있게 다루는 내용 중 하나는 검색 증강 생성(Retrieval Augmented Generation, RAG) 시스템인데, RAG는 LLM이 사전에 학습하지 않은 최신 정보나 비공개 문서에 기반하여 답변을 생성하도록 돕는 기술이다. RAG를 구현하기 위한 인덱싱(Indexing) 과정은 특히 흥미로웠다. PDF 파일과 같은 원본 문서를 텍스트로 변환하고, 이를 청크(Chunk)로 분할한 다음, 최종적으로 숫자로 변환하여 벡터 저장소(Vector Store)에 저장하는 일련의 과정이 상세하게 담겨 있다.
파싱하는 과정은 어느 정도 예상과 비슷했지만, 제한된 청크 단위로 분할할 때 맥락 유지를 위해 200자 중복 구간을 두는 방식은 실용적이고 흥미로웠다. 텍스트 분할 후에는 임베딩(Embedding) 모델에 맞게 텍스트를 긴 숫자 시퀀스로 표현하는데, 이는 숫자가 가진 유연성 덕분에 의미론적 유사성 기반의 벡터 탐색이나 고차원 공간에서의 유사도 측정에 용이하기 때문이라는 점도 와닿는 지점이었다. 물론 이 과정만으론 검색 결과의 일관성이 떨어지기 때문에 MultiVectorRetriever, RAPTOR, ColBERT를 통해 최적화를 진행한다.
일반적으로 RAG 시스템은 사용자의 질의를 임베딩하고 데이터 소스에서 유사 문서를 찾아낸 후, 이를 프롬프트 맥락에 활용하여 최종 프롬프트를 구성하는 과정을 거친다. 이를 통해 기업의 비공개 문서나 개인 정보와 같은 특정 데이터에 기반한 더욱 정확하고 명확한 답변을 얻을 수 있다는 점을 이해하는 데에 필요한 과정임을 알 수 있는 대목이다. 특히 책에서 언급된 재작성-검색-읽기(Rewrite-Retrieve-Read) 전략은 사용자 입력 쿼리의 품질이 좋지 않을 경우 LLM에 쿼리 재작성을 요청하여 검색 성능을 향상시키는 기법으로, 비록 호출이 두 번 연속으로 발생하여 추가적인 지연이 있을 수 있지만 질의의 모호성으로 인한 검색 실패를 줄일 수 있다는 점에서 매우 유용하다고 생각했다. 결국 이 또한 개발에서 함수를 짜듯 여러 가지 로직을 적용해 보고 시도해 보는 과정처럼 느껴졌고, 지금도 많은 시도를 통해 더 최적화된 새로운 전략들이 얻어지고 있지 않을까 생각할 수 있는 대목이었다.
이후 챕터에서 언급된 내용은 최신 컨텍스트를 저장하는 방법이었다. LLM은 기본적으로는 무상태(상태를 저장하지 않음)로 상호작용하기 때문에 이전의 프롬프트나 응답 내용을 전혀 기억하지 못한다. 당연히 모델과 함께 프롬프트, 출력 파서를 함께 저장해서 사용하면 좋겠지만 모든 걸 저장하면 메모리 관리에 이슈가 생긴다. 얼마 전 개발자 모임에서 컨텍스트 저장에 대해 들었던 내용은 청크 분할 및 별도 저장과 같은 과정을 거쳤던 것으로 기억하는데, 랭체인에서는 랭그래프라는 오픈소스 라이브러리를 통해 다중 액터, 다단계, 상태 저장 인지 아키텍처 구조를 쉽게 구현할 수 있도록 지원하고 있다. 이를 통해 효율적으로 이전 대화 기록을 관리하고 LLM이 '기억'하도록 만든다. 이는 챗봇과 같은 대화형 애플리케이션 개발에 있어 필수적인 기능이라고 볼 수 있다.
이 책은 랭체인과 랭그래프를 활용한 LLM 애플리케이션 개발의 전 과정을 체계적으로 안내하는 실용 가이드에 가깝다. 단순히 기술의 사용법을 넘어, 그 배경과 원리, 그리고 실제 서비스 개발에 필요한 설계 관점과 운영 노하우까지 폭넓게 다루고 있다. 특히 RAG 시스템 구현, 에이전트 아키텍처 설계뿐만 아니라 LLM의 성능을 높이는 패턴, 실질적인 배포와 테스트 등 현재 AI 애플리케이션 개발의 트렌드를 담고 있다고 느꼈다. 책의 기획과 집필 과정에서도 새로운 기술이 끊임없이 등장하는 시대인 만큼, 부록을 통해 MCP(Model Context Protocol) 서버 구축과 활용 또한 간략하게 다루고 있는데, 그게 이 책이 트렌드를 담고자 노력한다는 뉘앙스를 느끼기에 충분했다. 한 권의 책으로 모든 심화적인 내용을 담을 순 없지만, 빠르게 변화하는 LLM 생태계 속에서 어느 정도의 개괄적인 그림을 그리는 데에 유용한 미니맵 역할을 해줄 수 있지 않을까 싶다.