C.W.K.
Stream
Lesson 01 of 05 · published

비용: 임베딩 budget 과 호출 패턴

~22 min · ops, cost

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

청구서 어디서 옴

  • Ingestion 임베딩 — 청크당 한 번씩, 재임베딩할 때마다 결제.
  • Query 임베딩 — 유저 query 당 한 번 결제.
  • Storage — vector size × 청크 × replication. 수천만 row 안 넘으면 보통 작음.
  • LLM 호출 — retrieval 작동하면 가장 큰 line item. RAG 가 이거 면제 안 해줘.

중요한 비용 레버 셋

  1. 콘텐츠 hash 로 임베딩 캐시. 같은 청크 재-ingest 비용 0 이어야. 텍스트 hash, 벡터 lookup, miss 일 때만 모델 호출.
  2. Batch. 호스티드 임베딩 API 가 청크 1개든 100개든 토큰당 같은 가격이지만, batched 호출은 round-trip 100번 대신 1번. 32–128 batch size 가 일반적.
  3. Eval 이 허용하면 작은 모델. 384차원 로컬 모델이 factoid retrieval 에서 3072차원 호스티드 모델 매칭 가능 + 호출당 비용 0. eval set 이 차이가 본인 query 에 진짜 중요한지 알려줌.

Code

콘텐츠-hash 캐시·python
import hashlib, json
from pathlib import Path

CACHE = Path('embedding_cache.jsonl')

def cached_embed(texts: list[str]) -> list[list[float]]:
    cache: dict[str, list[float]] = {}
    if CACHE.exists():
        for line in CACHE.read_text().splitlines():
            row = json.loads(line)
            cache[row['hash']] = row['vec']

    results, misses, miss_hashes = [], [], []
    for t in texts:
        h = hashlib.sha256(t.encode()).hexdigest()
        if h in cache:
            results.append(cache[h])
        else:
            results.append(None)
            misses.append(t)
            miss_hashes.append(h)

    if misses:
        new_vecs = model.encode(misses, normalize_embeddings=True).tolist()
        with CACHE.open('a') as f:
            for h, v in zip(miss_hashes, new_vecs):
                f.write(json.dumps({'hash': h, 'vec': v}) + '\n')
        miss_iter = iter(new_vecs)
        results = [r if r is not None else next(miss_iter) for r in results]
    return results
Batched OpenAI 임베딩·python
from openai import OpenAI
from itertools import islice

client = OpenAI()

def batched(it, n):
    it = iter(it)
    while batch := list(islice(it, n)):
        yield batch

def embed_corpus(texts, batch_size=64):
    out = []
    for batch in batched(texts, batch_size):
        resp = client.embeddings.create(model='text-embedding-3-large', input=batch)
        out.extend([d.embedding for d in resp.data])
    return out

External links

Exercise

ingestion 파이프라인에 콘텐츠-hash 캐시 추가. 코퍼스 full 재-ingest 두 번. 두 번째 실행이 100% cache rate + 임베딩 API 비용 0 인지 확인. savings 로깅.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.