【ChatGPT 備忘録】XServerでOpenAI(ChatGPT)を動かす方法まとめ

何かと便利なXServerで話題のChatGPTを動かすために色々四苦八苦したので、手順をまとめる。

XServer × ChatGPT(OpenAI)の問題点

root権限が無いため、標準でインストールされているPythonに追加でモジュールがインストールできない。


方針

miniconda + pipを使う

minicondaってなに?

Minicondaとは、パッケージ管理システムと環境マネジメントシステムを担う conda と Python 基本パッケージを内包するディストリビューションです。 conda を用いて仮想環境を作成すれば、同じPC内で異なるバージョンのPython実行環境を用意することができます。

Google検索から抜粋

minicondaを使えばXServer上に様々なPython環境を構築できるようになります。

今回はminicondaを使ってXServer上にpython3.9環境を構築して、そのpython3.9にpip経由でOpenAIをインストールしていきます。

実際の手順

操作はXServerにssh接続してターミナル上で実行します。

minicondaのインストール

まずはインストールファイルをダウンロード&実行

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash Miniconda3-latest-Linux-x86_64.sh

途中で入力を求められたりしますが、すべてyesを入力。

インストールが終了すると.bashrcにいろいろ記述されているので、sourceを実行して有効化。

source .bashrc

conda –versionと実行すると現在のcondaのバージョンが表示されます。

conda --version

コマンドプロンプトの左に「(base)」と表示されていればOKです

本環境では標準でPython3.10がインストールされていました。

(base) [xsXXXXXX@svXXXXXX ~]$ python --version
Python 3.10.9

Python3.9の環境構築

3.10のバージョンのままでもいいのですが、ローカルの開発環境がpython3.9なのでcondaコマンドを実行して3.9環境を構築します。

ここではp39という名前でpython3.9環境を構築しました。

conda create --name py39 python=3.9

次に、今構築したpython3.9環境をactiveにします。
コマンドプロンプトの左に「(py39)」と表示されたらOK。

こんな感じ↓

(base) [xsXXXXX@svXXXXX ~]$ conda activate py39
(py39) [xsXXXXX@svXXXXX ~]$ 

これで自由にモジュールを追加できるpython3.9環境ができあがりました。

あとは公式ドキュメントにもあるようにpipからopen aiをインストールします。

open aiのインストール

pip install openai

これでopen aiのライブラリもインストールできました。

サンプルプログラムなどはこの状態で動くはずです。

PHPからopen AIを実行

2023年4月時点でopen aiのAPIはpythonのものしかありません。

今回laravelフレームワークで構築したウェブアプリケーションからChatGPTを扱いたいので、condaで構築したpython環境とPHPから実行するPythonコマンドの実行ファイルを合わせる必要があります。

筆者の環境では、
/home/xsXXXXXX/miniconda3/envs/py39/bin/python
にpython3.9環境が構築されたので、phpで実行するなら以下のような記述になります。(pythonプログラムはhoge.pyとしています。)

<?php
$output = null;
exec('/home/xsXXXXXX/miniconda3/envs/py39/bin/python hoge.py', $output);
var_dump($output);

ChatGPTの使い方

最近ChatGPTに関する問い合わせが非常に多いので、ChatGPTの使い方をまとめた動画を一つ紹介します。

※ 4分40秒辺りから具体的な説明になります。

GoogleなどでChatGPTと検索してもChatGPTに似せたアプリや偉い人の感想などが多くて基本的な使い方の説明が中々見つけられませんよね。

一言で使い方を言えば、以下のURLでログインして出てくるウィザードに従えばOKです。(細かい使い方は上記の動画を見てください)

ChatGPTのログインはこちらから↓
https://chat.openai.com/auth/login

ちなみに今インフォトップで販売しているきりんツールを使う場合は、ChatGPTへの登録は必要ありません。

きりんツールの利用上限が拡大されました

現在インフォトップで販売させていただいているブログ記事自動作成ツール「きりんツール」について、公開直後から大変多くの方にご購入いただきました。本当にありがとうございます。

公開当初は、1日の記事作成の制限数に以下の上限を設定していました。

ライトプランの場合
一日あたり最大10件まで

