본문 바로가기
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
"검색은 관련된 글을 찾고, 자동완성은 아빠가 실제로 이어 쓴 말을 그대로 돌려줘."

자동완성은 작은 검색이 아니야

검색이 '이 주제와 관련된 구절은 어디 있지?'라고 묻는다면 자동완성은 '내가 이 문구 뒤에 실제로 무엇을 썼지?'라고 물어. 답은 관련 문서 목록이 아니라 과거 글에 실제로 이어 쓴 문구 몇 가지야. 사서가 책을 골라주는 일보다, 문장 한가운데서 예전의 자기 목소리가 메아리치는 일에 가까워.

입력한 문구가 시작되는 곳을 모두 찾아

입력 끝부분을 문구 접두어 쿼리로 만들어 전문 인덱스에서 같은 단어 순서가 시작되는 위치를 찾고, 각 위치 바로 뒤의 문자열을 모아. 코퍼스에서 자주 반복해 이어 쓴 문구를 위로 올리면 제안 목록이 돼. 신경망이 다음 단어를 추측하는 것이 아니라, 아빠가 그 문구를 실제로 어떻게 이어 썼는지 세어서 보고하는 방식이야.

키를 누르는 속도는 로컬 연산만 허용해

필요한 일은 문구 접두어 조회와 횟수 계산뿐이라 임베딩과 벡터 저장소, 모델 서버, 네트워크 호출이 전혀 없어. 로컬 인덱스만 사용하니 글자마다 실행해도 수십 밀리초 안에 답할 수 있어. 결정론은 여기서 좋은 덕목을 넘어 기능을 가능하게 만드는 조건이야.

단어를 다시 이어 붙이지 말고 원문의 정확한 부분문자열을 돌려줘. 토큰으로 쪼갠 뒤 공백을 넣어 재구성하면 investor'sinvestor s로 망가지고 QE & QT의 간격도 달라질 수 있어. 문자 위치로 원문을 그대로 잘라야 구두점까지 보존돼.

마법처럼 보여도 밑바닥은 단순한 기계야

과거 글로 문장을 완성하는 발상은 오래됐어. Lantern이 특별히 지키는 것은 키 입력 속도와 원문 충실성이야. 로컬 인덱스만 읽고, 원문 조각을 그대로 내보내며, HTML 부스러기 같은 잘못된 조각은 잡동사니 필터로 막아. 화면에서는 내 생각을 내 말로 이어주는 마법처럼 느껴지지만, 아래에서는 예측이 아니라 정확한 조회와 계산만 일어나.

Code

문구 접두어 매칭 + 연속 문구 수집 — 모델 없이, 구두점까지 그대로·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

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

Progress

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

댓글 0

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

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