電通総研 テックブログ

電通総研が運営する技術ブログ

ナレッジグラフを搭載した検索システム

みなさんこんにちは!電通国際情報サービス(ISID)クロスイノベーション本部 AIトランスフォーメーションセンター(AITC)インドネシア出身のファイサル ハディプトラと申します。この記事は 電通国際情報サービス Advent Calendar 2022 の12月7日の記事です。 先日、TECHPLAYで「AI搭載検索システム」について登壇いたしました。 Techplayイベントページ

今回は、AI搭載検索システムに関連する「ナレッジグラフを搭載した検索システム」について紹介します。

AI搭載検索システム

検索といえば、皆さんはきっとGoogle検索をイメージしています。最近のGoogle検索は、昔とは違ってAI技術を活用することで、ただのキーワード検索を超えた特徴を持っています。Google検索に慣れているほとんどのユーザーは検索システムを使用するときに、以下のようなことを期待します。

  1. ドメイン理解(Domain-aware):ユーザーのクエリ内のキーワードに該当する概念を認識して自動的にその概念のカテゴリや属性などをクエリに付加する。例えば:「ISID」というクエリを打ったときに、「会社」のカテゴリ、「電通国際情報」の別名、と「品川」の本社所在地などの情報をクエリに付加する。
  2. 文脈とユーザーの理解(Contextual and Personalized):ユーザーの好み・プロフィールを考慮してクエリと検索結果の関連度を調整する。例えば:エンジニアが「Python」というクエリを打ったときに、蛇のPythonではなく、プログラミング言語Pythonを記載する記事を返す。
  3. 対話型(Conversational)自然言語を理解し、前に検索したものを考慮する。例えば:「コロナ」と検索した後、次に「mrna」と検索すると、モデルなのワクチン情報が出てくる。
  4. マルチモーダル(Multi-modal):テキストに限らず、音声、画像、映像などに対応する。
  5. 知能的(Intelligent):データが溜まっていけばいくほど自己改善する。例えば:誤字自動訂正や自動補完機能がだんだん賢くなる。
  6. 支援型(Assistive):検索以上に自動的に適切なアクションを実行する。例えば:映画名を検索すると、検索結果カードの下の部分で「予約ボタン」が表示される。

これらの特徴は共通のゴールを持っています。ユーザーの意図(ユーザーが探したいもの)を理解することです。ユーザーが探したいものは、ユーザー自身しか分からないので、検索システムの開発側はユーザー意図を3つの次元に分割し、それぞれの次元を定量化します。

  1. コンテンツ理解:検索対象文書とユーザーが入力したキーワードのクエリそのものを理解する。
  2. ユーザー理解:検索システムのユーザーの好みやプロフィールを理解する。
  3. ドメイン理解:検索システムをデプロイする業務/ドメイン知識を理解する。

