💰

Snowflake Intelligenceで実現するデータ分析レポート執筆の自動化(第4回金融データ活用チャレンジ)

に公開

はじめに

SIGNATEで(金融庁共催)第4回金融データ活用チャレンジ が2026/1/14 ~ 2/11まで開催されています!
本コンペティションでNowcastとしてSnowflake勉強会を開催したので、

  • ソリューションの具体的な内容
  • どういう思考でこのソリューションを選択したのか
  • 具体的な実装など

をお伝えします!!

今回構築したリソースは以下のGitHubリポジトリで公開しています。
お手軽にSnowflake Intelligenceを試したい方、ぜひこちらご活用いただけますと嬉しいです!

https://github.com/TakumiMukaiyama/FDUA-competition-template

コンペの概要

内容

コンペでは、10社企業に対して、財務データと有価証券報告書を分析し、成長戦略を提案するレポートを作成します。

使用データ

コンペでは以下のデータが提供されます。

  • 企業情報:仮想の建設・工事関連企業10社分の財務データおよび企業属性データ。
  • 定性データ(有価証券報告書):企業ごとの事業内容、リスク情報、経営方針など
  • 定量データ(財務・属性データ):企業ごとの基本情報(所在地、業種等)、主要な財務諸表項目(PL、BS、CF)など

有価証券報告書についてはpdfファイル、それ以外のデータはcsvファイルとして提供されました。

評価基準

成果物の提案書は以下の観点で評価されます。

評価視点 評価のポイント
1. 全体構成 過去3年の財務・事業分析(Past)と、未来への成長戦略(Future)が一貫した因果関係で論理的に接続されているか
2. 地域性 企業の所在地(商圏、人口動態、行政施策)を踏まえ、画一的ではない地域密着型の提案ができているか
3. 業界特性 官公庁/民間、元請/下請などの販路特性を把握し、それに応じた具体的な分析・提案となっているか
4. 業界課題1 低コスト工法、環境技術(GX)、省力化技術(DX)など、技術トレンドへの投資や対応策を提案できているか
5. 業界課題2 工事需要の変化や深刻な人手不足(2024年問題、外国人材受入等)に対し、実効性のある解決策を示せているか

提出する成果物

提出物は以下の3点セットです。単にレポートを生成するだけではなく、再現性確保のためのログや人間がAIの生成をどう取捨選択したかまで提出することが求められています。

  1. 提案書: 各仮想企業の将来に向けた成長戦略案(計10ファイル)。
  2. プロンプトログ: 生成AIに入力した指示文と出力結果の完全な記録(再現性担保のため)
  3. 検証プロセスレポート: AIの出力を人間がどのように検証・修正・採用したかを記述したドキュメント

ベースラインソリューション

Snowflakeを使ったソリューションの概要図です。

architecture

ソリューションの推しポイント

今回作ったソリューションで気に入っている点は以下の3点です。それぞれどのような意図でこの処理を選択したのかを説明していきます。

有価証券報告書をAI_PARSE_DOCUMENTで抽出したテーブルとCortex Searchを両方用意

有価証券報告書(PDFファイル)をAI_PARSE_DOCUMENTで抽出し、テーブルとして保存した上でCortex Searchを用意しました。

今回は、有価証券報告書の包括的なデータを十分に活かすことが必要だと感じたため、RAGだけではなく、FullContextを与えられる手法を取りました。その際に、SnowflakeのAI_PARSE_DOCUMENTを活用して有価証券報告書の全文を抽出し、SECURITIES_REPORTS_TEXTテーブルとして保存しました。このテーブルには、ドキュメントのメタデータ(企業コード、ファイル名など)と全文のカラムが含まれています。

以下はSECURITIES_REPORTS_TEXTテーブルの構造とデータの例です。

企業コード ファイル名 全文
11111 有価証券報告書(11111).pdf 第1章 企業の概況
1. 企業の目的及び事業の内容
当社は、茨城県を中心に総合建設・土木工事を手がける企業として...

