icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【AIが勝手に投稿するブログ開発シリーズ】プロンプト変数を生成クラスに渡す・データベース保存・自動実行などの機能作成

更新: 2024/09/21 3137文字

今回は最近管理人が作っていた『AIが勝手に投稿するブログ開発シリーズ』で、プロンプトを変数にして、生成に渡す・データベース保存などのコア機能っぽい部分を取り上げます。geminiライブラリをちょっと応用した感じです。さっそく内容を確認していきましょう。

前回行った内容~生成した文章を保存するデータベースを作る

前回の記事では、Google Geminiが生成した文章を保存するためのデータベースを設計しました。また、その前の段階でも『gemini-apiライブラリにSystem Instructionsを渡す』というのを扱いました。お時間ありましたら、こちらも目を通していただけると良いと思います。

また現在運用している『AIが勝手に投稿するブログ』のリンクは以下の通りです。こちらは現在、管理人が全く手を加えずに、aiがブログを投稿してくれています

AIが勝手に投稿するブログ~ディレクトリ構成と、プロンプトを生成に渡す・データベース保存等のコード例

ディレクトリ構成

サーバーにアップしたフォルダのローカル保存してある版ですが、内容は以下の通りです。

asset 生成部分のCSS,paginathing.js,アイコンの画像など
controllers dbConnectAndGetClass.php(データベース接続・記事取得・ページネーション出力)
generatePostClass.php(systemInstructionやcontentをライブラリに渡す・データベース保存する)
prompts content.php(雑談を行ってくださいみたいな指示、切り替えできる)
systemInstruction.php(システム指示)
vendor composerでインストールしたderrickobedgiu1/gemini-apiライブラリ、変更なし

今回はcontrollersフォルダ(generatePostClass.php)&promptsフォルダあたりをみていきましょうか。vendor内のderrickobedgiu1/gemini-apiライブラリについては、製作者さんのgithubリポジトリを見た方が早いので省略します。

promptsフォルダ内のプロンプトや指示が入ってるPHPファイル

systemInstruction.phpは、単純にgeminiに渡すsystemInstructionが入っているだけです。 この下に『1:雑談を行ってください、の場合』『2:webサイトSSFについて紹介してください、の場合』などのような指示が続きます。これはglobal $sInstructionみたいな形で変数になっていて、geminiライブラリに渡します。

そして、肝心のプロンプトを切り替えるコード(content.php)はこちらです。

ポイントはarray_randで、ここの番号をランダムで選んで、switchでプロンプト・カテゴリ・アイコン画像を切り替えています。

これらのファイルで使われた変数$sInstruction(システム指示),$prompt(プロンプト),$autoblog_cat(カテゴリ),$autoblog_imgpass(画像)は、実際に文章を生成するクラスに渡されます。

geminiライブラリにプロンプトなどを渡して、生成した文をデータベースに保存するコード(generatePostClass.php)

生成・データベース保存用classを作ったんですが、こんな感じになりました。とはいってもコンストラクタで全部やってしまいますが。autoload.phpはライブラリ読み込みで、他に先ほど作ったsystemInstruction.php・content.phpをrequire_onceで読んでいます。データベース接続情報はconst DSNのようにクラス定数にし、self::〇〇でアクセスします。

$response01 = $gemini->models()~の下りは、以前作ったコードと同じですが、sleep(6);という処理を挟んでいます。geminiの生成が遅れる場合があり、『レスポンスが空の状態なのにアクセスしようとした』というようなエラーが出たからです。

そのあとはPDOクラスを使ってデータベースに保存します。$contentのechoは生成文の確認用です。後はアクセスすれば実行され、データベースに記事が保存されます。

自動的に実行するには~サーバー側でcronの設定を行った

毎回ファイルアクセスして実行するのはめんどくさいので、どうにかして自動的にこのプログラムを動かす方法はないでしょうか?デスクトップwindowsだったらタスクスケジューラみたいに。
ありますね、サーバーでcron設定です。

SSFのサイトはロリポサーバーで動かしているため、ロリポサーバーcron機能が使えます。こんな感じで、間隔(1日2回)と実行ファイルを設定していきました。共用サーバーなのであまり大量に負荷をかけると止められる可能性がありますが、1日2回データベースに自動保存程度なら、サポセンから苦情もこないようです。

あとがき・まとめ

  • システム指示,プロンプトは他ファイルに分け、プロンプトはarray_randで切り替えられるようにした
  • 生成した文はPDOクラスを使ってデータベース保存ができたが、生成処理が遅れてエラーになることがあったため、sleep(6)のように処理を少し遅らせた
  • アクセスすればコンストラクタが動くが、毎回やるのはめんどいので、サーバーcronで自動実行するようにした

まとめると、こんなところでしょうか。今後もコードはいろいろ改善する点はありますが、geminiで生成した文をデータベースに保存・しかも自動実行というところまで作りました。次は記事の取得とか、WordPressのディレクトリに組み込むところも扱ってみたいと思います。


【カテゴリ】- PHP
【タグ】- , , , ,

関連記事