
こんにちは、CCCMKホールディングスAIエンジニアの三浦です。
私たちの部門では毎週LT会を開催していて、各自が持ち回りで資料を作って発表をしています。私も発表しているのですが、数年続いていることもあり、かなりの量の発表資料になってきました。これらの資料はとりあえず社内のストレージ内に保管しているのですが、せっかくならこれまで自身が築いてきた知見をもっと活用できるような形にしたいな、と考えるようになりました。
たとえば「LLMのFine-Tuningのやり方ってどこに書いてある?」とか、「画像解析についてこれまでどれくらい発表したっけ?」なんていう問い合わせに答えることが出来る仕組みです。
ちょうど今自分自身が興味を持っているテーマとして、非構造化データをどうやって構造化して管理するのか、といったものがあります。ここ最近の私の記事ではそれを解決するためにSnowflakeのAISQLの1つであるAI_EXTRACT関数を使うアイデアをご紹介してきました。
今回はいったんその集大成としてAI_EXTRACT関数を使って自身の過去のLT会の資料(pptxファイル)を構造化してSnowflakeのTableとして格納、さらにSnowflakeのAI機能のCortex AnalystとCortex Searchと連携、そしてAI Agent機能のCortex AgentのToolとして設定し、以下のように自然言語でLT会のファイルを探し出すことが出来るような仕組みを作るまでの流れをご紹介したいと思います。

LT会の資料をどうやって構造化するのか
まず考えたことはLT会の資料をどういった観点でまとめるべきか、という点です。元のファイルを参照できるようにしたいのでファイル名は含めたいですし、いつ作成された資料なのかも必要です。また、ファイル名とスライドタイトルが異なる場合があるのでファイル名とは別にタイトルも含めたほうが良いですし、今後チーム全員のファイルを同じように管理することを想定すると作成者も必要になります。これらはファイルのメタデータと捉えることが出来ます。
そして当然ながらファイルに書かれているコンテンツも構造化データに含め、検索が出来るようにしたいです。

構造化処理の具体的な実装方法
メタデータとコンテンツデータ両方ともAI_EXTRACT関数で実現することが出来ます。
メタデータ
まずメタデータをドキュメントから取得する処理です。SnowflakeのSQLクエリで実装しました。作成日は私が時々資料の中に書くことを忘れており、取得が出来ないケースがあったのでその場合は"1900-01-01"をセットしてDATE型で格納するようにしました。
実装したSQLは以下のような内容です。
SELECT SHA2(T.FILE_NAME,224) AS FILE_ID, T.FILE_NAME AS FILE_NAME, T.response:AUTHOR::STRING AS AUTHOR, T.response:TITLE::STRING AS TITLE, T.response:CATEGORY::STRING AS CATEGORY, COALESCE(TRY_TO_DATE(T.response:DATE::STRING), TO_DATE('1900-01-01')) AS DATE FROM ( SELECT FILE_NAME, AI_EXTRACT( file => TO_FILE('@PPTX', FILE_NAME), responseFormat => [ ['AUTHOR', 'Who is the author of this document?'], ['TITLE', 'What is the title of this document?'], ['DATE', 'Tell me the date of this document in the YYYY-MM-DD format.'], ['CATEGORY','Which of the following fields is this document most closely related to: LLM, IoT, ML or Engineering?'] ] ):response AS response FROM FILE_LIST ) AS T;
実行すると以下のような情報が取得できました。

コンテンツ
コンテンツ取得用のSQLは前回の記事で作成したものと同様です。以下の用な情報をコンテンツとして取得できました。

Cortex AnalystとCortex Searchの連携
これで資料のメタデータとコンテンツデータをそれぞれ取得することが出来ました。それぞれのデータへは、メタデータは通常のSQLクエリを通じて、コンテンツデータは自然言語によるクエリを通じてアクセスするのが良さそうだと考えました。Snowflakeにはそれぞれに特化したAI機能があり、Cortex Analystをメタデータに、Cortex Searchをコンテンツデータに接続することで、いずれも自然言語でデータにアクセスが出来るようになります。
メタデータをCortex Analystに接続
メタデータが格納されたテーブルをCortex Analystに接続します。テーブルに含まれるカラムがどのような意味を持っているのかなどをセマンティックモデルというyaml形式のファイルに書き込んでいきます。直接yamlを編集するのではなくSnowsight(SnowflakeのWebUI)上で編集することが出来ます。

コンテンツデータをCortex Searchに接続
コンテンツデータには、コンテンツの内容を示すテキストが含まれています。こういったテキストカラムに対し、埋め込みモデルと単語検索を組み合わせたハイブリット検索の機能を提供するのがCortex Searchです。
こちらもSnowsightから設定することが可能です。
Cortex Agent
最後にSnowflakeのAgent機能であるCortex Agentに先ほど作成したCortex AnalystとCortex SearchをToolとして与えます。するとCortex Agentがユーザーからの指示に応じて最適なCortex AgentやCortex Searchを最適な方法で呼び出して必要なデータを抽出し、回答を生成してくれるようになります。

まとめ
ドキュメントをどういった観点で管理するのか、という課題はけっこう突き詰めると難しい問題だな、と最近考えています。出来るだけ全ての情報を取っておきたいけど、そうすること今度は管理が難しくなる。このあたりの線引きは、ケースバイケースなのかもしれません。
今回はSnowflakeのAI_EXTRACTで必要な情報だけを構造化データ化し、SnowflakeのAIで有効活用する、といったことにトライしてみました。結構役に立つような仕組みが作れそうなので、このまま本格的に作りこんでいこうかな、と考えています!