ゴールドプランの場合
1日あたり最大50件まで

本ツールには文章作成のAIであるChat GPTのAPIを利用しているのですが、実稼働させてみてAPIの利用料金に余裕がありそうなので記事作成の上限数を以下の通りに引き上げました。

ライトプランの場合
一日あたり最大30件まで

ゴールドプランの場合
1日あたり最大200件まで

今後も様子を見て段階的に引上げる予定です。

何卒宜しくお願いします。

きりんツールアフィリエイト設定

きりんツールはインフォトップでアフィリエイトできるようになっています。

また、きりんツール自体にきりんツールをアフィリエイトする機能が組み込まれているため、AI記事と連携してそのままきりんツールのアフィリエイトもすることが可能です。

この動画では、きりんツールとインフォトップアフィリエイトを連携する方法を説明しています。

一般アフィリエイト報酬は1000円ですが、きりんツールの購入者はアフィリエイト報酬を50%に引き上げさせていただきます。
ゴールドプランの場合は初月19800円、月額9800円の利用料がかかりますが、この利用料の50%が紹介者様に支払われますので継続的に売上を手にすることができます。

アフィリエイト文言はHTMLで記載する必要があります。

もし、記載を誤ってしまった場合などは以下のテキストをコピペするなどで再設定してください。

アフィリエイト文言の例

この記事は<a href="{%affiliate_url%}">きりんツール</a>のAIによる自動生成機能で作成されました

macでターミナルからhostsファイル書き換え

hostsファイルを書き換えるとドメインのIPを瞬時に書き換えられるので便利だからやり方をここにメモ

ターミナルを起動

ターミナルはコマンドを使っていろんな操作ができる便利なアプリケーション

macのスポットライト機能で検索するのが便利

クリックして選んだアプリケーションが起動します

ターミナルが起動した

vi でhostsファイルを開く

管理者権限で/etcフォルダにあるhostsファイルをviで開くコマンド

パスワードを聞かれるので入力

sudo vi /etc/hosts

管理者権限でhostsファイルをviで開いた状態が以下

このファイルに

172.217.161.46 hoge.com

↑こんな感じで「IP ドメイン」の形式で行を追加するとそのドメインのIPを強制的に切り替えられるので、以下にような状態になることを目指します。

viの使い方

ファイルの最終行に「IP ドメイン」の行を足すだけなので簡単に見えるけどviの癖が凄いのでちょっと大変

コマンドを使ってファイルを編集・保存する感じです

入力モード・コマンドモードの切り替え

viはコマンド操作をするコマンドモードと文字を入力する入力モードがあります。
通常vi起動時はコマンドモードになっています。

入力モードへの切り替えは小文字のi
コマンドモードに戻すときはEscキー

左下にINSERTと出ていたら入力モード。文字を入力できます

入力モードとコマンドモードを切り替えつつファイルを編集することになります。

viよく使うコマンド

入力モードへ切り替えi
コマンドモードへ切り替えEscキー
カーソル移動十字キーがわかりやすい
保存して終了:wq
保存しないで終了:q!
保存だけするコマンド:w
行をコピーyy
行を貼り付けp
一番下の行に移動Shift + g
行の末尾に移動して入力モードに切り替えShift + a

簡単な操作なら十字キーで移動して、入力モードに切り替えてなんやかんや文字を入力して:wqで保存すればOKです。

もし変な操作したかもと思ったらEscを連打してコマンドモードにしてから:q!で保存せずに終了です。

実際に編集しよう

最終行にIP +ドメインの行を足すだけなので、十字キー↓連打、その後→連打からiで入力モードに切り替えて、Enter(改行)してIP ドメインと入れれば力技でも解決します。

コマンドを使うと少しだけ楽になります。

初手Shift + gで最終行に移動、次にShift + aで行の末尾に移動して入力モードに切り替え、そこでEnterしてIP ドメイン入力で完了です。

保存は:wq

お疲れ様でした。

[Laravel 備忘録] APIの取得結果をキャッシュしたらGoogle Custom Search API利用料金が激安になった

状況

開発したリサーチツールで、Google Custom Search APIを利用しているけど料金が高いので安くしたいから工夫した

やったこと