第2章 事業の状況
1. 事業の内容
(1)事業の概要
当社は、公共工事を中心とした建設工事を主要事業としており...
22222 有価証券報告書(22222).pdf 第1章 企業の概況
1. 企業の目的及び事業の内容
当社は、高知県を中心にホールディングス事業を展開する企業として...

これにより、指示に応じて会社の財務データや企業情報を取り出し、基本情報を押さえつつ、有価証券報告書を全文読ませることで、きめ細やかな提案ができるように意図しました。

また、Cortex Searchは提案レポートをまとめる上で、特定の項目やセクションについて追加で情報が欲しいとき用に用意しました。

企業情報・定量データのSemantic Viewを用途別に分離

企業情報、定量データについては、Semantic Viewを分けた上で、用途別に呼び出せるようにしました。

今回csvデータとして渡されたデータは、行数は少ないものの列が90列ほど存在しました。
Snowflake Semantic Viewの作成手順内で50列以内が推奨されています。全てを1つのSemantic Viewに入れるのはノイズになるという判断から、取得したいデータの種別ごとにSemantic Viewを

  • 基本情報 + 損益計算書(P/L)
  • 貸借対照表(B/S)- 資産側
  • 貸借対照表(B/S)- 負債・純資産側 + キャッシュフロー

の3つに分けてCortex AgentにToolとして与えました。

https://github.com/TakumiMukaiyama/FDUA-competition-template/blob/main/snowflake_setup/07_create_semantic_view.sql

Cortex AgentにWord出力用のCustom Toolを提供

Cortex AgentにWord出力をさせるCustom Toolを与えることで、生成AIの思考過程をわざわざコピペしなくても成果物を出力できるようにしました。

単純に分析をさせるだけであれば、このCustom Toolを作らなくても良かったです。一方で、分析結果をコピペして書き直すという作業がユーザー体験として良くないと感じたため、このCustom Toolを構築しました。Snowflakeでは高機能なAgentを簡単に作れて、かつToolを実装すればさまざまなユースケースに対応しうることを見せたかったという意図もあります。

https://github.com/TakumiMukaiyama/FDUA-competition-template/blob/main/snowflake_setup/09_create_custom_tools.sql

処理の中身は、

  1. Cortex Agentが出力したい文字列をStored Procedureに引数として渡す。
  2. Stored Procedureが実行されて、Wordファイルを作成。
  3. 作成したWordファイルをSnowflake内部ステージにPUT。
  4. 作成したファイルに対して、PreSigned URLを発行。

としました。発行したPreSigned URLをAgentに返り値として渡すことでその場で生成結果がダウンロードできるようになっています。
実際に生成している画面がこちらです。

word export from snowflake intelligence

実際に出力したWordファイルがこちらです。もっと汚い状態で出てくるかと思っていたのですが、表紙と本文分けてくれてたり、ちゃんとセクションを作ってくれたりと気が利いてました。


プラスαの工夫ポイント

  • Snowflake Market Placeの利用
    SnowflakeではMarketPlaceでデータを提供してくれていたり、Cortex Knowledge Extentionというすぐ使えるRAGを提供してくれていたりします。無料で使える範囲でも外部データとして取り込むのはより良いレポートを作ることができそう。

  • Web検索を行うCustom Toolの構築
    今回、データとしては基本的に会社の情報のみを与えてレポート作成しました。最近よくある物価上昇、金利の情報とかは一切入っていないのでWeb検索を行うことでより扱う情報に幅を持たせることができそう。

まとめ

本記事では、第4回金融データ活用チャレンジ向けに構築したBaselineソリューションについて紹介しました。

Snowflakeでは、高機能なAgentを簡単に構築でき、Toolを実装することでさまざまなユースケースに対応できることができます。また、非構造化データの処理から構造化データの分析、最終的な成果物の生成まで、すべてをSnowflake内で完結できることも大きなメリットです。

構築したリソースはGitHubリポジトリで公開していますので、Snowflake Intelligenceを試したい方はぜひご活用ください。

Finatext Tech Blog

Discussion