Artisan コマンド
Lase が提供する Artisan コマンドの一覧です。
lase:reseed
migrations テーブル以外のすべてのテーブルを truncate してからシーダーを実行します。データベースをシーダーの初期状態にリセットしたい場合に使用します。
php artisan lase:reseed| オプション | 説明 |
|---|---|
--force | 確認プロンプトをスキップして実行する |
DANGER
このコマンドはローカル環境(APP_ENV=local)でのみ実行可能です。すべてのテーブルデータが削除されます。
lase:index-docs
docs/ ディレクトリの Markdown をチャンク分割・Embedding 化して DB に保存します。AI チャットの RAG(検索拡張生成)に使用されます。
php artisan lase:index-docs| オプション | 説明 |
|---|---|
--force | 変更がないファイルも再インデックスする |
--source= | 対象を相対パスで絞り込む(例: --source=auth/login.md)。複数指定可。指定時は孤立チャンクの削除を行わない |
--no-prune | 参照されなくなったチャンクを削除しない |
ファイル内容の MD5 が一致する場合はスキップされるため、変更が無ければ Embeddings API は呼ばれません。実行のたびに、削除・リネームされたドキュメントの孤立チャンクも掃除されます。
.vitepress/ 配下は除外されますが、index.md は YAML フロントマターを除去した本文が取り込まれます。
config('lase.ai.embedding_model') や embedding_dimensions を変更した場合は、--force を付けなくても自動的に再インデックスされます(各行に生成時のモデル・次元数を保持しているため)。古いモデルのチャンクは検索対象から除外され、再インデックス時に置き換わります。
失敗時の挙動
デプロイをブロックしないよう、無駄な待ち時間が発生しない設計にしています。
| 状況 | 挙動 |
|---|---|
OPENAI_API_KEY 未設定 | Embedding が必要になった時点で即終了(API を呼ばない)。変更が無くスキップだけで終わる場合はキー不要なので成功する |
| 認証エラー・リクエスト不備(4xx) | 再試行しても結果が変わらないため 1 回で打ち切る |
| レート制限(429)・サーバエラー(5xx)・通信障害 | 200ms 間隔で最大 3 回まで再試行する |
| 連続 3 ファイル失敗 | 残りを処理せず中断する(API 障害が疑われるため)。中断時は孤立チャンクの削除も行わない |
実行タイミング
デプロイ時と日次スケジューラーの二重で実行します。
1. デプロイ時(codebase-jp/actions の ansible-deploy に組み込み済み)
app-deploy.yml で、Blue-Green のトラフィック切り替え後に実行されます。
- name: Build AI chat document index (RAG)
ansible.builtin.shell: |
docker exec "app-{{ _next_color }}" sh -lc 'cd /var/www/app && timeout 300 php artisan lase:index-docs'
register: _index_docs
changed_when: false
failed_when: false
when: "app_role == 'PRIMARY'"意図的に以下の設計にしています。
| 設計 | 理由 |
|---|---|
| 切り替え後に実行 | インデックス生成の待ち時間をユーザーに見せない |
failed_when: false | Embeddings API 障害でデプロイを失敗させない(スケジューラーがリトライする) |
timeout 300 | API 全滅時に長時間ハングさせない |
app_role == 'PRIMARY' | DB を共有するため、複数の app ノードから同時に書き込まない |
2. 日次スケジューラー(デプロイ時に失敗した場合の保険)
$schedule->command(IndexDocs::class)->dailyAt('03:00')->withoutOverlapping();TIP
ハッシュ一致でスキップされるため、docs を変更していないデプロイでは Embeddings API を呼ばず 1 秒未満で完了します。33 ファイル / 265 チャンク規模の全件生成でもコストは 0.1 円程度、所要時間は 3〜10 秒です。
lase:send-admin-mails
管理者メールの送信を実行します。スケジューラーから定期実行されることを想定しています。
php artisan lase:send-admin-mailslase:renew-subscriptions
サブスクリプションの更新処理を実行します。スケジューラーから定期実行されることを想定しています。
php artisan lase:renew-subscriptions