見出し画像

Dify x Pythonでネット掲示板を自動要約! ~SNSの情報収集から考察まで完全自動化 生成AIで賢く情報収集~

割引あり

本"記事"は無料です。全項目無料で閲覧可能です。

次回はこちら(仕切り直してますので、先に次回を見て必要な項目は本記事で確認してください)

配布はこちら


こんにちは、Rcatです。
Difyを使ったAI関連そろそろ本題です。
前回までDifyでのボットの作り方やDiscordとの連携を見ていきましたが、今回は取得した情報の分離要約をAIにやらせます



本シリーズはこちら

前回はこちら

今回やること

概要

今回は投資に関する情報を集めます。
方法として、調べたものが出てくる検索よりも、情報が湧いてくるSNSを活用します。
しかし、この方法には大きな問題があります。それは関係のない雑談や煽りなどの情報が多数含まれているという点です。特にインターネット掲示板では、そのことに対しての内容の濃い話が交わされていたり、単体で情報だけを出してくれている場合もありますが、どうでもいい話で盛り上がってしまっていることもあります。
この場合、読むだけ時間の無駄なんですが、中身を読まないとどこに情報が隠れているのか分かりません。さて、こんな時こそAIに読ませていらない情報を省かせればいいんです。
というわけで、今回はYahooファイナンスからどうでもいい雑談を省かせ、重要な情報のみをピックアップした後、その内容について考察させていきます。

出力例

例えば、現状の出力例は以下の通りです。
これを見るだけでも、ヤフーに関してはネイバーとソフトバンク、行政指導といった情報が入ってきているのがわかります。

情報の取得方法

情報源の設定

今回は情報源としてyahooファイナンスを使用します。
ここを使う理由としてはRSSが用意されているからです。RSSとはRSSリーダーを用い、複数の情報を素早く確認するためのものです。
yahooファイナンスの場合、各掲示板ごとにRSSが用意されており、アクセスすると最新20件のコメントが取得できるようになっています。
つまり、今回は要約機能付きRSSリーダーを作るみたいな感じですね。

今回は例としてヤフーの銘柄でやっていきます(最近荒れてるが)

https://finance.yahoo.co.jp/cm/message/1004689/a5da5ua1bc

RSSのURLにアクセスするとこのようになっています。
非常に簡潔に情報を取得できそうですね

具体的な処理の流れ

処理の順番としては次のようになります。

  1. RSSから情報を取得する
    RSSのxmlデータからコメントを抜き出す処理が必要です。

  2. 取得した情報をふるいにかける
    Dify x Geminiで、余計な情報を省かせます。
    これ以降の処理のことも考えて、出力形式を設定する必要があります。

  3. 有用の情報を履歴に残す
    最新20件しか取得できないので、定期的に取得した後、履歴を残し情報を手元に保存します。

  4. できるだけ多くの情報からAIに考察をさせる
    手元に残してある履歴を使ってGemini1.5に考察させます。

  5. 考察結果を出力する
    出力形式は自由ですが、有用なコメント一覧と考察結果を出力させるようにしてみます。

Pythonを使ってRSSを取得する

RSSからコメントを抽出

まず最初にRSSから情報を取得します。
RSSはxml形式なのでライブラリを使って解析します。
使用するライブラリは"feedparser"です。

コードは次の通りです。
このライブラリで直接取りに行けるので取得した後、エントリを取得すればそれだけで終わりです。
中身が見やすいようにpprintを使ってます。

出力は以下の通りです。一部加工しています。
これを見る限り"summary"か"summary_detail"の"value"を取得すれば良さそうですね。
コードの一番下はとりあえずdetailを取得しています。

