見出し画像

生成AIで投資掲示板分析 BOT作成 ~AI要約で超時短効率情報収集で一歩リード! (Dify x Gemini x Discord)~ #1 前回のおさらいからデータベース化、分析のワークフロー化まで

こんにちは、Rcatです。
なんかタイトルがめっちゃ長いですが、今回は下記記事の続きです。
この次くらいでBOT配布にしたいと考えています。

配布はこちら

DIfy系目次記事

Discordのbotの方が組み上がったところで記事を書こうと思ったのですが、仕様を変更するうちにだんだん収集がつかなくなってきてしまいまして、今回一旦仕切り直そうと思います。
前回までの内容と重なるところもありますが、ご了承ください。

次回はこちら


本シリーズはこちら

この記事でやることとおさらい

発端

さて、まずはこの記事を初めて見る方向けにやることを説明します。
一言でまとめると投資に関する情報収集と分析の自動化が目的です。1つの銘柄だけであれば大した手間ではありませんが、さすがにそんなことをしてる人はいないですよね。それにいろんな情報が仕入れておいた方が世の中の流れも分かってくるので、意外と他で役に立ったりします。

情報収集について

ではどうやって情報を収集しましょうか?
毎日銘柄名で検索してニュース見ますか?
Xで情報を探しますか?
めんどくさいですね。
こういうことこそ、今流行りのテキスト生成AIにやらせるべきです。
テキスト生成AIは文章の要約なんてお手のものです。一気に情報突っ込んで分析させればいいだけです。楽になりますね。

では、どうやって情報を仕入れるかですが、非常にありがたい機能を提供しているYahooファイナンスから仕入れます。
yahooファイナンスのインターネット掲示板はRSSに対応しています。
RSSとは専用のRSSリーダーというものを使って、1つの画面に様々な情報を集約させるためのフォーマットです。
今回はここからコメントを仕入れます。つまり、AI要約機能付きRSSリーダーを作るといったものに近いでしょうか。

具体的な仕様

今回制作するものの仕様をここで紹介しておきます。
なかなかに盛りだくさんの機能です。

とりあえずシステムの関係性を図にすると以下のようになります。
これから先の説明ではこの関係性が前提となりますので、覚えておいてください。

概要

インターネット掲示板から情報を収集し、分析を行うAIチャットボット。

機能

  • インターネット掲示板監視機能
    Yahooファイナンスの掲示板を監視して、新規コメントをデータベースに蓄積します。

    • 情報のランク付け機能
      データベースに蓄積した情報の有用度を、AIを使ってレベル分けします。

  • コマンド自動検出機能
    チャットで入力されたメッセージをコマンドとして認識する機能。
    厳密なフォーマットに則ったコマンドではなく、「分析して」のような入力で実行できるようになります。

  • コメント分析機能
    Geminiを使用して100件程度の重要なコメントから市場を分析します。
    ニュース蓄積機能でニュースがインプットされている場合はそれも考慮されます。(DifyなのでLLMは変更可能)

    • 投稿件数監視機能
      投稿数と更新間隔をAIで分析し、今盛り上がっている掲示板を判定し、簡単な分析を常時自動で行います。(1H置き)

    • 分析返信機能
      分析結果に返信することで、追加の質問を行える機能。分からない言葉などはその場で返信してGeminiに聞くことができます。

  • 画像認識機能
    スマートフォンのスクリーンショットなどをアップロードし、情報として蓄積します。

    • 個別銘柄ニュース蓄積機能
      ispeedなど、投資系アプリのスクリーンショットをアップロードすることで文字列に変換後AIにて分析保管します。

使用するプログラム環境

  • チャットボット

    • Dify
      オリジナルのチャットボットを作ることができるオープンソースソフトウェアです。使うAI(LLM)は、GoogleのGemini前提ですが、人によってはGPT4やその他のモデルを使うなども可能。

    • Gemini
      Googleの開発している大規模言語モデルです。
      多少のレート制限はありますが、十分無料で使うことができます。

    • Discord
      ゲーマー用チャットアプリでおなじみのチャットアプリです。
      BOTアカウントが簡単に作成でき、制御するためのPythonライブラリが公開されているため採用。

  • プログラム言語

    • Python

  • データベース

    • Mysql
      関係データベース。取得したコメントの蓄積に使います。

  • 実行環境

    • Ubuntu(Linux)
      別の記事で紹介している24時間稼働PCを使用します。

