fc2ブログ

Microsoft Bot Frameworkを使う(1)

 ChatGPTのようなチャットボットを自分で作ってみようかなと急に思い立ちました。いつもの「何かやりたい」という発作のようなものです・・。

 以前にLlamaIndexを使ってChatGPTをカスタマイズした際は、ターミナルのコンソール上で受け応えを行っていましたが、今回はLine、Teams、ChatGPTのようなチャット画面にあるようなGUI上でテキストを入出力したいと思いました。

 ネット上を調査していると、MicrosoftにBot Frameworkというものがあることが分かりました。早速、試そうと思いましたが、その前に開発環境を整えました。

 開発に用いるPCはM1プロセッサのMac miniなので、Visual Studio Codeをエディタとして、「.NET8」をセットアップしました。Microsoftのサイトから、指示に従ってインストールを実行しました。私の環境は「macOSのArm64」です。dotNET8_install_231231.pngこのPCには昔「.NET6」をインストールしていたので、Ver.6.0.xのRuntimesの環境が残っています。dotNET8_env_231231.pngこの状態で「Bot Framework」の動作確認を行い、問題ないことを確認しましたが、その後、Ver.6.0.xのRuntimesの環境を削除すると、実行時にエラーが出ました。この「Bot Framework」のサンプルソフトは「.NET Core 3.1」が使われているので、動作には「.NET6」の環境も必要なのかもしれません。少なくとも「.NET8」のみの環境では動作NGでした(2023/12/31現在)。

 以下の手順は、Microsoftのサイトを参考に、Visual Studio Code、C#を用いて進めました。

 まず、ボットフレームワークエミュレータをインストールしました。botFrameworkEmulator_231231.png
 次に、3つのBot Framework C# テンプレート (エコー、コア、空のボット テンプレート) をインストールしました。
dotnet new install Microsoft.Bot.Framework.CSharp.EchoBot
dotnet new install Microsoft.Bot.Framework.CSharp.CoreBot
dotnet new install Microsoft.Bot.Framework.CSharp.EmptyBot
参考サイトには、
dotnet new -i Microsoft.Bot.Framework.CSharp.EchoBot
と「dotnet new -i」と記載がありましたが、非推奨とのこと。警告は出ますが、インストールは正常に行えました。botTemplate_231231.pngCore、Echo、Emptyの3種のテンプレートが正常にインストールされていることを確認した後、それぞれのボットを作成しました。botTemplateList_231231.png

1. Echoタイプ
 ターミナルから以下のコマンドを打ち込みました。プロジェクト名は「bot_test」としました。
dotnet new echobot -n bot_test
プログラムを実行させると、ボットはポート3978のローカルで実行されたとの表示が出ました。botRunEcho1_231231.png 次に、動作確認をするために、エミュレータを立ち上げ、「Open Bot」をクリックして、botRunEcho2_231231.pngBot URLに以下のアドレスを記入して「Connect」ボタンを押しました。
http://localhost:3978/api/messages
botRunEcho3_231231.png チャットのエミュレータ画面が出たので、文字を打ち込むと、その文字を返してくる(Echo)ボットでした。botRunEcho4_231231.png
2. Coreタイプ
 1.と同様な手順で進むと、以下の画面が出ました。botRunCore1_231231.png「どこに旅行に行きたいか?」と聞いてきたので、チャットしてみました。それなりに会話になっていますね。botRunCore2_231231.png
3. Emptyタイプ
 最後にEmptyタイプです。このタイプは文字は入力できますが、Botからの返事は組み込まれていません。開発者が組み込む仕様のものですね。LlamaIndexを用いたカスタムChatGPTとの連携はこのタイプですね。botRunEmpty_231231.png
 今回、急な思いつきで、MicrosoftのBot Frameworkで遊んでみました。サンプルプログラムを実行しただけですが、どのようなことができるのか、イメージが湧きました。詳細のコードを読み込んで、カスタムボット作成にチャレンジしてみようと思います。
スポンサーサイト



