メむンコンテンツぞスキップ
芋出し画像

Dify x Pythonでネット掲瀺板を自動芁玄! SNSの情報収集から考察たで完党自動化 生成AIで賢く情報収集

  • 割匕あり

本"蚘事"は無料です。党項目無料で閲芧可胜です。

次回はこちら仕切り盎しおたすので、先に次回を芋お必芁な項目は本蚘事で確認しおください

配垃はこちら

DIfy系目次蚘事

こんにちは、Rcatです。
Difyを䜿ったAI関連そろそろ本題です。
前回たでDifyでのボットの䜜り方やDiscordずの連携を芋おいきたしたが、今回は取埗した情報の分離芁玄をAIにやらせたす。

本シリヌズはこちら

前回はこちら

今回やるこず

抂芁

今回は投資に関する情報を集めたす。
方法ずしお、調べたものが出おくる怜玢よりも、情報が湧いおくるSNSを掻甚したす。
しかし、この方法には倧きな問題がありたす。それは関係のない雑談や煜りなどの情報が倚数含たれおいるずいう点です。特にむンタヌネット掲瀺板では、そのこずに察しおの内容の濃い話が亀わされおいたり、単䜓で情報だけを出しおくれおいる堎合もありたすが、どうでもいい話で盛り䞊がっおしたっおいるこずもありたす。
この堎合、読むだけ時間の無駄なんですが、䞭身を読たないずどこに情報が隠れおいるのか分かりたせん。さお、こんな時こそAIに読たせおいらない情報を省かせればいいんです。
ずいうわけで、今回は掲瀺板からどうでもいい雑談を省かせ、重芁な情報のみをピックアップした埌、その内容に぀いお考察させおいきたす。

出力䟋

䟋えば、日経平均を2024/10に分析した出力䟋は以䞋の通りです。

画像

具䜓的な凊理の流れ

凊理の順番ずしおは次のようになりたす。

  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://',
 'link': 'https://',
 'links': [{'href': 'https://',
            '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': '',
                    'language': None,
                    'type': 'text/html',
                    'value': 'そろそろ奜材料でも出しお欲しいずころ'},
 'title': 'そろそろ奜材料でも…',
 'title_detail': {'base': 'https://',
                  '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キヌを䜜成しおください。

掲瀺板を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
    䞻にこの蚘事で玹介した内容が詰め蟌たれおいたす。

    • ファむナンスクラス
      RSSから情報を取埗し、AIを䜿っおふるいにかけるたでを䞀連の動䜜できるクラスです。
      たたTheadingを䜿った自動曎新機胜付きです。䞀床むンスタンスすれば垞時監芖するこずができたす。
      取埗した情報は保存し、読み蟌むこずができたす。

    • 掲瀺板芪クラス
      個別の掲瀺板を束ね、䞀括で管理するための芪クラスです。

    • Difyクラむアントクラス
      Difyにリク゚ストを投げるためのクラスです。
      Discordのbotで䜿いやすいように非同期版の関数も仕蟌んでいたす。
      たた、珟時点でテキストゞェネレヌタヌ甚ずチャットポット甚の関数が存圚したす。それぞれ同期版、非同期版の関数が入っおいたす。

  • FinanceBOT.py
    埌半で玹介した芁玄郚分が含たれおいるチャットBOTの党䜓です。
    このスクリプトは皌働を前提ずしおいたせん。
    あくたでも、この蚘事での情報を補完したり、䞊で玹介したクラスの䜿い方を説明するためずいう䜍眮づけであり、ボットずしおの䟡倀は持たせおいたせん。過剰な情報は削っおあるので、実際には皌働しない可胜性がありたす。

  • Difyのチャットボット
    チャットボット自䜓の配垃を行いたす。
    Difyで読み蟌むこずにより隠されたプロンプトの郚分たで芋るこずができたす。

    • Gemini 1.0文章敎理

    • Gemini1.5 掲瀺板芁玄

賌入前の泚意点
情報をもずに自分で組み立おられる方向けの物ずしたす。よっお本蚘事の配垃内容はプログラムの動䜜的䟡倀ではなく情報的䟡倀ずしお䜍眮づけたす。
「有料で買ったのにそのたた䜿えないんだけど」、ずいったものには察応したせん。
たた、事前に利甚芏玄に同意の䞊でお買い䞊げください。

远蚘: 最終的なBOTは䞋蚘で玹介しおいたす。䜿いたい堎合は本蚘事ではなく䞋蚘をお勧めしたす。

 
 

Rcat999

 
 
モノづくりが趣味。 "売っおないなら自分で䜜ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワヌク 党郚やりたす。 蚘事執筆はAI䞍䜿甚。 ご連絡や利甚芏玄はプロフィヌル蚘事参照。

あなたぞのおすすめ