2025년 11월 7일 금요일

Spotify Podcast 이전하기 - BIM Insight Digest 시작

2012년부터 진행했던 Podcast (BIM, CG, SW). 지금까지 Internet Archive 를 이용해 Podcast 호스팅하고 있었는 데, 최근 다시 시작해야겠다는 생각이 들어, Spotify Podcast로 이사하려 한다. 이 과정을 기록한다. 
오랫동안 무료 호스팅으로 애용했던 Internet Archive

Motivation
2021년까지 지속했던 Podcast인데, 특히, BIM을 중심으로 진행했었다. 출발은 본인이 저술한 책을 좀 더 알기 쉽게 설명해, 출판사에 조금이나마 도움을 주고자 시작했다. 이게 주객이 전도되어 무려 십년 이상 방송하게 되었다. 개인적으로 알고 있던 것을 다시 정리해 방송하니, 스스로 자극되고, 공부되는 듯한 느낌이 좋았다. 코로나 쯤 너무 오래했고, 하고 싶은 말은 다 한 것 같다는 생각이 들어, 마지막 방송 이후로 지금까지 방송을 쉬었다.
그러다, 최근 BIM을 하시는 분들 중에 이론적으로만 접근하시거나, 관리자 위치에 계신 분들이 BIM에 대해 잘못된 이론적 이해만으로 위험한? 이야기를 하고 계시는 것을 보고 다시 Podcast를 해야 하겠다는 생각이 들었다. 
이론과 현실의 차이

Transfer
스포티파이 팟캐스트 채널 개설은 매우 쉽다. 호스팅도 자체 제공해 준다. 순서는 다음과 같다. 
Tools to manage and grow your podcast - Spotify for Creators 에 가입하고, 새로운 쇼를 만들어 팟캐스트 채널 기본 정보를 입력한 후, 첫 에피소스 방송 녹음파일을 업로드하면 된다. 

시간이 지나면, 다양한 Podcast 채널(Apple, Google 등)에 본인 방송이 검색으로 표출될 것이다.

Again, Podcast
약 15년 동안 Podcast를 하다 보니, 호스팅 플랫폼이 크게 3번 바뀌면서 관리가 쉽지 않았는 데, 스포티파이는 빅테크 기업이니 오래가겠지란 생각으로 시작한다. 

당연하다고 생각했던 것들이 시간이 지나면서 잊혀지고, 잘못 알고 있는 사람들이 조금씩 많아질 때, 방송을 하고 싶은 모티브가 되는 것 같다. 몇 년 간 쉬었으니 이제 천천히 다시 시작!

2025년 11월 6일 목요일

어느 코딩 1도 모르는 문과생 바이브 코딩 경험기:)

흥미로운 글이 있어, 정리해 남긴다. 좀 더 상세한 내용은 레퍼런스를 참고 바란다. 본 글의 제목은 "어느 코딩 1도 모르는 문과생 바이브 코딩 경험기:)". 말 그대로^^


머리말
AI 기술을 활용한 코딩 방식은 크게 '바이브 코딩(Vibe Coding)'과 '에이전트 AI(Agentic AI)'라는 두 가지 패러다임으로 구분될 수 있다. 이 두 접근법은 개발자의 개입 수준, 상호작용의 속도, 그리고 자동화의 범위에서 근본적인 차이를 보인다.

바이브 코딩은 AI 지원 프로그래밍(AI-Assisted Programming)의 한 형태로, 개발자와 AI가 실시간으로 상호작용하는 능동적(active) 프로세스이다. 이는 본질적으로 AI와 페어 프로그래밍을 수행하는 것과 유사하며, 개발자가 주도자(driver) 역할을, AI가 보조자(observer) 역할을 맡는다. 반복 주기는 수 초 단위로 짧으며, 개발자의 작업 흐름(flow)을 지원하는 데 중점을 둔다.

반면 에이전트 AI는 개발자가 AI에게 명확한 목표를 위임하는 수동적(passive) 프로세스에 해당한다. 이 모델에서 AI는 자율적 에이전트로서 작동하며, 코드 분석, 작성, 테스트, 심지어 풀 리퀘스트 생성에 이르는 복합적 작업을 독립적으로 수행할 수 있다. 반복 주기는 수 분에서 수 시간에 이르며, 개발자의 직접적인 개입을 최소화하는 것을 목표로 한다.

바이브 코딩의 일반적 경험
바이브 코딩의 일반적인 도입 과정은 기술적 숙련도가 상대적으로 낮거나 해당 코드베이스에 익숙하지 않은 인력이 간단한 작업을 처리하는 것에서 시작되는 경향이 있다. 초기 단계에서 사용자는 UI의 사소한 버그 수정이나 문구 변경과 같은 명확하게 정의된 소규모 작업을 AI의 도움을 받아 수행한다.