Fitbitのデータを処理する(6)

 しばらく間が開きましたが、今回は、深い睡眠:deep、覚醒:wake、軽い睡眠:light、レム睡眠:remの間の関係についてもう少し深掘りしようと思います。

 まず、軽い睡眠、深い睡眠、レム睡眠について、ネット情報から調べました。

軽い睡眠(light)
 軽い睡眠は毎晩眠りへの入り口として機能し、体がリラックスします。この段階は通常、眠りに落ちてから数分以内に始まります。軽い睡眠の初期には、起きている状態と眠っている状態の間をさまよってしまうことがあります。ある程度警戒心が強くなり、簡単に目が覚めるかもしれません。通常、この段階では呼吸と心拍数がわずかに減少します。軽い睡眠は精神的および肉体的な回復を促進します。

深い睡眠(deep)
 深い睡眠は通常、睡眠の最初の数時間で起こります。朝すっきり目覚めたときは、前夜にしっかりと深い睡眠を取れたと考えられます。深い睡眠中は、体の外部刺激に対する反応が鈍くなるため、目が覚めにくくなります。呼吸は遅くなり、筋肉は弛緩し、心拍数は通常より規則的になります。睡眠パターンは人によって異なりますが、成人では年齢を重ねるにつれて深い睡眠が減少するのが通常です。深い睡眠は身体の回復と記憶と学習の側面を促進します。この段階は免疫システムをサポートすることも示されています。

レム睡眠(rem)
 レム睡眠の最初の段階は、通常、深い睡眠の初期段階を経た後に発生します。一般に、夜の後半に起こる睡眠サイクルでは、レム睡眠の状態が長くなります。この睡眠の最終段階では、脳がより活発になります。夢は主にレム睡眠中に見られ、目がさまざまな方向に素早く動きます(Rapid Eye Movement)。心拍数が増加し、呼吸がより不規則になります。基本的に、夢の実現を避けるために首から下の筋肉は活動していません。レム睡眠は、脳が前日の情報を処理して統合し、長期記憶に保存できるようにするため、気分の調節、学習、記憶において重要な役割を果たすことが示されています。

 以上を踏まえて、前回の相関マトリックスから、睡眠に関する部分を抜き取ると以下の通り。CorrelationMap(2305-2308).pngこのデータは23年5月〜8月の4か月分のものですが、その後もデータ計測は継続していますので、23年5月〜12月の8か月分のデータセットを作りました。相関を確認すると以下の結果でした。傾向は同じ感じですね。CorrelationMap(2305-2312).png
睡眠時間で見た場合、以下のことが言えると思います。
 1. wake(覚醒)時間とlight(軽い睡眠)時間は正相関。
 2. deep(深い睡眠)時間とrem(レム睡眠)時間は正相関。
 3. light(軽い睡眠)時間とdeep(深い睡眠)時間は相関は弱いがあえて言うならば負関係。

8か月間の相関マップはこんな感じですが、確認して気になった点は以下の3点です。CorrelationMapAll(2305-2312).png
1. minutesAfterWakeup(覚醒後の時間)とefficiency(効率)の相関係数:-0.59
   → 睡眠の中で覚醒した後の時間が長くなればなるほど、睡眠の効率が悪くなる。

2. restlessness(寝返りを繰り返す状態の割合、寝付けていない割合)とrevitalization_score(回復スコア)の相関係数:-0.42
   → 寝返りを繰り返して寝苦しい時は、回復スコアが低い。

3. resting_heart_rate(安静時の心拍数)とrevitalization_score(回復スコア)の相関係数:0.38
   → 心拍数が安定していない場合は、回復スコアが低い。 

 今までスマートウォッチのFitbitで収集した私の睡眠データを分析し、現状把握を進めてきて、大体理解が進んできました。ただ、私自身の睡眠時間がそもそも短いんですね。平日は4:50に起きて、5:50には家を出ているので・・。睡眠時間を長くすれば、睡眠効率のスコアは必ず上がってくると思いますが、会社への通勤事情は改善できないので、結局は睡眠時間が短くても、睡眠の質をいかに上げるかがポイントになるのでしょうね。今回の分析結果から、寝ている間は何となく「心身を興奮状態にしないこと」が良さそうですね。今後も気を付けようと思います。

