自然文検索・自然言語検索をWebアプリに実装する時の考え方
自然文検索は、価値を体感しやすいAI機能です。ユーザーが普通の文章で希望を書き、プロダクトがその意図を使える検索結果に変えます。
実装で重要なのは、AIの解釈を確認できる形にすることです。ユーザーが見えない判断をそのまま信じる必要があってはいけません。B2C・BtoBで機能するパターンは同じです。モデルは「構造化された条件」を出力し、プロダクトはそれを描画・編集・確定的に実行する。流暢さは入力側だけ、結果ページは依然としてプロダクトです。
AI生成フィルターを見せる
モデルが検索条件を作るなら、その条件を表示します。フィルターは見える、編集できる、結果一覧とつながっている状態が理想です。
これは、不動産、採用、購買、サポート、文書検索、社内ツールなど、ユーザーが「なぜこの結果なのか」を理解する必要がある領域で特に重要です。
最初に作るフィルターには次のようなものがあります。
必須条件と任意条件
除外条件
並び替えの優先度
信頼度や曖昧さのメモ
リセットしやすい導線
具体的なパターン:ユーザーが文章を入力 → モデルが構造化クエリを返す → プロダクトが結果一覧の上部にチップとして描画。チップは編集可能。編集すると再検索。テキスト入力欄も残し、自然文で再修正できる。
```ts
// Zod / Pydantic / JSON Schemaで強制する出力スキーマ
type ParsedQuery = {
filters: {
location?: { name: string; radius_km?: number };
price_max?: number;
bedrooms_min?: number;
must_have: string[]; // ["バルコニー", "南向き"]
nice_to_have: string[]; // ["公園近く"]
exclude: string[]; // ["1階"]
};
sort: "price_asc" | "newest" | "best_match";
ambiguities: Array<{ field: string; note: string; confidence: number }>;
raw_input: string;
};
```
チップはこのオブジェクトのフィールドに直接バインドされます。DBへ実際に飛ぶクエリは、自由形式のLLM出力ではなく、構造化条件から生成された決定論的なSQL/Elasticsearchです。この分離があるからこそ、同じUIをテスト・ページング・キャッシュ・監査できます。
曖昧な入力(「若い家族が静かに暮らせる場所」)に対しては、モデルが解釈案と信頼度をアノテーションします。UIはツールチップ付きのソフトチップとして表示:「『静か』を『道路騒音スコア低』として解釈中。クリックで変更」。ユーザーは常に1クリックで解釈を訂正できます。
チャットボット化しすぎない
チャットボットが役立つ場面もあります。ただし、多くのWebアプリでは会話よりプロダクトの操作部品が重要です。自然文検索でも、地図、表、保存検索、カード、ダッシュボード、承認キューを使えます。
会話が役立つよりむしろ邪魔になりがちな領域:
結果件数が多いドメイン。 不動産、求人、カタログ。ユーザーはスキャン・比較・ピン留めしたい、会話の履歴をスクロールしたくない。
繰り返しワークフロー。 同種の検索を毎日行う場合、再入力よりチップが勝つ。
多条件の絞り込み。 「価格上限だけ上げて他は維持」は会話に弱く、チップに強い。
モバイル。 地図+カードはスマホでチャットスレッドに勝つ。
AIは意図を変換する。プロダクトはユーザーの判断を助ける。チャット入力欄は「多数の入力要素の1つ」として残せばよく、それ自体がUIの全てになることは稀であるべきです。
1つの検索ジャーニーから始める
最初のスプリントでは、1つの検索ジャーニーに絞ります。1つのデータセット、1つのユーザータイプ、1つの結果画面、1つの成功指標を選びます。
実務的な2週間の構築:
Day 1-3. 構造化クエリスキーマとチップUIを定義。最初の版は手書きクエリで動かし、モデルはまだ入れない。
Day 4-7. フリーテキスト→スキーマ変換のLLMステップを追加。厳格JSON出力、検証失敗時は1回だけ修復プロンプトでリトライ。手ラベルした実クエリ30〜50件で校正。
Day 8-11. 曖昧性の可視化、保存検索、副次的な結果画面1つ(地図、表、グルーピング)を追加。
Day 12-14. ログ、評価レポート、次に追加すべきデータセット・ジャーニーに関する書面の推奨。
そうすると実装を測定しやすくなります。さらに、検索対象、ランキングロジック、API連携を広げる前に、買い手が実際に試せるものになります。スプリント終了時に効く指標:クエリ→結果の成功率、チップ編集率(低いほどAIがユーザーを正しく読めている)、結果ゼロ率、最初の有用クリックまでの時間。どれもチャットボットを必要としません。