바이브 코딩 도구 사용 예시

이 과정은 통상적으로 1) 수정할 코드를 수동으로 탐색하고, 2) AI에게 자연어 프롬프트로 변경을 지시하며, 3) 생성된 코드를 검토하고, 4) 결과를 수동으로 검증하는 단계를 포함한다. AI가 한 번에 완벽한 코드를 생성하지 못하는 경우가 많으므로, 원하는 결과를 얻기까지 여러 차례의 반복적인 프롬프팅이 요구된다.

작업의 복잡성이 증가하거나 AI가 특정 문제에 고착되는 경우, 사용자는 병렬 처리 방식으로 접근법을 변경할 수 있다. 이는 단일 AI 모델 대신, 다수의 독립적인 개발 환경에서 서로 다른 모델이나 프롬프트를 사용하여 동일한 문제를 동시에 처리하는 전략이다.

바이브 코딩의 장점
바이브 코딩의 주요 장점 중 하나는 코드 기여의 진입 장벽을 낮춘다는 점이다. 코딩 실무 경험이 적은 관리직이나 비개발 직군 인력도 특정 프레임워크에 대한 깊은 지식 없이 간단한 코드 수정에 기여할 수 있다.

또한 단순 반복 작업의 효율화에 기여한다. 숙련된 개발자에게도 정형화된 코드(boilerplate) 작성이나 간단한 버그 수정은 시간이 소요되는 작업이며, AI는 이러한 작업을 신속하게 처리하여 개발자가 더 복잡한 문제에 집중하도록 돕는다.

생소한 코드베이스를 탐색하거나 새로운 기술을 학습할 때 가이드 역할을 수행할 수 있다.

수 초 단위의 즉각적인 피드백 루프는 개발자가 코드를 실험하고 아이디어를 빠르게 검증하는 것을 용이하게 하여, 중단 없는 '몰입(flow)' 상태를 유지하는 데 긍정적인 영향을 미친다.

단점 및 한계
바이브 코딩은 제공되는 컨텍스트에 크게 의존한다. 만약 코드베이스가 오래되어 방치된 코드나 안티패턴(anti-pattern)을 다수 포함하고 있다면, AI는 이러한 부정확한 패턴을 학습하여 비표준적인 코드를 생성할 위험이 있다. 이는 코드 실행 안전성, 보안 문제, 해킹 등 치명적 이슈를 포함할 수 있다. 

인간의 개입이 필수적인 병목현상(Human-in-the-Loop Bottleneck)이 존재한다. 이 방식은 본질적으로 능동적인 상호작용을 요구하므로, 시스템의 전체 처리량은 AI의 속도가 아닌, 인간이 동시에 관리할 수 있는 작업의 수와 생성된 코드를 검토 및 테스트하는 속도에 의해 제한된다.

AI가 특정 문제 해결 과정에서 국소 최적해(local optima)에 고착되어 비효율적인 해결책을 반복적으로 제안하는 현상이 발생할 수 있다.

AI가 생성한 코드는 반드시 인간에 의해 검증되어야 하므로, 이 검토 비용이 발생한다. 경우에 따라서는 AI의 제안을 수정하고 검증하는 데 소요되는 시간이 숙련된 개발자가 직접 작성하는 시간보다 더 오래 걸릴 수도 있다.

더 중요한 문제는 바이브 코딩 결과물이 블랙박스거나 스파게티 코드 덩어리가 될 수 있다는 점이다. 비 개발자가 바이브 코딩을 남용할 때 주로 이런 문제가 발생한다. 유지보수되지 않고, 읽기 어려운 산출물은 결국 버려지게 되어 있다. 

바이브 코딩 도구 개발사는 이런 문제에 대해 책임지지 않을 것이다.

한계 극복 및 발전
바이브 코딩의 효율성을 높이고 단점을 완화하기 위해서는 AI에 제공되는 컨텍스트의 품질을 향상시키는 것이 필수적이다. 이는 단순히 프롬프트를 개선하는 것을 넘어, AI가 참조할 수 있는 프로젝트의 코딩 스타일 가이드, 회피해야 할 안티패턴 목록, 테스트 명령어 등을 '규칙(Rules)' 파일 형태로 명시하여 제공하는 방식을 포함한다.

이 정보가 AI 프롬프트에 자동으로 주입되면, AI는 프로젝트의 맥락에 더 부합하는 코드를 생성할 수 있다. 요약하자면, 바이브 코딩은 개발 워크플로우를 강화하는 패러다임으로, 특히 비전문가의 코드 기여 장벽을 낮추고 단순 작업을 가속화하는 데 유용하다. 그러나 이 방식의 내재적 한계인 인간 개입 의존성과 컨텍스트 부족 문제는, 결국 개발자의 역할이 AI의 참여자에서 위임자로 전환되는 '에이전트 AI' 패러다임으로의 발전을 촉진하는 요인이 된다.

레퍼런스

pgVector 시맨틱 캐쉬로 RAG 가속하기

이 글은 사용자 질의를 시멘틱 벡터로 변환해 생성된 답을 미리 캐쉬에 저장해 놓고, 다음 유사 질의 시 관련 캐쉬 답변을 리턴하는 시맨틱 캐쉬 RAG 가속 방법을 알아본다.
 
pgVector 기반 RAG 캐쉬 개념도

시맨틱 캐쉬 필요성
LLM(대규모 언어 모델) 및 RAG(검색 증강 생성) 기반 애플리케이션은 종종 지연 시간(latency), 비용, 그리고 중복 연산의 문제에 직면한다. 사용자의 질의가 표현 방식만 약간 다를 뿐 의미론적으로 동일하더라도, 임베딩 생성, 문서 검색, LLM 호출에 이르는 전체 파이프라인이 매번 실행되는 경향이 있다. 이러한 방식은 특히 다수의 사용자가 유사한 질문을 반복할 때 비용 및 효율성 측면에서 비효율적이다. 전통적인 캐싱(traditional caching) 기법은 이러한 시나리오에서 제한적인 효용성을 보인다. 이는 기존 캐시가 텍스트의 정확한 일치(exact match)를 기반으로 작동하기 때문에, "파이썬이란 무엇인가?"와 "파이썬에 대해 설명해줘"와 같은 질의를 서로 무관한 요청으로 처리하기 때문이다.

이러한 문제를 해결하기 위해 시맨틱 캐시(Semantic Cache)가 도입되었다. 시맨틱 캐시는 이전에 처리된 질의와 그 응답을 저장하되, 원시 텍스트(raw text) 대신 질의의 의미론적 내용을 비교한다. 각 질의는 해당 의미를 포착하는 벡터 임베딩(vector embedding)으로 변환된다. 새로운 질의가 입력되면, 시스템은 캐시 내에서 가장 유사한 임베딩을 검색한다. 이때 코사인 유사도(cosine similarity)나 유클리드 거리(Euclidean distance)와 같은 벡터 공간 측정 기준이 사용된다. 만약 사전에 정의된 임계값(threshold) 이상의 근접한 일치 항목(cache hit)이 발견되면, 캐시된 결과가 즉시 반환된다. 일치 항목이 없는 경우(cache miss), 해당 요청은 LLM으로 전달되며, 새로 생성된 질의-응답 쌍이 캐시에 추가된다.

이 접근 방식은 특히 리소스 집약적인 문서 검색 및 생성 과정이 포함된 RAG 시스템, 그리고 사용자가 유사한 질문을 자주 반복하거나 재구성하는 챗봇 및 지식 보조 시스템에서 높은 가치를 지닌다. 그러나 실시간 주식 시세와 같이 데이터가 급격하게 변화하는 환경이나, 코드 생성 또는 형식적인 텍스트 매칭과 같이 구문의 정확성이 절대적으로 중요한 상황에는 적합하지 않다. 요컨대, 시맨틱 캐시는 사용자와 모델 사이의 지능형 계층(intelligent layer)으로 작동하여, 의미 있는 결과를 재사용하고 LLM 호출을 줄이며 응답 시간을 획기적으로 개선하는 역할을 수행한다.

시맨틱 캐쉬 구현 도구
RAG 애플리케이션에 시맨틱 캐시를 구현하기 위한 주요 도구는 다음과 같다. 

저장소 및 캐시 역할로 PostgreSQL과 pgvector 확장이 사용될 수 있다. pgvector는 표준 SQL 데이터베이스를 벡터 저장소(vector store)로 기능하게 하여, 정형 데이터와 시맨틱 임베딩을 단일 시스템 내에서 효율적으로 관리하고 SQL 쿼리를 통해 직접 유사성 검색을 수행할 수 있게 한다. 캐시 테이블은 질의 텍스트, 해당 임베딩 벡터, 그리고 모델의 응답을 저장한다. 

텍스트 생성을 위한 LLM으로는 LLaMA 기반 모델(예: llama3.2:1b 등)을 사용할 수 있다. 이 LLM은 캐시 미스(cache miss)가 발생했을 때, 즉 벡터 저장소에서 의미론적으로 유사한 질문이 발견되지 않았을 경우에만 호출된다. 

