
こんにちは、CCCMKホールディングスAIエンジニアの三浦です。
9月下旬になり、朝晩は少しずつ涼しさを感じるようになりました。私は四季の中で秋が好きなので、これからがとても楽しみです。
最近マニュアルや提案書といったドキュメントをAIで活用するため、どのようにそれらのデータを加工したらいいんだろう、ということを考えていました。
先日参加したSnowflakeのイベントでエンジニアの方々と情報交換させていただいた際にSnowflakeのAISQL関数"AI_EXTRACT"が使えるんじゃないか、といったアイデアをお聞きし、それ以来色々と試してみています。
そんな中、「このアプローチはいいかも」と思った方法を見つけたので、今回はその内容についてまとめてみたいと思います。
ドキュメントをまとめる観点
そもそもマニュアルや提案書などのドキュメントはどのように加工してデータベースのテーブルに格納するのがよいのでしょうか?私はあらゆるドキュメントをまとめる際の根幹には、ドキュメントの中には必ずいくつかの"コンテンツ"が含まれており、それらのコンテンツについて"何が書かれているのか?"といった観点があるんじゃないか、と考えました。
つまりドキュメントに含まれる"コンテンツ"と"それについて何が書かれているのか"をドキュメントごとに抽出することが出来れば様々な形式のドキュメント全体の内容を把握し、かつ統一した形式で格納することが出来そうです。
データ加工プロセスにAIを組み込む
問題は様々な形を持つドキュメントに対し、"コンテンツ"と"何が書かれているのか"をどうやって抜き出すか、です。ドキュメントの形式は様々なので、その中でコンテンツがどのように提示され、どのように説明されているのかはドキュメントごとにバラバラです。このドキュメントはこの処理で、あのドキュメントはあの処理で・・・のようにドキュメントごとに処理を個別に実装するのはかなり大変です。
そこで最近ではAI、特に生成AIをデータ加工プロセスに活用するアプローチが使われることが多くなってきているようです。ドキュメントからOCRに特化したAIでテキスト情報を抜き出し、LLMで要約やタイトルを生成し、格納するなどです。
Snowflakeはデータ加工プロセスで使えるAISQL関数がいくつか用意されています。OCRが出来るAI_PARSE_DOCUMENT, タイトルなどの特定の情報を抽出するAI_EXTRACTなどがそれに該当します。
AI_EXTRACTで様々なドキュメントに対応する
さて、今回はドキュメントからまずその中に含まれるコンテンツを抜き出し、そのコンテンツについての要約を生成させる、という流れをSnowflakeのAI_EXTRACTだけで実現します。2段階に分けてAI_EXTRACTを実行する流れで、以下のようなステップを取ります。
AI_EXTRACTを使ってドキュメントに含まれるコンテンツをリストで抽出- 抽出したコンテンツごとに
AI_EXTRACTでそれについてドキュメントの中で何が書かれているのかの要約を生成
この2段階の処理によって、もともとバラバラに書かれていたドキュメントの内容(非構造化データ)を「コンテンツ」や 「それに関する要約」といったテーブル形式のカラムに整理でき、つまり“構造化”された形でデータベースに格納できるようになります。
図にすると以下のようになります。

SQLによる実装
SQLで実装しました。AI_EXTRACTに与えるプロンプトは英語の方がうまく動作する印象を受けました。また、プロンプトの先頭に"List: "を付けると配列で結果を取得できるようです。複数抽出したいコンテンツは、この方法で取得しています。
---コンテンツリストの抽出 WITH CONTENTS AS( SELECT AI_EXTRACT( file => TO_FILE('@STAGE','document.pptx'), responseFormat => [ ['CONTENT', 'List: Please tell me what are the contents of this document?'] ] ):response AS CONTENT ) --コンテンツに対し要約を生成 SELECT F.VALUE AS CONTENT, AI_EXTRACT( file => TO_FILE('@PDF','document.pptx'), responseFormat => [ ['SUMMARY', CONCAT('Please provide a detailed summary of what is written about ',F.VALUE,' in this document.')] ] ):response:SUMMARY AS SUMMARY FROM CONTENTS, LATERAL FLATTEN(input=>CONTENTS.CONTENT:CONTENT) AS F;
実験
社内のLT会やSnowflakeのユーザー会向けに作ったパワーポイントのドキュメントを使って試してみました。
LT会の資料はMCPが盛り上がってきた今年度のはじめくらいにMCPについてまとめた資料です。

Snowflakeのユーザー会の資料はCortex Analystの精度をCortex Searchを使って改善する取り組みをまとめた資料です。

それぞれ以下のようにテーブル形式のデータを抽出することが出来ました。


ドキュメント全体の内容を把握することがそれなりに出来ていると思いました。
まとめ
いかがでしょうか。実はAI_EXTRACTを1回呼び出して要約を生成させることも出来るのですが、内容に偏りがあるように感じていました。今回のように2回に分けてAI_EXTRACTを実行することでドキュメント全体に含まれるコンテンツを網羅した要約を作成することが出来ました。
AIを使ってどうやってデータを加工していくのか、という課題がこれからも出てくるんじゃないかと感じています。今後も色々と調べていきたいと思っています!