{'author': '投稿者名',
 'author_detail': {'name': '投稿者名'},
 'authors': [{'name': '投稿者名'}],
 'guidislink': False,
 'id': 'https://finance.yahoo.co.jp/cm/message/1004689/a5da5ua1bc?comment=637082',
 'link': 'https://finance.yahoo.co.jp/cm/message/1004689/a5da5ua1bc?comment=637082',
 'links': [{'href': 'https://finance.yahoo.co.jp/cm/message/1004689/a5da5ua1bc?comment=637082',
            'rel': 'alternate',
            'type': 'text/html'}],
 'published': 'Sat, 18 May 2024 21:33:52 +0900',
 'published_parsed': time.struct_time(tm_year=2024, tm_mon=5, tm_mday=18, tm_hour=12, tm_min=33, tm_sec=52, tm_wday=5, tm_yday=139, tm_isdst=0),
 'summary': 'そろそろ好材料でも出して欲しいところ',
 'summary_detail': {'base': 'https://finance.yahoo.co.jp/cm/rss/1004689/a5da5ua1bc/comment.xml',
                    'language': None,
                    'type': 'text/html',
                    'value': 'そろそろ好材料でも出して欲しいところ'},
 'title': 'そろそろ好材料でも…',
 'title_detail': {'base': 'https://finance.yahoo.co.jp/cm/rss/1004689/a5da5ua1bc/comment.xml',
                  'language': None,
                  'type': 'text/html',
                  'value': 'そろそろ好材料でも…'}}
'そろそろ好材料でも出して欲しいところ'

コメントと日付を格納する

最新20件だけで考察ができるとは思いません。なので、AIには余計な情報を省いた後、有用な100件程度の情報を元に考察してもらいたいと考えています。
問題はその100件をどうやって持っておくかです。
掲示板を更新すると毎回最新20件が手に入りますが、それは全て新しいものなのか、それともダブってるコメントが含まれているのか確認しなければなりません。ということで、日付も一緒に格納しておきましょう。時間を比較すれば一目瞭然ですからね。

調べたところ、取得した日付の形式をそのままdatetimeオブジェクトに変換することができるみたいです。
以下のようにすることでオブジェクトとして取得しておきましょう。そうすれば日付の演算ができるようになります。

dt = datetime.datetime.strptime(datas[0]["published"],'%a, %d %b %Y %H:%M:%S %z') #'Tue, 07 May 2024 13:21:34 +0900'

掲示板取得まとめ

こちらは私は完成させたクラスの一部となります。全文は本記事末尾をご確認ください。
上記のコードで取得したコメントをループ内で処理しています。
ここではいくつかの追加の処理を行っています。まず最初にHTMLのエスケープシーケンスを文字列に変換しています。
一部のデータは"こ"のように人間には全く意味のわからない文字列でできていることがあります。これをデコードする処理(unescape)を最初に入れています。
次に改行やスペースの削除ですね。少しでもデータを節約するためですね。
コメントと日付を別々のリストに格納をしています。
そして一番最後にリバースをしています。こうすることで一番上が新しい掲示板の情報を一番下か新しいにします。基本的にリストに"追加"するので、後ろは新しくないと困るんですね。
処理が終わったら今度はデータの形式を変えています。タプルを使って日付とコメントをセットにしています。

#エスケープシーケンスの例
これはテストです

ちなみに、新しいコメントかどうか判定するのは手元にある最後のコメントの日付と今回新しく持ってきたものを下から順番に比較しています。
インデックスが分かったら、そこで切り出して手元の履歴にくっつけるだけです。

ちなみに、この後日付のデータを使ってコメントがどれくらいの間隔で更新されているのかを計算し、次回取得の秒数を計算する処理があります。
サーバーへの負荷を抑えつつ、情報は漏らさないように10件程度更新される秒数を計算しています。
20件のコメントが1時間で来ていた場合は、次30分で更新しに行くといった感じですね。
日経平均だと5分更新でも足りないくらいですが、普通の掲示板は短い時は5分、長い時は数時間と変動するので、更新間隔は固定しない方がいいです。
注意すべき点としては夜間全く更新されなかったので、朝5時の時点で次回の更新は3時間後だ!とやってしまうと、実は7時頃から盛り上がりだすと寄り付き前の情報を逃すことになってしまいますので注意。その辺は補正入れましょう。

掲示板整理AIをGeminiを使って作る

さて、新規コメントが入手できたところで、ログに保存する前にその情報が本当に必要なものなのかどうかふるいにかけてしまいましょう。

とあるグロース株の原文がこちら、掲示板の情報を一つのテキストとしてまとめています。
軽く見るだけでも数件どうでもいいコメントが入っているのが分かります。

ふるいにかけた結果がこちら
ちょっと閾値が厳しいかなといった感じですね。
ただ、どうでもいいコメントは完全に排除してくれているようですね。

Dify側 -チャットボットを作成-

それでは、余計なコメントを削除するチャットボットを作りましょう。
話をするわけではなく、文章の整理をお願いするわけですから今回使うのはテキストジェネレーターです。

プロンプトの作成

