Karpathy의 LiteLLM 의존성 재평가 - Golang 철학과 소프트웨어 공학
Classicial software engineering은 의존성이 좋은 것(벽돌을 쌓아 올리는)이라 믿지만, 이제 이것을 재평가해야 한다고 주장
LiteLLM 사건 (2026년 3월)
공격 개요
- 대상: LiteLLM (Python 라이브러리)
- 공격 방법: 악의 버전(v1.82.7, v1.82.8)이 PyPI에 업로드
- 피해 사례: API 키, 클라우드 자격증명, Kubernetes 설정, Git 자격증명, 암호화된 월렛
- 발견 원인: 악의 코드의 메모리 익스플로잇 버그
Karpathy의 평가
“최근 소프트웨어에서 가장 공포스러운 것 중 하나” – “software horror”
Karpathy의 입장 변화
이전: 의존성 숭배
Classicial software engineering에서:
- 벽돌 쌓기: 의존성이 좋은 것
- 복용성: 이미 증명된 라이브러리 사용
- 개발 속도: 빠른 프로토타이핑
현재: 의존성 저항
“저는 점점 더 의존성에 저항하고 있다”
핵심 이유:
- SaaS 공격 가능성: 의존성 공격의 피해 범위가 넓어짐
- Ouroboros의 경험: LiteLLM 의존성으로 영향받았고, 빠르게 제거했지만, 이미 늦었음
- LLM 활용: 필요한 기능만 cherry pick하고 직접 구현 가능
Golang의 철학적 장점
1. 표준 라이브러리
| 구성요소 | 설명 |
|---|---|
| 표준 HTTP 서버 | net/http |
| 표준 JSON | encoding/json |
| 표준 테스트 | testing |
| 표준 CLI | flag, os |
2. 외부 의존성 최소화
| 작업 | Python | Golang |
|---|---|---|
| HTTP 요청 | requests | net/http (표준) |
| JSON 처리 | json | encoding/json (표준) |
| 웹 서버 | Flask | net/http (표준) |
| 데이터베이스 드라이버 | psycopg2 | database/sql (표준 인터페이스) |
3. import만으로 끝
Python:
# 1. 라이브러리 설치
pip install requests
pip install flask
pip install psycopg2
# 2. import
import requests
import flask
import psycopg2
# 3. 사용 → 다른 패키지도 필요Golang:
// import만으로 끝
import "net/http"
import "encoding/json"
import "database/sql"
// 표준 라이브러리는 이미 Go에 내장4. go.mod 의존성 관리
module myapp
go 1.21
require (
github.com/example/tool v1.2.3 // 명시적 버전 지정
github.com/openai/sdk-go v0.26.0
)Python 생태계의 문제점
의존성 체인
내 앱 → 패키지 A → 패키지 B → 패키지 C → ...
└─ 템스 → 다른 패키지 → ...
└─ 테스트 → 또 다른 패키지 → ...
LiteLLM 사례:
LiteLLM → dspy (포함)
└─ 사용자 프로젝트 → 다른 패키지 → ...
└─ LiteLLM 한 개만 뚫렸는데 영향 범위 넓음
전염 감염
- 단일 패키지 취약점 → 전체 생태계 영향
- 의도치 않더라도 간접적으로 노출
- 패치 릴리스 후에도 장기간 영향 지속
새로운 패러다임: LLM-First
Karpathy의 제안
“LLM을 이용해서 필요한 기능만 cherry pick하고 의존성을 줄이는 게 맞다”
LLM의 장점
| 작업 | 전통적 방법 | LLM 활용 |
|---|---|---|
| HTTP 요청 | requests 설치 | LLM이 직접 구현 가능 |
| 데이터베이스 드라이버 | psycopg2 | LLM이 SQL 생성 가능 |
| 파싱 라이브러리 | beautifulsoup4 | LLM이 regex/파싱 가능 |
| 복잡한 로직 | 여러 패키지 | LLM이 한 번에 처리 가능 |
예시: LiteLLM 기능 재구현
기존 방법:
import litellm
# 36개 LLM 제공자 지원
# LiteLLM의 캐싱, 로깅, 실패 처리 모두 사용LLM-First 방법:
import http # 표준 라이브러리
import json # 표준 라이브러리
# OpenAI API 직접 호출
def call_openai(prompt: str) -> str:
response = http.post("https://api.openai.com/v1/chat", {
"model": "gpt-4",
"messages": [{"role": "user", "content": prompt}]
})
return json.loads(response.text)Go 모듈 관리 모범 사례
1. 의존성 최소화
# 사용하지 않는 패키지 제거
go mod tidy
# vendor 폴더 (선택 사항)
go mod vendor2. 버전 고정
require (
github.com/example/tool v1.2.3 # 명시적 버전
github.com/another/tool v2.1.0 # @latest 금지
)3. 보안 검증
# go.sum 무결성성 검증
go mod verify
# CVE 스캔
govulncheck ./...Karpathy의 프로젝트
llm.c / llm.go
- 언어: Python (llm.c) / Go (llm.go)
- 목적: 최소한의 LLM 트레이닝 및 추론
- 의존성: 거의 0에 가까움
Ouroboros의 의존성
- LiteLLM 제거 전: 빠르게 의존성 제거
- LiteLLM 제거 후: 새로운 표준 라이브러리로 재구현
결론
Golang의 철학적 우위
- 표준화된 생태계 — HTTP, JSON, 테스트 모두 표준
- 외부 의존성 최소화 —
go.mod로 체계적 관리 - 재현성 —
go.sum으로 빌드 재현 보장 - 보안 — 표준 라이브러리는 더 많은 코드 리뷰 받음
새로운 방법론
의존성 피라미드 → LLM-First 패러다임
- 필요한 기능만 cherry pick
- LLM으로 직접 구현
- 의존성 공격 영향 최소화
관련 자료
- LiteLLM Malware Attack: KuCoin
- Times of India: 링크
- Go Modules: Go.dev
- llm.c GitHub: https://github.com/karpathy/llm.c
- Karpathy.ai: https://karpathy.ai/
Added: 2026-03-31