2025-02-17-TIL
Today I Learned
심즈 게임 디자인 문서
GeekNews에 Don Hopkins가 공개한 1997년 심즈 개발 문서가 올라왔다. 94개의 PDF로 Goals, World, Objects, People, Simulator, Architecture, Graphics, Movement 같은 게임의 핵심 시스템과 내부 도구 문서를 담고 있다. 출시 전 게임의 설계를 장별로 어떻게 문서화했는지 볼 수 있는 자료다.
Caddy Server
Caddy는 보안과 사용 편의성을 강조하는 웹 서버로, 모든 사이트의 TLS 인증서를 자동으로 발급하고 갱신하는 Automatic HTTPS를 기본 동작으로 내세운다. HTTP, WebSocket, gRPC, FastCGI 리버스 프록시와 로드 밸런싱을 지원하고, 설정은 간단한 Caddyfile이나 REST API로 다루는 JSON으로 한다.
안드로이드 계산기의 정확한 계산
안드로이드의 계산기 앱은 정확한 계산을 위한 수많은 노력이 들어간 산물이다.
글에 따르면 부동소수점은 0.3이나 10^100을 정확히 표현하지 못해서, (10^100) + 1 − (10^100) 같은 식에서 1 대신 0이 나온다. Google은 Boehm GC로 알려진 Hans-J. Boehm에게 이 문제를 맡겼고, 팀은 분자와 분모를 큰 정수로 갖는 유리수 연산과 π나 √2 같은 무리수를 다루는 재귀 실수 연산(recursive real arithmetic)을 결합했다. 모든 수를 “유리수 × 재귀 실수”로 표현해서, 화면에 보이는 자릿수는 항상 정확하도록 만든 것이다.
NASA의 소프트웨어 개발 10가지 규칙
NASA에서의 소프트웨어 개발 규칙을 10가지 정했는데, 이 내용들을 살펴보면 대부분 가독성이 좋고, 명확하며, 예상치 못한 상황(런타임 에러 or 버그)이 없게끔 작성하는 방향이다.
규칙은 JPL의 Gerard J. Holzmann이 정리한 The Power of 10이다. 제어 흐름 제한(goto와 재귀 금지), 모든 루프에 고정된 상한, 초기화 이후 동적 메모리 할당 금지, 함수 길이 약 60줄 제한, 함수당 최소 두 개의 assertion, 가장 좁은 범위의 변수 선언, 반환값과 파라미터 검사, 전처리기 사용 제한, 포인터 사용 제한, 모든 경고를 켠 컴파일과 정적 분석 통과로 이루어진다. 원문 링크의 Otago 대학 페이지는 이 규칙을 소개하면서, 우주선 임베디드 소프트웨어가 아닌 다른 맥락에서는 그대로 적용하기보다 상황에 맞게 판단해야 한다는 비판적 주석을 붙였다.
AI와 웹 개발자의 일자리
AI가 웹 개발 산업 전체의 모습을 바꾸고 있다는 점에는 의심의 여지가 없지만, 단기적으로는 웹 개발자(또는 적어도 유능한 개발자)는 괜찮을 것이라고 생각합니다.
저는 AI가 사람들이 코드를 작성하고 심지어 기하급수적으로 문제를 디버깅하는 데 확실히 도움이 될 것이라고 생각합니다. 코드 도구가 개선됨에 따라 AI는 웹 개발자 일자리를 대체하지는 않지만 증강시키고, 더 효율적인 작업을 가능하게 하며, 더 일상적인 작업에 소요되는 시간을 더 많은 문제 해결 및 전략적 사고가 필요한 일에 할애할 수 있게 됩니다.
AI의 기능은 제품 생성 및 설계에서 최적의 결과를 얻으려면 인간 사용자의 안내와 이해가 필요하다는 점에서 제한적입니다.
웹 개발자가 진정한 가치를 제공하는 양질의 작업을 신중하게 제공하는 데 집중하고, 이러한 새로운 도구를 사용하여 이익을 얻는 방법을 배우면 항상 한 발 앞서 나갈 수 있습니다.
위 인용은 Al Power의 “Will AI take web developer jobs?”를 옮긴 것이다.
GPU에 대한 오해
Fly.io는 개발자들이 자기 플랫폼에서 AI/ML 추론을 돌리고 싶어 할 것이라 보고 GPU 머신에 크게 투자했지만, 그 판단이 틀렸다고 회고했다. 개발자가 원한 것은 GPU나 직접 운영하는 모델이 아니라 LLM API였다는 것이다. 기존 GPU 머신 사용자는 계속 지원하되 L40S 같은 일부 구간만 틈새 상품으로 유지한다고 밝혔다.
Introduction to Virtual Threads
가상 스레드 소개 발표 자료(PDF)를 저장해 두었다. 가상 스레드는 JEP 444로 JDK 21에서 정식 기능이 되었다. OS 스레드와 1:1로 대응하는 플랫폼 스레드와 달리, JDK가 많은 가상 스레드를 적은 수의 OS 스레드에 M:N으로 스케줄링한다. 목표는 요청마다 스레드 하나를 쓰는 thread-per-request 방식의 서버가 하드웨어를 충분히 활용하게 하는 것이고, 생성 비용이 작으므로 풀링하지 말고 작업마다 새로 만들어 쓰라고 JEP는 권한다. 실행 속도를 높여 주는 것이 아니라, I/O 대기가 많은 작업에서 동시성과 처리량을 높여 주는 기능이다.
Getter-Setter Pattern Considered Harmful
글쓴이는 getter와 setter가 가변 상태를 부추기고, 가변성과 상태가 코드를 복잡하고 추론하기 어렵게 만든다고 주장한다. 클래스를 설계할 때 먼저 불변으로 만들 수 있는지 묻고, get 접두사 없는 접근자를 가진 불변 클래스, 값을 바꾼 복사본을 만드는 with 패턴, 선택 필드가 많을 때의 빌더 패턴을 대안으로 제시한다.
Airbnb CEO와 AI 여행 계획
Airbnb CEO Brian Chesky는 AI 여행 계획은 아직 이르다고 말하며 지금을 인터넷의 90년대 중후반에 비유했다. Airbnb는 AI를 먼저 고객 지원에 도입하고, 이후 검색과 “여행과 생활 컨시어지”로 넓혀 갈 계획이라고 밝혔다.
AI가 신기술 채택을 저해한다
대형 언어 모델은 대규모 데이터셋과 긴 학습 기간을 거치므로, 출시 시점을 기준으로 이미 구버전 지식을 포함하는 경우가 많다. 그리고 최신 기술에 대한 AI 지원이 부족 -> 사용자와 자료 감소 -> 모델 학습 데이터 부족 -> 재차 AI 지원 부족으로 이어지는 악순환 가능성이 존재한다.
원문은 학습 데이터 기준일과 실제 사용 시점 사이의 지식 격차 외에, 시스템 프롬프트와 모델의 선호도 문제도 지적한다. 글쓴이가 여러 AI 도구에 일반적인 웹 앱을 요청해 보니 Claude와 ChatGPT는 꾸준히 React와 Tailwind로 코드를 만들었고, 바닐라 JavaScript를 원한다고 밝혀도 React로 다시 쓰는 경우가 있었다고 한다.
이에 대해 비판적인 의견은 다음과 같다. AI가 새로운 기술 채택을 방해한다는 것은 Stack Overflow가 새로운 기술 채택을 방해한다고 말하는 것과 같다. 초기 수용자들은 LLM에 의존하지 않는다. pioneer들은 AI의 제안보다는 주체적으로 기술적인 의사결정을 하고 발전시킬 수 있다.
Slack Alternatives
Slack을 대체할 팀 메신저 비교 글을 모았다. Zapier 글은 대규모 조직을 위한 Microsoft Teams, Google Workspace 사용자를 위한 Google Chat, 상시 음성 채팅의 Discord, 화상 회의의 Zoom, 그리고 자체 호스팅용 Element를 꼽는다. Element는 오픈소스 Matrix 프로토콜 위에서 동작해 자체 서버에 배포할 수 있고 메시지를 암호화한다. 저장한 Zapier 링크가 Element 항목()을 가리키고 있어서, 자체 호스팅이 가능한 선택지를 따로 눈여겨본 것으로 보인다.
그 밖에 저장한 자료
- 2024년 가장 조회수 높은 소프트웨어 엔지니어링 발표들: TechTalksWeekly가 GOTO, NDC, Spring I/O, CppCon 등의 2024년 발표 중 조회수가 높은 100개를 모은 목록이다.
- microservices.io: 『Microservices Patterns』의 저자 Chris Richardson이 운영하는 사이트로, 서비스 분해, 협업, 테스트, 배포에 관한 마이크로서비스 패턴 언어를 정리해 두었다.
- Visualizing algorithms for rate limiting: 고정 윈도(윈도 시작마다 카운터를 0으로 초기화), 슬라이딩 윈도(용량을 요청 하나씩 채움), 토큰 버킷(일정한 속도로 토큰을 채우고 요청마다 하나씩 소비)을 애니메이션으로 비교한다. 고정 윈도는 경계 근처에 요청이 몰리면 한도의 두 배까지 통과할 수 있다는 점이 눈으로 보인다.
- Diffie–Hellman 키 교환: 1976년 Whitfield Diffie와 Martin Hellman이 발표한 방식으로, 공개 채널에서 g^a mod p와 g^b mod p를 주고받아 양쪽이 같은 비밀 g^ab mod p를 얻는다. 인증이 없는 키 합의라서 중간자 공격에 취약하므로 실제로는 인증 수단과 함께 쓴다.
파인 튜닝(Fine-tuning)
파인 튜닝이란
파인 튜닝(Fine-tuning)은 사전 학습된(pre-trained) 모델을 특정 작업(task)이나 도메인(domain)에 맞게 추가 학습시키는 과정이다. 기존의 대규모 데이터셋으로 사전 훈련된 모델을 활용하면서, 상대적으로 적은 양의 데이터로 추가 학습을 진행하여 특정한 요구 사항에 맞게 성능을 향상시킬 수 있다.
- 사전 훈련(Pre-training): 대규모 데이터셋을 사용하여 일반적인 패턴을 학습한 모델을 생성하는 과정
- 파인 튜닝(Fine-tuning): 특정한 목적이나 데이터셋에 맞춰 사전 훈련된 모델을 미세 조정하는 과정
파인 튜닝의 주요 과정
- 사전 훈련된 모델 로드: 보통 딥러닝 프레임워크(PyTorch, TensorFlow 등)를 사용하여 공개된 사전 훈련 모델(GPT, BERT, ResNet, VGG, LLaMA 등)을 가져온다.
- 새로운 데이터셋 준비: 특정 도메인(예: 의료, 금융, 법률 등)에 맞는 데이터셋을 준비하고 전처리와 레이블링을 수행한다.
- 모델 구조 조정: 전체 모델을 그대로 사용할 수도 있지만, 일반적으로 일부 층(layers)만 학습 가능하도록 설정한다. 초기층(early layers)은 고정(freeze)하고, 마지막 층(later layers)만 학습시키는 방식이 일반적이다.
- 파인 튜닝 학습 진행: 보통 전이 학습(Transfer Learning) 방식으로, 기존 가중치를 유지하면서 추가적인 학습을 수행한다. 하이퍼파라미터(learning rate, batch size 등)를 조정하여 최적화한다.
- 성능 평가 및 최적화: 검증 데이터(validation data)로 모델 성능을 평가하고, 오버피팅 방지를 위한 정규화(regularization) 및 드롭아웃(dropout)을 적용할 수 있다.
파인 튜닝의 장점
- 적은 데이터로 학습 가능: 대규모 데이터를 직접 학습하지 않아도 되고, 소량의 도메인 데이터로도 높은 성능을 기대할 수 있다.
- 빠른 학습 속도: 처음부터 학습하는 것보다 훨씬 적은 연산량으로 학습할 수 있다.
- 높은 성능 유지: 일반적인 사전 훈련 모델보다 특정 도메인에서 더 나은 성능을 보일 수 있다.
- 전이 학습 활용: 기존 모델의 강력한 표현력(representation power)을 유지하면서 특정 작업에 적합하도록 조정할 수 있다.
파인 튜닝의 활용 예시
- 자연어 처리(NLP): OpenAI GPT 모델을 특정 도메인(예: 법률, 의료) 텍스트로 파인 튜닝하거나, BERT 모델을 감성 분석, 질의 응답(QnA) 등에 최적화한다.
- 컴퓨터 비전(CV): ImageNet으로 학습된 ResNet, VGG 모델을 의료 영상 분석, 얼굴 인식 등에 적용하거나, 특정 도메인의 이미지(예: 자율주행 자동차 데이터)로 파인 튜닝한다.
- 음성 인식(Speech Recognition): Whisper, Wav2Vec2 같은 사전 학습된 모델을 특정 언어나 억양에 맞게 조정한다.
- 추천 시스템(Recommendation): 대규모 사용자 행동 데이터를 학습한 모델을 특정 웹사이트나 서비스에 맞게 조정한다.
파인 튜닝과 전이 학습(Transfer Learning)의 차이
| 구분 | 전이 학습(Transfer Learning) | 파인 튜닝(Fine-tuning) |
|---|---|---|
| 학습 방식 | 사전 훈련된 모델을 활용하여 특정 작업에 맞게 일부 계층만 수정 | 기존 가중치를 유지하면서 추가 학습 진행 |
| 학습량 | 적은 데이터로도 가능 | 추가 학습이 필요함 |
| 속도 | 상대적으로 빠름 | 더 많은 학습 시간이 필요할 수도 있음 |
| 적용 범위 | 특정 작업(task)에 맞게 조정 | 특정 도메인(domain)에 맞게 조정 |
다만 TensorFlow의 전이 학습 튜토리얼은 두 개념을 대립시키지 않고, 사전 학습 모델을 활용하는 두 가지 방법으로 나눈다. 하나는 사전 학습 모델을 고정한 채 그 위에 새 분류기만 학습시키는 feature extraction이고, 다른 하나는 고정했던 모델의 위쪽 몇 층을 풀어서 새 분류기와 함께 학습시키는 fine-tuning이다. 위 표의 “전이 학습” 열은 이 중 feature extraction에 가깝다. 같은 튜토리얼은 BatchNormalization 층이 있는 모델을 파인 튜닝할 때는 그 층을 추론 모드(training=False)로 두어야 학습한 내용이 망가지지 않는다고 경고한다.
예제 코드
NLP에서 GPT 모델 파인 튜닝 (Hugging Face 활용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from transformers import GPT2Tokenizer, GPT2LMHeadModel, Trainer, TrainingArguments
from datasets import load_dataset
# 토크나이저 및 모델 불러오기
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")
# 데이터셋 로드 및 토큰화
dataset = load_dataset("wikitext", "wikitext-2-raw-v1")
def tokenize_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
# 학습 설정
training_args = TrainingArguments(output_dir="./results", num_train_epochs=3, per_device_train_batch_size=4)
trainer = Trainer(model=model, args=training_args, train_dataset=tokenized_datasets["train"])
# 파인 튜닝 실행
trainer.train()
이미지 분류 모델 파인 튜닝 (PyTorch 활용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import torch
import torchvision.models as models
import torchvision.transforms as transforms
from torch.utils.data import DataLoader, Dataset
# 사전 학습된 모델 로드 (ResNet50)
model = models.resnet50(pretrained=True)
# 마지막 레이어 변경 (파인 튜닝)
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, 10) # 새로운 클래스 개수 (예: 10개)
# 학습 준비
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
# 데이터셋 및 데이터로더 정의 (예제)
transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor()])
train_loader = DataLoader([], batch_size=32, shuffle=True)
# 옵티마이저 및 손실 함수 정의
optimizer = torch.optim.Adam(model.parameters(), lr=0.0001)
criterion = torch.nn.CrossEntropyLoss()
# 파인 튜닝 학습 루프
for epoch in range(10):
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
GPT-2 예제는 사전 학습 모델 전체를 추가 학습하는 방식이고, ResNet 예제는 마지막 분류층(model.fc)을 새 클래스 수에 맞게 바꾼 뒤 학습하는 방식이다. 두 번째 예제의 train_loader는 빈 리스트로 만든 자리표시자라 그대로 실행하면 학습이 일어나지 않는다.
정리
파인 튜닝은 사전 훈련된 모델을 활용하여 특정 작업에 맞게 미세 조정하는 기법이다. 이를 통해 적은 데이터와 연산 자원으로도 높은 성능을 기대할 수 있으며, NLP, 컴퓨터 비전, 음성 인식, 추천 시스템 등 다양한 분야에서 활용된다.
프롬프팅(Prompting)
AI에게 인간 사용자가 원하는 답을 이끌어내도록 안내하는 방법을 프롬프팅(Prompting)이라고 한다. 프롬프팅은 AI 모델(특히 대규모 언어 모델, LLM)에게 원하는 응답을 유도하는 입력 방식을 의미한다. 사용자는 특정한 방식으로 질문이나 명령을 입력하여, AI가 더 정확하고 유용한 답변을 생성할 수 있도록 조정할 수 있다.
프롬프팅의 주요 유형
- 기본 프롬프팅(Basic Prompting)
- 단순한 질의 입력
- 예: “AI란 무엇인가?”
- 명확한 프롬프팅(Explicit Prompting)
- 구체적인 지침을 제공하여 원하는 결과를 얻음
- 예: “AI란 무엇인지 간단하고 쉽게 설명해줘.”
- 컨텍스트 프롬프팅(Contextual Prompting)
- 특정한 배경 정보를 제공하여 더 정교한 답변을 유도
- 예: “초등학생이 이해할 수 있도록 AI 개념을 설명해줘.”
- 예제 기반 프롬프팅(Few-shot Prompting)
- 모델이 참고할 수 있도록 몇 가지 예시를 함께 제공
- 예:
1 2 3 4 5 6 7 8
Q: 사과는 어떤 색인가요? A: 보통 빨간색입니다. Q: 바나나는 어떤 색인가요? A: 노란색입니다. Q: 포도는 어떤 색인가요? A: ?
- 연쇄적 사고 프롬프팅(Chain-of-Thought Prompting, CoT)
- 논리적인 사고 과정을 단계적으로 유도하여 복잡한 문제 해결
- 예: ``` 문제: 어떤 사람이 사과 3개를 가지고 있다가 2개를 더 샀습니다. 총 몇 개의 사과가 있나요? 생각 과정:
- 처음에 3개의 사과가 있습니다.
- 2개의 사과를 추가로 삽니다.
- 3 + 2 = 5 답변: 5개입니다. ```
- 지시 기반 프롬프팅(Instruction Prompting)
- 특정한 형식이나 스타일을 지정하여 답변을 유도
- 예: “100자 이내로 AI의 개념을 요약해줘.”
- 반복적 프롬프팅(Iterative Prompting)
- 사용자가 반복적으로 프롬프트를 수정하여 AI의 응답을 개선
- 예:
- “AI란 무엇인가?” (너무 일반적인 답변)
- “AI란 무엇인지 기술적 관점에서 설명해줘.” (더 구체적인 답변)
연쇄적 사고 프롬프팅은 Jason Wei 등의 논문 “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models”에서 이름이 붙었다. 논문은 중간 추론 단계를 담은 예시 몇 개를 프롬프트에 넣으면 충분히 큰 언어 모델에서 산술, 상식, 기호 추론 성능이 크게 오른다고 보고한다. 위 4번과 5번을 합친 형태, 즉 추론 과정을 포함한 few-shot 예시가 논문의 실험 방식이다.
프롬프팅의 중요성
- 더 정확하고 유용한 답변을 받을 수 있다.
- AI 모델의 강점을 최대한 활용할 수 있다.
- 작업의 자동화를 최적화할 수 있다.
- 자연어 처리(NLP) 모델을 효과적으로 조작할 수 있다.
참고한 자료외부 출처 25
외부 출처
- 심즈 게임 디자인 문서(1997)
- Caddy - The Ultimate Server with Automatic HTTPSCaddy
- “A calculator app? Anyone could make that.”Chad Nauseam
- Comments on NASA’s 10 rules
- NASA의 소프트웨어 개발 10가지 규칙
- Will AI take web developer jobs?Al Power
- GPU에 대한 오해
- We Were Wrong About GPUs
- Introduction to Virtual Threads발표 자료 PDF
- JEP 444: Virtual Threads
- Getter-Setter Pattern Considered Harmful
- Airbnb CEO says it’s still too early for AI trip planning
- AI가 신기술 채택을 저해함 (vale.rocks)
- AI is Stifling Tech Adoption
- The 5 best Slack alternatives for businesses in 2025
- We’ve Tried 9 Slack Alternatives (Our Team’s Feedback)
- 50 Best Slack Alternatives for Team Communication in 2025
- What is the best Slack alternative for your team in 2025?Lark
- 5 Slack alternatives for efficient workplace communication in 2024
- 2024년 가장 조회수 높은 소프트웨어 엔지니어링 발표들 (techtalksweekly.io)
- What are microservices?
- Visualizing algorithms for rate limiting
- Diffie–Hellman key exchange
- Transfer learning and fine-tuning
- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models
댓글
아직 댓글이 없습니다