본문 바로가기
C.W.K.
Stream
Lesson 03 of 04 · published

예약하고 라운드로빈 — 폭 말고 깊이를 깎기

~12 min · context, allocation, design, llm

Level 0미분류
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

섹션 두 부류, 정책 둘

코퍼스가 배분이라는 걸 받아들이고 나면 섹션이 알아서 두 종류로 갈려. 어떤 건 작고 유일하고 대체 불가능해. 온도 측정 몇 개, 통째로 읽은 기사 둘, 어제 요약. 다른 건 덩치 크고 반복적이고 탄력적이야. 헤드라인. 늘 더 있고 하나하나가 조금씩 보태는 것들.

둘은 반대 정책을 받을 자격이 있어. 작고 유일한 섹션은 통째로 예약돼야 해. 그 일부는 거의 무가치하니까. 온도 측정 반쪽은 아무것도 안 알려줘. 덩치 크고 탄력적인 섹션은 남은 걸 받고 깔끔하게 멈춰야 하고. 설계상 우아하게 저하되니까. 헤드라인이 적은 건 더 작은 조망이지 망가진 조망이 아냐.

탄력 섹션 안에서도 순서가 중요해

고정 섹션을 예약하고 나서도 남은 몫을 여러 선반 사이에 어떻게 쓸지 정해야 해. 자연스러운 구현은 선반별로 도는 거고, 그건 원래 버그를 한 층 아래서 재현해. 앞쪽 몇 선반은 온전히 대표되고 뒤쪽 여럿은 통째로 없어져.

순위별 라운드로빈이 고쳐. 모든 선반의 톱 헤드라인을 가져오고, 그다음 모든 선반의 두 번째를, 그런 식으로. 그러면 예산이 떨어질 때 주제를 통째로 지우는 대신 각 주제가 깊이를 조금씩 잃어. 그리고 하루 조망한텐 주제 하나가 빠지는 게 각각을 좀 얇게 다루는 것보다 훨씬 큰 결함이야.

공짜로 얻는 연속성

예약 섹션 하나는 따로 언급할 값어치가 있어. 기능으로 위장한 지출 결정이거든. "어제 이후 뭐가 바뀌었나"는 일간 브리핑이 말해주면 진짜 쓸모 있는 거고, 뻔한 구현은 이틀을 비교하는 두 번째 생성이야. 그러면 상시 비용이 두 배가 되지.

그리고 불필요해. 이 생성이 이미 답하고 있는 같은 질문이거든. 어제 브리핑을 예약 섹션으로 넣으면 몇백 자에 추가 호출 0 건이야. 그러면 모형이 뭐가 움직였는지 말할 수 있고, 쓸모 있게도, 어제 뭘 틀렸는지도 말할 수 있어. 생성 단계를 추가하기 전에, 지금 하려는 그 안에서 답에 닿을 수 있는지 확인해.

예약은 넘치게 하는 테스트로 지켜

예약은 뭔가 강제해야 진짜야. 중요한 테스트는 평범한 날을 확인하지 않아. 탄력 섹션에 예산이 허용하는 것보다 훨씬 많은 내용을 일부러 들이붓고, 그다음 예약 섹션이 여전히 온전히 있는지 단언해. 그 테스트는 원래 구현에서 실패하고 예산 구현에서 통과하고, 이 부류 버그의 회귀 테스트가 해야 할 게 정확히 그거야.

저하될 수 없는 건 예약하고, 될 수 있는 건 배급해. 섹션마다 물을 건 "이거 얼마나 중요해?"가 아니라 "이거 반쪽이 값어치가 있나?"야. 그 질문이 중요도보다 훨씬 안정적으로 섹션을 두 정책으로 갈라줘.

Code

탄력 몫에 대한 라운드로빈, 그리고 예약을 지키는 홍수 테스트·python
def _fill_round_robin(shelves: list[list[str]], budget: int):
    """Spend the elastic allowance across shelves by RANK.

    Shelf-by-shelf would reproduce tail truncation one level down: the
    first shelves fully represented, the last ones absent. By rank,
    running out costs each topic a little depth instead of erasing
    whole topics -- and a missing subject damages a survey far more
    than thinner coverage of every subject.
    """
    lines, spent, dropped = [], 0, 0
    deepest = max((len(s) for s in shelves), default=0)
    for rank in range(deepest):
        for shelf in shelves:
            if rank >= len(shelf):
                continue
            cost = len(shelf[rank]) + 1
            if spent + cost > budget:
                dropped += 1
                continue          # keep going: a later shelf may fit
            lines.append(shelf[rank])
            spent += cost
    return lines, dropped


# The test that makes the reservation real. It does NOT test a normal
# day -- a normal day fits, and passes either way. It floods.
def test_a_wide_day_cannot_evict_the_reserved_sections(con):
    seed_shelves(con, count=40, headlines_each=200)   # far over budget
    corpus, stats = build_corpus(con)

    assert "X temperature" in corpus, "reserved section was evicted"
    assert "Yesterday's brief" in corpus
    assert stats["samples"] > 0
    assert stats["headlines_dropped"] > 0     # the elastic part absorbed it
    assert len(corpus) <= CORPUS_MAX_CHARS

External links

Exercise

네가 조립하는 제한된 출력을 골라. 프롬프트, 요약본, 요약 페이로드 같은 거. 섹션마다 물어서 갈라봐. 이거 반쪽이 값어치가 있나? 그러고 나서 지금 구현이 예약 부류 섹션한테 우선순위를 주는지 확인해. 답이 예여도 홍수 테스트를 써. 다음에 누가 섹션을 추가하면 순서가 흘러갈 테니까.
Hint
새 섹션은 끝에 붙고, 자르는 조립에선 그게 모든 추가가 중요도랑 상관없이 조용히 최하 우선순위가 된다는 뜻이야. 홍수 테스트가 그 흘러감을 조용히 바꾸는 대신 시끄럽게 실패하게 만들어주는 거고.

Progress

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

댓글 0

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

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