次のベン図に書いていたように各次元の代表技術と2つの次元を組み合わせた技術が記載されています。 ユーザー意図を理解するための次元

  1. コンテンツ理解 → キーワード検索(全文検索
  2. ユーザー理解 → 協調フィルタリング(推薦システム)
  3. ドメイン理解 → ナレッジグラフ
  4. コンテンツ理解 + ユーザー理解 → パーソナライズド検索
  5. ユーザー理解 + ドメイン理解 → マルチモーダル推薦
  6. コンテンツ理解 + ドメイン理解 → セマンティック検索

今回は、ナレッジグラフを搭載したセマンティック検索システムを紹介します。

ナレッジグラフを搭載したセマンティック検索

検索エンジン

ナレッジグラフを導入する前に、まず、検索エンジンの構成を解説します。検索エンジンでは、文書データを転置インデックスというデータ構造で管理しています。転置とは、本の索引のように、単語の一覧を並べて、その単語を含む文章にひも付いています。転置インデックスとしてデータを管理することで検索スピードが速くなります。

検索エンジンの仕組み

転置インデックスができたら、ユーザーがクエリを入力する時に、以下の処理を行います。

  1. クエリの解析:クエリをキーワード・単語に分割します。
  2. フィルターリング転置インデックスからそれらのキーワードを含む文書を取得します。
  3. 関連度の計算: 取得した文書とクエリの関連度を計算します。計算方法は様々ですが、よく使われるのはBM25です。
  4. 検索結果提供:最後に、関連度順で文書を並べてユーザーに返します。

検索エンジンを仕様することで、文書入れるだけでOut-of-the-boxで全文検索ができます。最初は、このようなキーワード検索だけで十分に情報検索ができますが、データがだんだん溜まっていけばいくほど、キーワード検索だけで得られない場合が多いです。例えば、Eコマースのシステムを例にして、ユーザーがiPadをクエリとして検索するときに、出てくるのは「iPadのケース」や「iPadの充電器」などiPad本体ではありません。

キーワード検索でいい結果得られない

この場合は、明らかに生のキーワード検索だけで、ユーザーが探したい情報を得ることはできません。1つの解決方法としては、ユーザーのクリック情報を収集して協調フィルタリングといった方法を使用して、検索結果を調整するのはできます。ただし、このアプローチの欠点としては、ユーザーの行動が制御できず、データの偏りが生じると、変な検索結果が出ています。そのために、今回は、ナレッジグラフを導入して、検索対象データとクエリに意味を持たせるべきです。

ナレッジグラフ

ナレッジグラフとは、簡単に言うと人間の知識をグラフ形式で表現するものです。世の中での定義は様々ですが、検索の文脈では、人の知識を表現するために5つのレベルで表現できます。

  1. 言い換え(Alternative Labels)同じ意味を表現する単語。例えば:チョコレート => チョコ;国際連合 => 国連。
  2. 同義語・類義語(Synonyms)近い意味を表現する単語。例えば:人間 => 人、人類;食べ物 => 食材、食料、フード、食品。
  3. 分類体系(Taxonomy)ものを階層的なカテゴリに分類する。例えば:加藤ーIS_A→人間、人間ーIS_A→哺乳類、哺乳類ーIS_A→動物。
  4. オントロジー(Ontology)ものの種類(タイプ・クラス)の関連性を表現する。例えば:動物ー食べる→食べ物、人間
  5. ナレッジグラフ(Knowledge Graph) オントロジーインスタンス化したものを同じグラフで表現する。例えば:加藤ーIS_A→人間、加藤ー食べる→食べ物

基本的に、ナレッジグラフは構造データであるので、データを簡単に探索できます。例えば、Google検索で「日本」というクエリを打った時に、検索結果の右側に日本のナレッジパネルが出てきます。そのナレッジパネルから日本の首都である「東京」をクリックすると、東京のナレッジパネルをすぐに表示できます。

セマンティック検索

ナレッジグラフと検索エンジンの双方の利点を活用するとセマンティック検索が実現できます。セマンティック検索では、ユーザーが打ったクエリからエンティティ(Entity)と関係(Relation)を抽出します。そして、「エンティティ」と「関係」の情報を使って、以下の処理を行うことができます。

[1] 得られた情報がたどり着くまでナレッジグラフに対してグラフ走査(Graph Traversal)を行います。 例えば:「ISID近くの中華」、解析結果のイメージは以下のとおりです。

  • 対象クラス: 中華レストラン
  • 絞り込み条件:
    • 距離:
      • 条件:近い(5km以内)
      • 原点:京王品川ビル(ISID本社)

この解析結果をもとに、GraphQL、Cypher QL(Neo4j)、SPARQLなどに変換すれば、グラフ走査を行うことができ、最後に対象ドキュメントまでたどり着きます。

Cypher Scriptのクエリイメージは以下のとおりです。

MATCH (a: Article)-[:HAS_MENTION]->(r:ChineseRestaurant)
MATCH (c: Company {english_name: ISID})-[:HAS_HEADQUARTER]->(o:Office)
WHERE point.distance(r.geolocation, o.geolocation) <= 5000
RETURN a

ナレッジグラフ アプローチ[1]では、高度なセマンティック解析処理と高度なセマンティック情報を持つナレッジグラフが必要で、難易度が高いです。もちろんこのようなシステムを実現できれば理想的であるが、人手で作るのは大変ですし、自動で作るのはかなり難しいです。

[2] 関連するエンティティをナレッジグラフから抽出してクエリを拡張してから検索エンジンにクエリを入力します。

このアプローチでは、クエリを解析して直接ナレッジグラフから答えを抽出するのではなく、ナレッジグラフから情報を抽出して、クエリを拡張します。

同じ例の「ISID近くの中華」ですと、ISIDという言葉は「電通国際情報サービス」や「品川」で、中華という言葉は「レストラン」や「中華料理」などナレッジグラフから抽出します。そのあと、オリジナルクエリにそれらの言葉を追加して、検索エンジンのクエリを作って投げます。

has_relatedナレッジグラフ

Elasticsearchのクエリイメージは以下のとおりです。

{
    "query":{
        "query_string": {
            "fields": ["title", "body", "category"],
            "query": "(ISID^10 OR 電通国際情報サービス OR 品川) AND (中華^10 OR レストラン OR 中華料理)"
        }
    }
}

アプローチ1に比べて、このアプローチの方がより現実的です。高度なセマンティック情報を持つナレッジグラフの必要性が低く、has_related_termsという関係性を表現したナレッジグラフで十分です。もちろん、アプローチ1の方は検索精度が高いですが、最初の段階で、このアプローチはやりやすいと考えられます。

まとめ

今回は、検索システムにナレッジグラフの導入イメージを紹介しました。イメージがつくように簡単なNeo4jのCypherスクリプトとElasticsearchクエリの例をあげてみました。ナレッジグラフを活用する前に、ナレッジグラフ構築が必要で、このステップは一番大変だと思います。ISIDでは、日本語の文書からナレッジグラフを構築する技術の研究を行っています。


私たちは同じチームで働いてくれる仲間を探しています。今回のエントリで紹介したような仕事に興味のある方、ご応募をお待ちしています。

執筆:@faisalhadiputra、レビュー:@yamada.yShodoで執筆されました