강연의 핵심은 LLM의 세 가지 주요 오해를 해부하는 데 있습니다. 첫째, LLM은 채팅할 수 없다는 점입니다. LLM은 ‘채팅’하는 것이 아니라, ‘Stop Token’이라는 개념을 활용한 정교한 처리 트릭을 통해 대화처럼 보이는 출력을 생성합니다. 특정 토큰(예: ‘user’)이 생성되면 LLM의 출력을 중단하고 제어권을 외부 프로그램으로 넘기는 방식입니다. 이 과정에서 Stop Token이 잘못 처리될 경우 LLM이 스스로 질문하고 답변하는 기이한 현상이 발생할 수도 있습니다. 둘째, LLM은 생각할 수 없다는 오해입니다. ‘추론(reasoning)’ 모델에서 보이는 ‘사고 과정’은 실제 사고가 아니라, 사용자에게는 보이지 않는 ‘reason’이라는 별도의 역할을 통해 단순히 토큰을 생성하는 것일 뿐입니다. 셋째, LLM은 도구를 직접 사용할 수 없다는 점입니다. LLM이 도구를 사용하는 것처럼 보이는 것은 ‘Stop Token’의 남용, ‘임베딩’의 활용, ‘출력 포맷팅’의 조작을 통해 외부 프로그램이 도구 호출을 중개하기 때문입니다. LLM은 특정 형식(예: JSON)의 출력을 생성하고, 외부 프로그램이 이를 해석하여 실제 도구를 호출한 뒤 그 결과를 다시 LLM의 컨텍스트에 주입하는 방식으로 작동합니다.
또한, 강연자는 LLM의 토큰화 과정에 대해 상세히 설명합니다. 언어에 따라 토큰의 길이가 달라지며, 영어는 학습 데이터에 많이 포함되어 있어 효율적인 토큰화를 보이는 반면, 폴란드어나 일본어는 더 많은 토큰을 소모하거나 문법적 특징으로 인해 독특한 토큰화 양상을 보인다고 언급합니다. 임베딩(Embeddings)은 비정형 데이터를 인덱싱하고 검색하는 데 사용되는 핵심 기술로, 개념을 숫자의 집합으로 변환하여 유사성을 측정하는 방식입니다. 이를 통해 LLM에 관련 데이터를 제공하는 RAG(Retrieval-Augmented Generation) 시스템이 구축될 수 있습니다. Ruby 생태계에서는 Andrew Kane이 개발한 pg_vector
와 Neighbor
와 같은 라이브러리가 임베딩 기반 검색에 활용되고 있음을 강조하며, 그의 기여가 Ruby ML 생태계에 지대하다고 언급합니다. 마지막으로, LLM의 출력 포맷팅에 대해서는 과거에는 LLM에게 특정 JSON 스키마에 맞춰 출력하도록 요청하고, 유효성 검사 후 잘못되면 다시 요청하는 방식(마치 주니어 개발자에게 작업 지시하는 방식과 유사)을 사용했으나, 이제는 LLM 서버 자체에서 이러한 JSON 응답 처리를 내장하고 있다고 설명합니다.