Laravel標準のキャッシュ機能で検索結果を一定期間保存するように実装

Google Custom Search API利用料金

  • API呼び出し、1000回につき5ドル
  • 1日あたりのAPI呼び出し、100回までは無料

一日100回までの無料ボーナスがあるので、理想は毎日100回ずつAPIを利用できれば月間で約3000回リサーチを行っても無料になるので、まんべんなく毎日リサーチをするのが理想ではある。

でも、ツールを一般公開している以上、どうしても週末に利用量が集中するので、土日は100は超えてしまう。

これを解決したい。

対策案

利用ログを追ってみると、短時間内(数分以内)に同一ワードで検索している履歴が複数見られた。

Aというワードで検索、次にBを検索、その後再度Aのワードで検索、その後Bで以下略。

数分前のワードでのリサーチ結果をもう一回見たいという人が一定数いるということよね。

特定のキーワードによるAPIからのレスポンスデータを一定時間キャッシュして、同一ワードでリクエストが来たらキャッシュデータを返すようにしたらAPIの呼び出し回数は減るはず。

以下のように実装。(環境はlaravel)


    public function getRequest()
    {

        // cacheがあればそれを利用
        $cacheKey = "キーワードをハッシュ化したcachekeyを利用する";

        $value = Cache::get($cacheKey);
        if ($value) {
            return $value;
        }

        // キャッシュがないならデータ取得
        $value = "APIからデータ取得する処理";

        // キャッシュに保存(60秒 * 60 = 1時間)
        $cacheTime = 60 * 60;
        Cache::put($cacheKey, $value, $cacheTime);
        return $value;
    }

実装結果

結果としては今の所これで一日100回以下に抑えられた。

利用者が10倍になったらアウトなのでまたその時考える。

きりんツール遂に完成!

多くのブロガーが、UberSuggestなどのキーワードボリュームツールと何らかの市場ライバルリサーチツールを組み合わせて事前にライバルチェックを行っていると思います。

僕自身利用はしているのですが、料金はそんなに安くない(数万円/月)のに加えてブロガーに特化しているわけではないので、細かい機能に不満があるんですよね。

こうなったらもう、自分で作ったれ!ということで作ったのがこのきりんツール(仮)です。

きりんツールはこちら
https://kirintool.jp

一言で言えば、特定の複数キーワード検索において「検索ボリューム」と「競合サイトの状況」を同時に比較してそのキーワードが狙い目のワードかを記事を書く前にチェックできるツールですね。

実際の画面がこちら↓

インターフェイスはシンプルです。

基本キーワードとサブキーワードを設定して「リサーチボタン」を押すだけ。

ネット上のデータをアナライズして、執筆に値するキーワードなのかを自動判別してくれます。

判定ロジック

詳細は企業秘密ですが、基本的に一定の検索ボリュームがあり、SEO評価の高いほかのサイトが少ないキーワードをOKキーワードとして判断しています。

需要と供給のミスマッチを狙う

僕の場合、ブログ運営で一番時間を掛けているところがキーワード選定の部分です。

いくら記事を書いても上位表示されないのであれば、売上には繋がりません。

需要と供給の関係というのを学校の授業で聞いたことがありますよね(あるよね?)

需要が多いのに、供給が少ない場合はものがすぐに売り切れる。

逆に需要が無いのに、供給が溢れている場合は、中々売上が上がることはないでしょう。

こういうことを市場が飽和していると表現したりしますよね。

検索ボリュームというのは「需要」、競合サイトの数は「供給」に相当します。

基本的に検索ボリュームが多いサイトは、競合サイトも多いのが当たり前ですから、需要と供給のバランスが逆転しているキーワードを探すのは結構時間が掛かるんですよね。

本当に狙い目のキーワードは、1時間位掛けて1つ見つかればいいほうじゃないかなと思います。

僕の場合、テーマが決まれば記事自体は30分あれば大体仕上がりますから、キーワード選定に費やす時間はかなり割合を占めていたんですよね。

全てのブロガーが求めていた答え

このツールは、長年ブログ運営をしてきた僕が一番時間がかかっていた作業を自動で実行してくれる全てのブロガーが求めていた革命的なリサーチツールです。