ダイダイ収穫2023

 今年も残り2日になりました。昨日(12/29)、仕事納めで、1/3までの5日間が年末年始の休みです。年末年始の休みが短いので今回も帰省せずにゆっくり家で過ごす予定です。

 今日は暖かい1日でした。散歩に出かけましたが、軽く汗をかく程度で気持ちよかったです。天気も良いので、毎年恒例?の庭のダイダイの収穫を行いました。過去のブログのダイダイ収穫記事によると、昨年(2022年)は8個、2016年も8個でした。

 今年は過去最高の数で、農薬を使わなくてもきれいな実をつけました。daidai_1_231230.png収穫後に数えてみると29個でした!daidai_2_231230.png これだけ数があると、果汁を絞ったハチミツ湯だけでは消費できそうにありませんね・・。美味しくいただこうと思います。

ブログアクセスログをスクレイピングする(4)

 前回の続きです。ブログのアクセスログを集計するために、昔の自身のブログ記事を参考にseleniumのChrome Driverを用いてスクレイピングを試みましたが、セキュリティ強化のためか、自動でWebサイトを操作することができませんでした。今回はそのリベンジです。

 結局、スマートでないですが、pyautoguiというパソコン上の画面座標をセットしてマウス操作や文字入力を行うRPAライブラリを利用して、解決しました。利用OSも過去実績のあるWindows OS(Windows 11)に変更しました。

 Chromeは画面最大化(1920×1080)した状態で利用し、各座標もフルHDの画面1920×1080の中で設定しました。ChromeはタスクバーにあるChromeのアイコンをプログラムでクリックして起動させました。Windows11_dsp_231217.pngまた、FC2ブログの管理ページには、ログインページに移行したあとに、ログイン名(User ID)とパスワードを入力して、ログインボタンをプログラムで操作することで無事にログインできました。FC2_admin_dsp_231217.png正常にログインできたPythonコードは以下の通りです。
# FC2 blog Admin page login
import pyautogui
import time

# Chrome icon position (1073, 1056)
pyautogui.click(1073, 1056, button="left")
time.sleep(2)

# Maximum size
pyautogui.hotkey('alt', 'space')
pyautogui.press('x')
time.sleep(2)

# URL set position (174, 57)
pyautogui.click(174, 57, button="left")
time.sleep(1)
pyautogui.hotkey('ctrl', 'a')
time.sleep(1)
pyautogui.press('delete')
time.sleep(1)
# URL set
pyautogui.write('https://fc2.com/ja/login.php?ref=blog', interval=0.1) # URL set
pyautogui.press("enter")
time.sleep(2)

# User ID position (515, 339)
pyautogui.click(515, 339, button="left")
time.sleep(1)
pyautogui.hotkey('ctrl', 'a')
time.sleep(1)
pyautogui.press('delete')
time.sleep(1)
pyautogui.write('My mail address', interval=0.2)
time.sleep(1)

# Password position (515, 381)
pyautogui.click(515, 381, button="left")
time.sleep(1)
pyautogui.hotkey('ctrl', 'a')
time.sleep(1)
pyautogui.press('delete')
time.sleep(1)
pyautogui.write('My password', interval=0.2)
time.sleep(1)