시맨틱 캐시의 핵심인 임베딩 생성을 위해서는 별도의 경량 임베딩 모델(예: all-MiniLM-L6-v2)이 사용된다. 이 모델은 텍스트를 생성하는 것이 아니라, pgvector에 저장되고 비교될 의미의 수치적 벡터 표현(numerical vector representation)을 생성하는 역할만 담당한다. 이러한 경량 모델은 빠른 속도와 낮은 메모리 점유율로 인해, 메인 LLM을 호출하기 전 신속한 유사성 검사에 이상적이다. 

전체 구성 요소를 통합하고 API를 제공하기 위해 FastAPI를 사용한 파이썬 서비스가 구축된다. 이 서비스는 REST API를 통해 사용자 질의를 수신하고, 입력 텍스트에 대한 임베딩을 생성하며, PostgreSQL의 시맨틱 캐시를 검색한다. 캐시 히트 시 캐시된 응답을 반환하고, 캐시 미스 시 LLaMA 모델을 질의한 후 새로운 질의-응답 쌍을 캐시에 저장하는 로직을 관장한다.

챗봇의 구현은 명확한 책임을 가진 모듈식 구성 요소로 설계된다. 영속성 계층(Persistence Layer)인 VectorDatabase는 pgvector를 활용하여 질의 임베딩, 응답, 메타데이터를 저장하고 코사인 거리를 기반으로 유사성 검색을 수행한다. EmbeddingService는 sentence-transformers 라이브러리(예: MiniLM)를 사용하여 사용자 텍스트를 수치적 벡터 표현으로 변환한다. 

이 구성 요소는 모든 요청의 첫 단계에서 작동하며, 데이터베이스 스키마와 일관된 벡터 차원을 보장한다. LLMService는 LLaMA와 같은 메인 LLM을 호출하여 텍스트 생성을 처리한다. 이 서비스는 오직 캐시 미스가 발생했을 때만 활성화된다. 

CacheService는 이러한 서비스들을 조율하는 핵심 오케스트레이션 계층이다. 이 모듈은 벡터 저장소에서 의미론적으로 유사한 임베딩을 확인하고, 유사도가 정의된 임계값을 초과하면 캐시된 응답을 반환한다. 캐시 미스 시에는 LLMService로 폴백(fallback)하고, 반환된 새로운 응답을 VectorDatabase에 업데이트하는 캐싱 로직 전체를 캡슐화한다. 

마지막으로 Chat API는 FastAPI를 통해 사용자 대면 인터페이스를 제공하며, /chat과 같은 엔드포인트를 노출하여 전체 캐싱 및 생성 흐름을 트리거한다.

시맨틱 캐쉬 운영 고려사항
시맨틱 캐시 시스템의 운영에서 중요한 고려사항은 캐시 무효화(cache invalidation) 전략과 유사성 임계값(similarity threshold)의 정밀한 조정이다. 정보가 자주 변경되는 도메인에서는 캐시에 저장된 응답이 오래된 정보(stale data)가 될 위험이 있다. 이를 해결하기 위해 TTL(Time-To-Live)을 설정하여 일정 시간 후 캐시 항목을 자동 만료시키거나, 원본 데이터 소스가 업데이트될 때마다 연관된 캐시 항목을 능동적으로 제거하는 이벤트 기반 무효화 기법이 요구된다. 또한, 유사성 임계값 설정은 시스템의 민감도(sensitivity)와 특이도(specificity) 간의 균형(trade-off)을 결정한다. 

임계값이 너무 낮으면(유사성 요구 수준이 낮으면) 의미론적으로 관련 없는 질의에 대해서도 캐시가 반환되어(False Positives) 부정확한 응답을 초래할 수 있다. 반대로 임계값이 너무 높으면(유사성 요구 수준이 높으면) 의미가 동일함에도 표현이 약간 다른 질의들을 캐시 미스로 처리하여(False Negatives) 캐시 효율성이 저하된다. 따라서 이 임계값은 실제 사용자 질의 데이터를 기반으로 한 지속적인 평가와 파인튜닝(fine-tuning)을 통해 최적화되어야 한다.

마무리
전통적인 캐싱이 LLM 질의에 실패하는 이유(상이한 표현, 동일한 의미)를 분석하고, 벡터 임베딩을 활용하여 의미론적 유사성을 기반으로 질의를 매칭하는 시맨틱 캐싱의 원리가 도입되었다. 