事前準備

本作を利用するにあたって必要な実行環境を整えます。

Difyのセットアップ

オリジナルのAIを作るためのソフトウェアです。
配布しているデータをインポートすることで、ご自身の環境で立ち上げることができます。
詳細は下記の記事をご確認ください。

データベースのインストール

今回はデータの蓄積にデータベースを使います。
私も初めて使用します。とりあえず使ってみたという記事を書いてみたので、参考にインストールだけしてください。
データベースの中身は空っぽで大丈夫です。

Pythonの準備

今時のLinuxなら3系は標準搭載だと思うので特に言及はしません。
必要ライブラリなどは配布しているソースの中にリストを入れておきます。

解説

さて、いきなりですが次の事項に関しては前回の記事でご確認ください。

  • 掲示板からの情報取得について

  • Difyの基本操作

データベースへの蓄積と情報の振り分け

前回の記事で情報の取得については解説しており、その部分については全く変更していません。
しかし、その後の情報の保管方法とランク付けについて方法を変えたので、そこから解説をしていきます。

データベースの中身について

まずはそもそもデータを保管するデータベースの構造がどうなっているのかを解説します。
データベースは主に2つの種類があります。
一つ目がメインの銘柄ごとの掲示板データベースです。ここにコメントなどの情報を蓄積していきます。
もう一つがかなり後の紹介になると思いますが、ニュースのデータベースです。

個別銘柄ごとのデータベースの中には2つのテーブルがあります。
一つ目は基本情報とステータスが入っているだけのテーブル。
もう一つがメインのコメントを蓄積するテーブルです。

基本情報やステータスのテーブルに関しては以下のようになっています。
名前とURL、最終更新日時、次回の更新秒数、本日の更新件数が入っています。

コメントのデータベースについては次のようになっています。
日付、内容、AIフラグ、AIメッセージ。
コメントを取得した瞬間に最初の2件に関しては書き込まれます。
そして、データベース化したポイントは投稿を絞り込まなくてもフラグで有用不要分けることができるということです。
ここで言うAIフラグが0は未処理の状態。1が有用で2が通常、3が不要です。
AIメッセージはどうしてその振り分けにしたのかの理由を出力させています。
正直まだ甘い気がしますが、ほとんどのどうでもいい投稿はけってくれるので、この後の考察が深いものになります。

データベースへのコメント書き込み

さて、ここからはデータベースへのコメントの書き込み方法について見ていきます。
書き込みについては、特に難しいことをしているわけではありません。
コメントの分だけループでmysqlのクエリを実行しているだけです。
この時はまだ処理していない情報もあるので、その部分にはデフォルトの数値を入れています。

※ソースコード内の情報が伏せられているものは、ソースコードのダウンロードをしていただく必要があります。

接続に使っている"DataBase_conf"は次のようになります。
クラスのインスタンス時にこの辞書が作成され、正常に接続できた場合、最下行の部分も辞書の中に取り込まれます。

AIによる情報の振り分け(データベース版)

前回の記事でも情報の振り分けは行いましたが、データベース化によりやり方を変更しました。

まずはPython側の一連の処理です。
最初にデータベースからAIに評価のデータを取得します。
そのデータを連結してAIに投げるためのテキストを作成します。
AIからの応答を確認し、フラグを書き込んでいきます。

ここでの最大の工夫ポイントはAIの出力を変えたことです。
前回は、余計な投稿を省いてそれ以外をそのまま出力してもらうようにしていました。
しかし、データベースでは各行にIDがついているのでこれで識別することができます。
というわけで、AIの応答は、ID、フラグ、理由。とてもコンパクトにまとめられました。
例えば、以下のような応答を得ることができます。
投稿レベルをお好みで調整することで、フィルタリング強度は変更できそうですね。