# login button position (659, 427)
pyautogui.click(659, 427, button="left")
time.sleep(3)
 ログイン後の処理は、以前のブログと同じ処理を行い、23/08/10〜23/12/09の4か月間のアクセスログを取得しました。

 次に、アクセスログの分析を行いました。まず、日毎のアクセス数のグラフです。10月の終わりから11月の初旬にかけて、アクセス数の異常な増加が確認されました。そういえばその頃、確かにアクセスランキングで上位になっていました。原因は良く分からなかったですが・・。Access_graph_231217.pngアクセスログの生データをChatGPT4に食わせて、Data Analysisで確認すると、Amazon Web Service(AWS)という、普段アクセスがないであろうと思われる珍しいドメイン名を見つけました。LogCheck_231217.pngもう少し深掘りしてみましょう。このAWSのドメインについて、アクセス元を詳しく調べました。AWS_check1_231217.png特定のアクセス元ではなく、アクセス元が複数ある結果でした。Googleのクローラが頻繁に自分のブログにアクセスすることがありますが、その類なのでしょうか?生成AIのネタを勝手に取っているのでしょうか?totalのブログアクセス数とAWSからのブログアクセス数を重ねてプロットしてみました。AWS_check2_231217.pngAWSアクセス数が多いとtotalアクセス数が多い結果でした。totalアクセス数からAWSアクセス数を差し引いたグラフは以下の通りです。急激な増加はなくなりました。Real_Access_231217.pngイレギュラーなアクセスについて、ログから除外するために、除外ホスト名にAWSを追加しました。Exclusion_List_231217.png
 話を変えて、教育機関(大学)からのアクセスを集計しました。京都大学の方に多くみていただきました。ありがとうございました。Univ_1_231217.png18件カウントされましたが、実データも18件抽出されました。ChatGPT4のData AnalysisはPythonのコードで処理しているので、嘘はついていないようです。Univ_2_231217.png2位の不明は以下の13件です。domain_nameには不明で表されていますが、全部、間違いなく大学や研究所ですね。Univ_3_231217.png
 ブログの管理ページにアクセスできず、ログがスクレイピングできない問題がありましたが、今回解決しました。ログ分析もでき、原因は分かっていませんが、AWSからの集中アクセスも確認できました。これからも定期的に調査をしようと思います。

GPTsを使う

 11/6(米国時間)に行われたOpenAIの公式イベント「OpenAI DevDay」にて、生成AIサービス「ChatGPT」に複数の新機能が追加されました。その中で、ChatGPTをカスタム化できるGPTsに大変興味を持ちました。

 以前、LlamaIndexを用いてChatGPTをカスタマイズする方法についてブログで話をしましたが、結論から言うと、今回のGPTsを使うと大変楽にChatGPTがカスタムできました。先月末にGPTsの味見をしていたのですが、最近何かと週末が忙しく、ブログにUpできていませんでした。

 導入作業は、元々の英語表記の画面をChromeで日本語に自動翻訳して行っていたのですが、途中でエラーが出ました。最終的に元々の英語表記のまま最後まで行くことでエラーを出さずに完了しました。新しいサービスは完全に日本語対応になっていないのかもしれませんね・・。以下、エラーも含んだ導入手順の覚書です。

 まず、ChatGPTにログインして、自分のWebページから「My GPTs」を表示させて、「GPTを作成する(Create a GPT)」を選択すると、1_MyGPTs_231216.png 新しいGPTを作成するページが立ち上がりました。左右二画面構成になっており、左側が「作成」と「構成、設定」、右側が「プレビュー」です。2_MyGPTs_231216.png「作成する(Create)」でGPTビルダーが質問をしてくるので、それにユーザが答えていくだけで、ChatGPTがカスタマイズできます。楽ですね。
 それでは、個人ブログの執筆支援をお願いしようと思います。「Blog Buddy(ブログ仲間)」という名前をつけてくれました。3_MyGPTs_231216.pngプロフィール写真を生成している中で、お話ししたエラーが発生。もう一度、一からやり直しです。4_MyGPTs_231216.png再度、同じ手順で進めました。「Blog Buddy」をもう一度勧められました。もしかしてデフォルト??5_MyGPTs_231216.png進んでいるうちに、また同じエラー発生。6_MyGPTs_231216.png日本語翻訳モードをあきらめて、元々の英語表記のままで再々トライしました。7_MyGPTs_231216.png今度はエラーを吐かずに、前に進んでいます。8_MyGPTs_231216.png以下、GPTビルダーとの会話です。9_MyGPTs_231216.png翻訳すると以下の通り。