아키텍처는 pgvector 기반의 VectorDatabase, 텍스트를 벡터로 변환하는 EmbeddingService, 캐시 미스 시에만 작동하는 LLMService, 그리고 전체 로직을 조율하는 CacheService 계층 및 FastAPI 기반의 API 엔드포인트로 구성된 모듈식 시스템으로 구현될 수 있다. 이러한 아키텍처는 높은 지연 시간과 비용을 유발하는 LLM 서비스를 빠르고 효율적인 프로덕션급 대화형 시스템으로 전환시킬 수 있는 잠재력을 보여준다.

레퍼런스

LiteLLM 기술 소개

이 글은 LiteLLM 기술을 소개한다.

LIteLLM 필요성
정교한 AI 도구 통합 시스템을 구축한 후에도, 클라이언트가 비용 절감을 위해 OpenAI 모델에서 Claude 모델로의 전환을 요구하는 상황이 발생할 수 있다. 또는 민감한 데이터 처리를 위해 로컬 모델을 사용하고, 일반 질의에는 클라우드 모델을 활용해야 하는 복합적인 요구사항이 존재한다. 적절한 추상화 계층이 부재할 경우, 이러한 변경 사항은 매번 통합 코드를 재작성해야 하는 복잡성을 초래한다.

LiteLLM과 MCP(Model Context Protocol)의 결합은 이러한 문제를 단순한 설정 변경 수준으로 단순화하는 아키텍처를 제공한다. LiteLLM은 보편적인 게이트웨이(Universal Gateway) 역할을 수행하며, MCP는 모델과 도구 간의 상호작용을 표준화한다. 이 통합을 통해 OpenAI, Anthropic, AWS Bedrock 또는 Ollama를 통한 로컬 모델 등 다양한 환경에서도 MCP 기반 도구들이 원활하게 작동한다.

언어 모델과 게이트웨이 기능
MCP 서버는 AI 시스템이 활용할 수 있는 표준화된 도구 집합을 노출한다. 예를 들어, 고객 서비스 MCP 서버는 `get_recent_customers` (최근 고객 목록 조회), `create_support_ticket` (지원 티켓 생성), `calculate_account_value` (계정 가치 분석)와 같은 도구(Tool)를 제공할 수 있다. MCP의 핵심은 이 도구들이 OpenAI, Claude, LangChain 등 MCP 호환 클라이언트를 사용하는 모든 시스템에서 동일하게 작동한다는 점이다. 이는 도구 통합에 대한 표준화의 이점을 명확히 보여준다.

LiteLLM은 언어 모델을 위한 보편적 번역기(Universal Translator)로 기능하는 라이브러리이다. 이는 한 번 작성된 코드가 지원되는 모든 모델에서 실행될 수 있도록 보장한다. 주요 기능으로는 백 개 이상의 다수 모델 지원, 통합된 인터페이스 제공, 요청 분산을 위한 로드 밸런싱, 공급자 전반의 비용 추적, 그리고 장애 발생 시 자동 전환되는 폴백(Fallback) 지원이 포함된다.
LiteLLM은 근본적으로 다양한 LLM 공급자의 API 엔드포인트를 OpenAI의 API 명세와 유사한 표준화된 인터페이스로 추상화한다. 이는 일종의 프록시(Proxy) 서버 역할을 수행하며, 각기 다른 입력 및 출력 형식을 동적으로 변환한다. 이로 인해 개발자는 기본 코드를 변경하지 않고도 백엔드에서 사용하는 모델을 자유롭게 교체할 수 있다.

LiteLLM과 MCP의 결합은 유연성을 지원한다. MCP 도구는 모든 LLM 공급자와 호환되며, 공급자 간 전환 시에도 도구 통합 코드를 변경할 필요가 없다. 이는 공급자 종속성(Vendor Lock-in)을 제거한다. 또한 가장 비용 효율적인 공급자에게 요청을 라우팅하여 비용을 최적화할 수 있다. 민감 데이터는 로컬 모델로, 일반 쿼리는 클라우드 모델로 처리하는 컴플라이언스 준수 아키텍처 구현이 용이해진다.

LiteLLM 기능
LiteLLM은 여러 공급자에 걸쳐 도구 실행 과정을 표준화한다. 모델이 도구 호출(Tool Call)을 반환하면, LiteLLM은 이를 표준 형식으로 수신한다. 이후 MCP를 통해 해당 도구를 실행하고, 그 결과(Tool Result)를 다시 각 공급자가 요구하는 적절한 형식(예: `tool` 역할의 메시지)으로 변환하여 대화 흐름을 완성한다.

