ChatGPTのように文字を少しずつ表示する

概要

Amazon Bedrock上で動作するAnthropicのClaude 2を使用して、ChatGPTのようにテキストをリアルタイムで表示するWebアプリケーションを作成する方法を説明します。

ソースコード

使い方

  1. .envファイルの設定

    Amazon Bedrockを使用するために必要なAWSの設定を含む.envファイルを編集します。

    Amazon Bedrockを使用するためのAWSの情報を設定します。

    AWS_ACCESS_KEY_ID=あなたのアクセスキー
    AWS_SECRET_ACCESS_KEY=あなたのシークレットキー
    AWS_REGION=使用するAWSリージョン
    
  2. Docker Composeの起動

    次のコマンドでDocker Composeを起動します。

    docker compose up -d --build
    
  3. アクセス

    ブラウザでhttp://localhost:8080/にアクセスします。

  4. WebSocket接続

    「(1)WebSocketに接続する」ボタンを押してWebSocketに接続します。

  5. プロンプトの送信

    プロンプトを入力し、「(2)プロンプトを送信する」ボタンを押します。

プログラムの解説

ブラウザとサーバーはWebSocketを通じて通信します。

サーバー側では、PythonでWebSocket接続を待ち受け、Anthropic Claude 2モデルに問い合わせを行い、結果をリアルタイムでクライアントに送信します。

サーバーサイド

サーバーのserver.pyはポート6789でWebSocketの接続を待ち受けます。

async def main():
    async with websockets.serve(echo, "0.0.0.0", 6789):
        await asyncio.Future()  # プログラムが終了しないようにする

メッセージを受信すると、BedrockのAPIを実行して結果を返します。

async def echo(websocket, path):
    """WebSocket経由でメッセージを受信し、応答を返す"""
    async for message in websocket:
        logging.info(f"Received message: {message}")
        async for response in invoke_bedrock(message):
            logging.info(f"Sending response: {response}")
            await websocket.send(response)

BedrockのAPIを実行すると、結果がストリームで返ってきます。

response = bedrock.invoke_model_with_response_stream(
    modelId='anthropic.claude-v2',
    accept='application/json',
    contentType='application/json',
    body=body
)

Bedrockから受け取った結果を返します。

stream = response.get('body')
if stream:
    for event in stream:
        chunk = event.get('chunk')
        if chunk:
            decoded = json.loads(chunk.get('bytes').decode())
            yield(decoded['completion'])

クライアントサイド

クライアントのindex.htmlはサーバーとのWebSocket接続を確立し、ユーザーの入力に基づいてメッセージを送信し、受信した応答を表示します。

// サーバーとのWebSocket接続を確立
ws = new WebSocket("ws://127.0.0.1:6789/");

// メッセージを送信
const message = document.getElementById("message").value;
ws.send(message);

// 受信した応答を表示
ws.onmessage = function (event) {
    log.textContent += event.data;
};

Amazon BedrockとAnthropic Claude 2を使用して、リアルタイムでテキストを表示するWebアプリケーションの作成方法を紹介しました。

ChatGPTのトークン数を取得する

概要

tiktokenライブラリを使用して、ChatGPTのトークン数を取得します。

ソースコード

使い方

docker composeで起動します。

docker compose up -d --build

Webブラウザで http://localhost:8080/ にアクセスします。

encodingにエンコーディングを指定して、promptに入力する文字列を指定します。

sendボタンを押すと、トークンすが表示されます。

解説

エンコーディングの一覧は「tiktoken.model.MODEL_TO_ENCODING.keys()」で取得します。

トークン数の取得は「tiktoken.encoding_for_model」を使用します。

encoding = tiktoken.encoding_for_model(encoding)
tokens = encoding.encode(prompt)
return jsonify({'token_count': len(tokens)})

Laravel 9へのアップグレード時に発生する「Method Illuminate\Mail\Mailer::failures does not exist」エラーについて

