서론
안녕하세요, 유스케입니다.
Flutter로 온디바이스 AI 검색 앱을 개발하고 있습니다.
이번에는 AI 검색의 정밀도를 실용적인 수준까지 끌어올리기 위해 제가 진행한 "조정 기록"을 개인적인 비망록으로 남깁니다.
과제: 검색 결과가 "야키니쿠"로 오염됨
개발 중인 실증 테스트에서, "컨로 적합표 (PDF)"를 검색했을 때 AI의 연상 작용이 너무 강하게 작용하여 "어제 먹은 야키니쿠" 메모가 1위로 나오는 현상이 발생했습니다.
AI (MiniLM)는 "불"이라는 개념으로 두 가지를 연결해 버린 것일까요? 실용적인 도구로서는 노이즈에 불과합니다. 이를 해결하기 위해 다음과 같은 로직을 도입했습니다.
구현한 3가지 조율 (비망록)
1. 30자 미만을 벡터화에서 제외하기
너무 짧은 문장은 AI가 그 한마디에 과도하게 반응하기 때문에 검색 결과를 오염시키는 원인이 됩니다.
대책: 30자 미만의 텍스트는 embedding을 생성하지 않고, 키워드 일치로만 처리.
결과: 단편적인 메모가 상위를 독점하는 것을 방지할 수 있었다.
2. 타이틀의 5배 부스트
AI에 전달하는 문장 구조 내에서, 타이틀을 5번 반복하도록 처리를 변경.
목적: AI에게 "이 문장의 주인공은 타이틀 (파일명)이다"라고 강조하기 위해.
구현 이미지: [TITLE]: 이름 \n 을 5번 반복하여 본문과 결합.
3. 스코어 배분의 고정 (60:40)
"키워드의 정확한 일치"와 "AI의 모호한 연상" 사이의 균형을 조정.
결론: 키워드 일치(60%), AI 스코어(40%)의 배분이 가장 "원했던 결과"에 가까워졌다.
【추가】 릴리스 버전에서의 "지능 상실" 에러 대처
운영용 빌드 (AAB)에서만 AI 검색이 Invalid entrypoint (10002)로 인해 크래시(crash)되는 문제에 직면.
원인: 난독화(obfuscation)로 인해 ObjectBox의 HNSW 인덱스용 변수가 변경된 것.
해결책:
Entity의 모든 항목에 @pragma('vm:entry-point')를 부여.
objectbox-model.json을 물리적으로 삭제하고 재구축.
이로써 드디어 릴리스 버전에서도 검색 기능이 복구되었다.
마치며
현재 Version 4를 심사 제출 중입니다.
Drive 상에서의 편집을 감지하여 기억을 자동으로 업데이트하는 기능을 포함했습니다.
Google Play의 공개 요건 (테스터 20명)에 대해서는 아직 갈 길이 멉니다.
혹시 이 프라이버시 특화형 검색 경험에 관심이 있는 분이 계신다면, 아래 사이트를 통해 협력해 주시면 감사하겠습니다.
👉 [소개 사이트: https://gitmame00.github.io/ ]
Discussion