🤖
1363 in / 5359 out / 6722 total tokens
Simon Willison이 Datasette 생태계에 LLM 통합을 위한 4개 플러그인을 연이어 릴리스했다. 단순한 기능 추가가 아니라, 데이터베이스와 LLM을 결합하는 완전한 워크플로우를 구축하겠다는 의도가 명확해 보인다.
🔥 핫 토픽
datasette-llm 0.1a5: Datasette의 LLM 코어 통합
Datasette 플러그인 아키텍처 위에 LLM 기능을 얹은 핵심 모듈이다. SQLite 데이터베이스에 저장된 데이터를 대상으로 LLM 쿼리를 날릴 수 있게 해준다. 게임 개발자 입장에서 생각하면, 인게임 로그나 플레이 데이터를 SQL로 쿼리하듯이 이제는 자연어로 "어제 밴된 유저들의 공통 패턴 찾아줘" 같은 질문을 던질 수 있는 셈이다.
이게 중요한 이유는 데이터 파이프라인의 복잡도를 획기적으로 낮춰주기 때문이다. 기존엔 데이터를 추출해서 Python 스크립트로 가공하고, OpenAI API 호출하고, 결과를 다시 DB에 저장하는 과정을 거쳐야 했다. datasette-llm은 이 과정을 SQL 레벨로 끌어내린다. 물론 내부적으론 API 호출이 발생하지만, 개발자는 이를 의식할 필요가 없다.
성능 관점에서 주의할 점은 LLM 호출이 동기냐 비동기냐다. 게임 서버 아키텍처에서 메인 스레드 블로킹은 치명적이다. 다행히 Datasette는 비동기 파이콘틱트(asyncio) 기반이라, 대량의 LLM 호출을 처리할 때 이벤트 루프 위에서 논블로킹으로 돌릴 수 있다. 다만 API 레이턴시 자체는 어쩔 수 없으니, 캐싱 전략을 병행해야 한다.
출처: Simon Willison
datasette-llm-usage 0.2a0: LLM 비용 추적
LLM API 호출량과 비용을 추적하는 플러그인이다. 토큰 사용량, 모델별 호출 횟수, 예상 비용을 대시보드 형태로 보여준다. 사이드 프로젝트로 AI 기능을 붙일 때 가장 골치 아픈 게 비용 관리다. "이 기능 한 번 호출할 때마다 50원씩 나가면 하루에 얼마지?" 같은 계산을 실시간으로 볼 수 있다는 게 큰 장점이다.
기술적으로 흥미로운 건 이 플러그인이 datasette-llm 위에 올라간다는 점이다. 즉, LLM 호출 자체를 인터셉트해서 메타데이터를 수집하는 구조다. 게임 서버로 치면 미들웨어나 인터셉터 패턴과 유사하다. AOP(Aspect-Oriented Programming)적 접근이라고 볼 수도 있다. 핵심 로직을 건드리지 않으면서 횡단 관심사(cross-cutting concern)를 분리한 셈이다.
실무에서는 이 데이터를 기반으로 예산 알림을 설정하거나, 특정 기능의 ROI를 계산할 수 있다. 예를 들어 "자동 고객 응대 챗봇이 하루에 5만 원어치 토큰을 쓰는데, 이게 인건비 절감과 비교해 얼마나 효율적인가?" 같은 질문에 답할 수 있다. UE5 프로젝트에서도 게임 내 AI 기능의 비용을 모니터링할 때 참고할 만한 패턴이다.
앞서 언급한 datasette-llm과 완벽하게 짝을 이룬다. 코어 플러그인이 호출을 담당하고, usage 플러그인이 그 호출을 감시하는 구조다.
출처: Simon Willison
datasette-enrichments-llm 0.2a0: 데이터 보강 자동화
datasette-enrichments-llm 0.2a0
Datasette의 Enrichments 시스템에 LLM을 연결한 플러그인이다. Enrichments는 원본 데이터에 새로운 정보를 덧붙이는(data enrichment) 작업을 자동화하는 프레임워크다. 예를 들어 유저 리뷰 테이블이 있으면, 각 리뷰의 감정 분석 결과를 새 컬럼으로 추가하거나, 요약문을 생성해서 붙일 수 있다.
이게 왜 혁신적인가 하면, 기존 데이터 파이프라인의 "사람이 개입해야 하는 지점"을 없애주기 때문이다. 게임 데이터로 치면, 플레이어 피드백을 자동으로 분류하거나, 버그 리포트에서 핵심 정보를 추출해서 별도 테이블에 정리하는 작업을 자동화할 수 있다. QA 팀이 매일 수백 건의 리포트를 읽을 필요가 없어진다.
아키텍처 관점에서 주목할 점은 배치 처리와 스트리밍 처리를 모두 지원한다는 것이다. 대량의 과거 데이터를 한 번에 보강할 때는 배치 모드로, 실시간으로 들어오는 데이터는 스트리밍으로 처리할 수 있다. 게임 서버의 로그 처리와 유사한 패턴이다. 다만 LLM 호출은 확률적이고 느리기 때문에, 재시도 로직과 에러 핸들링이 필수다. 이 플러그인이 그 부분도 추상화해준다.
datasette-llm-usage와 함께 쓰면, 어떤 enrichment 작업이 가장 비용을 많이 잡아먹는지도 파악할 수 있다. 데이터 품질과 비용의 트레이드오프를 정량적으로 관리할 수 있게 되는 것이다.
출처: Simon Willison
datasette-extract 0.3a0: 비정형 데이터 추출
비정형 텍스트에서 구조화된 데이터를 추출하는 플러그인이다. LLM의 구조화 출력(structured output) 기능을 활용해서, 자유 텍스트를 JSON이나 테이블 레코드로 변환해준다. 예를 들어 고객 문의 메일에서 "주문번호", "불만 사항", "요청 사항"을 자동으로 파싱해서 별도 테이블에 저장할 수 있다.
게임 개발에서도 활용도가 높다. 플레이어 채팅 로그에서 욕설이나 스팸을 감지해서 신고 테이블에 자동 등록하거나, 인게임 퀴즈의 자유 답변에서 정답 여부를 판단하는 데 쓸 수 있다. 기존엔 정규표현식이나 키워드 매칭으로 처리하던 작업을 LLM이 맡는 셈이다. 물론 정확도는 모델에 따라 달라지지만, GPT-4o나 Claude 수준이면 90% 이상의 정확도를 기대할 수 있다.
기술적 세부사항을 보면, 이 플러그인은 LLM의 function calling이나 JSON mode를 적극 활용한다. 프롬프트에 스키마를 정의해주면, LLM이 그 스키마에 맞춰 JSON을 뱉어낸다. 이를 Datasette가 SQLite 테이블로 바로 저장한다. UE5의 DataTable이나 DataAsset과 유사한 역할을 서버 사이드에서 수행하는 셈이다.
data enrichment 플러그인과 시너지가 크다. extract가 원본 텍스트에서 구조화된 데이터를 뽑아내면, enrichments가 그 데이터를 기반으로 추가 분석을 수행하는 식의 파이프라인을 구성할 수 있다. Simon Willison이 이 네 플러그인을 동시에 릴리스한 의도가 여기에 있다. 단품이 아니라 조립해서 쓰라고.
출처: Simon Willison
💭 총평
Simon Willison이 만드는 도구들의 특징은 "작고 느슨하게 연결된다"는 점이다. 모놀리틱한 올인원 솔루션이 아니라, 각자 하나의 역할만 하면서도 조합하면 강력해지는 유닛들이다. 유니티의 ECS 패턴이나 언리얼의 컴포넌트 시스템과 철학이 비슷하다.
특히 LLM을 API 호출이 아니라 "데이터 처리 파이프라인의 한 단계"로 자연스럽게 녹여낸 점이 인상적이다. 앞으로는 SQL 쿼리와 LLM 호출의 경계가 흐려질 것이다. SELECT 문 옆에 LLM_ENRICH 같은 키워드가 들어가는 세상이 올 수도 있다. 과장처럼 들리겠지만, datasette-llm 시리즈는 그 방향성을 보여주는 프로토타입이다.
게임 개발자 입장에서도 시사하는 바가 크다. 인게임 AI, 데이터 분석, 운영 자동화까지 LLM이 침투할 영역이 많다. 이걸 처음부터 다 직접 구현하려면 끝이 없다. Datasette 생태계처럼 작은 모듈로 쪼개서 점진적으로 통합하는 접근이 현명하다.
LLM은 더 이상 외부 API가 아니라 데이터 레이어의 일부가 되고 있다. 쿼리하듯 호출하고, 인덱스하듯 캐시하고, 트리거하듯 자동화한다.