概要

Laravelのバージョンを9にアップグレードした際に、メール送信機能で「Method Illuminate\Mail\Mailer::failures does not exist」というエラーが発生します。
この問題の原因と解決策について説明します。

問題の発生

以下のコードスニペットは、Laravel 9でメール送信を試みた際にエラーが発生する一般的な例です。

// メール送信
Mail::to('to@example.com')->send(new OrderShipped($order));

// メール送信に失敗したアドレスをチェック
$failures = Mail::failures(); // ←ここでエラーが発生
if (!empty($failures)) {
    echo '送信に失敗したメールがあります。';
} else {
    echo '全てのメールが正常に送信されました。';
}

問題の原因

このエラーは、Laravel 9でメール送信システムにSymfony Mailerが採用されたことが原因です。

Laravel 8まではSwiftMailerが使用されていましたが、Laravel 9ではMailer::failures()メソッドが削除され、メール送信後の失敗したアドレスの取得ができなくなりました。

解決策

Laravel 9では、メール送信前にメールアドレスの検証を行うことが推奨されています。
これにより、送信時のエラーを事前に防ぐことが可能です。

メールアドレスの検証方法に関しては、公式ドキュメントやその他のリソースを参照してください。

参考リンク

Amazon Linux 2023にSupervisorをインストールする

Amazon Linux 2023にSupervisorをインストールする手順を説明します。
Pythonとpipの確認から始め、Supervisorのインストール、設定、そして利用方法について詳しく解説します。

ステップ1: Pythonのバージョンを確認

まず、システムにインストールされているPythonのバージョンを確認します。

$ which python3
/usr/bin/python3
$ python3 --version
Python 3.9.16

ステップ2: pipのインストール

次に、Pythonパッケージマネージャーであるpipをインストールします。
以下のコマンドを実行して、pipがすでにインストールされているかどうかを確認し、必要に応じてインストールします。

$ python3 -m ensurepip --upgrade
(省略)
Installing collected packages: pip
Successfully installed pip-21.3.1

インストール後、pipのバージョンを確認して、正しくインストールされていることを確認します。

$ pip3 --version
pip 21.3.1 from /home/ec2-user/.local/lib/python3.9/site-packages/pip (python 3.9)

ステップ3: Supervisorのインストール

pipを使用して、Supervisorをインストールします。

$ pip3 install supervisor
(省略)
Installing collected packages: supervisor
Successfully installed supervisor-4.2.5

インストールが完了したら、以下のコマンドでSupervisorの実行可能ファイルのパスを確認します。

$ which supervisord
~/.local/bin/supervisord
$ which supervisorctl
~/.local/bin/supervisorctl

ステップ4: Supervisordの設定ファイルの作成

Supervisordの設定ファイルを生成し、必要に応じてカスタマイズします。

$ mkdir etc
$ .local/bin/echo_supervisord_conf > ~/etc/supervisord.conf

設定ファイルを編集して独自の設定を追加するには、以下のコマンドを使用します。

$ vi etc/supervisord.conf

設定例:

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface

;[include]
;files = relative/directory/*.ini
[include]
files = supervisord.d/*.ini

また、特定のプログラムの設定を追加することもできます。

$ vi etc/supervisord.d/laravel-worker.ini

設定例:

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
stopwaitsecs=3600

ステップ5: Supervisordの起動

設定ファイルが用意できたら、以下のコマンドでSupervisordを起動します。

$ supervisord -c ~/etc/supervisord.conf

ステップ6: Supervisorctlの使用

Supervisorctlを使用して、プロセスの状態を管理します。以下のコマンドでプロセスの状態を確認し、必要に応じて開始や停止などの操作を行います。

$ supervisorctl status all

以上で、Amazon Linux 2023にSupervisorをインストールし、設定する方法の説明は完了です。
この手順に従えば、効果的にSupervisorを利用してシステムのプロセス管理を行うことができます。