PythonでSydneyを用いてBing Chatに接続し会話を行う

スポンサーリンク

PythonでSydneyを用いてBing Chatに接続し会話を行ってみます。

今回はSydneyを用います。このライブラリ・モジュールはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。

■Python

今回のPythonのバージョンは、「3.9.9」を使用しています。(Windows11)(Pythonランチャー使用)

■Cookieを抽出する

Sydneyを使用するためには、BingからCookieを抽出する必要があります。そのためには、Microsoft アカウントが必要となりますので、事前にアカウントを登録しておく必要があります。

Cookieを抽出するために、今回はGoogleChromeでBing.com(https://www.bing.com/)にアクセスします。

アクセスするとWebサイト上部に「ログイン」の文字がありますので、こちらをクリックします。

アクセスすると、「Bingにサインイン」といったログインページが表示されますので、取得したアカウントの情報を入力。または入力されている情報に問題がないかを確認しログインを行います。

ログインを行うと、Bing.com(https://www.bing.com/)上部にアカウント名が表示され、ログインした状態となります。この状態を確認します。

確認後、Bingにログインした状態でGoogle Chromeデベロッパーツールを起動します。起動する際はWindowsの場合は「Ctrl + Shift + i」(ショートカットキー)が利用できます。MacOSの場合は「command + option + i」(ショートカットキー)が利用できます。

それ以外の場合は、GoogleChromeのWebブラウザで右上に3点リーダーアイコン(⋮)と呼ばれるアイコンがあります。こちらをクリックします。

クリックするとメニューが表示されますので、メニューから「その他のツール」をクリックします。

クリックするとさらにメニューが表示されます。このメニューから「デベロッパーツール」をクリックします。

デベロッパーツールを表示後、「Application」という項目がありますので、こちらをクリックします。クリックすると左側に「Storage」という項目がありますので、この項目内の「Cookies」をクリックします。クリックすると「https://www.bing.com/」のURLが表示されますので、こちらをクリックします。クリックすると、「Cookies」の情報が表示されますので、「Filter」の入力欄で「_U」と入力します。

入力するとNameが「_U」がヒットしますので、「_U」のValueの情報をコピーし保存します。これでSydneyを用いてBing Chatに接続し会話を行う準備は完了となります。

■Sydneyを用いてBing Chatに接続し会話を行う

完了後、Sydneyを用いてBing Chatに接続し会話を行うためのプログラムコードを書いていきます。

■コード

import os
import asyncio
from sydney import SydneyClient

os.environ['BING_U_COOKIE']="取得したCookie情報"

async def main() -> None:
    async with SydneyClient() as sydney:
        while True:
            prompt = input("あなた: ")

            if prompt == "!reset":
                await sydney.reset_conversation()
                continue
            elif prompt == "!exit":
                break

            print("Sydney: ", end="", flush=True)
            async for response in sydney.ask_stream(prompt):
                print(response, end="", flush=True)
            print("\n")


if __name__ == "__main__":
    asyncio.run(main())

■プロセス、処理手順

async def main() -> None:という関数を定義します。この関数は非同期で実行されるため、asyncが付与されています。

SydneyClient()というクラスのオブジェクトを、async with構文を用いて作成し、sydney変数に代入します。async withを使用することで、自動的にオブジェクトの初期化と後始末が行われます。

while True:ループが始まります。このループは、対話を繰り返し行うために必要です。対話を終了するためには、!exitと入力するか、Ctrl+Cを押してプログラムを強制終了する必要があります。

ユーザーに対して、input関数を用いて「あなた: 」と表示されたプロンプトが出力されます。ユーザーが何かしらの入力をすると、その入力内容がprompt変数に代入されます。

もし、!resetと入力された場合は、sydneyオブジェクトの対話状態をリセットして、次の対話を新しいものとして始めます。この場合、continue文が実行されて、while True:ループの最初に戻ります。

もし、!exitと入力された場合は、break文が実行されて、while True:ループから抜け出します。

それ以外の場合は、sydney.ask_stream(prompt)という非同期ジェネレーター関数を呼び出します。この関数は、ユーザーからの入力をもとに、自然言語処理モデルに対して質問を行い、その回答を返します。

async for構文を使用して、sydney.ask_stream(prompt)から返される回答を順番に取り出して、response変数に代入します。

print(response, end=””, flush=True)を実行して、Sydneyが返した回答を表示します。end=””を指定することで、print関数が改行を挿入しないように設定しています。

while True:ループに戻り、ユーザーからの入力待ち状態になります。

ユーザーが!exitを入力するまで、上記のステップが繰り返されます。!exitが入力されると、while True:ループから抜け出し、プログラムが終了します。

最後に、if __name__ == “__main__”:という条件分岐が行われます。この条件分岐は、Pythonのモジュールが直接実行された場合にだけ、以下のasyncio.run(main())が実行されることを保証します。

asyncio.run(main())を実行することで、main()関数が非同期で実行されます。具体的には、SydneyClient()オブジェクトを作成し、ユーザーからの入力を受け取って対話を行います。

■実行・検証

このコードを「b_ai_anser.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。

実行してみると、Sydneyを用いてBing Chatに接続し会話を行う生成された返答をプロンプト上で出力させることができました。

コメント

タイトルとURLをコピーしました