docs(dogfood): V009 morphological tokenizer scenarios + fixture evidence
v0.20.1 dogfood verification 의 fixture + scenario 를 DOGFOOD.md / SMOKE.md 에 반영. 사용자 KnowledgeBase 같은 영어/code 중심 KB 에서 한국어 0-hit 가 정상 (token 부재) 임을 명시하고, ko-dic 의 morpheme 분해 동작을 검증할 reference fixture (korea-overview.md + korea-compound.md) 를 inline 으로 제공. DOGFOOD.md §2.1 갱신: - description: trigram → unicode61 + 형태소 column. - scenarios: 한국어 2-char (한국, 서울) + compound noun (서울특별시) + 영어 whole-token 회귀 + 1-char filter 등 7 case 로 확장. - §2.1bis 신규: V009 dogfood evidence reference corpus + 검증 명령 + 예상 snippet (lindera 분해 증거) + known limitation (ko-dic compound 단일 token 정책, Option α acceptance). SMOKE.md 'V009 morphological 검색' 갱신: - trigram 시절 hint advisory + 3자 키워드 권장 시나리오 제거. - v0.20.1 의 2-char Korean / compound noun / 1-char filter / 영어 whole-token 회귀 scenario 로 교체. Reference fixture (실측 verify pass): - korea-overview.md: '한국' / '서울' / '지하철' 모두 hit. - korea-compound.md: '한국어' / '한국문화' / '서울특별시' compound hit. Spec: docs/superpowers/specs/2026-05-28-v0.20.x-korean-morphological-tokenizer-spec.md §9 Plan: docs/superpowers/plans/2026-05-28-v0.20.x-korean-morphological-tokenizer-plan.md (dogfood evidence)
This commit is contained in:
@@ -176,36 +176,38 @@ KB ask "이 KB 안에서 ..." --mode hybrid --k 5 # 9. RAG 답변 (Ollama
|
||||
KB --json ask "..." --mode hybrid # 10. 기계 친화 출력 검증
|
||||
```
|
||||
|
||||
### 한국어 trigram 검색 (v0.17.0)
|
||||
### 한국어 morphological 검색 (v0.20.1)
|
||||
|
||||
`chunks_fts` 가 FTS5 `trigram` tokenizer 로 동작 — 한국어 query 는 3자 이상 substring 매칭. V007 자동 backfill 이라 기존 KB 의 binary 만 v0.17.0+ 로 교체하면 즉시 적용 (re-ingest 불필요). `kebab.sqlite` 파일 크기가 trigram index 비대화로 ~2-5배 또는 수백 MB 증가.
|
||||
`chunks_fts` 가 FTS5 `unicode61` tokenizer + 한국어 lindera ko-dic 형태소 분해된 별 column (`tokenized_korean_text`) 으로 동작 (V009 migration). 한국어 2-char query (`한국`, `서울`) 도 ko-dic morpheme 매칭 시 hit. V009 자동 backfill (`App::open_with_config` 의 first-boot hook) 이라 기존 KB 의 binary 만 v0.20.1+ 로 교체하면 첫 부팅에서 자동 재-tokenize (re-ingest 불필요). `kebab.sqlite` 파일 크기가 형태소 column + lindera-ko-dic embedded dict 의존성으로 다소 증가.
|
||||
|
||||
`fixtures/search/korean/hash-table.md` (또는 등가) 를 워크스페이스에 두고 ingest 한 후:
|
||||
|
||||
```bash
|
||||
# 3자 연속 substring (raw, 원문에 "해시 충돌은" / "충돌은 발생" 가 있음)
|
||||
KB search --mode lexical "충돌은"
|
||||
# 2-char Korean (v0.20.1 의 핵심 가치 — Bug #8 close)
|
||||
KB search --mode lexical "한국"
|
||||
KB search --mode lexical "서울"
|
||||
|
||||
# multi-token Korean — builder 가 ("해시 충돌") OR ("해시" "충돌") 으로
|
||||
# 변환 (각 토큰 2자라 token-AND 후보는 trigram 비호환, whole-phrase 가 hit)
|
||||
# 3-char Korean
|
||||
KB search --mode lexical "한국어"
|
||||
KB search --mode lexical "지하철"
|
||||
|
||||
# Compound noun (ko-dic 가 형태소 분해 — '서울특별시' → [서울, 특별시])
|
||||
KB search --mode lexical "서울특별시"
|
||||
|
||||
# multi-token Korean
|
||||
KB search --mode lexical "해시 충돌"
|
||||
|
||||
# 한영 혼합 — 둘 다 3자 이상이라 whole-phrase + token-AND 모두 후보
|
||||
KB search --mode lexical "Rust 충돌은"
|
||||
# 한영 혼합
|
||||
KB search --mode lexical "Rust 최적화"
|
||||
|
||||
# 2자 query — 정상 0 hit + stderr `[hint] 3자 이상 키워드 권장`
|
||||
KB search --mode lexical "충돌"
|
||||
# 1자 query — `build_match_string` 의 MIN_QUERY_CHARS=2 filter 로 0 hit
|
||||
KB search --mode lexical "키"
|
||||
|
||||
# 동일 케이스의 --json 출력에는 search_response.v1.hint 필드 포함
|
||||
KB search --mode lexical "충돌" --json | jq '.hits | length, .hint'
|
||||
# → 0
|
||||
# → "3자 이상 키워드 권장 (trigram tokenizer 제약)"
|
||||
|
||||
# raw FTS5 mode (single quote 로 감싼 입력) — 사용자 명시 의도, hint 미출력
|
||||
# raw FTS5 mode
|
||||
KB search --mode lexical "'충돌'"
|
||||
```
|
||||
|
||||
영어 lexical 도 substring 매칭으로 바뀜 — `KB search --mode lexical "token"` 이 `tokenizer` / `tokenize` 도 hit (recall ↑, 단어 경계 정밀도 ↓).
|
||||
영어 lexical 은 V002 의 whole-token 매칭으로 회귀 — `KB search --mode lexical "token"` 은 `token` 토큰만 hit, `tokenizer` 의 substring 으로 매칭 X. substring recall 이 필요하면 vector/hybrid mode 권장 (spec §3 Non-Goals Path A).
|
||||
|
||||
### Stale doc indicator
|
||||
|
||||
|
||||
Reference in New Issue
Block a user