操作
機能 #404
完了
操作
実装に着手しました。
feature/404
SongQuery)への変換を QueryInterpreter で抽象化し、背後にローカルLLM実装(llama.cpp/GGUF)とルールベース実装を配置。LLMが未同梱・ロード失敗・出力不正のときはルールベースへ自動フォールバック。後段の SongSearchService(SongData+NotesRadar+scorelogによる重み付きランキング)は完全決定論とし、ユニットテストはこの中核とJSONパースの頑健性に集中させて DoD(例外なし・テスト全通過)を満たす。外部API不使用・ローカル完結。UIは本チケット対象外(検索ロジック+API層のみ)。対応が完了しました。
「☆10で短め、乱打多め、最近やってない曲」のような自然文クエリをローカルで解釈し、SongData / NotesRadar / スコア履歴を元に曲をランキング検索する機能を追加。外部API不使用・ローカル完結。本チケットは検索ロジック+API層のみ(UIは対象外)。
bms.player.beatoraja.song.search を追加。QueryInterpreter(自然文→構造化 SongQuery)を抽象化し、ローカルLLM実装(LlamaCppInference=de.kherud:llama/GGUFをリフレクションで隠蔽・遅延ロード・全ネイティブ呼出ガード)と決定論的 RuleBasedQueryInterpreter を用意。LlmQueryInterpreter はモデル未在/ロード失敗/出力不正時にルールベースへ自動フォールバック。SongSearchService(決定論中核): level/mode/bpm ハードフィルタ+パターン特徴量・長さ・recency・プレイ頻度・テキスト語のスコアリング。空corpus・不一致は空配列を返しnull/例外を出さない。PlayHistoryProvider(ScoreDatabaseAccessor 実装+in-memoryテスト実装)、ファサード NaturalLanguageSongSearch。de.kherud:llama を runtime 依存に追加、.gitignore に model/ を追加(モデルファイルは非コミット)。src/bms/player/beatoraja/song/search/ 下 17本 ・ テスト src/test/java/bms/player/beatoraja/song/search/ 下 5本 ・ build.gradle ・ .gitignore
.\gradlew.bat test : 成功(song.search 27テスト全通過 / failures=0・errors=0・skipped=0、既存スイートもgreen)