プロンプトについて
出力の内容を変更するので、プロンプトに関しても大幅に変更しました。
今回は以下のようなプロンプトにすることで、ほぼ目的の形式で出力されることを確認済みです。

ワークフローを使って分析する

分析の部分に関してもデータベース化によりやり方が多少変わったので再度簡単に解説します。

分析を行う関数は以下のようになっています。
フラグをつける時と同じ要領でコメントを取得します。
取得したコメントをもとにプロンプトを作成。
ワークフローを使って分析開始。
引数に対して正規表現かけてる理由は次項。

AIによる分析の部分ですが、今回Difyの目玉機能であるワークフローを使ってみました。
具体的には、ニュースの情報を考慮して分析を行うために、後からニュースの情報を取りに行く処理が追加されています。

この処理はいくつかのステップに分かれており
最初のステップはデータベースの銘柄名の取得です。データベースの名前がわからないと、ニュースにアクセスできないので、名前を取得します。
次に入力された掲示板がどの銘柄のものなのか推論します。
そして銘柄名が分かったニュースを取得します。

ポイントとしてはhttpリクエストのリクエスト先がこのbotであることです。ボット自体がデータベースを管理しているので、この中にhttpサーバーも紛れ込ませて、外部からのアクセスを可能にしています。
こうすることで、後から情報の追加を行うことができます。

ちなみに引数をつけて実行すればモデルを変更することもできるようにしています。Gemini1.5は使用回数が限られているので、使いすぎたら1.5Flashに切り替えるなど対応ができます。

AIを使った分析指示

ソースコードをじっくり見ていただいた方は疑問に思ったかもしれませんが、インプットの引数をわざわざ正規表現にかけてチェックしている場面があるんですね。これなんてかというと必ずしもそうなっているとは限らないからです。具体的にはここAIに入力させてるんです。

コマンド指示からチャット指示へ

以下は前回の記事で紹介した時点のbotの挙動です。
私からの指示が"ai"になっています。これはAIコマンドつまり分析しろという意味です。この後に引数を入力することでオプションをつけることができるんですが、めんどくさいですよね。

これが今回のボットの挙動です。
私からの指示が"分析"に変わっています。
実はこれ入力された内容をAIに渡してコマンドに変換してもらってるんです。

それにより、次のような指示の仕方ができるようになります。
「有用な情報で分析 社会情勢について別途まとめて」
この指示をコマンドに表すと次のようになります。
"ai level=1 appendix=社会情勢について別途まとめて"
有用な情報でと言っているので、情報レベルを1にしてくれています。
社会情勢についてまとめてと言っているので、appendixにそのまま追加されています。

出力に関しては以下の通りです。
結構荒れている掲示板であるにもかかわらず、投稿のスパンが広いので、無駄な情報を完全に省いていることがわかります。
また、社会情勢についてという項目を作ってくれているところから、その辺も考慮してくれていることがわかります。

ちなみにこの時の、コマンド認識の出力は以下の通りです。

コマンド分岐用のプロンプトは次の通りです。
ここでは投稿の振り分ける時と違い、JSONで出力をお願いしています。
かなりしつこく指示すればきちんとJSONで帰ってきます。

ポイントとしてはコマンド一覧が書いてあり、それぞれの引数の意味や必須任意まで細かく書いてあるところです。
Difyの質問分機器を使ってもよかったのですが、あれを使うと引数の部分まで処理できないので自分で書いてみました。あと意外とトークン使うので…。
この機能は改造の初期段階でつけた機能なので、ボットの方に収まっていますが、やろうと思えば大きめのワークフローを作って入れることもできそうですね。

一旦まとめ

今回は情報ソースのおさらいと処理のデータベース化について見ていきました。また、分析についてもワークフローを使ってさらに強化しました。
機能面ではユーザーからの指示をチャット形式で受け付けられるように、事前にAIをかませるように変更しました。
なお、この辺の処理に関してはボットのソース解説の方で行っていければと思います。

次回は、ニュースの情報についての画像認識とbotの中身について解説していきます。

データの配布について

最後のまとめ記事で配布予定。スキしてお待ちください。


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