./knowledge-base/README.md
# 🗄️ knowledge-base
**時代考証アシストシステム** の知識ベース・検索基盤モジュールです。
歴史資料の画像を AI で解析し、セマンティック検索を可能にします。
> 💡 **開発フローや CI/CD の仕組みについては [ルートの README](../README.md) を参照してください。**
> コードを `main` ブランチにプッシュするだけで、AWS への自動デプロイが完了します。
---
## 🎯 主要機能
| 機能 | 内容 |
| ---- | ---- |
| 📸 画像解析 | AI が画像を読み取り、内容・年代・タグを自動抽出 |
| 🔍 セマンティック検索 | キーワードの意味から関連資料を検索 |
| 🏷️ フィルタリング | 時代・ジャンル・タグで絞り込み |
| 📦 一括処理 | 複数資料のまとめてアップロード |
---
## 🏗️ システム構成
```
ブラウザ(フロントエンド)
│
▼
CloudFront(CDN)
│
▼
API Gateway(HTTPS API)
│
┌────┴───────────────────┐
▼ ▼
upload-handler search-api
│ │
▼ ▼
image-analyzer OpenSearch
(Claude Sonnet) (ベクトル検索DB)
│
▼
embedding-generator
(Bedrock Titan)
│
▼
OpenSearch
```
### 使用サービス一覧
| サービス | 用途 |
| -------- | ---- |
| AWS Lambda | サーバーレス関数(6つ) |
| Amazon OpenSearch | ベクトル検索エンジン |
| Amazon S3 | 画像・プロンプト・フロントエンド配信 |
| Amazon DynamoDB | 処理ステータス管理 |
| Amazon SQS | 非同期処理キュー |
| Amazon API Gateway | HTTPS API |
| Amazon CloudFront | CDN 配信 |
| AWS CDK | インフラをコードで定義・管理 |
---
## ⚡ Lambda 関数の役割
| 関数名 | 役割 |
| ------ | ---- |
| `upload-handler` | 画像アップロードの受け付け・SQS へのキュー投入 |
| `image-analyzer` | Claude Sonnet による画像解析(OCR・内容抽出) |
| `embedding-generator` | Bedrock Titan によるベクトル(埋め込み)生成・OpenSearch への登録 |
| `search-api` | セマンティック検索の実行 |
| `bulk-processor` | 複数資料の一括アップロード処理 |
| `dlq-processor` | 失敗したジョブの再処理 |
---
## 📁 ディレクトリ構造
```
knowledge-base/
├── cdk/ # インフラ定義(AWS CDK / TypeScript)
│ ├── bin/
│ │ └── historical-research.ts # CDK エントリーポイント
│ ├── lib/
│ │ └── historical-research-stack.ts # メインスタック定義
│ └── cdk.json
├── lambda/ # Lambda 関数(Python)
│ ├── layers/common/ # 共通ライブラリレイヤー
│ ├── upload-handler/
│ ├── image-analyzer/
│ ├── embedding-generator/
│ ├── search-api/
│ ├── bulk-processor/
│ └── dlq-processor/
├── frontend/ # フロントエンド(React / Vite)
├── prompts/ # AI プロンプトファイル(S3 で管理)
│ ├── image-analysis/
│ │ ├── main.txt # 画像解析プロンプト
│ │ └── json-schema.json # 出力スキーマ定義
│ └── master/
│ └── era-list.json # 時代区分マスタ
└── docs/ # 詳細ドキュメント
```
> 📝 **プロンプトファイル(`prompts/`)の変更も `main` にプッシュするだけで自動反映されます。**
---
## 🛠️ ローカル開発
### CDK の差分を確認する
インフラの変更を本番に適用する前に、差分を事前確認できます。
```bash
cd knowledge-base/cdk
npm install # 初回のみ
cdk diff # 現在の AWS 環境との差分を表示
```
> ⚠️ 実際のデプロイは `cdk deploy` を直接実行しないでください。
> **`main` ブランチへのプッシュで CI/CD が自動実行**します。
---
## 🔌 API エンドポイント
API Gateway のエンドポイント URL はデプロイログ([Actions タブ](https://github.com/nhk-ds/HistoricalAccuracy/actions))から確認できます。
### 📸 画像アップロード
```
POST /prod/process/upload
```
```json
{
"document_id": "doc_001",
"page_number": 1,
"metadata": {
"title": "昭和の台所",
"era": "昭和40年代(1956年~1965年)",
"genre": ["生活", "住宅"],
"tags": ["台所", "家電"]
},
"image_data": "<base64 エンコード済み画像>"
}
```
### 🔍 セマンティック検索
```
POST /prod/search
```
```json
{
"query": "昭和時代の台所",
"filters": {
"era": "昭和40年代(1956年~1965年)"
},
"page": 1,
"page_size": 20
}
```
### 📋 処理ステータス確認
```
GET /prod/process/status/{page_id}
```
---
## ⚠️ インフラの注意事項
### アクセス制限
API Gateway は以下の IP アドレスからのみアクセス可能です:
| 説明 | IP アドレス |
| ---- | ----------- |
| 社内ネットワーク | `133.127.0.0/16` |
| その他許可 IP | `118.238.211.181/32` |
| その他許可 IP | `125.196.69.242/32` |
### VPC 構成
Lambda 関数はプライベートサブネット内で動作します(既存 VPC `vpc-08d84efb87d052cf9` を使用)。
OpenSearch への直接アクセスが必要な場合は VPC 内からのみ可能です。
### API キー管理
LiteLLM の API キーは AWS Secrets Manager で管理しており、コードには含まれていません。
---
## 🆘 トラブルシューティング
| 症状 | 確認するポイント |
| ---- | --------------- |
| Lambda がタイムアウトする | CDK スタックのメモリ・タイムアウト設定を確認 |
| OpenSearch にアクセスできない | Security Group の設定・VPC 内からアクセスしているか確認 |
| プロンプトが反映されない | `prompts/` の変更が `main` にプッシュされているか確認 |
| デプロイが失敗する | [Actions タブ](https://github.com/nhk-ds/HistoricalAccuracy/actions) のログを確認 |
---
## 📖 詳細ドキュメント
| ドキュメント | 内容 |
| ------------ | ---- |
| [仕様書.md](仕様書.md) | システム全体の仕様 |
| [仕様書_基本機能.md](仕様書_基本機能.md) | 基本機能の詳細仕様 |
| [仕様書_基本機能_フロントエンド.md](仕様書_基本機能_フロントエンド.md) | フロントエンド仕様 |
| [仕様書_時代考証アシスト.md](仕様書_時代考証アシスト.md) | 時代考証アシスト機能仕様 |
| [開発引継ぎ.md](開発引継ぎ.md) | 開発引継ぎ情報 |
| [docs/AWS_ARCHITECTURE.md](docs/AWS_ARCHITECTURE.md) | AWS アーキテクチャ詳細 |
| [docs/opensearch-setup.md](docs/opensearch-setup.md) | OpenSearch セットアップ手順 |