さて、一番大事なプロンプトを入力していきます。
プロンプトの全文は記事の末尾を参照してください。

プロンプトは下記の通りです。
このプロンプトのポイントをまとめると次のようになります。

  • AIの立場を明確にする
    プロントとエンジニアリングについて調べていくと、まず一番最初にAIにどういった役割を持たせるのかをはっきりさせることが大事だとあります。今回はインターネット掲示板の監査人ということにしてみました。
    私なりの工夫ポイントはインターネット掲示板という言葉をここで使うことです。つまり、この時点でこれから入力される情報が掲示板によるやり取りの情報であることが分かります。

  • 具体的な指示
    次にどういう処理をして欲しいのか具体的に書きます。
    ここもかなり苦労したポイントで、きちんと書かないと思い通りに出てこないです。まだ改善の余地ありです。

  • 投稿文の加工
    投稿はそのままにするのがベストですが、今後の処理に使えるような状態は困るので、そういった場合変更する一文がここに含まれています。

  • 掲示板の投稿形式
    最初にインターネット掲示板という言葉を使いをしましたが、具体的にどういう風な形で情報が入ってくるのかわからないともしかしたらAIは正しく個別の投稿を判別できないかもしれません。
    そのため、こういう風に入力されるので、ここからここまでが一つの投稿だよというのわかるようにします。

  • 抽出方法
    文章を整理するように指示していますが、具体的にどうやって整理すればいいのか、といった情報をここで書いています。

  • 不要な投稿の目安
    人間であればこの指示はなくても大体皆さん同じようだと投稿を省いてくると思います。しかし、AIは何がいらないのかというところを具体的に指示したいとどういう返しをしてくるか分かりません。ちゃんと指示しましょう。

  • 出力形式
    ここが一番大事です。
    なにせAIへの入力は多少フォーマットが変わったとしてもきちんと理解はしてもらえますが、出力データに関しては完全にフォーマットを決めないとプログラムの処理できません
    現状100%フォーマット通りに出力してくれます。ただし、制御文字を入れてきたり、入れてこなかったりすることがあるのか現在の悩みです。

作成したプロンプト。塗りつぶし部は完全版で確認できます。

モデルとパラメーター

現在の設定は以下のようになっています。
パラメータの方は個々人で調整してください。
記事を書いている時点では1.5Flashがまだ未対応なので1.0です。対応したら変更したいですね。

前回までの内容に従って公開とAPIキーを作成してください。
https://note.com/rcat999/n/nf527a0cad538

掲示板をAIを使ってふるいにかける

さて、またPython側に戻ります。
先ほど取得した掲示板の情報をAIに投げて整理してもらいましょう。

ソースコード

下記はコメントを取得した後の続きです。全体のつながりは完全版で見られます。

やってることとしては、そんなに難しいことではありません。
まず最初に取得したコメントを連結して、AIに送信する形式に変換しています。
テキストが完成したらAIに投げます。ここで投げる先が先ほど作成したAIですね。
そして、その応答を処理する段階に入ります。
変なエラーで落ちても困るので、AIがちゃんとしたフォーマットで返せなかった場合は文章の整理をなかったことにしています。正規表現を用いて、私が指定した通りのフォーマットで出てきているかどうかを確認しています。
正常に出てきている場合は、ここで履歴に正式に追加するわけですね。

AIに投げる関数がこちら
これに関しては、前後の記事で紹介したものをクラスの中に折り込んだだけです。

ここまでで、手順3の"有用な情報を手元に残す"までが完了しました。

AIに考察を行わせる

さて、いよいよ大詰めです。
得た情報をもっとにAIに考察をしてもらいます。

考察用のAIを作る

先ほどのふるい分けAIと同じようにテキストジェネレーターで新しいAIを作ります。
今度は要約用のプロンプトにするわけですね。

プロンプトの作成

要約用のプロンプトは以下の通りです。全文は末尾ご確認ください。
具体的な説明はふるいの時と同じです。考察のやり方については、個々人で好きな方法で指定していいと思います。
私の場合は、自分で掲示板を読まずに流れや情報を得たいだけなので、どういうやり取りがあるんですか?的な感じにしてます。
未だに出力が安定しないので、もう少し詰めていきたいところですね。少なくとも大事な情報を逃すことはないですが。
また、一部アップデート用の項目が入っているので、使ってない部分がまだあったりします。

