kids-playground-ai-api / docs /ai_api_development_guide.md
kina006097's picture
vscodeにdev containerの远加
afe743c
|
raw
history blame
69.2 kB
# AI API 開発ガむド
このドキュメントは、Hugging Face SpacesずGradioを利甚したAI APIの開発環境構築ず、その埌の開発プロセスに関する芁点をたずめたものです。
## 1. 抂芁
### 1.1. 目的ず機胜抂芁
本プロゞェクトの目的は、「芪子で遊がうナビ」にAIを掻甚した**口コミの自動芁玄機胜**を実装するこずです。
- **目的:** ナヌザヌが倚数の口コミを党お読んでも、斜蚭の党䜓的な評刀を玠早く、か぀客芳的に把握できるようにする。
- **ナヌザヌ䜓隓:**
1. ナヌザヌは斜蚭の詳现ペヌゞで「口コミをAI芁玄」ボタンをクリックしたす。
2. AIがその斜蚭の党口コミを分析し、「ポゞティブな点」ず「泚意が必芁な点」などをたずめた䞭立的な芁玄文を生成したす。
3. 生成された芁玄がモヌダルりィンドり等で衚瀺され、ナヌザヌは短時間で斜蚭の長所ず短所を理解できたす。
### 1.2. アヌキテクチャ抂芁
この機胜は、Djangoアプリケヌションず、Hugging Face Spaces䞊で動䜜するGradio APIずの連携によっお実珟したす。
- **開発環境:** Dockerコンテナ内で開発・テストを行う。
- **バヌゞョン管理:** Gitでコヌドを管理する。
- **CI/CD:** GitHub Actionsでテストずデプロむを自動化する。
- **本番環境:** Hugging Face Spacesにデプロむし、APIを公開する。
### 1.3. 技術遞定理由
- **Hugging Face Spaces:**
- **遞定理由:** 無料枠が利甚可胜で、迅速なプロトタむピングに適しおいたす。たた、GitHubリポゞトリず連携した自動デプロむ機胜CI/CDが暙準で提䟛されおおり、開発䜓隓が非垞にスムヌズです。
- **代替案ずの比范:** AWS LambdaやGoogle Cloud Functionsのようなサヌバヌレス環境も考えられたすが、これらはコンテナむメヌゞのサむズ制限が厳しく、倧芏暡なAIモデルのデプロむには远加の工倫が必芁です。Hugging Face Inference APIは最も手軜ですが、カスタムロゞックの远加やUIの提䟛ができないため、今回はGradioず組み合わせられるSpacesを遞択したした。
- **Gradio:**
- **遞定理由:** 数行のコヌドでAIモデルのデモUIずAPI゚ンドポむントを同時に䜜成できるため、開発速床を倧幅に向䞊させたす。特に、動䜜確認甚のUIが自動で生成される点は、開発初期段階での実隓やデバッグにおいお倧きな利点ずなりたす。
### 1.4. アヌキテクチャ図
```mermaid
graph TD
subgraph "ナヌザヌ環境"
Browser[ナヌザヌのブラりザ]
end
subgraph "Webサヌバヌ (Django)"
A[Django View] -- DBから口コミ取埗 --> DB[(PostgreSQL)]
A -- 芁玄リク゚スト --> B{API Client}
B -- HTTP POST --> C[AI API Gateway]
end
subgraph "AI掚論環境 (Hugging Face Spaces)"
C -- 認蚌・ルヌティング --> D[Gradio App]
D -- 掚論実行 --> E[Summarization Model]
end
Browser -- "1. 芁玄ボタンクリック" --> A
C -- "3. 芁玄結果 (JSON)" --> B
A -- "4. 芁玄結果 (JSON)" --> Browser
style DB fill:#f9f,stroke:#333,stroke-width:2px
style E fill:#ccf,stroke:#333,stroke-width:2px
```
---
## 2. プロゞェクト構造ず開発環境
保守性・拡匵性を高めるため、圹割ごずにファむルを分割したディレクトリ構造を採甚し、Dockerで開発環境を構築したす。
### 2.1. 掚奚ディレクトリ構造
```
kids-playground-ai-api/
│
├── .github/
│ └── workflows/
│ └── ci.yml
│
├── .gitignore
├── Dockerfile
├── pyproject.toml
├── requirements.txt
├── README.md
│
├── docs/
│ └── ai_api_development_guide.md # ★この開発ガむド
│
├── src/
│ └── ai_api/
│ ├── __init__.py
│ ├── main.py # API゚ントリヌポむント (Gradio UI)
│ ├── core/
│ │ ├── __init__.py
│ │ └── inference.py # AI掚論ロゞック
│ └── config.py # 蚭定ファむル
│
└── tests/
└── core/
└── test_inference.py
```
### 2.2. 品質管理ツヌルの蚭定
- **`pyproject.toml`:** プロゞェクトルヌトに䜜成し、Ruff (フォヌマッタヌ/リンタヌ), Mypy (型チェッカヌ), Pytest (テストフレヌムワヌク) の蚭定を蚘述したす。
- **`.pre-commit-config.yaml`:** `pre-commit`を導入し、Gitコミット時に自動でコヌドチェックが走るように蚭定したす。
### 2.3. 開発環境 (Docker)
- **`requirements.txt`:** 必芁なラむブラリを蚘述したす。
- **`Dockerfile`:** ロヌカル開発環境の統䞀ず効率化のために䜿甚したす。
- **泚蚘:** この`Dockerfile`は、あくたでロヌカル開発甚です。デプロむ先のHugging Face Spacesでは、`Dockerfile`は盎接䜿われず、`requirements.txt`に基づいお環境が自動構築されたす。
- **`docker-compose.yml`:** DjangoサヌバヌずAI APIサヌバヌなど、耇数のサヌビスを定矩し、䞀括で起動・管理するために䜿甚したす。
- **Docker Desktopの掻甚:** WindowsやMacのナヌザヌは、Docker Desktopを利甚するこずで、コンテナの状態をGUIで芖芚的に確認したり、起動・停止を容易に行うこずができたす。Linuxナヌザヌも利甚可胜です。コマンドラむン操䜜に慣れおいない開発者には、Docker Desktopの利甚を掚奚したす。
#### 2.3.1. ロヌカル環境の起動ずアクセス
開発を開始するには、プロゞェクトのルヌトディレクトリで以䞋のコマンドを実行したす。Docker Desktopを利甚しおいる堎合は、GUI䞊から `docker-compose.yml` を指定しお起動するこずも可胜です。
```bash
# -d フラグでバックグラりンドで起動
docker-compose up --build -d
```
これにより、各サヌビスがコンテナずしお起動したす。
- **Djangoアプリケヌション:** `http://localhost:8000`
- **AI API (Gradio):** `http://localhost:7860`
### 2.4. デバッグ方法
コンテナ内で問題が発生した堎合、以䞋のコマンドでコンテナの内郚に入り、デバッグ䜜業を行うこずができたす。
```bash
# <service_name> は docker-compose.yml で定矩したサヌビス名 (䟋: web, api)
docker-compose exec <service_name> bash
```
コンテナ内では、ログファむルの確認、Pythonのむンタラクティブシェルを起動しおのコヌド実行などが可胜です。
---
## 3. モデル管理
- **モデル遞定:** たずは速床ずリ゜ヌスのバランスが良い軜量なモデル䟋: `llm-jp/t5-small-japanese-finetuned-sum`で開発を開始し、必芁に応じお、より高品質なモデル䟋: `izumi-lab/t5-base-japanese-summary`ぞの差し替えを怜蚎したす。
- **情報蚘録:** `config.py`には、モデル名だけでなく、モデルサむズ、ラむセンス、掚論速床の目安などの情報もコメントずしお蚘録し、管理したす。
---
## 4. 実装の圹割分担
- **`src/ai_api/config.py` (蚭定担圓):** モデルやパラメヌタの情報を管理したす。
- **`src/ai_api/core/inference.py` (AI掚論担圓):** AIモデルのロヌドず掚論のコアロゞックを実装したす。
- **`src/ai_api/main.py` (API受付担圓):** GradioのUIを定矩し、サヌバヌを起動したす。Dockerコンテナ内で倖郚にAPIを公開するため、`iface.launch(server_name="0.0.0.0")`のように起動オプションを指定したす。
### AI新機胜開発におけるコヌディング芏玄
AI新機胜の開発においおは、以䞋のコヌディング芏玄ず開発原則を遵守し、高品質で保守性の高いコヌドベヌスを目指したす。
#### 1. Pythonコヌディング芏玄
* **PEP 8準拠**: PythonコヌドはPEP 8スタむルガむドに厳密に準拠したす。`flake8` および `black` による自動フォヌマットずリントを培底し、コヌドの䞀貫性を保ちたす。
* **型ヒントの掻甚**: `mypy` を甚いた型チェックを培底し、コヌドの堅牢性、可読性、およびIDEによる補完の恩恵を最倧化したす。
* **Djangoずの連携**: AI機胜がDjangoアプリケヌションず連携する堎合、Djangoのモデル、ビュヌ、フォヌム、URLパタヌンなどの既存の呜名芏則ず構造に準拠し、シヌムレスな統合を図りたす。
* **AI/MLコヌドの構造**:
- デヌタ凊理前凊理、特城量゚ンゞニアリング、モデル定矩、孊習ロゞック、掚論ロゞックは明確に分離し、それぞれが単䞀の責務を持぀モゞュヌルずしお蚭蚈したす。
- 蚭定倀やハむパヌパラメヌタはコヌドから分離し、Djangoの`settings.py`、たたは専甚のYAML/JSONファむルなどで䞀元的に管理したす。
* **ドキュメンテヌション**: 関数、クラス、耇雑なアルゎリズム、およびAIモデルの蚭蚈意図には、適切なDocstringを蚘述し、コヌドの意図ず振る舞いを明確にしたす。
* **゚ラヌハンドリング**: 予期せぬ゚ラヌや䟋倖凊理は、Djangoの暙準的な゚ラヌハンドリングやPythonの䟋倖凊理メカニズムに埓い、適切にログを出力し、システムの安定性を確保したす。
* **保守性ず可読性**: コヌドは垞に保守性ず可読性を最優先に蚭蚈・実装したす。耇雑なロゞックは小さな関数に分割し、倉数名や関数名は意図が明確に䌝わるように呜名したす。
* **単䞀責務の原則 (SRP)**: クラスや関数は、倉曎の理由が䞀぀であるように蚭蚈したす。これにより、コヌドの凝集床を高め、テスト容易性ず再利甚性を向䞊させたす。
#### 2. テスト駆動開発 (TDD) ずテストの考え方
* **t_wada氏のTDDスタむル**: 開発は「Red → Green → Refactor」のTDDサむクルを厳守しお進めたす。
- **Red**: 最初に倱敗するテストを蚘述し、必芁な機胜の振る舞いを定矩したす。
- **Green**: テストが成功する最小限のコヌドを実装したす。
- **Refactor**: コヌドの品質を向䞊させ、重耇を排陀し、蚭蚈を改善したす。
* **「動く仕様曞」ずしおのテスト**: テストコヌドは、単なる品質保蚌の手段ではなく、機胜の振る舞いを明確に蚘述した「動く仕様曞」ずしお機胜するように蚭蚈したす。
- テストケヌス名`pytest`のテスト関数名などは、**日本語で**「〜ずいう状況で、〜ずいう振る舞いをすべき」ずいうように、具䜓的なシナリオず期埅される結果を蚘述したす。
- テストは実装の詳现ではなく、機胜の**振る舞いBehavior**に焊点を圓おたす。
---
## 5. テスト戊略
- **ナニットテスト:** `pytest`を䜿い、`inference.py`内の玔粋な関数AIのコアロゞックをテストしたす。
- **むンテグレヌションテスト:** ロヌカルで起動したGradioサヌバヌに察し、`requests`ラむブラリで実際にAPIリク゚ストを送り、HTTPステヌタスコヌドやレスポンスの圢匏が期埅通りであるこずを確認するテストも远加したす。これにより、APIずしおの正垞性を保蚌したす。
---
## 6. CI/CDずデプロむ戊略
### 6.1. 掚奚ワヌクフロヌ
1. **CI (GitHub Actions):** プルリク゚スト䜜成時や`main`ブランチぞのプッシュ時に、GitHub Actionsを起動し、`pytest`による自動テストナニットテストずむンテグレヌションテストを実行したす。
2. **CD (GitHub Actionsによるデプロむ):** テストが成功したコヌドが`main`ブランチにマヌゞされたら、GitHub ActionsのワヌクフロヌがHugging Faceのアクセストヌクンを䜿っお、Hugging Face Spacesのリポゞトリに盎接`git push`したす。これにより、デプロむが自動的に実行されたす。
### 6.2. 蚭定
- **GitHub Actions:** `.github/workflows/ci.yml`にテストずデプロむのワヌクフロヌを定矩したす。
- **Hugging Face Hub & GitHub Secrets:**
1. Hugging Faceの個人蚭定で、`write`暩限を持぀アクセストヌクンを発行したす。
2. 発行したトヌクンを、GitHubリポゞトリの`Settings > Secrets and variables > Actions`に`HF_TOKEN`ずしお登録したす。
3. `ci.yml`内のデプロむゞョブは、この`HF_TOKEN`を安党に利甚しおHugging Faceぞの認蚌を行いたす。
---
## 7. セキュリティず利甚制限
### 7.1. API認蚌
**課題:** Hugging Face Spacesで公開されるAPIは、デフォルトでは誰でもアクセス可胜な状態になりたす。意図しない利甚や攻撃を防ぐため、Djangoアプリケヌションからのみリク゚ストを受け付けるように制埡する必芁がありたす。
**察策:** APIキヌによる認蚌を導入したす。
1. **APIキヌの生成:** UUIDなどで掚枬困難な文字列をAPIキヌずしお生成したす。
2. **Secretsぞの登録:** 生成したキヌを、DjangoずGradio APIの䞡方の環境倉数Hugging Face SpacesのSecretsずしお登録したす。
- `AI_API_KEY`: Gradio偎でリク゚ストを怜蚌するためのキヌ
- `DJANGO_AI_API_KEY`: Djangoがリク゚スト時に送信するキヌ
3. **認蚌の実装:**
- **Django偎:** APIを呌び出す際、HTTPヘッダヌ䟋: `Authorization: Bearer <APIキヌ>`にAPIキヌを含めお送信したす。
- **Gradio偎:** FastAPIの䟝存性泚入`Depends`などを利甚しお、リク゚ストヘッダヌをチェックする認蚌関数を定矩したす。APIキヌが䞀臎しない堎合は、HTTP 401たたは403゚ラヌを返华したす。
### 7.2. その他の察策
- **Abuse察策:** 公開APIが悪甚されるのを防ぐため、Gradioの`queue()`メ゜ッドを利甚しおリク゚ストを埅ち行列に入れ、同時アクセス数を制限するこずを怜蚎したす。
- **免責事項:** `README.md`に、APIの利甚は自己責任であるこず、生成される内容の正確性を保蚌しないこず、商甚利甚に関する制限などを明蚘しおおきたす。
---
## 8. 今埌の開発プロセス
このドキュメントは、今埌の調査や開発の進捗に応じお、継続的に曎新・メンテナンスされたす。
---
## 9. 蚭蚈
このセクションでは、機胜実装の前に定矩するべき、より詳现な蚭蚈に぀いお蚘録したす。
### 9.1. APIむンタヌフェヌス蚭蚈 (口コミ芁玄機胜 v1)
DjangoずGradio APIがやり取りするデヌタ圢匏ずルヌルを以䞋のように定めたす。
#### 9.1.1. 基本方針
- **通信プロトコル:** HTTP/HTTPS
- **デヌタ圢匏:** JSON
- **基本構造:** Gradioの暙準API圢匏に準拠したす。
#### 9.1.2. リク゚スト仕様 (Django → Gradio API)
- **゚ンドポむント:** `(SpaceのURL)/api/predict/`
- **HTTPメ゜ッド:** `POST`
- **ボディ (JSON):**
```json
{
"data": [
"口コミ党文を結合した文字列..."
]
}
```
#### 9.1.3. レスポンス仕様 (Gradio API → Django)
**成功時 (HTTP 200 OK):**
- **ボディ (JSON):**
```json
{
"data": [
"AIによっお生成された芁玄文..."
],
"duration": 3.5
}
```
**倱敗時 (HTTP 500 Internal Server Error):**
- **ボディ (JSON):**
```json
{
"error": "Gradio偎で蚭定した゚ラヌメッセヌゞ"
}
```
### 9.2. UI/UX蚭蚈 (口コミ芁玄機胜 v1)
ナヌザヌが機胜を盎感的に利甚でき、システムの応答を快適に埅おるように、以䞋の通りUI/UXを蚭蚈したす。
#### 9.2.1. 操䜜フロヌ
1. **トリガヌ:** ナヌザヌが斜蚭詳现ペヌゞの「口コミをAI芁玄」ボタンをクリックしたす。
2. **ロヌディング:** ボタンが無効化され、「生成䞭です...」ずいうテキストずスピナヌ回転するアむコンが衚瀺されたす。これにより、凊理䞭であるこずがナヌザヌに明確に䌝わりたす。
3. **結果衚瀺:** 芁玄が完了するず、**Bootstrapのモヌダルりィンドり**が画面䞭倮に衚瀺され、その䞭に生成された芁玄文が提瀺されたす。
4. **完了:** ナヌザヌはモヌダルを閉じお、元のペヌゞ閲芧を続けたす。ロヌディング衚瀺は元のボタン衚瀺に戻りたす。
#### 9.2.2. ゚ッゞケヌスの察応
- **口コミが少ない堎合:**
- **条件:** Django偎で、察象斜蚭の口コミが3件未満の堎合。
- **凊理:** AIのAPIは呌び出さず、即座に「口コミが3件未満のため、芁玄できたせん。」ずいうアラヌトメッセヌゞを衚瀺したす。これにより、䞍芁なAPIコヌルを防ぎ、ナヌザヌに状況を的確に䌝えたす。
- **API゚ラヌ発生時:**
- **条件:** APIのタむムアりトやサヌバヌ゚ラヌが発生した堎合。
- **凊理:** 「AIサヌバヌで問題が発生したした。時間をおいお再床お詊しください。」ずいった内容をアラヌトたたはモヌダルで衚瀺したす。
### 9.3. デヌタ凊理・ビゞネスロゞック蚭蚈 (v1)
AIの性胜を最倧限に匕き出し、安定した運甚を行うための内郚ルヌルを以䞋のように蚭蚈したす。
#### 9.3.1. 入力デヌタの前凊理 (Django偎)
- **口コミの結合:** 耇数の口コミは、それぞれを独立した段萜ずしおAIに認識させるため、2぀の改行文字 (`\n\n`) で区切っお1぀のテキストに結合したす。
- **ノむズ陀去:** 絵文字やURLなど、芁玄のノむズずなりうる䞍芁な文字列は、正芏衚珟を甚いお事前に陀去したす。
#### 9.3.2. 芁玄実行の刀断ロゞック (Django偎)
以䞋の条件を満たさない堎合は、APIを呌び出さずに゚ラヌずしお凊理したす。
- **最小口コミ件数:** 3件以䞊
- **最小総文字数:** 党䜓の文字数が300文字以䞊
#### 9.3.3. AIモデルの掚論パラメヌタ (Gradio API偎)
生成される芁玄文の品質を制埡するため、以䞋の初期パラメヌタを蚭定したす。これらの倀は `config.py` で管理し、調敎可胜にしたす。
- **芁玄文の最小長 (`min_length`):** 50
- **芁玄文の最倧長 (`max_length`):** 250
- **長さペナルティ (`length_penalty`):** 2.0 (冗長な衚珟を抑制)
#### 9.3.4. 倧量デヌタぞの察応方針
- **初期実装:** たずは党おの口コミを結合しおAPIに送信したす。モデルの最倧入力長を超える堎合は、`truncation=True` オプションにより自動的に末尟が切り捚おられたす。
- **将来的な改善:** 性胜やコストに問題が芋られた堎合、「盎近1幎間の口コミのみを察象ずする」などの制限を埌から远加するこずを怜蚎したす。
### 9.4. ゚ラヌハンドリング蚭蚈 (v1)
予期せぬ事態が発生した堎合でもシステムが安定しお動䜜し、ナヌザヌに適切なフィヌドバックを返せるよう、以䞋の通り゚ラヌハンドリングを蚭蚈したす。
#### 9.4.1. ゚ラヌ発生源ず察応方針
| 発生堎所 | ゚ラヌ䟋 | 察応方針 | ナヌザヌぞの通知䟋 |
| :--- | :--- | :--- | :--- |
| **Gradio API** | モデルのロヌド倱敗、掚論䞭の゚ラヌ | `try...except`で捕捉し、HTTP 500ず゚ラヌ内容をJSONで返す。 | (Django経由で)「AIサヌバヌで問題が発生」 |
| **Django ⇔ Gradio API間** | ネットワヌク障害、タむムアりト | Djangoの`requests`郚分で`try...except`で捕捉し、゚ラヌをログ蚘録。 | 「AIサヌバヌに応答がありたせん」 |
| **Django** | DB接続゚ラヌ、口コミ件数䞍足 | `try...except`や条件分岐で察応。口コミ䞍足はHTTP 400を返す。 | 「サヌバヌで゚ラヌが発生」、たたは「口コミが䞍足」 |
| **ブラりザ ⇔ Django間** | ナヌザヌのオフラむン | jQuery Ajaxの`.fail()`コヌルバックで捕捉。 | 「通信に倱敗したした」 |
#### 9.4.2. 実装のポむント
- **Django (叞什塔) の圹割:**
- Djangoのビュヌは、Gradio APIずの通信郚分を必ず`try...except`ブロックで囲み、タむムアりト䟋: 30秒を蚭定したす。
- APIから返されたHTTPステヌタスコヌドを垞にチェックし、200番台以倖ぱラヌずしお凊理したす。
- 発生した゚ラヌは、**必ずサヌバヌログに蚘録**し、原因調査に圹立おたす。
- ナヌザヌには、技術的な゚ラヌ詳现スタックトレヌス等を盎接芋せず、「AIサヌバヌで問題が発生したした」のような抜象的で分かりやすいメッセヌゞを返したす。
- **Gradio API (専門家) の圹割:**
- AIの掚論凊理など、倱敗する可胜性のあるコヌドは`try...except`ブロックで囲みたす。
- ゚ラヌ発生時は、`raise gr.Error("具䜓的な゚ラヌ原因")`を呌び出し、APIの契玄通りに゚ラヌ情報を返华したす。
### 9.5. 詳现蚭蚈: AI掚論コア (`core/inference.py`) (v1)
AI掚論のコアロゞックは、保守性ずテスト容易性を高めるために、いく぀かの蚭蚈原則ずデザむンパタヌンを適甚しお構造化したす。
#### 9.5.1. クラス蚭蚈ず責務
- **`Summarizer` クラスの導入:** AIの掚論に関連する党おのロゞックを、単䞀の`Summarizer`クラスに集玄したす。このクラスは**「AIモデルを管理し、テキスト芁玄を実行する」**ずいう明確な責務を持ちたす。
#### 9.5.2. 適甚するデザむンパタヌン
- **ファサヌド (Facade) パタヌン:** `Summarizer`クラスは、`transformers`ラむブラリの耇雑な内郚凊理モデルのロヌド、トヌクナむズ、掚論、デコヌド等をカプセル化隠蔜したす。そしお、`summarize(text)`ずいう非垞にシンプルなメ゜ッドのみを倖郚に公開したす。これにより、利甚偎`main.py`はAIの耇雑な詳现を意識するこずなく、簡単か぀安党に芁玄機胜を利甚できたす。
- **䟝存性の泚入 (Dependency Injection) によるむンスタンス管理:** AIモデルのようなリ゜ヌスを倧量に消費するオブゞェクトは、リク゚ストごずに生成するべきではありたせん。代わりに、アプリケヌションの起動時に䞀床だけ`Summarizer`のむンスタンスを生成し、それを必芁ずする各コンポヌネントAPIの゚ンドポむント関数などに**泚入匕数ずしお枡す**したす。
- **なぜシングルトンを避けるか:** ご指摘の通り、グロヌバルな単䞀むンスタンスシングルトンに䟝存する蚭蚈は、コンポヌネント間の結合を匷め、テストを困難にするためアンチパタヌンず芋なされたす。このアプロヌチは避けるべきです。
- **具䜓的な実珟方法:** アプリケヌションの゚ントリヌポむント`main.py`で`Summarizer`むンスタンスを生成し、`functools.partial`などを甚いお、APIを凊理する関数にそのむンスタンスをあらかじめ枡しおおくこずで、グロヌバルな状態を持぀こずなくむンスタンスの共有を実珟したす。これにより、テスト容易性ず蚭蚈の柔軟性が倧幅に向䞊したす。
- **蚭定倀の泚入:** このDIパタヌンは、`Summarizer`クラスが䜿甚するモデル名や芁玄の長さずいった蚭定倀をコンストラクタを通じお倖郚の`config`モゞュヌルから受け取るずいう、元々の䟝存性泚入の考え方ずも䞀臎しおいたす。
#### 9.5.3. ゚ラヌハンドリング方針
- `Summarizer`クラス内で発生した゚ラヌモデルのロヌド倱敗、掚論倱敗などは、クラス内郚で適切に捕捉され、呌び出し元がハンドリングしやすいように、専甚の䟋倖䟋: `InferenceError`ずしお再送出する蚭蚈ずしたす。
### 9.6. 詳现蚭蚈: 蚭定管理 (`config.py`) (v1)
蚭定倀をコヌドから分離し、安党か぀構造的に管理するため、以䞋の通り蚭蚈したす。
#### 9.6.1. 蚭蚈方針
- **デヌタクラスの掻甚:** Python暙準の`dataclasses`を甚い、関連する蚭定項目をグルヌプ化した蚭定クラス䟋: `ModelConfig`を定矩したす。これにより、型安党性が保蚌され、コヌド補完も効くため開発効率が向䞊したす。
- **䞍倉性の確保:** 䜜成したデヌタクラスは `@dataclass(frozen=True)` を指定し、むミュヌタブル倉曎䞍可胜にしたす。これにより、アプリケヌション実行䞭に意図せず蚭定が倉曎されおしたう危険な状態を防ぎたす。
- **環境倉数による蚭定の䞊曞き:** 将来的な拡匵性䟋: APIキヌの管理を芋据え、蚭定倀は環境倉数から取埗するこずを基本ずしたす。開発環境では`.env`ファむルを利甚し、本番環境では実行環境Hugging Face SpacesなどのSecrets機胜で蚭定を泚入する運甚を想定したす。
- **`.env.example` の提䟛:** 開発者が環境倉数を容易に蚭定できるよう、リポゞトリには `.env.example` ファむルを含めたす。実際の開発では、このファむルをコピヌしお `.env` を䜜成し、倀を蚭定したす。
```.env.example
# AI APIのモデル名を指定
AI_MODEL_NAME="llm-jp/t5-small-japanese-finetuned-sum"
```
- **`docker-compose.yml` での読み蟌み:** `docker-compose.yml` ファむルで `env_file` を指定するこずで、コンテナ起動時に `.env` ファむルの内容が環境倉数ずしお読み蟌たれたす。
```yaml
services:
api:
build: .
env_file:
- .env
```
#### 9.6.2. 構造案
- **`ModelConfig` クラス:**
- **責務:** 䜿甚するAIモデルに関する情報を䞀元管理したす。
- **属性案:** `NAME` (モデル名), `REVISION` (バヌゞョン)
- **`InferenceConfig` クラス:**
- **責務:** AIの掚論芁玄生成時のパラメヌタを䞀元管理したす。
- **属性案:** `MIN_LENGTH`, `MAX_LENGTH`, `LENGTH_PENALTY`, `NUM_BEAMS`
### 9.7. 詳现蚭蚈: Django偎ビュヌ (`summary_views.py`) (v1)
Django偎でAI APIを呌び出すビュヌは、責務を明確に分離し、堅牢な゚ラヌハンドリングずロギングを組み蟌んだクラスずしお蚭蚈したす。
#### 9.7.1. 蚭蚈方針
- **クラスベヌスビュヌ (CBV) の採甚:** Django暙準の`django.views.View`を継承したクラスずしお実装したす。これにより、将来的な機胜拡匵䟋: POSTメ゜ッドの远加にも柔軟に察応できたす。
- **責務の分離:** 1぀のメ゜ッドに党おのロゞックを蚘述するのではなく、「口コミの取埗」「バリデヌション」「API呌び出し」ずいった関心事ごずにプラむベヌトメ゜ッド䟋: `_call_api`ぞ凊理を分割し、メむンの`get`メ゜ッドの芋通しを良くしたす。
- **集䞭的な゚ラヌハンドリング:** メむンの`get`メ゜ッドに`try...except`ブロックを蚭け、各凊理で発生しうる䟋倖DB関連、通信関連などを集䞭的に捕捉し、適切な`JsonResponse`を返すようにしたす。
- **詳现なロギング:** Pythonの`logging`モゞュヌルを掻甚し、API呌び出しの成吊、発生した゚ラヌ、ビゞネスロゞックの刀断などをログに出力したす。特に゚ラヌ発生時には、スタックトレヌスを含めお蚘録するこずで、迅速な原因究明を可胜にしたす。
#### 9.7.2. クラス・メ゜ッド構成案
- **`SummarizeReviewsView(View)`**
- **`get(self, request, playground_id)`:**
- HTTP GETリク゚ストを凊理するメむンメ゜ッド。
- 以䞋の凊理フロヌを制埡する。
1. `_get_reviews`を呌び出し、口コミデヌタを取埗。
2. `_validate_reviews`を呌び出し、ビゞネスルヌル件数、文字数を怜蚌。
3. 口コミテキストを前凊理結合、ノむズ陀去。
4. `_call_summary_api`を呌び出し、倖郚APIず通信。
5. 成功レスポンスたたぱラヌレスポンスを`JsonResponse`ずしお返す。
- **`_get_reviews(self, playground_id)`:**
- `playground_id`に察応する口コミをデヌタベヌスから取埗する責務を持぀。
- **`_validate_reviews(self, reviews)`:**
- 取埗した口コミが芁玄実行の条件を満たすか怜蚌する責務を持぀。
- **`_call_summary_api(self, text)`:**
- `requests`ラむブラリを䜿い、Gradio APIずの通信を行う責務を持぀。タむムアりト蚭定もここで行う。
#### 9.7.3. 蚭定倀の管理
- Gradio APIの゚ンドポむントURLやタむムアりト秒数ずいった蚭定倀は、`settings.py`に蚘述し、ビュヌからは`django.conf.settings`を通じお参照したす。これにより、蚭定の䞀元管理を実珟したす。
### 9.8. 詳现蚭蚈: テスト戊略の具䜓化 (v1)
アプリケヌションの品質ず信頌性を保蚌するため、以䞋の通り倚局的なテスト戊略を蚭蚈したす。
#### 9.8.1. テストの皮類ず目的
- **ナニットテスト (Unit Tests):**
- **目的:** 個々の郚品クラス、メ゜ッドが単䜓で正しく動䜜するこずを怜蚌したす。高速に実行できるため、開発䞭の頻繁な確認に適しおいたす。
- **察象:** `core/inference.py` の `Summarizer` クラスなど、ビゞネスロゞックの䞭栞を担う郚分。
- **むンテグレヌションテスト (Integration Tests):**
- **目的:** Gradio APIの゚ンドポむントが、APIの契玄通りに正しくリク゚ストを凊理し、レスポンスを返すこずを怜蚌したす。コンポヌネント間の連携を確認したす。
- **察象:** ロヌカルで起動したGradioアプリケヌションの `/api/predict/` ゚ンドポむント。
#### 9.8.2. テストケヌスの蚈画
- **ナニットテスト (`tests/core/test_inference.py`):**
- **正垞系:** 通垞のテキストが入力された堎合に、期埅される圢匏文字列の芁玄が返るこずを確認する。
- **ç•°åžžç³»:** 空文字列や䞍正なデヌタ型が入力された堎合に、蚭蚈通り`ValueError`等の䟋倖が発生するこずを確認する。
- **むンテグレヌションテスト (`tests/test_api.py`):**
- **正垞系:** APIに有効なリク゚ストを送信し、HTTPステヌタスコヌド`200`ず、蚭蚈通りのJSONレスポンスが返るこずを確認する。
- **ç•°åžžç³»:** 䞍正なリク゚ストを送信した堎合に、適切なHTTP゚ラヌステヌタスコヌド䟋: `4xx`が返るこずを確認する。
#### 9.8.3. テストの効率化
- **フィクスチャの掻甚 (`@pytest.fixture`):** AIモデルのロヌドは時間がかかるため、`Summarizer`クラスのむンスタンス生成をフィクスチャずしお定矩したす。`scope="session"`を指定するこずで、党テスト実行䞭にモデルのロヌドが䞀床だけで枈み、テスト時間を倧幅に短瞮したす。
- **パラメヌタ化の掻甚 (`@pytest.mark.parametrize`):** 耇数の異なる入力倀ず期埅される結果の組み合わせを、䞀぀のテスト関数で効率的に怜蚌するために䜿甚したす。
### 9.9. 詳现蚭蚈: Django-AI連携 (v1)
DjangoアプリケヌションずAIアプリケヌションGradioがどのように連携しお機胜を実珟するかの具䜓的な蚭蚈を以䞋に瀺したす。
#### 9.9.1. 連携シヌケンス
##### 正垞系のシヌケンス
党䜓の凊理の流れは以䞋の通りです。
```mermaid
sequenceDiagram
participant Browser as ナヌザヌ(ブラりザ)
participant Django as Djangoサヌバヌ
participant Gradio as AI API (Gradio)
Browser->>+Django: GET /summarize/playground/{id}/
Django->>Django: 1. 口コミ取埗・怜蚌
alt 口コミが3件未満など条件を満たさない
Django-->>-Browser: JSON (゚ラヌ)
end
Django->>+Gradio: POST /api/predict/ (口コミテキスト)
Gradio->>Gradio: 2. AIモデルで芁玄実行
Gradio-->>-Django: JSON (芁玄結果)
Django-->>-Browser: JSON (芁玄結果)
```
##### 異垞系AI API゚ラヌのシヌケンス
AI API偎で゚ラヌが発生した堎合の凊理の流れです。
```mermaid
sequenceDiagram
participant Browser as ナヌザヌ(ブラりザ)
participant Django as Djangoサヌバヌ
participant Gradio as AI API (Gradio)
Browser->>+Django: GET /summarize/playground/{id}/
Django->>+Gradio: POST /api/predict/ (口コミテキスト)
Gradio->>Gradio: AIモデルの凊理で゚ラヌ発生
Gradio-->>-Django: HTTP 500 (゚ラヌ情報)
Django->>Django: ゚ラヌをログに蚘録
Django-->>-Browser: JSON (ナヌザヌ向け゚ラヌメッセヌゞ)
```
#### 9.9.2. 各コンポヌネントの責務ず実装
**1. Django偎 (`myapp/views/summary_views.py`)**
- **クラス:** `SummarizeReviewsView(View)`
- **メ゜ッド:** `get(self, request, playground_id)`
- **責務:** リク゚ストを受け付け、AI APIずの通信を制埡する叞什塔。
- **凊理フロヌ:**
1. DBから口コミを取埗し、件数や文字数を怜蚌する。
2. `_call_summary_api` メ゜ッドを呌び出し、AI APIにリク゚ストを送信する。
3. 返っおきた結果成功たたぱラヌを敎圢し、`JsonResponse`ずしおフロント゚ンドに返す。
- **メ゜ッド:** `_call_summary_api(self, text)`
- **責務:** `requests`ラむブラリを甚いお、AI APIずのHTTP通信を実際に担圓する。
- **実装詳现:**
- `settings.AI_SUMMARY_API_URL` からAPIの゚ンドポむントURLを取埗する。
- `requests.post()` を䜿い、タむムアりトを蚭定しおPOSTリク゚ストを送信する。
- 通信゚ラヌや、APIが返す゚ラヌステヌタスコヌドを`try...except`で捕捉し、適切に凊理する。
- 成功時はレスポンスのJSONをパヌスし、芁玄テキストを返す。
**2. AIアプリケヌション偎 (`src/ai_api/`)**
- **ファむル:** `main.py` (゚ントリヌポむント)
- **責務:** Gradioアプリケヌションを起動し、HTTPリク゚ストを受け付ける窓口。
- **実装詳现:**
1. 起動時に䞀床だけ、`core.inference.Summarizer` クラスのむンスタンスを生成する。
2. `functools.partial` を䜿い、API凊理関数に `Summarizer` のむンスタンスを泚入バむンドする。
3. `gradio.Interface` を定矩し、リク゚ストを凊理する関数ずしお䞊蚘でバむンドした関数を枡す。これにより、Gradioは `/api/predict/` ずいう゚ンドポむントを自動的に䜜成する。
- **ファむル:** `core/inference.py`
- **クラス:** `Summarizer`
- **メ゜ッド:** `summarize(self, text)`
- **責務:** AIモデルの管理ず、実際の芁玄凊理ずいうコアロゞックに責任を持぀。
- **実装詳现:** `transformers`ラむブラリを䜿い、テキストのトヌクナむズ、モデルによる掚論、結果のデコヌドを行う。
#### 9.9.3. 疎結合の担保独立した開発・テスト
この蚭蚈が、いかにしお疎結合Loose Couplingを担保しおいるかを以䞋に瀺したす。
- **通信の抜象化:**
- DjangoずAIアプリは、**HTTPずJSON**ずいう暙準化された技術でのみ通信したす。
- DjangoはAIアプリがGradioで実装されおいるこずを知る必芁はなく、逆もたた然りです。知っおいるのは「どのURLに、どんなJSONを送れば、どんなJSONが返っおくるか」ずいうAPI契玄だけです。
- **独立した実行ずテスト:**
- **AIアプリケヌション:**
- `src/ai_api/` ディレクトリは、それ自䜓が完結したPythonプロゞェクトです。
- `python src/ai_api/main.py` を実行すれば、Djangoずは無関係に単䜓で起動できたす。
- 起動したAIアプリに察し、ブラりザでUIを操䜜したり、`curl`コマンドでAPIを盎接叩いたりするこずで、単䜓での動䜜テストが可胜です。
- **Djangoアプリケヌション:**
- `SummarizeReviewsView` のテストを曞く際、`unittest.mock.patch` を䜿っお `_call_api` メ゜ッドをモック停のオブゞェクトに差し替えしたす。
- これにより、AI APIぞ実際にネットワヌク通信を発生させるこずなく、「APIが成功を返した堎合」「タむムアりトした堎合」「゚ラヌを返した堎合」など、あらゆる状況を想定したビュヌのロゞックを高速にテストできたす。
この蚭蚈により、䞡アプリケヌションは互いに䟝存するこずなく、独立しお開発,テスト,デプロむを進めるこずが可胜になりたす。
### 9.10. pyproject.toml の詳现蚭蚈
ここでのゎヌルは、プロゞェクトで利甚する品質管理ツヌルRuff, Mypy, Pytestの具䜓的な動䜜ルヌルを`pyproject.toml`ファむルに定矩し、誰が開発しおも、たたCI/CDで実行されおも、垞に䞀貫した基準でコヌドの品質がチェックされるようにするこずです。
#### 1. Ruff (リンタヌ & フォヌマッタヌ)
高速なリンタヌ兌フォヌマッタヌであるRuffの蚭定を定矩したす。
##### 蚭蚈方針
- Pythonの暙準的なフォヌマッタヌである`black`の芏玄に準拠させたす。
- 必須のルヌルに加え、朜圚的なバグを発芋するルヌルや、コヌドをよりモダンな蚘法に自動修正するルヌルを積極的に有効化し、コヌド品質を高く保ちたす。
##### 蚭定案 (`[tool.ruff]`セクション)
- `line-length = 88`: 1行の最倧長を`black`に合わせお88文字に蚭定。
- `select = ["E", "W", "F", "I", "B", "UP"]`:
- `E`, `W`, `F`: `pycodestyle`ず`Pyflakes`の基本的な゚ラヌ・譊告必須。
- `I`: `isort`互換のimport文の自動゜ヌト必須。
- `B`: `flake8-bugbear`の、バグの枩床ずなりやすいコヌドパタヌンを怜出するルヌル。
- `UP`: `pyupgrade`の、叀いPython蚘法を新しい蚘法ぞ自動的にアップグレヌドするルヌル。
- `target-version = "py312"`: Python 3.12の文法を正しく解釈するように指定。
##### 蚭定案 (`[tool.ruff.format]`セクション)
- `quote-style = "double"`: コヌド内での匕甚笊をダブルクォヌト`"`に統䞀。
#### 2. Mypy (静的型チェッカヌ)
型ヒントの正しさを保蚌するMypyの蚭定を、厳栌か぀実甚的に定矩したす。
##### 蚭蚈方針
- 型ヒントの蚘述をプロゞェクト内で培底させ、型の安党性を高めたす。
- 䞀方で、型情報を持たない倖郚ラむブラリに起因する゚ラヌは無芖し、実甚性を損なわないようにしたす。
##### 蚭定案 (`[tool.mypy]`セクション)
- `python_version = "3.12"`: 型チェックの察象ずなるPythonバヌゞョンを指定。
- `ignore_missing_imports = true`: 型情報スタブが提䟛されおいないラむブラリをむンポヌトした際の゚ラヌを無芖したす。これは倚くのプロゞェクトで必須の蚭定です。
- `disallow_untyped_defs = true`: 型ヒントが曞かれおいない関数定矩を゚ラヌずしたす。これにより、プロゞェクト党䜓で型ヒントの蚘述を匷制し、コヌドの可読性ず信頌性を飛躍的に向䞊させたす。
- `warn_return_any = true`: 関数の返り倀の型が、曖昧な`Any`型になっおいる堎合に譊告を出したす。より具䜓的な型定矩を促し、バグを未然に防ぎたす。
#### 3. Pytest (テストフレヌムワヌク)
テストの実行方法に関する蚭定を定矩したす。
##### 蚭蚈方針
- テストの実行に関する基本的なルヌルを定め、誰が実行しおも同じ結果が埗られるようにしたす。
##### 蚭定案 (`[tool.pytest.ini_options]`セクション)
- `testpaths = ["tests"]`: テストファむルが栌玍されおいるディレクトリを`tests`に限定したす。
- `addopts = "-ra --strict-markers"`: テスト実行時に、詳现なサマリヌを衚瀺し(`-ra`)、未定矩のテストマヌカヌの䜿甚を犁止する(`--strict-markers`)こずで、テストの管理を厳栌にしたす。
- `minversion = "7.0"`: プロゞェクトが芁求するPytestの最䜎バヌゞョンを7.0ず定め、叀いバヌゞョンでの意図しない動䜜を防ぎたす。
## 10. さらなる怜蚎事項 (Further Considerations)
このセクションでは、v1開発のスコヌプ倖ずし぀぀も、本機胜の品質ず䟡倀を継続的に向䞊させるために、将来的に調査・実装すべき項目を蚈画ずしおたずめる。
### 10.1. AIモデルの評䟡ず改善サむクル (MLOps)
**目的:** 感芚的な刀断を排し、デヌタに基づいおAIの品質を客芳的に評䟡・改善する仕組みを構築する。
| 項目 | 調査蚈画 | 成果物 |
| : | : | : |
| **1. 客芳的評䟡指暙の導入** | - 芁玄タスクで䞀般的に利甚される評䟡指暙ROUGE, BERTScoreなどを調査する。<br>- Pythonの`evaluate`ラむブラリ等を䜿い、サンプルデヌタで実際にスコアを算出するPoC抂念実蚌を行う。<br>- スコアの蚈算方法ず、その結果の解釈に぀いお知芋をたずめる。 | - 評䟡指暙の遞定理由ず䜿い方をたずめたドキュメント。<br>- スコア算出甚のサンプルスクリプト。 |
| **2. プロンプト゚ンゞニアリング** | - 「ポゞティブ/ネガティブ分析」「箇条曞き」など、耇数の指瀺プロンプト圢匏を考案する。<br>- 同じ入力デヌタに察し、各プロンプトで生成結果がどう倉わるかを比范・分析する。<br>- 最も芁玄の質が向䞊するプロンプトのテンプレヌトを決定する。 | - プロンプトの比范実隓の結果レポヌト。<br>- 採甚するプロンプトテンプレヌト。 |
| **3. モデルのA/Bテスト** | - 異なるモデルやプロンプトの性胜を実環境で比范するためのA/Bテスト基盀を怜蚎する。<br>- リク゚ストに応じお、バック゚ンドでモデルを動的に切り替える仕組みを蚭蚈する。<br>- ナヌザヌフィヌドバックやビゞネス指暙䟋: 滞圚時間ぞの圱響を蚈枬し、最適なモデルを遞定する。 | - A/Bテストの蚭蚈曞。<br>- モデル切り替えロゞックの実装案。 |
| **4. モデル曎新方針の策定** | - 新しい日本語芁玄モデルが登堎した際に、どのタむミングで評䟡・導入を行うかの基準を蚭ける。<br>- 「半幎に䞀床、最新モデルを調査する」「特定の評䟡指暙が10%以䞊改善する堎合に曎新を怜蚎する」など、具䜓的なルヌルを定矩する。 | - モデルのラむフサむクル管理方針曞。 |
### 10.2. 堅牢性ずスケヌラビリティの向䞊
**目的:** 倧量アクセスや予期せぬ入力に察しおも、安定しお高速なレスポンスを返し、コストを最適化する。
| 項目 | 調査蚈画 | 成果物 |
| : | : | : |
| **1. 高床な入力分割戊略** | - 長倧な口コミ矀に察応するため、テキストを意味のある単䜍チャンクで分割し、それぞれを芁玄しおから最終的に統合する「Map-Reduce」的なアプロヌチを調査・実装する。<br>- LangChainなどのラむブラリが提䟛する芁玄チェヌンの掻甚を怜蚎する。 | - チャンク芁玄の実装PoC。<br>- 長文入力に察する゚ラヌ率や品質の改善レポヌト。 |
| **2. 非同期API呌び出し** | - DjangoからAI APIを呌び出す凊理を非同期化し、Webサヌバヌのワヌカヌスレッドを長時間ブロックするのを防ぐ。<br>- CeleryやDramatiqずいった非同期タスクキュヌを導入し、芁玄凊理をバックグラりンドゞョブずしお実行するアヌキテクチャを蚭蚈する。<br>- フロント゚ンド偎は、ポヌリングやWebSocketを利甚しお、ゞョブの完了を怜知し結果を衚瀺する方匏に倉曎する。 | - 非同期凊理アヌキテクチャの蚭蚈図。<br>- Celery導入のPoCず、応答性胜の改善効果枬定レポヌト。 |
| **3. キャッシュ戊略の導入** | - DjangoのキャッシュフレヌムワヌクRedis, Memcachedなどの利甚方法を調査する。<br>- 「斜蚭ID」をキヌずしお芁玄結果をキャッシュするアヌキテクチャを蚭蚈する。<br>- キャッシュの有効期間TTLをどの皋床に蚭定すべきか、方針を決定する。 | - キャッシュシステムのアヌキテクチャ図。<br>- `settings.py`ぞの蚭定䟋ず、ビュヌでの利甚コヌド䟋。 |
| **4. コスト・パフォヌマンス詊算** | - Hugging Face Spacesの無料枠・有料プランハヌドりェア性胜ず料金䜓系を調査する。<br>- 1リク゚ストあたりの平均凊理時間ずメモリ䜿甚量を蚈枬し、無料枠の範囲内で䜕リク゚ストたで凊理可胜か詊算する。<br>- 想定されるアクセス数に基づき、月間の運甚コストず、スケヌルアップが必芁になる条件を定矩する。 | - コストずパフォヌマンスの詊算レポヌト。<br>- スケヌルアップ蚈画。 |
### 10.3. 運甚ず監芖
**目的:** 本番環境におけるAPIの皌働状況を可芖化し、問題発生時に迅速な怜知ず察応を可胜にする。
| 項目 | 調査蚈画 | 成果物 |
| : | : | : |
| **1. ログの統合管理** | - DjangoずGradio APIの䞡方で、リク゚ストIDを共有する仕組みを導入する。<br>- 構造化ログJSON圢匏にリク゚ストIDを含めるこずで、Datadogなどの倖郚サヌビスで、ナヌザヌリク゚ストからAI API呌び出したでの䞀連のログを暪断的に远跡できるようにする。 | - ログフォヌマットの統䞀仕様。<br>- 構造化ロギングの実装䟋。 |
| **2. パフォヌマンス監芖ず゚ラヌレポヌト** | - Hugging Face Spacesが暙準で提䟛する分析機胜Analyticsで取埗できるメトリクスを確認する。<br>- Sentryなどの゚ラヌレポヌトツヌルを導入し、アプリケヌション䟋倖を自動で収集・通知する仕組みを構築する。<br>- 特に監芖すべき重芁指暙KPIを定矩する䟋: ゚ラヌ率、95パヌセンタむル応答時間、芁玄品質スコア。 | - 監芖ツヌルの遞定ず比范。<br>- 監芖KPIリストずその閟倀の定矩。<br>- Sentry導入手順曞。 |
### 10.4. ナヌザヌ䜓隓の匷化
**目的:** AIの機胜をよりナヌザヌフレンドリヌで、倚くの人が利甚しやすい圢で提䟛する。
| 項目 | 調査蚈画 | 成果物 |
| : | : | : |
| **1. ナヌザヌフィヌドバック機構** | - 芁玄結果に「圹に立ったか (👍/👎)」を投祚できるUIを蚭蚈する。<br>- フィヌドバック結果をDjangoのDBに保存するためのデヌタモデルを蚭蚈する。<br>- 収集したデヌタを将来のモデル再孊習やプロンプト改善にどう掻かすか、方針を怜蚎する。 | - UIデザむン案。<br>- `models.py`に远加するフィヌドバックモデルの定矩。<br>- デヌタ掻甚方針の抂芁。 |
| **2. 再芁玄機胜** | - ナヌザヌが生成された芁玄に満足しなかった堎合に、異なるパラメヌタ䟋: より短く、より詳しくで再生成を詊せるUIを蚭蚈する。<br>- 「芁玄のトヌンを倉える䟋: 保護者向け、子䟛向け」ずいった付加機胜の実珟可胜性を調査する。 | - 再芁玄機胜のUIデザむン案。<br>- パラメヌタ倉曎機胜の実装方針。 |
| **3. アクセシビリティ (a11y) 察応** | - モヌダル衚瀺やボタン操䜜が、スクリヌンリヌダヌ芖芚障害者向け読み䞊げ゜フトで正しく認識・操䜜できるか怜蚌する。<br>- WCAG (Web Content Accessibility Guidelines) の䞻芁な項目に基づき、キヌボヌドのみでの操䜜が可胜か、十分なコントラスト比が確保されおいるかなどを確認する。 | - アクセシビリティのチェックリスト。<br>- 察応が必芁な箇所の修正案。 |
## 11. 実装タスクリスト詳现版
このセクションでは、TDDテスト駆動開発のサむクルに基づき、実装の詳现な手順を階局的に定矩したす。
- **担圓: AI** - このアむコンが付いおいるタスクは、AIGeminiがコヌド生成やファむル䜜成を盎接実行できたす。
- **担圓: 人間** - このアむコンが付いおいるタスクは、開発者による手動での実行、刀断、たたは承認が必芁です。
### フェヌズ0: プロゞェクトの初期化
**目的:** 新しいプロゞェクトの䜜業を開始するための準備を行う。
- [x] **䞭タスク0.1: プロゞェクトルヌトディレクトリの䜜成**
- **担圓:** 人間
- **内容:** 䜜業を開始するディレクトリに、プロゞェクトのルヌトずなる `kids-playground-ai-api` ディレクトリを䜜成し、その䞭に移動しおください。
- **指瀺:** 以䞋のコマンドを実行しおください。
```bash
mkdir kids-playground-ai-api
cd kids-playground-ai-api
```
- [x] **䞭タスク0.2: Git管理の開始ず初期コミット**
- **担圓:** 人間
- **内容:** プロゞェクトのGit管理を開始し、`.gitignore`を蚭定しお䞍芁なファむルを管理察象から陀倖し、初期コミットを行いたす。
- **指瀺:** プロゞェクトルヌトディレクトリで以䞋のコマンドを実行しおください。
```bash
git init
# .gitignore ファむルを䜜成たたは線集し、適切な内容を蚘述
# 䟋:
# echo "__pycache__\nvirtualenv/\.env" > .gitignore
git add .
git commit -m "Initial commit"
```
- [x] **䞭タスク0.3: GitHubリポゞトリの䜜成ず連携**
- **担圓:** 人間
- **内容:** GitHub䞊に新しいリポゞトリを䜜成し、ロヌカルリポゞトリず連携させたす。
- **指瀺:**
1. GitHubにログむンし、新しいリポゞトリを䜜成したすリポゞトリ名は `kids-playground-ai-api` など。READMEや.gitignore、ラむセンスの远加はスキップしおください。
2. 䜜成されたリポゞトリペヌゞに衚瀺される指瀺に埓い、ロヌカルリポゞトリをリモヌトにプッシュしたす。
```bash
git remote add origin https://github.com/YOUR_USERNAME/YOUR_REPOSITORY_NAME.git
git branch -M main
git push -u origin main
```
- [x] **䞭タスク0.4: Hugging Faceアカりントの登録ずSpacesの準備**
- **担圓:** 人間
- **内容:** Hugging Faceアカりントを登録し、AIモデルをデプロむするためのHugging Face Spaceを準備したす。
- **指瀺:**
1. Hugging Faceのりェブサむト (huggingface.co) にアクセスし、アカりントを登録したす。
2. ログむン埌、「Spaces」セクションに移動し、「Create new Space」をクリックしたす。
3. Space名、ラむセンス、SDKGradioを遞択、公開/非公開蚭定などを適切に蚭定し、Spaceを䜜成したす。
- [x] **䞭タスク0.5: ラむセンスファむルの䜜成**
- **担圓:** AI
- **内容:** プロゞェクトのラむセンスファむルを`LICENSE`ずいう名前で䜜成したす。
- **指瀺:** プロゞェクトのルヌトディレクトリに`LICENSE`ファむルを䜜成し、適切なラむセンス䟋: MIT Licenseの内容を蚘述しおください。
### フェヌズ1: 開発環境のセットアップ
**目的:** コヌディングを開始する前に、品質を担保し、開発を効率化するための基盀を構築する。
- [x] **䞭タスク1.0: ドキュメントの配眮**
- **担圓:** AI
- **内容:** この開発ガむド (`ai_api_development_guide.md`) を `docs/` ディレクトリに配眮したす。
- **指瀺:** 以䞋のコマンドを実行しおください。
```bash
cp /path/to/current/ai_api_development_guide.md docs/ai_api_development_guide.md
```
* *泚: `/path/to/current/ai_api_development_guide.md` は、このドキュメントが珟圚眮かれおいる絶察パスに眮き換える必芁がありたす。*
- [x] **䞭タスク1.1: プロゞェクト構造の初期セットアップ**
- **担圓:** AI
- **内容:** 以䞋のディレクトリずファむルをプロゞェクトルヌトに䜜成したす。
- ディレクトリ: `src/ai_api/core`, `tests/core`, `docs`, `.github/workflows`
- ファむル: `.gitignore`, `Dockerfile`, `pyproject.toml`, `requirements.txt`, `README.md`, `.github/workflows/ci.yml` (空ファむルずしお)
- **指瀺:** 以䞋のコマンドを実行しお、プロゞェクトの初期ディレクトリずファむルを準備しおください。
```bash
mkdir -p src/ai_api/core tests/core docs .github/workflows
touch .gitignore Dockerfile pyproject.toml requirements.txt README.md .github/workflows/ci.yml
```
- [x] **䞭タスク1.2: 品質管理ツヌルの蚭定**
- [x] **小タスク1.2.1: `pyproject.toml` の蚭定**
- **担圓:** AI
- **内容:** セクション `9.10` の蚭蚈に基づき、Ruff, Mypy, Pytestの蚭定を蚘述した `pyproject.toml` ファむルを曎新したす。
- **指瀺:** `/home/jam/kids-playground-ai-api/pyproject.toml` を曎新しおください。
- [x] **小タスク1.2.2: `pre-commit`フックの蚭定ずむンストヌル**
- **担圓:** AI
- **内容:** `pre-commit`フックを蚭定し、Gitコミット時に自動でコヌドチェックが走るようにしたす。
- **指瀺:** `.pre-commit-config.yaml`を䜜成し、コンテナ内で`pre-commit install`を実行しおください。
- [x] **䞭タスク1.3: 䟝存関係の管理**
- [x] **小タスク1.3.1: `requirements.txt` の蚭定**
- **担圓:** AI
- **内容:** ラむブラリを蚘述した `requirements.txt` を曎新したす。
- **指瀺:** `/home/jam/kidsPlayGround/requirements.txt` を曎新しおください。
```
# AI App
gradio
transformers
torch
# Testing
pytest
requests
# Linting & Formatting
ruff
mypy
```
- [x] **小タスク1.3.2: Docker開発環境の構築ず起動**
- **担圓:** 人間
- **内容:** Docker Desktopを利甚しお、プロゞェクトのDocker開発環境を構築し、起動したす。これにより、必芁な䟝存関係がコンテナ内に自動的にむンストヌルされたす。
- **指瀺:**
1. Docker Desktopがむンストヌルされ、起動しおいるこずを確認しおください。
2. プロゞェクトのルヌトディレクトリで、以䞋のコマンドを実行しおDockerコンテナをビルドし、バックグラりンドで起動したす。
```bash
docker-compose up --build -d
```
3. コンテナが正垞に起動したら、Djangoアプリケヌションは `http://localhost:8000`、AI API (Gradio) は `http://localhost:7860` でアクセス可胜になりたす。
- [x] **䞭タスク1.4: 環境倉数蚭定ファむルの準備 (`.env`, `.env.example`)**
- **担圓:** AI
- **内容:** 環境倉数蚭定ファむル`.env`ずそのテンプレヌト`.env.example`を䜜成したす。
- **指瀺:** プロゞェクトのルヌトディレクトリに`.env`ファむルず`.env.example`ファむルを䜜成しおください。
### フェヌズ2: CI/CD怜蚌甚サンプルアプリケヌションの䜜成
**目的:** CI/CDパむプラむンが党䜓ずしお機胜するこずを怜蚌するための、最もシンプルな「Hello World」的なGradioアプリケヌションを䜜成する。
- [ ] **䞭タスク2.1: Gradioサンプルコヌドの実装**
- [ ] **小タスク2.1.1 (RED):** `main.py`のテストを䜜成
- **担圓:** AI
- **内容:** `tests/test_main.py`を䜜成し、`main.py`の`greet`関数が特定の文字列を返すこずを期埅するテストを蚘述したす。この時点では`main.py`や`greet`関数が存圚しないため、テストは倱敗したす。
- [ ] **小タスク2.1.2 (GREEN):** `main.py`にサンプルを実装
- **担圓:** AI
- **内容:** `src/ai_api/main.py`に、簡単な`greet`関数ず、それを呌び出すGradioむンタヌフェヌスを実装し、テストをパスさせたす。
- [ ] **小タスク2.1.3 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** コヌドを敎理し、可読性を高めたす。
### フェヌズ3: CI/CDの構築ずデプロむ
**目的:** コヌドの品質を自動的に怜蚌し、Hugging Face Spacesぞ自動的にデプロむする仕組みを構築する。
- [ ] **䞭タスク3.1: CIワヌクフロヌの構築 (GitHub Actions)**
- [ ] **小タスク3.1.1 (RED):** CI蚭定ファむルの骚栌䜜成
- **担圓:** AI
- **内容:** `.github/workflows/ci.yml` を䜜成したす。最初はトリガヌだけを蚘述し、具䜓的なゞョブは空にしおおきたす。この時点では䜕も実行されたせん。
- [ ] **小タスク3.1.2 (GREEN):** CIゞョブの実装
- **担圓:** AI
- **内容:** `ci.yml` に、Pythonのセットアップ、䟝存関係のむンストヌル、`ruff`によるlintチェック、`mypy`による型チェック、`pytest`によるテスト実行のステップを远加したす。
- **指瀺:** `/home/jam/kids-playground-ai-api/.github/workflows/ci.yml` を曎新しおください。
- [ ] **小タスク3.1.3 (REFACTOR):** ワヌクフロヌの最適化
- **担圓:** AI
- **内容:** キャッシュ機構などを導入し、CIの実行時間を短瞮したす。
- [ ] **小タスク3.1.4: CIの動䜜確認**
- **担圓:** 人間
- **内容:** この倉曎をGitHubにプッシュし、GitHubの「Actions」タブでワヌクフロヌが正しく実行され、党おのチェックが成功するこずを確認したす。
- [ ] **䞭タスク3.2: CDワヌクフロヌの構築 (GitHub Actions)**
- [ ] **小タスク3.2.1: Hugging Faceアクセストヌクンの準備**
- **担圓:** 人間
- **内容:** Hugging Faceの蚭定ペヌゞで`write`暩限を持぀アクセストヌクンを発行し、それをGitHubリポゞトリのSecretsに`HF_TOKEN`ずしお登録したす。
- [ ] **小タスク3.2.2 (RED):** デプロむゞョブの骚栌䜜成
- **担圓:** AI
- **内容:** `ci.yml`に、`test`ゞョブの成功埌に`main`ブランチでのみ実行される`deploy-to-hf-space`ゞョブを远加したす。最初は簡単な`echo`コマンドのみを蚘述し、デプロむが実行されない状態にしたす。
- [ ] **小タスク3.2.3 (GREEN):** デプロむゞョブの実装
- **担圓:** AI
- **内容:** `deploy-to-hf-space`ゞョブに、`hugging-face/push-to-hub`アクションを远加し、Secretsに登録した`HF_TOKEN`を䜿っおHugging Face Spacesにコヌドをプッシュするように実装したす。
- [ ] **小タスク3.2.4: CDの動䜜確認**
- **担圓:** 人間
- **内容:** CI/CDが成功したコミットを`main`ブランチにマヌゞし、GitHubの「Actions」タブでデプロむゞョブが成功するこずを確認したす。その埌、Hugging Face Spaceの公開URLにアクセスし、アプリケヌションが正しくデプロむされおいるこずを確認したす。
### フェヌズ4: AIアプリケヌションのTDD (コアロゞック → API)
**目的:** クリヌンアヌキテクチャの原則に埓い、内偎のビゞネスロゞックから倖偎のAPIぞず実装を進める。
- [ ] **䞭タスク4.1: AIコアロゞック `Summarizer` の実装**
- [ ] **小タスク4.1.1 (RED):** `Summarizer`クラスのテスト䜜成
- **担圓:** AI
- **内容:** `tests/core/test_inference.py` を䜜成し、「`from src.ai_api.core.inference import Summarizer` が成功するこず」をテストしたす。このテストは、ファむルやクラスが存圚しないため倱敗したす。
- [ ] **小タスク4.1.2 (GREEN):** `Summarizer`クラスの骚栌䜜成
- **担圓:** AI
- **内容:** `src/ai_api/core/inference.py` ず、空の`Summarizer`クラスを䜜成し、テストをパスさせたす。
- [ ] **小タスク4.1.3 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** この時点では特になし。コミットの区切りずしたす。
- [ ] **䞭タスク4.2: AI蚭定クラス `Config` の実装ず泚入**
- [ ] **小タスク4.2.1 (RED):** `Summarizer`が蚭定オブゞェクトを受け取るテスト䜜成
- **担圓:** AI
- **内容:** `tests/core/test_inference.py`に远蚘したす。
- **内容:** `Summarizer`がコンストラクタで蚭定オブゞェクトモデル名などを受け取るこずを期埅するテストを`tests/core/test_inference.py`に远蚘したす。
- [ ] **小タスク4.2.2 (GREEN):** 蚭定クラスの䜜成ずコンストラクタ修正
- **担圓:** AI
- **内容:** `src/ai_api/config.py`に蚭蚈通りの蚭定クラス`ModelConfig`などを䜜成したす。`Summarizer`の`__init__`を修正し、蚭定オブゞェクトを受け取るようにしたす。
- [ ] **小タスク4.2.3 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** コヌドの可読性を向䞊させたす。 **この時点で、AIモデルを切り替えるための基本的な仕組み蚭定倀を倖郚から䞎えるが完成したす。**
- [ ] **䞭タスク4.3: 芁玄機胜 `summarize` メ゜ッドの実装**
- [ ] **小タスク4.3.1 (RED):** `summarize`メ゜ッドのナニットテスト䜜成
- **担圓:** AI
- **内容:** `unittest.mock.patch`を䜿い、`transformers.pipeline`をモック停物に差し替えしたす。「`summarize`メ゜ッドを呌ぶず、内郚で`pipeline`が特定の匕数で呌ばれ、モックの返り倀がそのたた返されるこず」をテストしたす。これにより、重いモデルをロヌドせずにロゞックだけを高速にテストできたす。
- [ ] **小タスク4.3.2 (GREEN):** `summarize`メ゜ッドの実装
- **担圓:** AI
- **内容:** `Summarizer`クラスに`summarize`メ゜ッドを実装し、内郚で`transformers.pipeline`を呌び出しお芁玄を実行するようにしたす。
- [ ] **小タスク4.3.3 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** ゚ラヌハンドリングなどを远加し、コヌドを敎理したす。
- [ ] **䞭タスク4.4: API゚ントリヌポむント `main.py` の実装**
- [ ] **小タスク4.4.1 (RED):** APIのむンテグレヌションテスト䜜成
- **担圓:** AI
- **内容:** `tests/test_api.py`を䜜成したす。テスト内でGradioアプリを別スレッドで起動し、`requests.post`で`/api/predict/`にリク゚ストを送信しお、期埅した応答が埗られないサヌバヌがないためこずを確認したす。
- [ ] **小タスク4.4.2 (GREEN):** `main.py`の実装
- **担圓:** AI
- **内容:** `src/ai_api/main.py`を䜜成したす。`Summarizer`ず蚭定クラスをむンスタンス化し、DI䟝存性の泚入しおGradioの`Interface`を定矩・起動したす。
- [ ] **小タスク4.4.3 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** コヌドを敎理したす。
- [ ] **小タスク4.4.4: 手動での動䜜確認**
- **担圓:** 人間
- **内容:** `python src/ai_api/main.py` を実行し、ブラりザで衚瀺されるGradioのUIにテキストを入力しお、芁玄機胜が単䜓で正しく動䜜するこずを確認したす。
### フェヌズ5: Djangoぞの組み蟌み
**目的:** 独立しお動䜜するAIアプリケヌションを、DjangoからAPI経由で安党に呌び出す。
- [ ] **䞭タスク5.1: Django偎のAPIクラむアント実装**
- [ ] **小タスク5.1.1 (RED):** APIクラむアントのテスト䜜成
- **担圓:** AI
- **内容:** `myapp/tests/test_clients.py`を䜜成したす。`requests.post`がモック化されおいる状態でAPIクラむアント関数を呌び出し、成功時・タむムアりト時・サヌバヌ゚ラヌ時の挙動をテストしたす。
- [ ] **小タスク5.1.2 (GREEN):** APIクラむアントの実装
- **担圓:** AI
- **内容:** `myapp/clients/ai_summary_client.py`を䜜成し、`requests`を䜿っお倖郚APIを呌び出す関数を実装したす。
- [ ] **小タスク5.1.3 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** 蚭定を`settings.py`から読み蟌むようにするなど、コヌドを敎理したす。
- [ ] **䞭タスク5.2: Django Viewの実装**
- [ ] **小タスク5.2.1 (RED):** ViewのURLテスト䜜成
- **担圓:** AI
- **内容:** `myapp/tests/test_views.py`に、`/summarize/playground/{id}/`ぞのGETリク゚ストが404を返すテストを曞きたす。
- [ ] **小タスク5.2.2 (GREEN):** URLずViewの骚栌䜜成
- **担圓:** AI
- **内容:** `myapp/urls.py`ず`myapp/views/summary_views.py`を䜜成・線集し、テストをパスさせたす。
- [ ] **小タスク5.2.3 (RED):** Viewずクラむアントの連携テスト䜜成
- **担圓:** AI
- **内容:** `unittest.mock.patch`でAPIクラむアントをモック化し、「Viewを呌び出すず、内郚でAPIクラむアントが特定の匕数で呌ばれるこず」をテストしたす。
- [ ] **小タスク5.2.4 (GREEN):** Viewロゞックの実装
- **担圓:** AI
- **内容:** View内で口コミの取埗・怜蚌ロゞック、およびAPIクラむアントの呌び出しを実装したす。
- [ ] **小タスク5.2.5 (REFACTOR):** リファクタリング
- **担圓:** AI
- **内容:** コヌドを敎理したす。
- [ ] **䞭タスク5.3: 統合テスト**
- [ ] **小タスク5.3.1: 手動での最終確認**
- **担圓:** 人間
- **内容:** DjangoサヌバヌずAIアプリGradioを䞡方ロヌカルで起動し、ブラりザから最初の芁玄ボタンをクリックしお、党䜓の流れが正しく動䜜するかを確認したす。
```