고급 웹 프로그래밍 · MIDTERM 1–7
중간고사 한 장 요약
LLM API → 스트리밍 → 임베딩 → RAG → 평가. 시험 전 10분, 이 한 장만.
1PAGE ONLY
W01
AI 웹의 지형
- 결정론 같은 입력 → 같은 출력 / AI 같은 입력도 달라질 수 있음
- 토큰 출력이 입력보다 비싸고 느림 → 스트리밍으로 체감 개선
- 컨텍스트 윈도우 입력+출력 한도. 클수록 비용↑, 중간 정보 놓침
- Stateless LLM은 대화를 기억하지 않음 → 메시지 배열 누적 + DB 저장
- 할루시네이션 → RAG·출처 표시·도구 호출
- Supabase: RLS(행 단위 보안), pgvector, Edge Function(키 보호)
W02
LLM API · 프롬프트
POST /v1/chat/completions+Authorization: Bearer- 역할: system(정체성·규칙) / user / assistant. 응답도 배열에 누적
- 응답:
finish_reason(stop·length),usage(토큰 사용량) - temperature 0=일관, ↑=무작위 / top_p 누적확률 / max_tokens 길이 제한
- 프롬프트: 역할·규칙·제약·형식 + 구분자 + few-shot + 단계적 추론
- 인젝션 방어=구분자 / Edge: CORS·JWT·환경변수·지수 백오프
W03
스트리밍 UI
- SSE HTTP 단방향, LLM 응답에 충분 / WebSocket 양방향, 채팅방·게임
- 조각난 JSON은 버퍼링 후 완성된 줄만 파싱
- 한글 멀티바이트는 TextDecoder 스트리밍 모드로 합쳐서 디코딩
- Edge Function은 가공 없이 relay → 지연 최소화
fetch+getReader()+stream: true,delta누적- React는
setMessages(prev => ...)/ user 즉시 저장, assistant는 완료 후 최종본
W04
임베딩 · 벡터 검색
- 키워드 검색은 어휘 불일치에 약함 (환불 vs 결제 취소)
- 임베딩=의미를 벡터로. 각 원소 -1~1, 한 모델은 입력과 무관하게 항상 같은 차원
- 문서=passage, 질문=query로 구분해 임베딩
- 코사인 유사도 -1~1, pgvector
<=>는 1 - 유사도(거리) - Top-K는 무관한 질문에도 K개 반환 →
threshold필수 - 모델·차원을 바꾸면 기존 벡터는 비교 불가 → 재인덱싱
- pgvector
vector(n)+ 원문 저장 + RPCmatch_documents
W05
RAG 아키텍처
- LLM의 세 한계: Knowledge Cutoff, Private Data, Hallucination
- Prompting(토큰·유실) vs Fine-tuning(재학습) vs RAG(관련 부분만 주입)
- 인덱싱(개념 4단계): 문서 → 청킹 → 임베딩 → 저장
- 쿼리: 질문 임베딩 → 유사도 검색 → 프롬프트 조립 → 생성
- 청킹: 고정(간단·문맥 끊김) / 구조(헤더) / 의미(비쌈)
- 프롬프트 3원칙: 컨텍스트만 근거, 없으면 모른다, 출처
[1]
W06
문서 파이프라인
- 구현 6단계: 업로드 → 추출 → 정제 → 청킹 → 임베딩 → 적재
- 원본 보관: 모델 교체 시 재인덱싱해야 하므로 필수
- Storage(S3 호환·버킷) + DB 메타데이터, 접근은 RLS
- 객체 키=
userID/sourceID(한글·특수문자 회피) - PDF: 스캔본은 OCR, 좌표 보정, 머리말·꼬릿말 제거
- 재귀적 분할(구조·고정의 구현) 문단 → 줄 → 단어 / Source 1 : N Chunk + 위치 메타데이터
- 메타데이터 필터 + 벡터 검색 / HNSW는 빠르지만 메모리 / 삭제 일관성
W07
평가 · 고도화
- 오답 진단: 컨텍스트에 정답? → 생성 문제 / 없으면 DB 확인 → 인덱싱 or 검색
- 평가셋: 질문·정답 근거·기대 답변·질문 유형·답변 가능 여부
- Hit@K=생성 품질의 천장 / Recall=여러 근거 중 찾은 비율 / Precision@K / MRR
- 임계값: 오수용(답 없는데 통과) ↔ 잘못된 거부(답 가능한데 차단)
- 생성 평가: 근거 충실도·관련성·정답 일치·출처 정확도·거부 적절성 / LLM 판정도 사람 검증
- Hybrid=의미+키워드, RRF로 순위 결합 / Rerank=Bi→Cross, Recall@30→Top-5
- 쿼리 재작성은 검색에만, 생성엔 원 질문·원 이력 / HyDE도 검색에만
+
비교 한눈에
- SSE 단방향·간단 ↔ WebSocket 양방향·복잡
- Bi-Encoder 미리 계산·빠름·부정확 ↔ Cross-Encoder 쌍으로 계산·정확·느림
- 오수용 임계값↓ → 환각 위험 ↔ 잘못된 거부 임계값↑ → 답 가능한데 거부
- Hit 하나라도 찾음 ↔ Recall 정답 조각을 얼마나 찾음
- Prompting 매번 주입 ↔ Fine-tuning 모델 수정 ↔ RAG 검색해서 주입
+
마지막 10분
- “왜 RAG인가?” → 세 한계를 먼저 말하고, 인덱싱/쿼리로 나눠 설명
- “왜 스트리밍인가?” → 전체 시간은 같지만 첫 글자까지의 시간이 줄어든다
- “코사인 거리?” →
1 - 유사도. 유사도는 클수록, 거리는 작을수록 가깝다 - “오답 진단?” → 컨텍스트 → DB → 인덱싱 → 검색 순서로 좁힌다
- “쿼리 재작성?” → 검색에만 쓰고 생성에는 원 질문을 넘긴다
주의 HyDE의 가상 답변도 검색에만. 컨텍스트에 넣으면 환각이 된다.
COSINE DISTANCE
distance = 1 - cos(θ)
MRR
MRR = (1/rank₁ + … + 1/rankₙ) / n
RRF
score(d) = Σ 1/(k + rank)