이 아키텍처는 다양한 실제 시나리오에 적용 가능하다. 단순 쿼리는 저비용 모델로, 복잡한 쿼리는 고성능 모델로 라우팅하는 비용 최적화 라우팅이 가능하다. 또한 개인식별정보(PII)가 포함된 메시지는 로컬 모델로, 그 외에는 클라우드 모델로 전송하는 규정 준수 기반 라우팅을 구현할 수 있다. LiteLLM은 여러 모델에 대한 폴백 체인을 구성하여, 특정 공급자에서 장애가 발생하더라도 다음 모델로 자동 전환하여 서비스 안정성을 확보한다.


고급 활용 패턴으로, 각 공급자별로 최적화된 매개변수(예: `temperature`, `max_tokens`)를 동적으로 적용할 수 있다. LiteLLM은 `completion_cost` 유틸리티를 통해 요청별 비용을 자동으로 추적하는 기능도 제공한다. 결론적으로, 도구 계층을 MCP로 추상화하고 모델 계층을 LiteLLM으로 추상화함으로써, AI 시스템은 코드 변경 없이 비즈니스 요구사항 변화에 능동적으로 적응할 수 있다. 

레퍼런스

DeepSeek OCR 기능 및 기술

이 글은 DeepSeek OCR 기능 및 주요 기술을 정리한다. 
Deepseek OCR 실행 예시

머리말
DeepSeek-OCR은 이미지나 PDF 문서를 구조화된 마크다운(Markdown) 텍스트로 변환하기 위해 설계된 30억(3B) 매개변수 규모의 비전-언어 모델(VLM)이다. 이는 중국의 AI 기업 DeepSeek AI에 의해 개발되었으며, 이 기업은 DeepSeek Coder 및 LLM 시리즈와 같은 고성용 오픈웨이트 모델을 저비용으로 개발하여 주목받은 바 있다.

전통적인 OCR(광학 문자 인식) 시스템은 문자를 감지하고 단어를 조립한 후 구조를 추론하는 순차적 방식을 사용한다. 이로 인해 복잡한 테이블, 양식, 또는 다단 레이아웃(layout)을 정확하게 인식하는 데 한계가 있었다. DeepSeek-OCR은 이러한 접근 방식과 근본적으로 차별화된다. 이 모델은 전체 문서 페이지를 단일한 시각적 컨텍스트로 취급하며, 레이아웃을 인식하는 비전-언어 과제로 문제를 재정의한다.

핵심 기술
딥시크OCR은 '컨텍스트 광학 압축(contexts optical compression)'을 지원한다. 이 모델은 DeepEncoder라는 시각 인코더와 DeepSeek3B-MoE라는 언어 디코더로 구성된다. 
딥시크OCR 구조

DeepEncoder는 SAM(Segment Anything Model)과 CLIP의 개념을 활용하여 1024x1024 픽셀 이미지에서 생성될 수 있는 수천 개의 시각적 패치(patch)를 단 수백 개의 핵심적인 '비전 토큰(vision token)'으로 압축한다. 이 압축된 시각 정보는 텍스트 정보를 픽셀로 인코딩하는 것이 정보 밀도 측면에서 더 효율적이라는 통찰에 기반한다.

이 압축 기술을 통해 10배의 압축률에서도 97% 수준의 텍스트 복원 정확도를 달성하며, 기존 방식 대비 7배에서 20배 적은 토큰으로 전체 문서를 표현할 수 있다. 결과적으로 LLM 디코더의 제한된 컨텍스트 윈도우(context window) 내에서도 긴 문서 전체의 구조를 이해하고 처리하는 것이 가능해진다.

DeepSeek-OCR은 속도와 정확도를 조절할 수 있는 다양한 프리셋(preset)을 제공한다. Tiny, Small, Base, Large 모드는 입력 이미지 해상도를 조절하여 일반적인 문서 처리에 사용된다. 

성능
성능 측면에서 DeepSeek-OCR은 OmniDocBench와 같은 표준 벤치마크에서 Tesseract, PaddleOCR과 같은 전통적인 오픈소스 OCR 엔진의 성능을 크게 능가한다. 특히 테이블 및 복잡한 구조 인식에서 강점을 보이며, Google Document AI와 같은 상용 API와 경쟁 가능한 수준의 정확도를 제공한다. 고성능 GPU(A6000 등) 환경에서는 페이지당 1초 미만의 추론 속도를 달성할 수 있다.

운영 환경에서 이 모델은 약 6-7GB의 가중치(bf16 기준)를 가지며, CPU 실행도 가능하지만 실질적인 성능을 위해 8GB에서 12GB VRAM을 갖춘 GPU가 권장된다.