また、地味に大事な点として出力文字数を制限しています。
理由はDiscordの入力条件が2000文字だからです。最終的には掲示板自動要約botになるので、Discordの規格に則る必要があるためですね。

多くの情報から考察を行わせる

次のソースコードはbotの一部です。この関数により考察を実行しています。やってることは前回と同じです。
ただし、今回は入力のコメントを100件まで拡張しています。そのコメントを全て連結し先ほどのAIに投げます。
そして出来上がった応答はDiscordに出力されます。

考察結果を出力する

実際に実行してみると、以下のような応答を得られました。
出力は指定した通り行われているみたいです。
まず100件のデータがいつからいつまでのデータなのかきちんと入ってます。
次に有用な投稿がいくつかピックアップされています。本当にそれが100件の中で一番有用なのかは分かりませんが…。
プロンプトの指示を短くするため、"してください"ではなく”する”などにしているので、応答もそれっぽい感じになってますね。別にいいんですけど

自分で覗いてないですが、なんか大事になってるみたいですね…?
というように自分で見に行かなくても確認しなければならない情報を得ることができました。あとは自分で裏を取るだけです。
余裕があればWebのサーチAPIとかを使って自動的に裏を取るとかやれたらいいですね。

まとめ

今回はインターネット掲示板から自動で情報を収集し、自動でふるいにかけ、自動で要約までを行いました。今までは帰りの電車の中で自分で情報を取捨選択していましたが、その時間を他のことに使えるようになりました。
具体的な活かし方としては、寄り付き前に一度要約させて新しい情報が出てないかを確認。そして、大引け後にその日の取引に関してどんな意見が交わされているか、また要約といった感じでしょうか?
もちろん変な値動きをするようなら、その場で要約かけてみてもいいかもしれません。
1銘柄10分くらいかけて掲示板を漁る時代からAIに指示して10秒待つだけの時代になりました。

ソースコードおよびBOTの完全版情報

最後までご覧いただきありがとうございます。
途中で紹介したソースコードの全文をこちらから配布しています。

https://script.google.com/macros/s/AKfycbysRqb7488rvLGPqOOhGlr0w513zIHC67BEPzJtPAKrAc4lKfDCmsB0mVL1Ha5BY5P0/exec?name=ファイナンスBOT_解説用

具体的には以下のような情報になっています。

  • getfinance.py
    主にこの記事で紹介した内容が詰め込まれています。

    • Yahooファイナンスクラス
      RSSから情報を取得し、AIを使ってふるいにかけるまでを一連の動作できるクラスです。
      またTheadingを使った自動更新機能付きです。一度インスタンスすれば常時監視することができます。
      取得した情報は保存し、読み込むことができます。

    • Yahooファイナンス親クラス
      個別の掲示板を束ね、一括で管理するための親クラスです。

    • Difyクライアントクラス
      Difyにリクエストを投げるためのクラスです。
      Discordのbotで使いやすいように非同期版の関数も仕込んでいます。
      また、現時点でテキストジェネレーター用とチャットポット用の関数が存在します。それぞれ同期版、非同期版の関数が入っています。

  • FinanceBOT.py
    後半で紹介した要約部分が含まれているBOTの全体です。
    このスクリプトは稼働を前提としていません。
    あくまでも、この記事での情報を補完したり、上で紹介したクラスの使い方を説明するためという位置づけであり、ボットとしての価値は持たせていません。過剰な情報は削ってあるので、実際には稼働しない可能性があります。

  • Difyのチャットボット
    チャットボット自体の配布を行います。
    Difyで読み込むことにより隠されたプロンプトの部分まで見ることができます。

    • Gemini 1.0文章整理

    • Gemini1.5 掲示板要約

購入前の注意点
情報をもとに自分で組み立てられる方向けの物とします。
AIは進化目覚まし分野であり、少し時間が経てば各ツールの使い方などが変わっている可能性があるためです。
「有料で買ったのにそのまま使えないんだけど」、といったものには対応しません。
また、事前に利用規約に同意の上でお買い上げください。

※今後Botを配布する可能性もありますが、その場合は"getfinance"クラスをこの記事限定にすることで、2重購入にならないようにいたします。
この記事+BOTで初めて動くという具合です。

追記 : getfinanceの仕様を大きく変更するため、botは本記事のgetfinanceと互換性のない完全別体になりそうです。

ここから先は

199字

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