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

키스트로크 속도의 자동완성

~12 min · complete, keystroke, phrase-prefix, punctuation-faithful

Level 0불 꺼진 심지
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"검색은 매칭되는 남의 단어를 찾아. 자동완성은 네가 실제로 쓴 방식 그대로, 네 단어를 돌려줘."

완전히 다른 질문

자동완성은 작은 검색이 아냐. 검색은 "어느 구절이 이것과 관련 있어?" 를 물어. 자동완성은 훨씬 친밀한 걸 물어: "장기 투자자가 물어야 할 유일한 질문 을 쳤어 — 내 코퍼스는 그 phrase 를 어떻게 끝내?" 답은 문서의 순위 목록이 아냐. 네 글에서 캔, 다음에 그럴싸하게 올 연속 몇 개야. 사서라기보단, 문장 중간에 되울린 네 자신의 목소리야.

phrase-prefix mining 이 작동하는 법

메커니즘은 우아하고 완전히 모델 없어. 친 것의 꼬리를 잡아 전문 인덱스에 phrase-prefix 쿼리로 써 — 그 정확한 단어 시퀀스가 코퍼스에서 시작되는 곳을 매칭해. 앵커되는 각 곳마다, 바로 뒤에 오는 걸 보고, 그 연속을 모아. 각각이 얼마나 자주 재발하는지로 순위 매기면, 제안이 나와. 신경망으로 다음 단어를 예측하는 게 아냐. 네 코퍼스가 그 phrase 를 실제로 어떻게 이었는지, 나타난 매번을 보고하는 거야.

임베딩 없음, 네트워크 없음, 모델 없음

순수 phrase-prefix 조회 더하기 카운팅이라, 자동완성은 로컬 인덱스만 만져. 임베딩 호출 없음, 벡터 저장소 없음, 모델 서버 없음, 어떤 종류의 네트워크 홉도 없음. 그게 키 누를 때마다 발사되고도 수십 ms 안에 돌아오게 하는 거야. 앞 트랙의 결정론이 여기선 그냥 좋은 속성이 아냐 — 가능하게 하는 제약이야. 네트워크 호출이 든 자동완성 경로는 쓸 수 없어서, 애초에 그런 게 없어.

raw 소스 조각을 내보내 — 텍스트를 재구성하지 마. 미묘한 함정: 연속을 단어로 토큰화하고 공백으로 재결합하면, 구두점을 조용히 파괴해. "investor's" 가 "investor s" 가 되고, "QE & QT" 는 앰퍼샌드 간격을 잃어. 고침은 토큰에서 재구축하는 대신 소스의 정확한 부분문자열 을, 아포스트로피와 앰퍼샌드까지 전부, 돌려주는 거야. 충실한 자동완성은 네가 내보내는 바이트가 쓰인 바이트라는 뜻이야 — 절대 손실 있는 재구성이 아냐.

부활한 기능, 정밀하게

코퍼스 phrase-완성은 오래된 아이디어야 — 글쓰기 도구는 오래 네 과거 텍스트에서 문장을 끝내주겠다 제안해왔어. Lantern 버전을 날카롭게 하는 건 그 아래 쌓인 규율이야: 로컬 상태만 만져 지킨 키스트로크 등급 예산, 재구성 대신 구두점 충실한 raw 조각, 그리고 malformed 소스 조각이 쓰레기 제안으로 안 떠오르게 하는 junk guard. 이 기능은 네 생각을 네 단어로 끝낼 때 마법처럼 느껴져 — 그리고 그 마법은 아래 전부 결정론적 기계야.

Code

Phrase-prefix + 연속 mining, 구두점 충실, 모델 없음·python
def complete(prefix: str, k: int = 5) -> list[str]:
    tail = last_phrase(prefix)                     # e.g. 'a long-term investor'
    # Phrase-prefix match: find where this exact word-sequence begins in the corpus.
    anchors = fts_phrase_prefix(tail)              # local index only, no network

    continuations: Counter[str] = Counter()
    for hit in anchors:
        # Take the EXACT source substring after the match — never re-join tokens,
        # or "investor's" degrades to "investor s" and "QE & QT" loses its spacing.
        raw = source_slice_after(hit)              # punctuation-faithful
        if not is_markdown_shrapnel(raw):          # junk guard
            continuations[raw] += 1

    # Rank by how often the corpus actually continued this way.
    return [text for text, _ in continuations.most_common(k)]

External links

Exercise

네 과거 글에서 자동완성을 짓는다 상상해. 알고리즘을 스케치해: 마지막에 친 몇 단어가 주어지면, 그 phrase 가 전에 나타난 곳을 어떻게 찾고, 다음에 온 걸 어떻게 모을래? 이제 구두점으로 스트레스 테스트해 — 아포스트로피나 앰퍼샌드가 든 phrase 를 쓰고 네 접근이 그걸 보존할지 망칠지 추적해. 충실하려면 뭘 돌려줘야 해?
Hint
충실한 수는 단어로 쪼개고 재결합하는 대신 원본 소스의 정확한 부분문자열을, offset 까지, 돌려주는 거야. 토큰화-후-재결합하는 순간, 간격과 구두점을 되추측하기로 약속한 거고 — 축약형과 기호에서 틀리게 추측할 거야.

Progress

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

댓글 0

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

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