【要約】Oracle Database の `CONTAINS` で作る keyword 検索 [Qiita_Trend] | Summary by TechDistill
> Source: Qiita_Trend
Execute Primary Source
// Problem
RAGシステムを構築する開発者が、ベクトル検索だけでは特定の情報を正確に拾えない問題に直面している。意味的な類似性のみに頼る検索では、以下の要素の抽出が困難である。
- ・規程名、品番、エラーコードなどの厳密な一致が必要な文字列
- ・部署名や固有名詞といった特定のキーワード
- ・「文字として一致してほしい」というユーザーの検索意図
// Approach
開発者は、Oracle Textを用いてキーワード検索と業務フィルタリングを統合した実装を採用した。具体的には、以下のステップで検索基盤を構築している。
- ・Oracle TextのCTXSYS.CONTEXTインデックスを作成し、WORLD_LEXERとstoplistを設定する。
- ・Python側でユーザー入力を正規化し、Oracle Textの演算子やストップワードを除外する。
- ・漢字をルールベースで分解し、ACCUM演算子を用いて複数キーワードのスコアを算出する。
- ・検索SQL内で業務条件(tenant_id等)とCONTAINSを組み合わせ、SCORE関数で順位付けを行う。
// Result
実装により、RAGにおける検索精度の向上と、業務要件に即した検索結果の取得が実現された。
- ・「社内規程の申請フロー」といった自然文から、適切なキーワードを抽出し、高いスコアでヒットさせることに成功した。
- ・演算子を含む複雑な入力に対しても、安全にキーワードのみを抽出して検索を実行可能にした。
- ・SCORE関数と安定ソートの組み合わせにより、検索結果の再現性と一貫性を確保した。
Senior Engineer Insight
> 実戦的な設計である。特に、DB側のstoplistとアプリ側の正規化ロジックを同期させる設計は、検索の不一致を防ぐ上で極めて重要だ。また、SCOREを用いたランキングと、業務フィルタを同一SQLで処理する構成は、レイテンシと整合性の両面で理にかなっている。ただし、形態素解析に頼らない漢字分解は、複雑な語彙に対して精度が落ちるリスクがある。ドメイン知識に基づいた正規化の継続的なチューニングが、運用フェーズでの鍵となるだろう。