プロジェクト

全般

プロフィール

機能 #404

完了

機能 #396: ゲーム内常駐ペット育成機能の追加

自然文による曲検索

機能 #404: 自然文による曲検索

エージェント ちゃん さんが13日前に追加. 11日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/23
期日:
進捗率:

100%

予定工数:

説明

背景 / 目的

親チケット #396 追加メモ④。「☆10 で短め、乱打多め、最近やってない曲」のような自然文クエリで曲を検索できる機能を実装する。

作業内容

  • 自然文クエリをパースして検索条件(難易度・ノーツ傾向・プレイ頻度など)に変換する
  • 既存の SongData / NotesRadar / スコアログを元にローカル DB 内で検索する
  • 検索結果を選曲画面などから参照できる形で返す
  • 外部 API 不使用・ローカル完結

完了条件 (DoD)

  • 代表的な自然文クエリで期待する曲が1件以上ヒットする
  • マッチする曲が DB にない場合でも例外が発生しない
  • ユニットテストがすべて通る

関連するチケット 2 (0件未完了2件完了)

次のチケットに先行 beatoraja - 機能 #415: 自然文曲検索用ローカルLLMモデルの同梱・パッケージングと実モデル動作検証 (#404 follow-up)完了いづ さん2026/06/242026/06/24

操作
次のチケットに先行 beatoraja - 機能 #416: 選曲画面からの自然文曲検索UI (#404 follow-up)完了いづ さん2026/06/242026/06/24

操作

いづ さん さんが12日前に更新 操作 #1

いづ さん さんが12日前に更新 操作 #2

実装工数などは度外視した場合、どういう実装方式があるんだろ?

エージェント ちゃん さんが11日前に更新 操作 #3

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/404
  • 対応方針: 自然文→構造化クエリ(SongQuery)への変換を QueryInterpreter で抽象化し、背後にローカルLLM実装(llama.cpp/GGUF)とルールベース実装を配置。LLMが未同梱・ロード失敗・出力不正のときはルールベースへ自動フォールバック。後段の SongSearchService(SongData+NotesRadar+scorelogによる重み付きランキング)は完全決定論とし、ユニットテストはこの中核とJSONパースの頑健性に集中させて DoD(例外なし・テスト全通過)を満たす。外部API不使用・ローカル完結。UIは本チケット対象外(検索ロジック+API層のみ)。

エージェント ちゃん さんが11日前に更新 操作 #4

  • 次のチケットに先行 機能 #415: 自然文曲検索用ローカルLLMモデルの同梱・パッケージングと実モデル動作検証 (#404 follow-up) を追加

エージェント ちゃん さんが11日前に更新 操作 #5

  • 次のチケットに先行 機能 #416: 選曲画面からの自然文曲検索UI (#404 follow-up) を追加

エージェント ちゃん さんが11日前に更新 操作 #6

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

「☆10で短め、乱打多め、最近やってない曲」のような自然文クエリをローカルで解釈し、SongData / NotesRadar / スコア履歴を元に曲をランキング検索する機能を追加。外部API不使用・ローカル完結。本チケットは検索ロジック+API層のみ(UIは対象外)。

変更点

  • 新規パッケージ bms.player.beatoraja.song.search を追加。
  • QueryInterpreter(自然文→構造化 SongQuery)を抽象化し、ローカルLLM実装(LlamaCppInferencede.kherud:llama/GGUFをリフレクションで隠蔽・遅延ロード・全ネイティブ呼出ガード)と決定論的 RuleBasedQueryInterpreter を用意。LlmQueryInterpreter はモデル未在/ロード失敗/出力不正時にルールベースへ自動フォールバック。
  • SongSearchService(決定論中核): level/mode/bpm ハードフィルタ+パターン特徴量・長さ・recency・プレイ頻度・テキスト語のスコアリング。空corpus・不一致は空配列を返しnull/例外を出さない。
  • PlayHistoryProviderScoreDatabaseAccessor 実装+in-memoryテスト実装)、ファサード NaturalLanguageSongSearch
  • de.kherud:llama を runtime 依存に追加、.gitignoremodel/ を追加(モデルファイルは非コミット)。
  • 変更ファイル: 新規 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)

関連 MR

  • !96 (feature/404 → develop)

フォローアップ

  • #415: ローカルLLMモデルの同梱・パッケージングと実モデル動作検証(実API確定・推論のバックグラウンドスレッド化を含む)
  • #416: 選曲画面からの自然文曲検索UI

他の形式にエクスポート: PDF Atom