GPT Builder
ブログバディはどのような分野に焦点を当てるべきでしょうか?例えば、旅行、ライフスタイル、テクノロジーなど、特定のブログのテーマやスタイルを専門にするべきでしょうか、それとも他の何かでしょうか?

次に、ブログバディが避けるべきことを考えてみましょう。ブログの執筆を手伝う際に避けるべき特定のトピック、言語、スタイルはありますか?これには、物議を醸す話題、特定の種類のユーモア、あるいは技術的な言語を避けることが含まれるかもしれません。例えば。あなたの考えはどうですか?

You
ブログバディには、日常生活や旅行などの個人的なコンテンツを含めたいと思っています。テクノロジーに関する別のブログを書くと思います。また、言語として日本語を使用したいと思います。
会話は継続します。10_MyGPTs_231216.png
GPT Builder
では、ブログバディはどのようにあなたと対話すればよいでしょうか?よりフォーマルな応答を好むか、それともカジュアルなものを好むか?また、あなたのブログのトピックをよりよく理解するために質問を積極的にしてほしいですか、それともあなたの指導を待つべきですか?このやり取りをどのように想像しているか教えてください。

You
私はむしろフォーマルな表現を好みますが、あまり堅苦しすぎるのも好きではありません。あなたからの質問と私からの指導との間でバランスを保ちながら交流したいと思います。
最終的に出来上がったのはこんな感じです。11_MyGPTs_231216.pngここで、Knowledgeにカスタム情報のファイル(blog_tsuredure.txt)をUpdateしました。このファイルは私のブログの中の技術情報と関係のない「つれづれなるままに」の記事をテキスト化してそのまま保存したものです。12_MyGPTs_231216.png以上が準備の部分です。

それでは、プレビュー画面で質問してみましょう。
おすすめの旅行スポットを聞いてみると、「私の知識を検索中」と表示が出て13_MyGPTs_231216.png以下の回答が得られました。驚いたことに、この回答はまさに私のブログで書かれた内容ですね。四国鎌倉北関東などまさに「それらしく」回答していますね。14_MyGPTs_231216.pngちなみに美味しいラーメン屋を聞くと15_MyGPTs_231216.png私がブログで書いたラーメン屋のリストが出現!個人の見解のラーメン評論が「それらしく」回答されています(笑)。面白いですね。

今回、GPTsで遊んでみました。使い方次第では大変便利なツールになりそうです。用途も含めて考えてみようと思います。

ChatGPT4を使う(8)

 前回の続きです。クレジットカードで決済をした場合の月毎の支出を集計する話です。前回、集計に用いるデータセットの作成まで終わりましたので、今回はデータの可視化と分析です。今回もChatGPT4にプログラムを書いてもらい、マイナー修正して使える形にしました。

2.データの可視化
 前回作成したデータセットを添付して、以下のプロンプトを投げました。ChatGPT4のData Analysisを用いました。dataVisualization1_231203.png結果は以下の通りで、グラフは表示してくれましたが、日本語フォントが文字化けしました。dataVisualization2_231203.png再度、トライをしてくれたみたいですが、結局文字化けは解消されませんでした。「グラフの内容自体は正しく表現されています。」と開き直られていますが・・。dataVisualization3_231203.png 以前も日本語の情報の入ったデータをData Analysisで処理した際に、エラーを吐いたことがあります。現時点(23/12/03)でGPT4のData Analysisでは日本語を使わない方が良いかもしれませんね。
 日本語表記に対応するため、結局、自身のローカルPC(Mac Mini)のPython環境で、今回GPT4が作成してくれたコードを動かしました。コードは19行目の日本語フォントの設定を20行目に修正するだけで他に修正する箇所はありませんでした。すごいですね。
import pandas as pd
import matplotlib.pyplot as plt

# Load the data from the uploaded CSV file
file_path = 'Card_statement.csv' # CSVファイルのパスを適宜変更してください
card_data = pd.read_csv(file_path)