프로덕션 환경에서의 효율적인 서빙을 위해 vLLM이 공식적으로 지원된다. vLLM은 PagedAttention이라는 핵심 기술을 사용하는 고성능 LLM 추론 엔진이다. PagedAttention은 운영체제의 가상 메모리 페이징과 유사하게, KV 캐시(Key-Value Cache)를 비연속적인 소규모 '블록(block)' 단위로 분할하여 관리한다. 이는 기존 서빙 방식의 비효율적인 메모리 과다 할당(over-reservation) 및 단편화 문제를 해결하여, 메모리 사용량을 최적화하고 연속적인 배치 처리를 통해 전체 처리량(throughput)을 극대화한다.

의존성
구현 시에는 `pdf2image` 라이브러리(poppler 의존성)를 사용하여 PDF를 페이지별 PNG 이미지로 변환하는 전처리가 필요하다. 이때 입력 DPI(150-180은 속도, 220 이상은 품질) 설정이 결과물의 품질과 속도 간의 중요한 절충점이 된다. 모델 로드 시에는 `trust_remote_code=True` 플래그가 필요하며, `torch.bfloat16` 타입을 사용하여 메모리 사용량을 줄일 수 있다. 추론은 OCR 작업의 결정론적(deterministic) 특성을 고려하여 `do_sample=False`로 설정하는 것이 일반적이다.

레퍼런스

AI 에이전트 프레임웍의 불편한 진실

이 글은 AI 에이전트 프레임웍의 불편한 진실을 경험을 반영해 이야기해보도록 한다. 

에이전트의 기반 LLM의 근본적 한계. 환각
AI 에이전트 프레임워크는 근본적으로 그 기반이 되는 대규모 언어 모델(LLM)의 성능에 종속된다. 에이전트의 자율적 행동, 계획 수립, 도구 사용 결정은 모두 LLM의 추론 능력에서 비롯된다. 그러나 LLM은 '환각(Hallucination)'이라는 고질적인 한계를 지닌다. 환각은 모델이 사실에 근거하지 않거나 맥락과 무관한 정보를 확신을 가지고 생성하는 현상이다. 에이전트 시스템에서 이러한 환각은 단순한 오답을 넘어, 존재하지 않는 API를 호출하려 하거나, 잘못된 사실을 기반으로 후속 계획을 수립하는 등 치명적인 오류로 이어진다.

RAG는 만능 도구가 아니다.
검색 증강 생성(RAG)은 에이전트가 외부 지식에 접근하도록 돕는 핵심 기술로 사용되지만, 이는 만능 해결책이 아니다. RAG 시스템의 효율성은 검색(Retrieval)과 생성(Generation) 두 단계의 품질에 모두 의존한다. 검색 단계에서 벡터 데이터베이스가 사용자의 복잡한 의도와 무관하거나 오래된 정보를 반환할 경우, LLM은 부정확한 컨텍스트를 기반으로 응답을 생성하게 된다. 또한, 원본 문서를 의미론적으로 적절하게 분할(chunking)하는 과정 자체가 복잡한 엔지니어링 문제이다. RAG는 검색된 정보가 LLM의 환각을 억제할 것이라 기대되지만, 모델이 제공된 컨텍스트를 무시하거나 잘못 해석하여 여전히 환각을 일으키는 경우는 빈번하게 발생한다.

블랙박스화된 프레임웍. 간단한 질문 하나로 인해 발생되는 일들?
최신 에이전트 프레임워크는 높은 수준의 추상화를 제공하여 개발자가 복잡한 로직 없이도 에이전트를 구현할 수 있도록 지원한다. 그러나 이러한 추상화는 시스템을 '블랙박스(Black Box)'로 만든다. 사용자의 간단한 질의 하나를 처리하기 위해, 프레임워크 내부에서는 수많은 연쇄 반응이 일어난다. 여기에는 질의 분석을 위한 LLM 호출, 적절한 도구 선택을 위한 추론, 도구 입력값 포맷팅, 실제 도구 실행(API, DB 조회), 결과 파싱, 그리고 최종 응답 생성을 위한 또 다른 LLM 호출 등이 포함된다. 이 과정 중 어느 한 단계에서 오류가 발생할 경우, 추상화된 계층에 가려져 문제의 근본 원인을 파악하고 디버깅하는 것은 극도로 어려워진다.
가려져 있는 수많은 프롬프트

