Commit
·
afe743c
1
Parent(s):
d270dd6
vscodeにdev containerの追加
Browse files- .devcontainer/devcontainer.json +15 -0
- docs/ai_api_development_guide.md +58 -58
- tests/test_main.py +8 -0
.devcontainer/devcontainer.json
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "Kids Playground AI API Dev",
|
3 |
+
"dockerComposeFile": "../docker-compose.yml",
|
4 |
+
"service": "api",
|
5 |
+
"workspaceFolder": "/app",
|
6 |
+
"customizations": {
|
7 |
+
"vscode": {
|
8 |
+
"extensions": [
|
9 |
+
"ms-python.python",
|
10 |
+
"ms-python.vscode-pylance",
|
11 |
+
"charliermarsh.ruff"
|
12 |
+
]
|
13 |
+
}
|
14 |
+
}
|
15 |
+
}
|
docs/ai_api_development_guide.md
CHANGED
@@ -160,8 +160,8 @@ AI新機能の開発においては、以下のコーディング規約と開発
|
|
160 |
* **型ヒントの活用**: `mypy` を用いた型チェックを徹底し、コードの堅牢性、可読性、およびIDEによる補完の恩恵を最大化します。
|
161 |
* **Djangoとの連携**: AI機能がDjangoアプリケーションと連携する場合、Djangoのモデル、ビュー、フォーム、URLパターンなどの既存の命名規則と構造に準拠し、シームレスな統合を図ります。
|
162 |
* **AI/MLコードの構造**:
|
163 |
-
|
164 |
-
|
165 |
* **ドキュメンテーション**: 関数、クラス、複雑なアルゴリズム、およびAIモデルの設計意図には、適切なDocstringを記述し、コードの意図と振る舞いを明確にします。
|
166 |
* **エラーハンドリング**: 予期せぬエラーや例外処理は、Djangoの標準的なエラーハンドリングやPythonの例外処理メカニズムに従い、適切にログを出力し、システムの安定性を確保します。
|
167 |
* **保守性と可読性**: コードは常に保守性と可読性を最優先に設計・実装します。複雑なロジックは小さな関数に分割し、変数名や関数名は意図が明確に伝わるように命名します。
|
@@ -170,12 +170,12 @@ AI新機能の開発においては、以下のコーディング規約と開発
|
|
170 |
#### 2. テスト駆動開発 (TDD) とテストの考え方
|
171 |
|
172 |
* **t_wada氏のTDDスタイル**: 開発は「Red → Green → Refactor」のTDDサイクルを厳守して進めます。
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
* **「動く仕様書」としてのテスト**: テストコードは、単なる品質保証の手段ではなく、機能の振る舞いを明確に記述した「動く仕様書」として機能するように設計します。
|
177 |
-
|
178 |
-
|
179 |
|
180 |
---
|
181 |
|
@@ -537,7 +537,7 @@ sequenceDiagram
|
|
537 |
- `python src/ai_api/main.py` を実行すれば、Djangoとは無関係に単体で起動できます。
|
538 |
- 起動したAIアプリに対し、ブラウザでUIを操作したり、`curl`コマンドでAPIを直接叩いたりすることで、単体での動作テストが可能です。
|
539 |
- **Djangoアプリケーション:**
|
540 |
-
- `SummarizeReviewsView` のテストを書く際、`unittest.mock.patch` を使って `
|
541 |
- これにより、AI APIへ実際にネットワーク通信を発生させることなく、「APIが成功を返した場合」「タイムアウトした場合」「エラーを返した場合」など、あらゆる状況を想定したビューのロジックを高速にテストできます。
|
542 |
|
543 |
こ���設計により、両アプリケーションは互いに依存することなく、独立して開発,テスト,デプロイを進めることが可能になります。
|
@@ -683,9 +683,9 @@ git push -u origin main
|
|
683 |
```
|
684 |
|
685 |
- [x] **中タスク0.4: Hugging Faceアカウントの登録とSpacesの準備**
|
686 |
-
-
|
687 |
-
-
|
688 |
-
-
|
689 |
1. Hugging Faceのウェブサイト (huggingface.co) にアクセスし、アカウントを登録します。
|
690 |
2. ログイン後、「Spaces」セクションに移動し、「Create new Space」をクリックします。
|
691 |
3. Space名、ライセンス、SDK(Gradioを選択)、公開/非公開設定などを適切に設定し、Spaceを作成します。
|
@@ -765,140 +765,140 @@ docker-compose up --build -d
|
|
765 |
- **内容:** 環境変数設定ファイル(`.env`)とそのテンプレート(`.env.example`)を作成します。
|
766 |
- **指示:** プロジェクトのルートディレクトリに`.env`ファイルと`.env.example`ファイルを作成してください。
|
767 |
|
768 |
-
### フェーズ
|
769 |
|
770 |
**目的:** CI/CDパイプラインが全体として機能することを検証するための、最もシンプルな「Hello World」的なGradioアプリケーションを作成する。
|
771 |
|
772 |
-
- [ ] **中タスク
|
773 |
-
- [ ] **小タスク
|
774 |
- **担当:** AI
|
775 |
- **内容:** `tests/test_main.py`を作成し、`main.py`の`greet`関数が特定の文字列を返すことを期待するテストを記述します。この時点では`main.py`や`greet`関数が存在しないため、テストは失敗します。
|
776 |
-
- [ ] **小タスク
|
777 |
- **担当:** AI
|
778 |
- **内容:** `src/ai_api/main.py`に、簡単な`greet`関数と、それを呼び出すGradioインターフェースを実装し、テストをパスさせます。
|
779 |
-
- [ ] **小タスク
|
780 |
- **担当:** AI
|
781 |
- **内容:** コードを整理し、可読性を高めます。
|
782 |
|
783 |
-
### フェーズ
|
784 |
|
785 |
**目的:** コードの品質を自動的に検証し、Hugging Face Spacesへ自動的にデプロイする仕組みを構築する。
|
786 |
|
787 |
-
- [ ] **中タスク
|
788 |
-
- [ ] **小タスク
|
789 |
- **担当:** AI
|
790 |
- **内容:** `.github/workflows/ci.yml` を作成します。最初はトリガーだけを記述し、具体的なジョブは空にしておきます。この時点では何も実行されません。
|
791 |
-
- [ ] **小タスク
|
792 |
- **担当:** AI
|
793 |
- **内容:** `ci.yml` に、Pythonのセットアップ、依存関係のインストール、`ruff`によるlintチェック、`mypy`による型チェック、`pytest`によるテスト実行のステップを追加します。
|
794 |
- **指示:** `/home/jam/kids-playground-ai-api/.github/workflows/ci.yml` を更新してください。
|
795 |
-
- [ ] **小タスク
|
796 |
- **担当:** AI
|
797 |
- **内容:** キャッシュ機構などを導入し、CIの実行時間を短縮します。
|
798 |
-
- [ ] **小タスク
|
799 |
- **担当:** 人間
|
800 |
- **内容:** この変更をGitHubにプッシュし、GitHubの「Actions」タブでワークフローが正しく実行され、全てのチェックが成功することを確認します。
|
801 |
|
802 |
-
- [ ] **中タスク
|
803 |
-
- [ ] **小タスク
|
804 |
- **担当:** 人間
|
805 |
- **内容:** Hugging Faceの設定ページで`write`権限を持つアクセストークンを発行し、それをGitHubリポジトリのSecretsに`HF_TOKEN`として登録します。
|
806 |
-
- [ ] **小タスク
|
807 |
- **担当:** AI
|
808 |
- **内容:** `ci.yml`に、`test`ジョブの成功後に`main`ブランチでのみ実行される`deploy-to-hf-space`ジョブを追加します。最初は簡単な`echo`コマンドのみを記述し、デプロイが実行されない状態にします。
|
809 |
-
- [ ] **小タスク
|
810 |
- **担当:** AI
|
811 |
- **内容:** `deploy-to-hf-space`ジョブに、`hugging-face/push-to-hub`アクションを追加し、Secretsに登録した`HF_TOKEN`を使ってHugging Face Spacesにコードをプッシュするように実装します。
|
812 |
-
- [ ] **小タスク
|
813 |
- **担当:** 人間
|
814 |
- **内容:** CI/CDが成功したコミットを`main`ブランチにマージし、GitHubの「Actions」タブでデプロイジョブが成功することを確認します。その後、Hugging Face Spaceの公開URLにアクセスし、アプリケーションが正しくデプロイされていることを確認します。
|
815 |
|
816 |
-
### フェーズ
|
817 |
|
818 |
**目的:** クリーンアーキテクチャの原則に従い、内側のビジネスロジックから外側のAPIへと実装を進める。
|
819 |
|
820 |
-
- [ ] **中タスク
|
821 |
-
- [ ] **小タスク
|
822 |
- **担当:** AI
|
823 |
- **内容:** `tests/core/test_inference.py` を作成し、「`from src.ai_api.core.inference import Summarizer` が成功すること」をテストします。このテストは、ファイルやクラスが存在しないため失敗します。
|
824 |
-
- [ ] **小タスク
|
825 |
- **担当:** AI
|
826 |
- **内容:** `src/ai_api/core/inference.py` と、空の`Summarizer`クラスを作成し、テストをパスさせます。
|
827 |
-
- [ ] **小タスク
|
828 |
- **担当:** AI
|
829 |
- **内容:** この時点では特になし。コミットの区切りとします。
|
830 |
|
831 |
-
- [ ] **中タスク
|
832 |
-
- [ ] **小タスク
|
833 |
- **担当:** AI
|
834 |
- **内容:** `tests/core/test_inference.py`に追記します。
|
835 |
- **内容:** `Summarizer`がコンストラクタで設定オブジェクト(モデル名など)を受け取ることを期待するテストを`tests/core/test_inference.py`に追記します。
|
836 |
-
- [ ] **小タスク
|
837 |
- **担当:** AI
|
838 |
- **内容:** `src/ai_api/config.py`に設計通りの設定クラス(`ModelConfig`など)を作成します。`Summarizer`の`__init__`を修正し、設定オブジェクトを受け取るようにします。
|
839 |
-
- [ ] **小タスク
|
840 |
- **担当:** AI
|
841 |
- **内容:** コードの可読性を向上させます。 **この時点で、AIモデルを切り替えるための基本的な仕組み(設定値を外部から与える)が完成します。**
|
842 |
|
843 |
-
- [ ] **中タスク
|
844 |
-
- [ ] **小タスク
|
845 |
- **担当:** AI
|
846 |
- **内容:** `unittest.mock.patch`を使い、`transformers.pipeline`をモック(偽物に差し替え)します。「`summarize`メソ��ドを呼ぶと、内部で`pipeline`が特定の引数で呼ばれ、モックの返り値がそのまま返されること」をテストします。これにより、重いモデルをロードせずにロジックだけを高速にテストできます。
|
847 |
-
- [ ] **小タスク
|
848 |
- **担当:** AI
|
849 |
- **内容:** `Summarizer`クラスに`summarize`メソッドを実装し、内部で`transformers.pipeline`を呼び出して要約を実行するようにします。
|
850 |
-
- [ ] **小タスク
|
851 |
- **担当:** AI
|
852 |
- **内容:** エラーハンドリングなどを追加し、コードを整理します。
|
853 |
|
854 |
-
- [ ] **中タスク
|
855 |
-
- [ ] **小タスク
|
856 |
- **担当:** AI
|
857 |
- **内容:** `tests/test_api.py`を作成します。テスト内でGradioアプリを別スレッドで起動し、`requests.post`で`/api/predict/`にリクエストを送信して、期待した応答が得られない(サーバーがないため)ことを確認します。
|
858 |
-
- [ ] **小タスク
|
859 |
- **担当:** AI
|
860 |
- **内容:** `src/ai_api/main.py`を作成します。`Summarizer`と設定クラスをインスタンス化し、DI(依存性の注入)してGradioの`Interface`を定義・起動します。
|
861 |
-
- [ ] **小タスク
|
862 |
- **担当:** AI
|
863 |
- **内容:** コードを整理します。
|
864 |
-
- [ ] **小タスク
|
865 |
- **担当:** 人間
|
866 |
- **内容:** `python src/ai_api/main.py` を実行し、ブラウザで表示されるGradioのUIにテキストを入力して、要約機能が単体で正しく動作することを確認します。
|
867 |
|
868 |
-
### フェーズ
|
869 |
|
870 |
**目的:** 独立して動作するAIアプリケーションを、DjangoからAPI経由で安全に呼び出す。
|
871 |
|
872 |
-
- [ ] **中タスク
|
873 |
-
- [ ] **小タスク
|
874 |
- **担当:** AI
|
875 |
- **内容:** `myapp/tests/test_clients.py`を作成します。`requests.post`がモック化されている状態でAPIクライアント関数を呼び出し、成功時・タイムアウト時・サーバーエラー時の挙動をテストします。
|
876 |
-
- [ ] **小タスク
|
877 |
- **担当:** AI
|
878 |
- **内容:** `myapp/clients/ai_summary_client.py`を作成し、`requests`を使って外部APIを呼び出す関数を実装します。
|
879 |
-
- [ ] **小タスク
|
880 |
- **担当:** AI
|
881 |
- **内容:** 設定を`settings.py`から読み込むようにするなど、コードを整理します。
|
882 |
|
883 |
-
- [ ] **中タスク
|
884 |
-
- [ ] **小タスク
|
885 |
- **担当:** AI
|
886 |
- **内容:** `myapp/tests/test_views.py`に、`/summarize/playground/{id}/`へのGETリクエストが404を返すテストを書きます。
|
887 |
-
- [ ] **小タスク
|
888 |
- **担当:** AI
|
889 |
- **内容:** `myapp/urls.py`と`myapp/views/summary_views.py`を作成・編集し、テストをパスさせます。
|
890 |
-
- [ ] **小タスク
|
891 |
- **担当:** AI
|
892 |
- **内容:** `unittest.mock.patch`でAPIクライアントをモック化し、「Viewを呼び出すと、内部でAPIクライアントが特定の引数で呼ばれること」をテストします。
|
893 |
-
- [ ] **小タスク
|
894 |
- **担当:** AI
|
895 |
- **内容:** View内で口コミの取得・検証ロジック、およびAPIクライアントの呼び出しを実装します。
|
896 |
-
- [ ] **小タスク
|
897 |
- **担当:** AI
|
898 |
- **内容:** コードを整理します。
|
899 |
|
900 |
-
- [ ] **中タスク
|
901 |
-
- [ ] **小タスク
|
902 |
- **担当:** 人間
|
903 |
- **内容:** DjangoサーバーとAIアプリ(Gradio)を両方ローカルで起動し、ブラウザから最初の要約ボタンをクリックして、全体の流れが正しく動作するかを確認します。
|
904 |
|
|
|
160 |
* **型ヒントの活用**: `mypy` を用いた型チェックを徹底し、コードの堅牢性、可読性、およびIDEによる補完の恩恵を最大化します。
|
161 |
* **Djangoとの連携**: AI機能がDjangoアプリケーションと連携する場合、Djangoのモデル、ビュー、フォーム、URLパターンなどの既存の命名規則と構造に準拠し、シームレスな統合を図ります。
|
162 |
* **AI/MLコードの構造**:
|
163 |
+
- データ処理(前処理、特徴量エンジニアリング)、モデル定義、学習ロジック、推論ロジックは明確に分離し、それぞれが単一の責務を持つモジュールとして設計します。
|
164 |
+
- 設定値やハイパーパラメータはコードから分離し、Djangoの`settings.py`、または専用のYAML/JSONファイルなどで一元的に管理します。
|
165 |
* **ドキュメンテーション**: 関数、クラス、複雑なアルゴリズム、およびAIモデルの設計意図には、適切なDocstringを記述し、コードの意図と振る舞いを明確にします。
|
166 |
* **エラーハンドリング**: 予期せぬエラーや例外処理は、Djangoの標準的なエラーハンドリングやPythonの例外処理メカニズムに従い、適切にログを出力し、システムの安定性を確保します。
|
167 |
* **保守性と可読性**: コードは常に保守性と可読性を最優先に設計・実装します。複雑なロジックは小さな関数に分割し、変数名や関数名は意図が明確に伝わるように命名します。
|
|
|
170 |
#### 2. テスト駆動開発 (TDD) とテストの考え方
|
171 |
|
172 |
* **t_wada氏のTDDスタイル**: 開発は「Red → Green → Refactor」のTDDサイクルを厳守して進めます。
|
173 |
+
- **Red**: 最初に失敗するテストを記述し、必要な機能の振る舞いを定義します。
|
174 |
+
- **Green**: テストが成功する最小限のコードを実装します。
|
175 |
+
- **Refactor**: コードの品質を向上させ、重複を排除し、設計を改善します。
|
176 |
* **「動く仕様書」としてのテスト**: テストコードは、単なる品質保証の手段ではなく、機能の振る舞いを明確に記述した「動く仕様書」として機能するように設計します。
|
177 |
+
- テストケース名(`pytest`のテスト関数名など)は、**日本語で**「〜という状況で、〜という振る舞いをすべき」というように、具体的なシナリオと期待される結果を記述します。
|
178 |
+
- テストは実装の詳細ではなく、機能の**振る舞い(Behavior)**に焦点を当てます。
|
179 |
|
180 |
---
|
181 |
|
|
|
537 |
- `python src/ai_api/main.py` を実行すれば、Djangoとは無関係に単体で起動できます。
|
538 |
- 起動したAIアプリに対し、ブラウザでUIを操作したり、`curl`コマンドでAPIを直接叩いたりすることで、単体での動作テストが可能です。
|
539 |
- **Djangoアプリケーション:**
|
540 |
+
- `SummarizeReviewsView` のテストを書く際、`unittest.mock.patch` を使って `_call_api` メソッドをモック(偽のオブジェクトに差し替え)します。
|
541 |
- これにより、AI APIへ実際にネットワーク通信を発生させることなく、「APIが成功を返した場合」「タイムアウトした場合」「エラーを返した場合」など、あらゆる状況を想定したビューのロジックを高速にテストできます。
|
542 |
|
543 |
こ���設計により、両アプリケーションは互いに依存することなく、独立して開発,テスト,デプロイを進めることが可能になります。
|
|
|
683 |
```
|
684 |
|
685 |
- [x] **中タスク0.4: Hugging Faceアカウントの登録とSpacesの準備**
|
686 |
+
- **担当:** 人間
|
687 |
+
- **内容:** Hugging Faceアカウントを登録し、AIモデルをデプロイするためのHugging Face Spaceを準備します。
|
688 |
+
- **指示:**
|
689 |
1. Hugging Faceのウェブサイト (huggingface.co) にアクセスし、アカウントを登録します。
|
690 |
2. ログイン後、「Spaces」セクションに移動し、「Create new Space」をクリックします。
|
691 |
3. Space名、ライセンス、SDK(Gradioを選択)、公開/非公開設定などを適切に設定し、Spaceを作成します。
|
|
|
765 |
- **内容:** 環境変数設定ファイル(`.env`)とそのテンプレート(`.env.example`)を作成します。
|
766 |
- **指示:** プロジェクトのルートディレクトリに`.env`ファイルと`.env.example`ファイルを作成してください。
|
767 |
|
768 |
+
### フェーズ2: CI/CD検証用サンプルアプリケーションの作成
|
769 |
|
770 |
**目的:** CI/CDパイプラインが全体として機能することを検証するための、最もシンプルな「Hello World」的なGradioアプリケーションを作成する。
|
771 |
|
772 |
+
- [ ] **中タスク2.1: Gradioサンプルコードの実装**
|
773 |
+
- [ ] **小タスク2.1.1 (RED):** `main.py`のテストを作成
|
774 |
- **担当:** AI
|
775 |
- **内容:** `tests/test_main.py`を作成し、`main.py`の`greet`関数が特定の文字列を返すことを期待するテストを記述します。この時点では`main.py`や`greet`関数が存在しないため、テストは失敗します。
|
776 |
+
- [ ] **小タスク2.1.2 (GREEN):** `main.py`にサンプルを実装
|
777 |
- **担当:** AI
|
778 |
- **内容:** `src/ai_api/main.py`に、簡単な`greet`関数と、それを呼び出すGradioインターフェースを実装し、テストをパスさせます。
|
779 |
+
- [ ] **小タスク2.1.3 (REFACTOR):** リファクタリング
|
780 |
- **担当:** AI
|
781 |
- **内容:** コードを整理し、可読性を高めます。
|
782 |
|
783 |
+
### フェーズ3: CI/CDの構築とデプロイ
|
784 |
|
785 |
**目的:** コードの品質を自動的に検証し、Hugging Face Spacesへ自動的にデプロイする仕組みを構築する。
|
786 |
|
787 |
+
- [ ] **中タスク3.1: CIワークフローの構築 (GitHub Actions)**
|
788 |
+
- [ ] **小タスク3.1.1 (RED):** CI設定ファイルの骨格作成
|
789 |
- **担当:** AI
|
790 |
- **内容:** `.github/workflows/ci.yml` を作成します。最初はトリガーだけを記述し、具体的なジョブは空にしておきます。この時点では何も実行されません。
|
791 |
+
- [ ] **小タスク3.1.2 (GREEN):** CIジョブの実装
|
792 |
- **担当:** AI
|
793 |
- **内容:** `ci.yml` に、Pythonのセットアップ、依存関係のインストール、`ruff`によるlintチェック、`mypy`による型チェック、`pytest`によるテスト実行のステップを追加します。
|
794 |
- **指示:** `/home/jam/kids-playground-ai-api/.github/workflows/ci.yml` を更新してください。
|
795 |
+
- [ ] **小タスク3.1.3 (REFACTOR):** ワークフローの最適化
|
796 |
- **担当:** AI
|
797 |
- **内容:** キャッシュ機構などを導入し、CIの実行時間を短縮します。
|
798 |
+
- [ ] **小タスク3.1.4: CIの動作確認**
|
799 |
- **担当:** 人間
|
800 |
- **内容:** この変更をGitHubにプッシュし、GitHubの「Actions」タブでワークフローが正しく実行され、全てのチェックが成功することを確認します。
|
801 |
|
802 |
+
- [ ] **中タスク3.2: CDワークフローの構築 (GitHub Actions)**
|
803 |
+
- [ ] **小タスク3.2.1: Hugging Faceアクセストークンの準備**
|
804 |
- **担当:** 人間
|
805 |
- **内容:** Hugging Faceの設定ページで`write`権限を持つアクセストークンを発行し、それをGitHubリポジトリのSecretsに`HF_TOKEN`として登録します。
|
806 |
+
- [ ] **小タスク3.2.2 (RED):** デプロイジョブの骨格作成
|
807 |
- **担当:** AI
|
808 |
- **内容:** `ci.yml`に、`test`ジョブの成功後に`main`ブランチでのみ実行される`deploy-to-hf-space`ジョブを追加します。最初は簡単な`echo`コマンドのみを記述し、デプロイが実行されない状態にします。
|
809 |
+
- [ ] **小タスク3.2.3 (GREEN):** デプロイジョブの実装
|
810 |
- **担当:** AI
|
811 |
- **内容:** `deploy-to-hf-space`ジョブに、`hugging-face/push-to-hub`アクションを追加し、Secretsに登録した`HF_TOKEN`を使ってHugging Face Spacesにコードをプッシュするように実装します。
|
812 |
+
- [ ] **小タスク3.2.4: CDの動作確認**
|
813 |
- **担当:** 人間
|
814 |
- **内容:** CI/CDが成功したコミットを`main`ブランチにマージし、GitHubの「Actions」タブでデプロイジョブが成功することを確認します。その後、Hugging Face Spaceの公開URLにアクセスし、アプリケーションが正しくデプロイされていることを確認します。
|
815 |
|
816 |
+
### フェーズ4: AIアプリケーションのTDD (コアロジック → API)
|
817 |
|
818 |
**目的:** クリーンアーキテクチャの原則に従い、内側のビジネスロジックから外側のAPIへと実装を進める。
|
819 |
|
820 |
+
- [ ] **中タスク4.1: AIコアロジック `Summarizer` の実装**
|
821 |
+
- [ ] **小タスク4.1.1 (RED):** `Summarizer`クラスのテスト作成
|
822 |
- **担当:** AI
|
823 |
- **内容:** `tests/core/test_inference.py` を作成し、「`from src.ai_api.core.inference import Summarizer` が成功すること」をテストします。このテストは、ファイルやクラスが存在しないため失敗します。
|
824 |
+
- [ ] **小タスク4.1.2 (GREEN):** `Summarizer`クラスの骨格作成
|
825 |
- **担当:** AI
|
826 |
- **内容:** `src/ai_api/core/inference.py` と、空の`Summarizer`クラスを作成し、テストをパスさせます。
|
827 |
+
- [ ] **小タスク4.1.3 (REFACTOR):** リファクタリング
|
828 |
- **担当:** AI
|
829 |
- **内容:** この時点では特になし。コミットの区切りとします。
|
830 |
|
831 |
+
- [ ] **中タスク4.2: AI設定クラス `Config` の実装と注入**
|
832 |
+
- [ ] **小タスク4.2.1 (RED):** `Summarizer`が設定オブジェクトを受け取るテスト作成
|
833 |
- **担当:** AI
|
834 |
- **内容:** `tests/core/test_inference.py`に追記します。
|
835 |
- **内容:** `Summarizer`がコンストラクタで設定オブジェクト(モデル名など)を受け取ることを期待するテストを`tests/core/test_inference.py`に追記します。
|
836 |
+
- [ ] **小タスク4.2.2 (GREEN):** 設定クラスの作成とコンストラクタ修正
|
837 |
- **担当:** AI
|
838 |
- **内容:** `src/ai_api/config.py`に設計通りの設定クラス(`ModelConfig`など)を作成します。`Summarizer`の`__init__`を修正し、設定オブジェクトを受け取るようにします。
|
839 |
+
- [ ] **小タスク4.2.3 (REFACTOR):** リファクタリング
|
840 |
- **担当:** AI
|
841 |
- **内容:** コードの可読性を向上させます。 **この時点で、AIモデルを切り替えるための基本的な仕組み(設定値を外部から与える)が完成します。**
|
842 |
|
843 |
+
- [ ] **中タスク4.3: 要約機能 `summarize` メソッドの実装**
|
844 |
+
- [ ] **小タスク4.3.1 (RED):** `summarize`メソッドのユニットテスト作成
|
845 |
- **担当:** AI
|
846 |
- **内容:** `unittest.mock.patch`を使い、`transformers.pipeline`をモック(偽物に差し替え)します。「`summarize`メソ��ドを呼ぶと、内部で`pipeline`が特定の引数で呼ばれ、モックの返り値がそのまま返されること」をテストします。これにより、重いモデルをロードせずにロジックだけを高速にテストできます。
|
847 |
+
- [ ] **小タスク4.3.2 (GREEN):** `summarize`メソッドの実装
|
848 |
- **担当:** AI
|
849 |
- **内容:** `Summarizer`クラスに`summarize`メソッドを実装し、内部で`transformers.pipeline`を呼び出して要約を実行するようにします。
|
850 |
+
- [ ] **小タスク4.3.3 (REFACTOR):** リファクタリング
|
851 |
- **担当:** AI
|
852 |
- **内容:** エラーハンドリングなどを追加し、コードを整理します。
|
853 |
|
854 |
+
- [ ] **中タスク4.4: APIエントリーポイント `main.py` の実装**
|
855 |
+
- [ ] **小タスク4.4.1 (RED):** APIのインテグレーションテスト作成
|
856 |
- **担当:** AI
|
857 |
- **内容:** `tests/test_api.py`を作成します。テスト内でGradioアプリを別スレッドで起動し、`requests.post`で`/api/predict/`にリクエストを送信して、期待した応答が得られない(サーバーがないため)ことを確認します。
|
858 |
+
- [ ] **小タスク4.4.2 (GREEN):** `main.py`の実装
|
859 |
- **担当:** AI
|
860 |
- **内容:** `src/ai_api/main.py`を作成します。`Summarizer`と設定クラスをインスタンス化し、DI(依存性の注入)してGradioの`Interface`を定義・起動します。
|
861 |
+
- [ ] **小タスク4.4.3 (REFACTOR):** リファクタリング
|
862 |
- **担当:** AI
|
863 |
- **内容:** コードを整理します。
|
864 |
+
- [ ] **小タスク4.4.4: 手動での動作確認**
|
865 |
- **担当:** 人間
|
866 |
- **内容:** `python src/ai_api/main.py` を実行し、ブラウザで表示されるGradioのUIにテキストを入力して、要約機能が単体で正しく動作することを確認します。
|
867 |
|
868 |
+
### フェーズ5: Djangoへの組み込み
|
869 |
|
870 |
**目的:** 独立して動作するAIアプリケーションを、DjangoからAPI経由で安全に呼び出す。
|
871 |
|
872 |
+
- [ ] **中タスク5.1: Django側のAPIクライアント実装**
|
873 |
+
- [ ] **小タスク5.1.1 (RED):** APIクライアントのテスト作成
|
874 |
- **担当:** AI
|
875 |
- **内容:** `myapp/tests/test_clients.py`を作成します。`requests.post`がモック化されている状態でAPIクライアント関数を呼び出し、成功時・タイムアウト時・サーバーエラー時の挙動をテストします。
|
876 |
+
- [ ] **小タスク5.1.2 (GREEN):** APIクライアントの実装
|
877 |
- **担当:** AI
|
878 |
- **内容:** `myapp/clients/ai_summary_client.py`を作成し、`requests`を使って外部APIを呼び出す関数を実装します。
|
879 |
+
- [ ] **小タスク5.1.3 (REFACTOR):** リファクタリング
|
880 |
- **担当:** AI
|
881 |
- **内容:** 設定を`settings.py`から読み込むようにするなど、コードを整理します。
|
882 |
|
883 |
+
- [ ] **中タスク5.2: Django Viewの実装**
|
884 |
+
- [ ] **小タスク5.2.1 (RED):** ViewのURLテスト作成
|
885 |
- **担当:** AI
|
886 |
- **内容:** `myapp/tests/test_views.py`に、`/summarize/playground/{id}/`へのGETリクエストが404を返すテストを書きます。
|
887 |
+
- [ ] **小タスク5.2.2 (GREEN):** URLとViewの骨格作成
|
888 |
- **担当:** AI
|
889 |
- **内容:** `myapp/urls.py`と`myapp/views/summary_views.py`を作成・編集し、テストをパスさせます。
|
890 |
+
- [ ] **小タスク5.2.3 (RED):** Viewとクライアントの連携テスト作成
|
891 |
- **担当:** AI
|
892 |
- **内容:** `unittest.mock.patch`でAPIクライアントをモック化し、「Viewを呼び出すと、内部でAPIクライアントが特定の引数で呼ばれること」をテストします。
|
893 |
+
- [ ] **小タスク5.2.4 (GREEN):** Viewロ���ックの実装
|
894 |
- **担当:** AI
|
895 |
- **内容:** View内で口コミの取得・検証ロジック、およびAPIクライアントの呼び出しを実装します。
|
896 |
+
- [ ] **小タスク5.2.5 (REFACTOR):** リファクタリング
|
897 |
- **担当:** AI
|
898 |
- **内容:** コードを整理します。
|
899 |
|
900 |
+
- [ ] **中タスク5.3: 統合テスト**
|
901 |
+
- [ ] **小タスク5.3.1: 手動での最終確認**
|
902 |
- **担当:** 人間
|
903 |
- **内容:** DjangoサーバーとAIアプリ(Gradio)を両方ローカルで起動し、ブラウザから最初の要約ボタンをクリックして、全体の流れが正しく動作するかを確認します。
|
904 |
|
tests/test_main.py
ADDED
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
from src.ai_api.main import greet
|
3 |
+
|
4 |
+
def test_greet():
|
5 |
+
"""
|
6 |
+
greet関数が期待される挨拶文を返すことをテストする。
|
7 |
+
"""
|
8 |
+
assert greet("World") == "Hello, World!"
|