一般公開はまだ先になるかも

現状このツールは僕が個人利用する上で便利だと思う機能を最低限組み込んだ状態で完璧に動作しています。

今後僕のクライアント様に利用してもらって、機能要望を聞きながらより幅広い層のニーズに対応しきれるようになったら一般公開ということにしようと思っています。

いろんなAPI(有料)を使っているので、タダでは公開しませんよ(笑

とはいえ、多くの人にブロガーという職業を目指してもらいたいという気持ちもあるので、そこまでがめつくはしないつもりです。

きっとあなたの希望に答えられるツールになっていますから、楽しみにしていてください。

逆にキーワードさえ決まってしまえばあとは1時間もかかりません。

[Laravel 備忘録] Laravel Authでユーザー情報変更機能実装

ProfileController作成

sail artisan make:controller ProfileController

routes/web.phpに以下を追記

// プロフィールの表示と編集
Route::get('/profile', [ProfileController::class, 'index'])->middleware(['auth']);
Route::get('/profile/edit', [ProfileController::class, 'edit'])->middleware(['auth']);
Route::post('/profile/edit', [ProfileController::class, 'update'])->middleware(['auth']);

ProfileController.php

    public function edit()
    {
        return view('profile.edit');
    }

    public function update(Request $request)
    {
        $request->validate([
            'name' => ['required', 'string', 'max:255'],
        ]);
        // Authからuser取り出し
        $user = Auth::user();
        $params = $request->all();
        // パラメータをセットして更新
        $user->fill($params)->save();

        // flashメッセージつけてリダイレクト
        return redirect('/profile')->with('flash_message', 'ユーザー情報を編集しました');
    }

viewファイルの適当な箇所(おそらくlayoutファイル)に以下を記述

                @if (session('flash_message'))
                    <div class="max-w-7xl mx-auto  bg-blue-100 border border-blue-500 text-blue-700 px-4 py-3 rounded" role="alert">
                        <p class="text-sm">{{ session('flash_message') }}</p>
                    </div>
                @endif

参考

https://teratail.com/questions/284796

[Laravel 備忘録] コマンドラインプログラムの作成

フレームワークで開発してると、「このfunction本当に挙動あってる?」みたいな瞬間があると思います。(あるよね?)

それを確認するためにTest作れとかいう意見もわかるんですが、そもそもそのテストを作るためにちょっと挙動を確認したいときもあるわけです。

laravelでいうtinkerみたいな対話式プログラムも用意されていますが、僕的にはコマンドラインで echo “hello world”; 以上のことやるの難しいと思うんですよね。

Web出力にvar_dumpとかするにしても、都合の良いページがあればいいですが、var_dumpするためにいちいちコントローラーとか作るのもめんどくさいわけです。

だから僕はそんなときは、コマンドラインプログラムで対応しています。

なので今回はlaravelでコマンドラインプログラム実装する備忘録。

環境

Laravel8、php7、Laravel Sail

やりたいこと

laravelのコマンドラインプログラムでHello Worldを出力する。

まずはCommandファイルを作成

sail artisan make:command Kirin

これで/app/Console/Commands/Kirin.phpが作られる。

Sail未導入ならsail -> phpに置き換えかな

Kirin.phpを修正

直すところは大まかに3つ、$signature、$descripitionとhandle()の中身です。

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class Kirin extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
//  コマンド文字列を指定
    protected $signature = 'kirin:test';

    /**
     * The console command description.
     *
     * @var string
     */
//  コマンドの説明(適当でOK)
    protected $description = '頑張って作ったコマンドラインプログラム';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
//      ここに処理を記述
        echo 'Hello world.' . PHP_EOL;
        return Command::SUCCESS;
    }
}

実行

以下のコマンドを実行します。

$ php artisan kirin:test

$php artisan + $signatureで指定した文字列

実行結果

Hello world.

まとめ

Laravelの場合、useやらnamespaceやら色々プログラムを動かすために記述が必要で、こんなのIDEが無いと無理。

コマンドラインプログラムにしておけば、IDEで保管しながらコーディングできるしモデルとか使う場合とかこういうふうにしないとわけわかんなくね?

というひとのためのtipsです。