토큰 사용은 숨겨져 있다.
에이전트 프레임워크의 블랙박스 특성은 예측 불가능한 비용 문제로 직결된다. 에이전트가 자율적으로 작동하며 ReAct(Reason-Act) 프롬프트나 CoT(Chain of Thought)와 같은 추론 과정을 거칠 때, 사용자가 인지하지 못하는 수많은 내부적 LLM 호출이 발생한다. 사용자는 단 하나의 질의를 입력했지만, 시스템은 계획 수립, 도구 사용, 중간 평가, 최종 응답 생성을 위해 여러 차례 LLM API와 통신하며 막대한 양의 토큰을 소모한다. 이러한 '숨겨진 토큰 사용량'은 시스템의 운영 비용을 예측 불가능하게 만들며, 프로토타입 단계에서는 드러나지 않았던 비용 문제가 실제 서비스 운영 시 심각한 장애물로 작용한다.

멀티 에이전트과 가난한 인프라의 충돌
최근의 에이전트 연구는 단일 에이전트를 넘어, 여러 전문화된 에이전트가 협업하는 '멀티 에이전트(Multi-Agent)' 시스템으로 확장되고 있다. 그러나 이러한 복잡한 시스템은 막대한 계산 자원과 정교한 인프라를 요구한다. 각 에이전트는 독립적인 추론을 위해 LLM을 호출해야 하며, 에이전트 간의 통신과 조율(orchestration) 과정 역시 추가적인 LLM 호출을 유발한다. 이는 시스템 전체의 지연 시간(latency)을 기하급수적으로 증가시킨다. 소규모 기업이나 개발자가 보유한 제한된 '빈약한 인프라'로는 이러한 복합적인 상호작용을 감당하기 어렵다. 결과적으로, 멀티 에이전트 시스템은 개념적으로는 강력하지만, 극심한 속도 저하와 자원 병목 현상으로 인해 실질적인 프로덕션 환경에 적용되기 어려운 한계에 부딪힌다.

누가 돈을 벌어가나?
현재 AI 에이전트 생태계의 경제적 구조를 살펴보면, 수익은 특정 주체에 집중되는 경향이 있다. 가장 큰 수익은 LLM API를 제공하는 거대 기술 기업(예: OpenAI, Anthropic, Google)이 창출한다. 에이전트 프레임워크가 복잡한 내부 추론을 위해 더 많은 토큰을 소모할수록, 이들 모델 공급자의 매출은 증가한다. 또한, LangChain(LangSmith)이나 LlamaIndex와 같이 에이전트 개발 프레임워크를 제공하는 기업들은 개발 과정을 단순화하는 도구와 관찰 가능성(observability) 솔루션, 엔터프라이즈 지원을 유료화하며 수익을 창출한다. 반면, 이러한 도구를 활용하여 실제 애플리케이션을 구축하려는 다수의 개발자나 기업은 높은 API 비용과 확장성의 한계라는 현실적 장벽에 직면하게 된다.

마무리
결론적으로, AI 에이전트 프레임워크는 자율적으로 작업을 수행하는 AI라는 매력적인 비전을 제시하지만, 그 이면에는 불편한 진실이 존재한다. 현재의 에이전트는 기반 LLM의 환각 문제, RAG 시스템의 취약성, 프레임워크의 불투명성, 그리고 통제 불가능한 토큰 비용이라는 근본적인 한계에 직면해 있다. 이러한 문제들은 에이전트 시스템을 실험적인 프로토타입 수준에서 안정적인 프로덕션 서비스로 이전하는 데 가장 큰 장애물로 작용한다. 진정한 자율 에이전트의 구현은 프레임워크의 발전뿐만 아니라, LLM 자체의 신뢰성 향상과 이를 뒷받침할 수 있는 성숙한 인프라스트럭처의 확보를 전제로 한다.

레퍼런스
부록: 숨겨져 있는 토큰 사용

2025년 10월 29일 수요일

Deepseek OCR 파싱 기술 분석 및 사용법

이 글은 Deepseek OCR 파싱(Parsing) 기술 분석 및 사용법을 간략히 설명한다. 

AI 에이전트 개발 시 제일 문제가 되는 것 중 하나가 LLM의 먹이인 컨텍스트를 비정형 데이터에서 추출하는 챌린지이다. 이를 해결하려는 다양한 방법들이 있는 데, 보통은 파서, OCR, 벡터라이징 기술 등 여러가지를 조합해 솔류션을 구현한다. 

최근 오픈소스로 DeepSeek OCR(https://github.com/deepseek-ai/DeepSeek-OCR) 이 릴리즈되었다. 문서 이미지에서 그림, 텍스트, 벡터 등을 인식해 레이아웃을 유지한 체 디지털 데이터로 변환할 수 있다. 


물론 학습된 데이터 기준이겠지만, 다양한 비정형 멀티모달 데이터를 처리하려 노력한 것 같다. 
TBD...

레퍼런스