# Convert the '利用日' column to datetime
card_data['利用日'] = pd.to_datetime(card_data['利用日'])

# Extract year and month for grouping
card_data['年月'] = card_data['利用日'].dt.to_period('M')

# Group by year-month and user, and sum the amounts
monthly_usage = card_data.groupby(['年月', '利用者'])['利用金額'].sum().unstack(fill_value=0)

# Set the font to support Japanese characters
# Note: The font setting may need to be adjusted based on your environment
#plt.rcParams['font.family'] = 'IPAexGothic'
plt.rcParams['font.family'] = 'Hiragino Sans'

# Create a stacked bar plot
plt.figure(figsize=(12, 6))
monthly_usage.plot(kind='bar', stacked=True, ax=plt.gca())
plt.title('月別利用金額(利用者別積み上げ)')
plt.xlabel('月')
plt.ylabel('利用金額')
plt.xticks(rotation=45)
plt.legend(title='利用者')
plt.tight_layout()

# Show the plot
plt.show()
描画結果は以下の通りで、楽にグラフを作成することができました。dataVisualization4_231203.png
3.データの分析
 次に同じデータセットについて、以下の質問を投げかけました。一つ目のプロンプトは「本人」の利用額ベスト10の質問です。dataAnalysis1-1_231203.png回答は以下の通りです。モザイクで数字を隠していますが、問題なく、利用額の多い順番に表示されました。dataAnalysis1-2_231203.png二つ目のプロンプトは利用者毎の月別の集計の質問です。dataAnalysis2-1_231203.png結果、これもモザイクで数字を隠していますが、正しく出力されました。dataAnalysis2-2_231203.png三つ目のプロンプトは同じ「利用店名・商品名」毎の集計の質問です。dataAnalysis3_231203.pngこれも正しい結果でした。生成AIは勝手に数字を当てはめているイメージがありましたが、Data AnalysisでバックグラウンドのPythonが正しく計算した上で、正確な回答を出してくれていることが分かりました。これは使えそうですね。

 ちなみに、同じ内容をPandasAIで行わせても結果は同じでした。OpenAIのGPT4用APIのアカウントを私自身、所持していないので、おそらくGPT3.5でもPandasAIで正しい回答が導き出せているのでしょうね。PandasAIのプログラムは以下の通りです。
import pandas as pd
from pandasai import PandasAI
from pandasai.llm.openai import OpenAI

# Instantiate a LLM
OPENAI_API_KEY = "my openai key"
llm = OpenAI(api_token=OPENAI_API_KEY)
pandas_ai = PandasAI(llm)

df = pd.read_csv('Card_statement.csv') # dataset read
column_names = df.columns.tolist()
print(column_names)

# 利用者が「本人」のデータについて、利用額が多い順に10件出力してください。
pandas_ai(df, prompt='利用者が「本人」のデータについて、利用額が多い順に10件出力してください。')

# 利用金額を本人、家族、ETCに分けて月単位で集計し出力してください。
pandas_ai(df, prompt='利用金額を本人、家族、ETCに分けて月単位で集計し出力してください。')

# 利用金額を「利用店名・商品名」毎に集計して、利用金額が多い順に10件出力してください。
pandas_ai(df, prompt='利用金額を「利用店名・商品名」毎に集計して、利用金額が多い順に10件出力してください。')
15行目の回答はこんな感じです。GPT4のData Analysisのものと同じ回答でした。PandasAI_Result1_231203.png
 最後に、Bing ChatとGoogle Bardも試しましたが、双方NGでした。
Bing Chat: 文字数4000文字制限で、添付データすべてを読み込めずにNG。土俵に上がれず・・。
Google Bard: プロンプトは受け付けたので、文字数制限はパスしたが、得られた回答がデタラメで使えない。

 今回、ChatGPT4のData Analysisでデータセットを食わせて、可視化や分析ができることがよく分かりました。どれだけ、高度のことができるのか、今後さらに触って確認してみようと思いました。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: