見出し画像

生成AIで投資掲示板分析 BOT作成 ~AI要約で超時短効率情報収集で一歩リード! (Dify x Gemini x Discord)~ #2 自動分析と画像認識

こんにちは、Rcatです。
前回は初回との変更点と分析の方法についてまとめました。
今回は、前回説明しきれなかったニュースの画像認識と今回、さらに追加した自動分析機能についてお話ししていこうと思います。

次回(配布)

前回はこちら

DIfy系目次記事


ニュースを画像認識

まず、最初にPythonによる画像認識については以下の記事で紹介しています。この内容を掲示板、自動分析botに折り込んで信頼できる情報源として使用します。
具体的なソースコードはこちらの記事で確認してください。

簡単に概要

ぶっちゃけこの機能は私のための機能です。
何のための画像認識かと言いますと、文字列をコピーできないスマホアプリから情報を取り込むためです。
私は楽天証券を使用しているのですが、このアプリはニュースも紹介してくれます。しかし、これ表示されるだけでコピーも何もできないんですね。
せっかく情報があるのに分析に使えないのでもったいないです。では、画像認識で文字列化した後、AIに要約させてデータベースに保存してしまいましょう。

ちなみにこの画像を画像認識すると以下のようになります。

note、新会社TaLes&Coを設立
05/27 08:38 株式新聞

国内株式



not e<5243.T>は 2 4 日、クリエイターの創作活動への支援と作品のポテンシ
ャルを引き出す新規事業の推進を目的に、1 0 0%子会社Ta Le s&Co. (テイ
ルズアンドコー) を設立したと発表した。

今後さらに積極的にクリエイターの創作活動を支援し、さまざまなメディアとの
連携によって作品の持つポテンシャルを最大化させてミッション実現を目指す。

前週末 2 4 日終値は、前日比2円安の5 7 7円。
[ 株式新聞ニュースKABDAS-EXPRESS]

提供 : ウエルスアドバイザー社 (2024-05-27 08:38)

る NOTE

実際の動作はこちら

認識とデータベース化

まずはデータベースの構造を紹介します。
まず、ニュースのデータベースの中には2つのテーブルがあります。なお、現状使用しているのは片方だけです。今後のアップデートで使用する予定ではありますが、優先度はかなり低いです。

mysql> show tables;
+----------------+
| Tables_in_News |
+----------------+
| Brand_News     |
| News           |
+----------------+

使用しているのはブランドニュースの方です。
こちらの中身は日付と銘柄、そしてニュースで構成されています。
例えば上で紹介しているものを取り込むと以下のようになります。
画像認識だけだとただの文字列ですが、AIを使用しているので画像の中から日付と銘柄、そしてニュースに分類してくれています。
このやり方の特徴はブランドで絞り込むことができるということです。

mysql> select * from Brand_News limit 27,1;
+----+------------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | date       | brand | news                                                                                                                                                                                                                                                          |
+----+------------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 32 | 2024-05-27 | note  | クリエイターの創作活動支援と作品のポテンシャルを引き出す新規事業を推進するため、100%子会社TaLes&Co.を設立。クリエイターの創作活動を支援し、作品のポテンシャルを最大化させる。                                                                                 |
+----+------------+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

例えば、以下のようなクエリを使ってノートのブランドで最新5件のニュースを取得すると以下のようになります。
結局1件しかないので表示は変わりませんが、このような形で新規5件のニュースを分析に追加することができるようになります。

mysql> select date,news from Brand_News where brand in ("note") order by date desc limit 5;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| date       | news                                                                                                                                                                                                                                                          |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2024-05-27 | クリエイターの創作活動支援と作品のポテンシャルを引き出す新規事業を推進するため、100%子会社TaLes&Co.を設立。クリエイターの創作活動を支援し、作品のポテンシャルを最大化させる。                                                                                 |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

画像認識のソースコード

以下が画像認識を行う部分の抜粋です。
Discordの部分もあるので、知らない方は直感的に理解しづらいとは思いますが、大まかに次のようなことをやっています。
最初に画像が添付されている場合は、それを読み込む。
次に画像認識を使ってテキスト化する。
さらにテキスト情報をAIに送って整形する。
AIから目的の応答が返ってきた場合、データベースに取り込む

伏せてある箇所ソースのダウンロード限定です。

AIのプロンプト

私なりに工夫した点をあげると次のような点があります。
画像認識であることを説明すること。
文章の中にどうしても認識できなかった文字が混ざったり、画面のレイアウトがそのまま1つのテキストとして出力されるので、変な文字列であることは当たり前ですよという風な伝え方をしています。
次に日付です。
ニュースには月と日しか書いてないので年がありません。このままAIに渡すとなんと2023年と返してきます。なので、プロンプト中に今日の日付を入力する欄があります。
さらに銘柄一覧です。
これはデータベースからニュースを引っ張る時に銘柄名でフィルターをかけるのですが、ちょっとでも違うと引っかからなくなるのが問題です。例えば"note"は"ノート"と表記されているかもしれません。あるいは画像認識で余計なスペースが入って、銘柄名にスペースの有無といった差が生じてしまうかもしれません。というか生じます。
こういった混乱を防ぐために銘柄名の一覧を入力しておき、この中にあるならこの名前を使えと指定しています。ない場合は新しく建ててもらいます。
まぁ、さすがに"ノート"を"note"という風には認識してくれないので、やる場合は"note(ノート)"というような書き方をしておく必要があります。実際こういう書き方をしている銘柄が一つだけあります。
最後に出力形式です。
ニュースには2つの場合があります。1つ目は共同開発などで1つのニュースが複数の銘柄に関連する場合。この場合はブランドごとにニュースのデータを入力する必要があります。
もう一つは同じ画像の中に複数の銘柄の情報が入っている場合です。この場合は銘柄ごとに文章を分けて入力する必要があります。
最後の出力指示には、こういった場合に対応できるような書き方にしています。ただ、あまり安定はしていません。5割くらいでうまく判定してくれればいい方でしょうか…。

ニュースのワークフロー

このニュースの画像認識のAI処理はワークフローになっています。
最初の質問分機器は銘柄ごとのニュースなのか、社会的なニュースなのかの分岐です。社会的な方は今のところ使ってはいません。

上側にhttpリクエストが2つあるのがわかると思います。
ここで銘柄の一覧と現在時刻を取得しているわけですね。
このhttpリクエストに関しては、前回の分析で紹介したワークフローの仕組みと同じです。
ワークフローってこういう後から情報を動的に入力するのにかなり使えます。AIに投げる時点で全ての情報が確定していないような状態だと非常に使い勝手がいいですね。

自動分析機能

機能概要

前回予告していなかった内容ですが、急遽新機能を搭載することにしました。その名も自動分析機能です。
この機能は掲示板への投稿件数と時間あたりを投稿数から活発な掲示板を判定し、その内容を自動で分析して結果を送ってくれるというものです。

今までは、分析を行うためにはその都度指示をする必要がありました。しかし、複数の銘柄を監視していると優先順位がつきがちです。そして、あんまり見ていなかった銘柄が急に盛り上がりだしていたらどうでしょうか?情報収集しているのに見逃しますよね。
というわけでAIに常時見てもらいましょう。活発だなと思ったものは常時分析に回し、その結果を常時送ってもらえば見逃すことはありません

なお、この機能は主に"今"を分析するための機能なので、新規50件のコメントから分析を行います。
特に値動きの激しい銘柄や決算シーズンでは真価を発揮します。

自動的に盛り上がっている掲示板を検出

例えばこちらが出力の例です。
監視している銘柄のうち、以下の5個が盛り上がっていると判定されました。確かに休日なのに件数が多いですね。

例えば、この時、自動的に出力されたレポートは以下の通りです。
ポイントは、常時分析なので細かい情報を出さず総評のみの形にしていること、投稿のスパンを明記して、どれくらい新しい情報で分析しているのか見られること、現在の株価などをコメントから拾える場合は拾うこと。
こうすることで"今"を分析することができると考えています。

AIのプロンプト

こちらが自動盛り上がり検出プロントです。
精度はそこそこでしょうか。
やってみてわかったことは厳密に閾値を指示しないと全く役に立たないということでした。
なので、判定基準やそれを支える追加情報の定義にだいぶ苦労しました。

伏せてある箇所はダウンロード者限定特典です

生の出力例は以下の通りです。
どうしてその掲示板を判定したのかという理由を出力させることで正常に動作しているかどうか確認できます。
テキスト生成AIは基本計算できませんが、この程度であれば問題ないみたいですね。

活発判定のワークフロー

こちらの機能に関してはワークフローで完結させてみました。
今までと同様、各掲示板の投稿状況をhttpリクエストで取得してプロンプトに付け加えてからAIに流すというワークフローです。
httpリクエストはJSONで結果を返すので、それをプロンプトに直すPythonコードも間に挟んでいます。

このワークフローを呼び出す部分は以下の通りです。
事前にプロンプトなどを作らず、ただワークフローを呼び出しているだけです。かなりシンプルになっています。
ワークフローから活発な掲示板が返されるので、それらをループで回しています。
一番最後の"Each_Analysis"関数が個別の分析になります。

個別分析のワークフロー

個別の詳細分析に関しては、今までの分析用ワークフローをそのまま使っています。
上の方が通常の分析用のルートで、下の方が今回の簡易分析のルートです。
ワークフローを使うことで、パラメーターによる分岐を行い。たくさんのボットを作らなくても、1つのワークフローの中で管理できるというメリットがあります。

まとめ

今回は後半部の紹介を行いました。
画像認識によるニュースという信頼できる情報の追加とリアルタイム投稿分析による情報の見逃し回避ができるようになりました。
最初はただ分析を楽にできればと考えていましたが、とうとう完全自動化まで来てしまいました。自分の時間が完全にフリーになりましたので、自分の方ではこれらの分析を踏まえ、テクニカルでもやってみる余裕も生まれますね。もちろん他のことに時間を使いたいというのであれば、そういうのも全然いいと思います。ともかく、情報収集と分析いう手間のかかる作業をすべてAIにやらせることができました。
次回はここまでの内容で出来上がったボットの使い方紹介と全てのデータの配布となります。
それではまたお会いしましょう。


情報が役に立ったと思えば、僅かでも投げ銭していただけるとありがたいです。