はじめに
生成AIが登場してから開発であれ調査であれ進め方ががらっと変わってきました。インターネットの登場で「自分が調べたい」と思ったことは簡単に調べられるようになってきましたが、生成AIの登場により今度は自分が知らないことにも気づきやすくなってきて、自身のスキルを底上げできるようになってきたことを実感する日々です。
さて、パラメータ数の増加や推論・エージェントの導入など生成AI自体も進化を続けているわけですが、それぞれ具体的にどのくらいの違いがあるのか気になるところです。
そこで、今回はChatGPT-5 に絞って各モデルの出力にどのくらい違いがあるのか見てみることにしました。
何を生成するのか?
今回は要件定義書を生成します。まず、自分がやりたいことを短いアイデアで表現し、このアイデアを元にして生成AIに要件定義書を生成してもらいます。
要件定義書の元になるアイデアを記したプロンプト
下記のプロンプトを生成AIに送って、要件定義書をMarkdownで取得します。
要件案を元に、不足部分を補足した要件定義書を作成してください。フォーマットはmarkdown 形式とします。
# アイデアのポイント
- ココナラで自分に関係する仕事が募集されたらLINEで通知してくれるBotである
- 自分に関係する仕事はキーワードで指定する
- キーワード指定はブラウザで実施できるようにする
- ブラウザでアクセスする際にユーザアカウントの管理を行うこと
- ココナラでの募集内容は定期的にスクレイピングを実施し、収集した情報を非リレーショナルデータベースに蓄積する
ChatGPT 5 Pro版
以下のようになりました。想像以上に充実した内容です。
# 要件定義書:ココナラ案件通知 LINE Bot
最終更新日: 2025-11-03
## 1. 目的・背景
- 目的
- ココナラ上で公開された募集(依頼)を定期的に収集し、ユーザーが事前に登録したキーワードに合致する案件をLINEで即時またはまとめて通知する。
- ブラウザからキーワードや通知設定を管理できるアカウント機能を提供する。
- 収集データは非リレーショナルデータベースに蓄積し、検索や配信に活用する。
- 背景
- ココナラの案件は更新が頻繁で、手動の巡回では見逃しやタイムラグが発生しやすい。
- LINE通知を利用することで、ユーザーは即時性と利便性を確保できる。
- 非リレーショナルDBによりスキーマの柔軟性とスケーラビリティを担保する。
## 2. スコープ
- 対象
- ココナラの「募集(依頼)」ページに公開された新着・更新情報の収集と通知
- ブラウザUIによるキーワード・通知設定・アカウント管理
- LINEを使ったプッシュ通知
- 非対象(初期リリース)
- ココナラへの自動応募・自動メッセージ送信
- ココナラの有料会員機能やログインが必要な領域のスクレイピング
- 企業向けSLAの提供、マルチプラットフォーム通知(Slack, Email等)
## 3. ステークホルダー
- エンドユーザー: 案件を探す個人・フリーランサー
- 運用者/管理者: システム運用、監視、サポート
- 開発チーム: バックエンド、フロントエンド、インフラ、QA
- 法務/コンプライアンス: 利用規約・法令順守の確認
## 4. 用語定義
- 案件: ココナラの募集(依頼)情報
- キーワード: ユーザーが指定する検索語や条件
- 通知: LINEプッシュメッセージでの配信
- スクレイピング: 公開Webページからの機械的情報取得
- 非リレーショナルDB: ドキュメント指向/Key-Value型DB(例: MongoDB, Firestore, DynamoDB)
## 5. 前提・制約
- ココナラの利用規約、robots.txt、関連法令に従うこと。必要に応じて許諾取得・仕様変更の可能性あり。
- スクレイピングは認証不要な公開範囲に限定し、適切なレート制御・キャッシュ・バックオフを実装する。
- 通知はLINE Messaging APIを使用し、ユーザーの同意に基づき配信。
- 非リレーショナルDBを採用。初期は単一リージョン、将来マルチAZ/DR対応可。
- 想定規模(初期)
- ユーザー: 1,000〜10,000
- 登録キーワード/ユーザー: 1〜20
- クローリング頻度: 5〜15分間隔
- 新規案件: 日あたり数千件まで耐える
## 6. ユースケース
- ユーザー登録/ログイン
- LINE連携(友だち追加+アカウント連携)
- キーワード追加/編集/削除、優先度・一致条件の設定
- 通知設定(即時/ダイジェスト、静音時間、上限)
- 通知の受信と既読/ミュート
- テスト通知の送信
- アカウント解除・退会(データ削除)
- 管理者によるクローラ監視、再実行、ブラックリスト設定
## 7. 機能要件(FR)
- FR-01 アカウント管理
- ブラウザからのアカウント登録/ログイン/ログアウト
- LINE Loginまたはメール+パスワード(MVPはLINE Login推奨)
- パスワード再設定(メール方式採用時)
- FR-02 LINE連携
- LINE公式アカウントの友だち追加
- LINE Loginでのユーザー同意取得とアカウント紐付け
- 配信トークンの安全な保管と更新
- FR-03 キーワード管理
- キーワードのCRUD
- マッチ条件設定(含む/除外、AND/OR、完全一致/部分一致)
- 正規化(全半角、大小、記号除去)と日本語形態素解析の簡易オプション(MVPは部分一致+正規化)
- カテゴリ/価格帯/納期などの簡易フィルタ(MVPはカテゴリ・価格帯)
- FR-04 通知設定
- 即時通知またはダイジェスト(15/30/60分間隔)
- 静音時間帯(例: 23:00-7:00)と遅延配信
- 1日あたり通知上限(例: 50件/日)
- 重複抑制(同一案件の再通知防止、内容更新時のみ再通知)
- FR-05 スクレイピング
- 定期ジョブでの一覧取得(サイト構造の変更耐性を考慮)
- 詳細ページのメタ情報抽出(タイトル、本文、カテゴリ、価格レンジ、URL、投稿日、更新日、投稿者表示名など)
- 失敗時のリトライ、指数バックオフ、レート制御
- 取得結果の正規化・重複判定・保存
- FR-06 データ保存(非リレーショナルDB)
- エンティティ: 案件、ユーザー、キーワード、サブスクリプション設定、通知ログ、スクレイピングログ
- インデックス: 案件URLハッシュ、投稿日、カテゴリ、全文検索用トークン
- FR-07 マッチング
- 新規/更新案件に対してユーザーごとのキーワードで一致判定
- 除外キーワードとカテゴリ除外の適用
- 配信キューへの投入(重複排除)
- FR-08 通知配信
- LINE Messaging APIでのメッセージ送信(タイトル、抜粋、価格、URL、カテゴリ、投稿日)
- 失敗時の再送制御(一時障害のみ再試行、最大3回)
- 配信結果のログ化
- FR-09 ブラウザUI
- 設定ダッシュボード(キーワード、通知設定、テスト通知、連携状態)
- レスポンシブ対応、シンプルな検索/プレビュー
- FR-10 管理者機能
- クローラ稼働状況ダッシュボード(成功/失敗率、遅延、直近エラー)
- スクレイピング対象URLテンプレート管理
- キーワード/ユーザーの凍結・解除(不正対策)
- 重要アラートの通知(運用LINEまたはSlack)
- FR-11 ログ・監視
- アプリログ、監査ログ(認証、設定変更、配信)、メトリクス出力
- しきい値超過での自動通知
- FR-12 退会・データ削除
- ユーザーの自己削除と関連データの消去(法令・会計要件の範囲内)
- FR-13 法令・規約順守
- robots.txt尊重、レート制限、ユーザーエージェント明示
- 申請・許諾が必要な場合の運用手順
## 8. 非機能要件(NFR)
- NFR-01 可用性: 月間稼働率99.5%以上(スクレイピングと通知の総合)
- NFR-02 性能
- 新規案件検知から通知までの遅延: 平均5分以内(即時設定時)
- 配信レート: 1,000通/分(バースト時)
- NFR-03 スケーラビリティ: ユーザー10万人まで水平拡張可能な設計
- NFR-04 セキュリティ
- 通信のTLS化、保存時暗号化(PII/トークン)
- OWASP Top 10対策(CSRF、XSS、SQLi相当、認可不備)
- 最小権限IAM、シークレットのセキュア保管
- NFR-05 信頼性
- 重要キューは少なくとも1回以上の配信保証(at-least-once)+冪等処理
- バックアップ/スナップショット: 1日1回、保持30日
- NFR-06 運用性: メトリクス/ログの集中管理、ワンクリック再実行、構成のコード化
- NFR-07 可観測性: 分散トレース、リクエスト相関ID
- NFR-08 プライバシー/GDPR相当: 取得最小化、目的外利用禁止、削除要請に応答
- NFR-09 アクセシビリティ: Web標準に準拠しキーボード操作可能
- NFR-10 国際化: 初期は日本語のみ、将来拡張可
## 9. システム構成概要
- コンポーネント
- Webフロントエンド(設定UI)
- 認証/認可サービス(LINE Login/自前認証)
- スクレイピングワーカー(スケジューラ、フェッチャ、パーサ)
- 正規化・重複検知・マッチングサービス
- 通知ディスパッチャ(LINE Messaging APIクライアント)
- 非リレーショナルDB(ドキュメント指向)
- メッセージキュー/ジョブキュー(配信・解析)
- 監視/ロギング/メトリクス基盤
- インフラ(例)
- マネージドKVS/ドキュメントDB(MongoDB Atlas, Firestore, DynamoDBのいずれか)
- サーバレス関数/コンテナ
- 定期実行(Cron/Cloud Scheduler)
- シークレットマネージャ
- CDN/静的ホスティング
- 外部サービス
- LINE Messaging API, LINE Login
- ココナラ公開Webページ(規約遵守)
## 10. データ設計(非リレーショナル)
- ユーザー
- userId, lineUserId, displayName, email(任意), authProvider, createdAt, status
- 設定(ユーザー別)
- userId, notifyMode(immediate/digest-15/30/60), quietHours, dailyCap, excludeCategories
- キーワード
- keywordId, userId, text, matchType(partial/exact), logic(AND/OR), isExclude, priority, createdAt
- 案件
- itemId(URLハッシュ), url, title, descriptionExcerpt, category, priceRange, postedAt, updatedAtOnSite, fetchedAt, source
- マッチ結果
- matchId, itemId, userId, matchedKeywords[], matchedAt, isUpdatedItem
- 通知ログ
- deliveryId, userId, itemId, channel=line, status(success/fail), attempts, lastTriedAt, errorCode
- スクレイピングログ
- runId, target, status, startedAt, finishedAt, errorSummary
インデックス例
- 案件: itemId(PK), postedAt降順, category, fullTextTokens
- マッチ結果: userId+matchedAt, itemId
- 通知ログ: userId+lastTriedAt, status
保持期間
- 案件本文抜粋: 180日(要件・容量次第で調整)
- 通知ログ: 90日
- スクレイピングログ: 30日
## 11. マッチング仕様
- 正規化
- 大文字小文字無視、全半角統一、記号・絵文字除去、空白正規化
- 一致判定(MVP)
- 部分一致(サブストリング)を基本
- AND/ORはキーワード単位の集合操作
- 除外キーワードは常に優先
- 将来拡張
- 形態素解析(Kuromoji/Sudachi)による語彙単位一致
- 同義語辞書、カテゴリベースの重み付け
- 機械学習による関連度スコア
## 12. 通知仕様
- コンテンツ
- タイトル(最大40〜60文字にトリム)
- 抜粋(最大120文字)
- 価格帯/カテゴリ/投稿日
- URL(ココナラ該当ページ)
- 配信制御
- 即時: マッチ後キューに投入し優先送信
- ダイジェスト: 指定間隔でまとめて最大N件
- 重複抑止: itemId+userIdで24時間内再送禁止(更新時は許容)
- レート制御: ユーザー別・全体別スロットリング
- エラー処理
- 一時エラーは指数バックオフで最大3回
- 永続エラー(ブロック/無効トークン)は停止+通知停止フラグ
## 13. スクレイピング仕様
- 対象
- ココナラの公開募集一覧・詳細ページ(ログイン不要範囲)
- 頻度
- 一覧の巡回: 5〜15分
- 詳細のフォローアップ: 新規検知時のみ、更新検知はE-Tag/Last-Modified相当の疑似判定(本文ハッシュ比較)
- 技術要件
- HTTPクライアントは適切なUser-Agentを明示
- robots.txtを取得・尊重
- レート制限(例: 0.5〜2 req/sec)、ランダマイズ
- HTML構造変化に備え、抽出ロジックは設定駆動(セレクタを外部化)
- キャッシュと再利用(CDN/HTTPキャッシュ)を活用
- 法令・規約
- 規約変更・禁止事項が発生した場合は即時停止・見直し
- 可能な限り公式の提供手段(RSS/API等)があれば優先
## 14. セキュリティ・プライバシー
- 認証/認可: OAuth2(LINE Login)またはJWT、セッション固定化対策、CSRF対策
- 入出力バリデーション、XSS/クリックジャッキング対策
- 最小権限アクセス、監査ログ保持
- 個人情報の最小化(必要なのはlineUserId、表示名程度)
- データ暗号化(保存時: KMS/鍵管理、通信時: TLS1.2+)
- インシデント対応手順(検知/封じ込め/連絡/復旧)
## 15. 監視・運用
- メトリクス
- クローラ: 成功率、平均応答時間、取得件数、解析失敗率
- 配信: 送信成功率、再試行率、到達遅延、ブロック率
- アプリ: エラーレート、レイテンシ、CPU/メモリ
- アラート
- スクレイピング成功率<95%(1時間移動平均)
- 配信成功率<98%
- キュー滞留時間>10分
- 運用
- ブルー/グリーンまたはカナリアデプロイ
- ロールバック標準手順
- 週次ヘルスチェックレポート
## 16. UI/UX要件
- PC/スマホ対応のレスポンシブ
- 初回オンボーディング(LINE連携→キーワード登録→テスト通知)
- エラー時のわかりやすい説明と再試行導線
- アクセシビリティ(コントラスト、フォーカス可視化、キーボード操作)
## 17. API/外部IF(概要)
- ブラウザ向けAPI
- 認証: /auth/login, /auth/logout, /auth/callback(LINE)
- ユーザー設定: /me, /me/settings
- キーワード: /keywords [GET/POST], /keywords/{id} [PUT/DELETE]
- テスト通知: /me/test-notification [POST]
- Webhook
- LINE Messaging API Webhook(友だち追加/ブロック/不達情報)
- 管理API(認可必須)
- /admin/crawler/runs, /admin/crawler/retry, /admin/health
## 18. 品質保証・テスト観点
- 単体/結合/システム/負荷/回帰テスト
- 主要受入条件(例)
- 指定キーワードに一致する案件が検知から5分以内に通知される(P50)
- 除外キーワードが設定されている案件は通知されない
- 静音時間帯には通知されず、解除後に遅延配信される
- 同一案件は24時間内に重複通知されない
- 1日上限に到達した場合、それ以上は送られない
- 退会後、通知が停止し、関連データが削除される
## 19. リスクと対策
- サイト構造変更によるスクレイピング失敗
- セレクタ外部化、監視、早期検知と暫定停止
- 規約変更・法的リスク
- 法務レビュー、許諾取得、代替手段検討、停止スイッチ
- LINE API仕様変更・制限
- SDK利用、定期検証、冗長化(再発行手順)
- スパム認定・ブロック
- 配信頻度制御、ユーザー明示同意、簡便な停止手段
- スケール時のコスト増
- サーバレス/マネージド活用、キューイング、バッチ最適化
## 20. ロードマップ(例)
- フェーズ1(MVP, 4〜6週)
- LINE連携、基本認証、キーワード部分一致、即時通知、スクレイピング(公開一覧→詳細)、管理者ダッシュボード簡易版
- フェーズ2
- ダイジェスト通知、静音時間、除外キーワード、カテゴリ/価格フィルタ、重複更新通知
- フェーズ3
- 形態素解析、同義語、レコメンド、複数通知チャネル(任意)
## 21. 成功指標(KPI)
- 通知クリック率(CTR)
- 新規案件から通知までの中央値遅延
- 配信成功率/ブロック率
- 週次アクティブユーザー(WAU)
- 解約率/継続率
## 22. 非対象(明確化)
- ココナラの非公開情報の取得
- ログインが必要な領域の自動取得
- 自動応募やプロファイル操作
- キーワードの推薦学習(初期)
## 23. 想定技術スタック(参考)
- フロントエンド: TypeScript, React/Vue, 静的ホスティング+CDN
- バックエンド: Node.js/Python(スクレイピング/通知)、サーバレス or コンテナ
- データベース: Firestore/MongoDB/DynamoDB
- メッセージング: Cloud Tasks/Queues
- 監視: Cloud Monitoring + Sentry など
- CI/CD: GitHub Actions, IaC(Terraform等)
以上。初期の要件案に加え、アカウント管理、通知・マッチング仕様、スクレイピングの規約順守、データモデル、運用・監視、受入基準など不足部分を補完した要件定義を示しました。
ChatGPT 5 版
最初に記したプロンプトを用いてChatGPT-5版も出力してみました。Pro 版に比べると若干量は少ないものの、こちらもしっかりした内容です。ただ、完全な包含関係にあるわけでもなさそうです。
# 要件定義書:ココナラ募集監視 LINE 通知Bot
## 1. 文書情報
- 文書版: v1.0
- 作成日: 2025-11-06
- 作成者: 仕様策定担当
- 目的: 要件案に基づき不足箇所を補完し、設計・実装の基準となる要件を明確化する
## 2. 背景・目的
- 背景: ココナラの新規募集(依頼)情報から、自分に関連する案件のみを即時に把握したいニーズがある。
- 目的: ユーザが定義したキーワードに一致する募集がココナラで新規掲載・更新された際、LINEで自動通知するBotおよび管理用Webアプリを提供する。
## 3. スコープ
- 対象
- Webブラウザからのユーザ登録/ログイン/キーワード設定/通知設定
- ココナラ募集情報の定期スクレイピングと非リレーショナルDBへの蓄積
- キーワードマッチング処理とLINE通知
- 運用監視・簡易管理機能(管理者用)
- 非対象(初期リリース)
- ココナラAPI(公式)未使用時の双方向連携
- ネイティブアプリ(iOS/Android)
- 複雑な自然言語意味解析(高精度NLP)は将来拡張
## 4. 用語定義
- 募集: ココナラの「仕事・相談」などの依頼投稿
- キーワード: ユーザが登録する文字列/ルールで、募集のタイトル・本文等にマッチさせる条件
- 通知: LINE Messaging API(Bot)経由のプッシュメッセージ、またはLINE Notify
- マッチ: 募集データに対し各ユーザのキーワードが一致した状態
## 5. ステークホルダー
- エンドユーザ: 通知を受け取り、キーワードを管理する利用者
- 開発・運用チーム: 実装、保守、監視
- 外部サービス: ココナラ、LINEプラットフォーム
## 6. 成果目標/KPI
- 新規募集出現からユーザ通知までの平均レイテンシ: 5〜10分以内(ターゲット)
- 誤配信率(不要通知): 5%未満を目標
- 重複通知率: 1%未満
- 月間稼働率: 99.5%以上
## 7. ユースケース/ユーザーストーリー
- UC1: ユーザはWebでアカウントを作成し、LINEアカウントと連携する
- UC2: ユーザはキーワードを複数登録し、通知方法(即時/ダイジェスト)、時間帯(サイレント時間)を設定する
- UC3: 新規募集が出現し、キーワードに一致した場合、ユーザへLINE通知が送られる
- UC4: ユーザは通知履歴をWebで確認・停止・再開できる
- UC5: ユーザはキーワードのテストマッチ(サンプル文への試適合)を行える
- UC6: 退会時、全データと連携を削除できる
## 8. 機能要件
### 8.1 アカウント/認証
- Webアカウント作成(メール+パスワード)または外部ログイン(LINE Login/Googleは拡張候補)
- メール認証(必須)、パスワード再設定
- セッション管理(JWTまたはサーバセッション)、CSRF対策
- 2段階認証(任意/将来拡張)
- 退会(データ削除要求に応じる)
### 8.2 LINE連携
- LINE Official Account(Messaging API)を用いたBot実装
- アカウント連携フロー
- Webで「LINE連携」操作→LINE OAuth→同意→ユーザDBにLINEユーザIDを保存
- 通知種別
- 即時通知(デフォルト)
- ダイジェスト通知(1日/1回、時間指定)
- 通知制御
- サイレント時間帯(例: 23:00-8:00)設定
- 通知レート制限(例: 1分あたり最大X件/ユーザ)
- 重複抑止(同一募集・同一キーワードの再通知防止)
### 8.3 キーワード/フィルタ管理
- CRUD: 複数登録上限(初期: 20件/ユーザ、変更可能)
- マッチ対象フィールド選択: タイトル、本文、タグ、カテゴリ
- マッチ方式
- 部分一致、フレーズ一致、正規表現(上級者向け、初期はオフ)
- 大文字小文字/全半角の正規化
- 除外キーワード(NOT条件)
- しきい値/論理式(AND/OR、初期はAND/OR程度)
- 追加フィルタ(取得可能な範囲)
- カテゴリ、価格帯、募集ステータス、掲載日時
- テストマッチ機能(サンプル文入力→マッチ判定結果表示)
### 8.4 スクレイピング/収集
- 収集対象: ココナラの募集一覧・詳細ページ(公開範囲のみ)
- 周期: 5分間隔(初期)、負荷状況により動的調整
- 範囲制御
- 対象カテゴリの優先度指定(ホワイトリスト)
- 最終取得時刻/最終IDを保持し差分取得
- リクエスト間隔・ジッターで負荷分散(例: 1リクエスト/2〜5秒)
- 健全性
- robots.txt・利用規約の遵守、アクセス頻度の抑制
- 429/5xx時の指数バックオフ、サーキットブレーカ
- HTML変更検知時のアラート
- 取得項目(取得可能な場合)
- 募集ID/URL、タイトル、本文、カテゴリ、価格/報酬、掲載日時/更新日時、ステータス、出品者/依頼者の公開属性、タグ、添付有無
- データ品質
- 文字コード/改行正規化
- HTMLサニタイズ/テキスト抽出
- 正規化・重複排除(URL/ID/内容ハッシュ)
### 8.5 マッチング/通知キュー
- 新規/更新募集の取り込み時にルールマッチを実行
- ユーザごとの一致結果をキューイングし通知ワーカーで送信
- 冪等性: 同一募集×同一ユーザ×同一キーワードは1回のみ送信
- 失敗時リトライ(指数バックオフ、最大N回)
- ダイジェスト生成(期間内のマッチを集約しテンプレート整形)
### 8.6 Web UI
- 画面
- サインアップ/ログイン/パスワード再設定
- ダッシュボード(連携状態、最近の通知、システム状態)
- キーワード一覧/編集/テスト
- 通知設定(即時/ダイジェスト、サイレント時間、レート上限)
- 通知履歴(直近100件)
- アカウント設定/退会
- UX
- 日本語UI、タイムゾーンJST表示
- 入力バリデーション、エラーの日本語メッセージ
- モバイル最適化(レスポンシブ)
### 8.7 管理・運用機能(管理者)
- ユーザ検索、連携状態確認、強制連携解除
- スクレイピングジョブの状態確認・再実行
- 重要メトリクスの可視化(収集成功率、通知件数、遅延、失敗率)
- 監査ログ閲覧(閲覧制御付き)
- メンテナンスモード切替・告知
## 9. 非機能要件
### 9.1 性能
- 通知レイテンシ: 平均10分以内、95パーセンタイル15分以内
- スループット: 同時1万ユーザ・1分間に最大5,000件のマッチ処理を想定(初期)
- Web応答時間: p95 < 500ms(静的配信除く)
### 9.2 可用性・信頼性
- 稼働率99.5%以上
- 重要キューは少なくとも1回配信保証、重複送信に対する冪等処理
- バックアップ: DB日次スナップショット、保持30日
- フェイルセーフ: スクレイピング停止時はユーザへステータス通知(任意)
### 9.3 セキュリティ
- OWASP ASVS相当のWebアプリセキュリティ対策
- 通信のTLS化、静止データの暗号化
- 機密情報(LINEチャネルシークレット等)はSecrets管理
- RBAC(管理者/一般)
- 入力のサニタイズ、CSRF/XSS/SQLi(NoSQLi)対策
- 監査ログ(重要操作、認証、権限変更)
### 9.4 プライバシー・法令
- 個人情報(メール、LINE ID等)の最小化収集
- プライバシーポリシー、利用規約の整備
- APPI(個人情報保護法)に準拠、ユーザデータの開示/削除に対応
- ココナラ/LINEの利用規約・robots.txt遵守。禁止事項に該当する場合は機能停止/仕様変更を行う
### 9.5 運用・監視
- ログ集中管理(収集、解析、保存期間90日)
- メトリクス監視(CPU/メモリ、ジョブ成功率、スクレイピング遅延、通知失敗率、429発生率)
- アラート(閾値超過・連続失敗)
- リリース/ロールバック手順、メンテナンス告知
### 9.6 互換性・拡張性
- ブラウザ対応: 最新のChrome/Edge/Safari/Firefoxの現行-1
- マイクロサービス/サーバレスを許容する疎結合設計
- データスキーマは将来拡張を想定(バージョニング)
## 10. データ要件
### 10.1 ストレージ(非リレーショナルDB)
- 種別: ドキュメント/Key-Value型(例: DynamoDB、Firestore、MongoDB いずれか)
- 理由: 柔軟なスキーマ、スケール容易、クエリ要件が限定的
### 10.2 主要コレクション/項目(例)
- users
- userId, email, passwordHash, emailVerified, lineUserId, notifyPrefs, createdAt, deletedAt
- keywords
- keywordId, userId, pattern, matchMode, fields, excludes, filters, createdAt, enabled
- listings
- listingId, source, url, title, body, category, tags, price, postedAt, updatedAt, contentHash, fetchedAt, status
- matches
- matchId, userId, listingId, keywordId, matchedAt
- notifications
- notificationId, userId, listingId, keywordId, channel, status, sentAt, retries
### 10.3 データ保持
- listings: 90日保持(初期)、アーカイブ可
- notifications/matches: 180日保持(初期)
- 退会時: ユーザ関連データを消去(法的要件を除く)
## 11. 外部連携要件
### 11.1 LINE
- Messaging APIの利用(Bot運用)
- 必須設定: チャネルID/シークレット、Webhook受信、署名検証
- レート制限・料金体系を考慮した送信制御
### 11.2 ココナラ
- 公開Webページの取得のみ
- robots.txtと利用規約の遵守
- 過負荷防止のためのアクセス制御(間隔、総量制限)
- HTML/CSS変更に備えた抽象化(セレクタ定義を外部化/設定管理)
## 12. API要件(内部/外部)
- 認証系
- POST /auth/signup, /auth/login, /auth/logout, /auth/password/reset
- ユーザ設定
- GET/PUT /me, GET/PUT /me/notify-prefs
- キーワード
- GET/POST/PUT/DELETE /keywords
- POST /keywords/test
- 通知履歴
- GET /notifications?limit=…&since=…
- 管理
- GET /admin/health, /admin/jobs, /admin/users/:id
認可: ユーザ所有リソースのみアクセス可。管理APIは管理者のみ。
## 13. UI要件(概要)
- ダッシュボード: 連携状態、最新マッチ、システム告知
- キーワード編集: 追加/削除/並び替え、マッチ方式、除外語、対象フィールド
- 通知設定: 即時/ダイジェスト、時間帯、レート上限、プレビュー
- 履歴: 件名、要約、リンク、送信時刻、重複抑止表示
- アクセシビリティ: キーボード操作、コントラスト比の配慮
## 14. 品質保証
- テスト
- 単体/結合/E2E(主要フロー:連携→登録→マッチ→通知)
- スクレイピング回帰テスト(HTMLモック/スナップショット)
- 負荷試験(スクレイピング/通知キュー)
- コード品質: 静的解析、Lint、依存脆弱性診断
- セキュリティ診断: 脆弱性スキャン、ペネトレーションテスト(任意)
## 15. デプロイ/運用
- CI/CD: 自動ビルド、ステージングでの検証後プロダクションへデプロイ
- コンテナ化またはサーバレス運用
- スケジューラ: 定期ジョブ(例: Cloud Scheduler/Cron + ワーカー)
- 機密情報: マネージドSecrets
- ログ/メトリクス/アラート: マネージド監視基盤を利用
## 16. 制約・前提
- ココナラの仕様変更や規約変更により機能制限・停止の可能性
- 無断高頻度アクセスは禁止。負荷制御を厳格化
- 非リレーショナルDBを必須とする(要件)
- 初期ユーザ規模は数千人、今後の増加に対応できる設計
## 17. リスクと対応
- スクレイピングブロック/HTML変更
- 対応: セレクタ外部化、変更検知アラート、フェイルセーフ停止
- 過剰通知・スパム化
- 対応: レート制御、ダイジェスト、重複抑止、ユーザ側の粒度調整UI
- 法務・規約違反リスク
- 対応: 事前確認、アクセス頻度の制御、問い合わせ窓口整備、停止ポリシー
- LINEレート制限超過
- 対応: キュー平滑化、バックオフ、バッチ/ダイジェスト化
## 18. マイルストーン(例)
- M1 仕様確定/設計: 2週
- M2 スクレイパ基盤/DB/キュー: 3週
- M3 キーワード/マッチ/通知(即時): 3週
- M4 Web UI/連携/履歴: 3週
- M5 運用監視/セキュリティ/QA: 2週
- M6 パイロットリリース: 1週
- 合計目安: 14週
## 19. 簡易アーキテクチャ(テキスト)
- フロントエンド(SPA/SSR)→ バックエンドAPI(認証/CRUD/通知設定)
- スクレイピングワーカー(スケジュール実行)→ 非リレーショナルDBへ保存
- マッチングワーカー(新規/更新トリガ)→ 通知キュー → LINE送信ワーカー
- Webhook受信(LINE)→ アカウント連携/コマンド処理
- 監視/ログ/アラート基盤(横断)
## 20. 受け入れ基準(抜粋)
- ユーザがキーワードを登録し、該当募集が掲載された場合に10分以内でLINE通知されること
- 重複通知が発生しないこと(同一募集×同一キーワード×同一ユーザ)
- サイレント時間帯設定が有効であること
- 退会時にユーザデータとLINE連携が削除されること
- robots.txtと利用規約に反しないアクセス制御が有効であること
以上。
ChatGPT 5 Pro とChatGPT 5(標準)との比較
これら2つの中身の違いをChatGPT 5に分析させると下記のようになりました。
(生成AI ->)
両方とも同じシステム(ココナラ案件監視+LINE通知Bot)を目的としていますが、一つ目は包括的・分析的に全領域を網羅した「詳細型の要件定義」、二つ目は**開発フェーズ直前を意識した「整理・実装指向の要件定義」**です。
以下で構造別に比較します。
1. 目的・構成方針の違い
| 観点 | 一つ目(ココナラ案件通知 LINE Bot) | 二つ目(ココナラ募集監視 LINE 通知Bot) |
|---|---|---|
| 性格 | 網羅的・分析ドキュメント | 精選・設計直結ドキュメント |
| 構成 | 23章構成(目的〜KPI〜ロードマップ) | 20章構成(設計・開発直結) |
| 目的 | 機能仕様・法令・拡張性・運用まで包括的 | 実装要件と品質基準の明確化 |
| 想定読者 | 企画・法務・設計・運用を含む多部門 | 開発チーム中心(開発者・QA・運用者) |
| 文章トーン | 説明的・提案書寄り | 技術仕様・開発指示書寄り |
2. 機能要件の比較
| 項目 | 一つ目 | 二つ目 |
|---|---|---|
| 認証 | LINE Loginを中心(メール方式は補助) | メール+パスワードを主軸、LINE/Google拡張 |
| 通知モード | 即時/15〜60分ダイジェスト/静音時間帯/上限 | 即時+1日1回ダイジェスト、サイレント時間・レート上限 |
| マッチング | キーワード+カテゴリ・価格フィルタ、将来ML拡張 | キーワード+カテゴリ・価格・正規表現対応(実用化寄り) |
| スクレイピング | 頻度5〜15分、robots遵守、HTMLセレクタ外部化 | 5分周期、ジッター・サーキットブレーカ等を追加し堅牢化 |
| UI | ダッシュボード+設定中心 | 通知履歴・テストマッチ機能など追加的UI設計あり |
| 管理機能 | スクレイピング監視、URLテンプレ管理 | ジョブ再実行、RBAC、監査ログなどセキュリティ強化版 |
| 退会処理 | 関連データ削除、法令範囲内 | 削除+LINE連携解除明記 |
3. 非機能要件(NFR)の比較
| 分類 | 一つ目 | 二つ目 |
|---|---|---|
| 可用性 | 99.5%以上 | 同等 |
| 性能 | 通知遅延5分以内、1000通/分 | 遅延10分以内、5000マッチ/分(実用値想定) |
| スケーラビリティ | 水平拡張・10万ユーザ対応 | 1万ユーザ初期想定(段階的拡張) |
| セキュリティ | OWASP Top10、IAM権限最小化 | OWASP ASVS準拠、RBAC追加 |
| プライバシー | GDPR準拠・削除対応 | 個人情報保護法(APPI)準拠に明記変更 |
| 運用監視 | メトリクス・ログ統合、再実行機能 | メトリクス/429発生率監視など運用リアル化 |
| 可観測性 | 分散トレース・相関ID | ログ集中管理+閾値アラート中心 |
4. データ設計比較
観点 一つ目 二つ目
DB種別 Firestore/MongoDB/DynamoDB候補 同候補(明記形式はDynamoDB/Firestore)
データ構造 案件・キーワード・通知ログ・マッチ結果など詳細定義 users / keywords / listings / matches / notifications に簡潔統一
保持期間 案件180日、通知90日、スクレイプ30日 listings 90日、notifications 180日(逆転・整理)
インデックス設計 明示あり(降順索引) 簡略化(フィールド構造のみ)
➡ 二つ目は「設計書に転記しやすい形式」で整理。
5. アーキテクチャと運用比較
| 項目 | 一つ目 | 二つ目 |
|---|---|---|
| アーキテクチャ | 構成要素一覧+技術例(Node/Python) | テキスト形式の簡易構成図(フロー記述) |
| 実行環境 | サーバレス/コンテナ+Cron | 同等だが明確に「Cloud Scheduler/Cron」記載 |
| CI/CD | GitHub Actions+Terraform | CI/CD+ステージング検証を明記 |
| 監視 | Cloud Monitoring/Sentryなど | 監査ログとメンテナンスモード追加 |
| 法令対応 | robots.txt尊重+許諾対応 | ココナラ規約・robots.txt遵守+停止ポリシー明記 |
6. 品質保証・受入条件
| 観点 | 一つ目 | 二つ目 |
|---|---|---|
| テスト | 単体/結合/負荷/回帰 | 単体/結合/E2E+負荷・セキュリティ診断追加 |
| 受入条件 | 5分以内通知、除外/静音確認など | 10分以内通知、robots遵守、データ削除確認など |
| 成果指標 | CTR, 遅延中央値, 継続率 | KPI→受入基準へ転換(定量化) |
7. 総合評価(まとめ)
| 項目 | 一つ目 | 二つ目 |
|---|---|---|
| スコープの広さ | ◎ 非機能・運用・拡張まで網羅 | ○ 必要範囲に集約 |
| 実装の具体性 | ○ 概念中心 | ◎ 開発・実装直結の粒度 |
| リスク対応 | ◎ 詳細なリスト | ○ 要点を整理 |
| 運用視点 | ○ 技術スタックレベル | ◎ 実運用手順レベル |
| ドキュメント用途 | 提案書・企画・レビュー | 設計書・開発指示・QA |
結論
一つ目の要件定義書は、
- 全ステークホルダー向けに広範囲の要件を包括し、「戦略・方針・リスク・将来拡張」を重視
- 要件定義フェーズ〜PoC向き
二つ目の要件定義書は、
- 一つ目をベースにして開発実装に必要な要素を取捨選択し、設計/テスト/運用まで一貫した「開発チーム用仕様書」
- 設計レビュー・実装フェーズに最適
(<- 生成AI)
Pro 版の方が開発者目線よりもビジネス目線によっている感じです。
最序盤に検討する要件定義書の位置づけとしてはPro 版の方が良いのかもしれません。
ChatGPT 5 mini版の場合
恐らく内容のレベルが落ちるはずですが、どのくらい変わってくるのかを見てみます。
# 要件定義書 — ココナラ募集通知Bot(LINE通知)
作成日: 2025-11-06
作成者: 要件策定チーム
---
## 1. 概要(目的と背景)
ココナラ上で募集された案件の中から、ユーザが指定したキーワードに合致するものを検出し、LINEで通知するBotシステムを提供する。ユーザはブラウザ上の管理画面でキーワードや通知設定を管理できる。募集情報は定期的にスクレイピングしてNoSQLデータベースに蓄積・検索する。
目的:
- ユーザが関心ある案件を見逃さないように即時または定期的に通知する
- キーワードの柔軟な指定と管理をブラウザで簡易に行えるようにする
- スケーラブルで堅牢なデータ収集基盤を提供する
前提:
- ココナラに公式公開APIがない、もしくは利用制約があるためスクレイピングで情報取得する前提。ただし、スクレイピングは対象サイトの利用規約・robots.txt・法令を遵守すること。
---
## 2. 用語定義
- ユーザ:本サービスの登録者(案件通知を受ける者)
- キーワード:ユーザが登録する検索条件(文字列・正規表現等)
- 投稿(Post):ココナラ上の募集エントリ(案件)
- マッチ(Match):投稿がユーザのキーワードと一致した事象
- 通知:LINEを通じてユーザへ送信されるメッセージ
- Scraper:ココナラから情報を収集するプログラム
---
## 3. 範囲(スコープ)
MVP(最小実行可能製品)の想定機能:
- ユーザ登録 / ログイン(メール+パスワード、後にLINE Loginも検討)
- LINEアカウント(ユーザ)とサービスアカウントの連携
- キーワードのCRUD(追加・編集・削除)/キーワードごとのマッチ方式指定(部分一致/完全一致/正規表現)
- 定期スクレイピング(スケジューラ管理)
- NoSQL(例:MongoDB)での投稿保存・インデックス化
- マッチ検出ロジックと通知(即時通知、もしくはダイジェスト)
- マッチ履歴の参照(Web UI)
- 基本的な運用監視とログ(スクレイピング成功/失敗、通知送信結果)
将来的機能(フェーズ2以降):
- 有料プラン(通知頻度の拡張、複数キーワード上限拡張)
- 高度なフィルタ(カテゴリ、価格帯、出品者評価)
- 高可用性クラスタリング、水平スケーリング
- 管理者用ダッシュボード、利用統計、ユーザ管理
---
## 4. 機能要件(機能仕様)
### 4.1 ユーザ管理
- ユーザ登録
- 必須情報:メールアドレス、パスワード
- パスワードは bcrypt 等でハッシュ化して保存
- メール確認(オプションだが推奨)
- ログイン/ログアウト(セッション管理、JWT等を使用)
- アカウント編集(メール・パスワード変更、LINE連携解除)
- アカウント削除(データ消去ポリシーに従う)
### 4.2 LINE連携
- ユーザはサービスのLINE公式アカウントを「友だち追加」し、Web画面上でLINEアカウントと紐付ける(LINE LoginまたはLINEMessaging APIのLink機能)
- 通知はLINE Push Message(Messaging API)で配信
- ユーザが通知受信を拒否した場合の処理(配信停止、エラーハンドリング)
### 4.3 キーワード管理
- キーワードの追加・編集・削除
- キーワードあたり設定項目:
- マッチ方式:部分一致 / 完全一致 / 正規表現
- 有効/無効フラグ
- 通知モード:即時 / 定期ダイジェスト(日次/週次) / ミュート時間帯
- マッチ対象フィールド:タイトル / 本文 / カテゴリ / タグ
- 優先度(任意)
- キーワード上限(MVPは10件など、課金で拡張可)
### 4.4 投稿収集(スクレイピング)
- 取得項目(例):
- post_id(可能な場合はサイト上の一意ID)
- タイトル
- 本文(概要)
- URL(直接リンク)
- 作成日時 / 更新日時(検出できる場合)
- カテゴリ / タグ
- 価格情報(ある場合)
- 出品者ID / 名前(可能な範囲で)
- スクレイプ日時、取得元HTML(※生HTMLは必要に応じて保存)
- スクレイピングの周期(初期値、調整可能):
- 新着向け:10分間隔(※負荷・規約上の制約がある場合は延長)
- 深掘りクロール:1日1回全カテゴリ巡回
- 重複検出:
- URL/投稿ID をキーに重複排除
- 更新があれば updated_at を更新して差分検出
- フェイルオーバー・リトライ:
- 取得失敗時は指数バックオフでリトライ(最大N回)
- 大量エラー発生時はアラートを発報
- JSレンダリング対応:
- 必要に応じて headless browser(Playwright/Puppeteer)を用いる
- 逆ブロック対策:
- IPローテーション、リクエスト間隔のランダム化、User-Agentの適切な設定を実施
- ただし規約遵守が最優先
### 4.5 マッチングロジック
- 新規投稿/更新投稿がDBに格納されたタイミングで、該当するユーザキーワードと突合
- 突合アルゴリズム:
- 部分一致:大文字小文字の正規化(日本語は形態素解析を検討)
- 正規表現:ユーザ入力は事前に検証(計算量の大きい正規表現は制限)
- ストップワード処理や形態素解析(Mecabなど)を導入すると精度向上
- マッチ条件に合致したら Match レコードを作成し、通知キューへ登録
- マッチ重複制御:
- 同一ユーザ・同一投稿に対して既に通知済みなら再通知しない(例:30日内は再通知抑止)
### 4.6 通知
- 通知モード:
- 即時通知:マッチ発生から遅延最小でLINEへPush
- ダイジェスト:日次/週次でまとめて送信
- 通知内容(テンプレート):
- タイトル、抜粋、マッチしたキーワード、カテゴリ、価格(あれば)、投稿URL(Deep link)
- 例:"[ココナラ] 新着案件: 【ロゴ制作】 — キーワード: ロゴ デザイン — 価格: 10,000円 — 詳細: https://coconala... "
- 通知頻度制御(スラッシング防止):
- 同一時間帯に大量通知が発生する場合はバッチ化
- ユーザ単位の1時間上限などを設定可能
- 配信確認:
- LINE APIのレスポンスを保存し、失敗時はリトライまたは管理者通知
### 4.7 UI(ブラウザ)
主要ページ:
- ダッシュボード(最近のマッチ、未読通知数、統計)
- キーワード管理(一覧、作成フォーム、編集)
- 検索/投稿一覧(スクレイプした投稿を参照、フィルタ)
- 通知設定(モード、時間帯制御)
- アカウント設定(LINE連携、メール、パスワード)
- ヘルプ / 利用規約 / プライバシーポリシー
基本的なUX要件:
- レスポンシブ(スマホ/PC対応)
- 操作ログ出力(ユーザ操作の監査に利用可能)
---
## 5. 非機能要件
### 5.1 性能・可用性
- 可用性: 本番稼働時 99%(SLAは将来的に明確化)
- レイテンシ:
- 即時通知の送信遅延目標: マッチ検出後5分以内にLINE配信
- スケーラビリティ:
- スクレイピングはジョブ分散可能な設計(ジョブキュー化)
- DBはシャーディング/レプリケーションを想定(MongoDB Atlas等)
### 5.2 信頼性・保守性
- ログと監視:スクレイプ成功率、通知配信成功率、アプリエラーを監視
- 障害時アラート:PagerDuty/Slack等へ通知
- バックアップ:DBは日次バックアップ、保存期間(例:30日)
### 5.3 セキュリティ
- 通信はTLS(HTTPS)必須
- パスワードは安全なハッシュ(bcrypt)
- APIは認証(JWT)と権限チェック
- ユーザ入力(特に正規表現)はサニタイズと実行時間制限を付与
- 秘匿情報(LINEチャネルアクセストークン等)はSecrets Managerで管理
- 個人情報保護方針と削除ポリシーを整備
### 5.4 法令・倫理・利用規約
- スクレイピング対象のrobots.txt、利用規約を確認し、違反しないこと
- 必要に応じてココナラ側に許可を得る(API提供の有無確認)
- プライバシーポリシー・利用規約を作成し、ユーザに提示する
### 5.5 保持期間・データ削除
- 投稿データ:1年保持(要件により調整可)
- ユーザ削除時:関連データの削除方針を策定(GDPR等の準拠を考慮)
---
## 6. データ設計(概念スキーマ)
- User
- user_id (UUID)
- email
- password_hash
- line_user_id (nullable)
- line_linked (bool)
- created_at, updated_at
- notification_preferences (即時/日次等)
- Keyword
- keyword_id
- user_id
- keyword_text
- match_type (partial|exact|regex)
- target_fields (title, body, category)
- active (bool)
- created_at, updated_at
- Post
- post_id (サイト上のID or hash(url))
- url
- title
- body
- category
- price
- author_id
- created_at (投稿日時)
- scraped_at
- raw_html (optional/size-limited)
- Match
- match_id
- user_id
- keyword_id
- post_id
- matched_text
- notified (bool)
- notified_at
- created_at
- NotificationLog
- notification_id
- user_id
- payload
- status (sent|failed)
- response
- created_at
DB候補: MongoDB(NoSQL要件を満たす理由で推奨)。Redisはキューメカニズム・キャッシュに利用。
---
## 7. API設計(概要)
REST API(HTTPS)を想定。主要エンドポイント例:
- POST /api/register
- POST /api/login
- GET /api/user/me
- POST /api/keywords
- GET /api/keywords
- PUT /api/keywords/{id}
- DELETE /api/keywords/{id}
- GET /api/posts?filter=...
- GET /api/matches?user_id=...
- POST /api/line/link (LINE連携用のコールバック/コネクト)
- POST /webhook/line (LINEメッセージ受信用)
- POST /admin/scrape/run (管理者用スクレイプ制御)
認証: Bearer JWT。重要操作は権限確認。
---
## 8. 運用・監視・ログ
- 監視項目:
- スクレイピングジョブの成功率、平均所要時間
- 通知送信成功率(LINE APIレスポンス)
- APIのエラーレート
- DB容量、クエリ遅延
- ログ:
- 取得ログ(target URL, status, latency)
- マッチイベントログ
- 通知送信ログ(レスポンスコード・エラー)
- アラート:
- スクレイプ失敗率が閾値超過
- 通知API連続失敗
- DB接続異常
- 運用ダッシュボード:Grafana等で表示
---
## 9. テスト計画
- 単体テスト:API、スクレイパーモジュール、マッチロジック
- 結合テスト:スクレイパー→DB→マッチ→通知フロー
- E2Eテスト:ブラウザUI操作の自動テスト(Selenium等)
- 負荷テスト:同時スクレイプジョブ、通知バースト時の送信検証
- セキュリティテスト:脆弱性スキャン、入力検証の確認
受入基準(例):
- 新規キーワードを登録し、スクレイピングにより該当投稿があれば10分以内にLINE通知が到着すること(即時設定時)
- 同一投稿に対して同一ユーザに2回以上通知しないこと(30日以内)
- スクレイピング成功率が1日あたり95%以上
---
## 10. 法務・コンプライアンス
- スクレイピング対象サイトの利用規約・robots.txtの遵守を最優先
- プライバシーポリシーを整備し、ユーザデータの取り扱いを明確化
- LINEプラットフォーム利用規約に準拠する(Push通知の同意取得など)
- 必要に応じて法務相談を行い、ココナラ運営への問い合わせ・許諾取得を検討
---
## 11. セキュリティ上の注意点(詳細)
- 正規表現の無制限実行を防ぐためタイムアウト・文字数上限を設ける
- DBに保存するraw_htmlはサイズ制限し、XSS被害を防ぐためWeb表示時にサニタイズする
- APIのレート制限を実装(IP単位・ユーザ単位)
- LINEアクセストークンの流出防止(アクセス制御・Vaultで保護)
---
## 12. 実装技術案(推奨スタック)
- バックエンド:Python (FastAPI) または Node.js (Express/NestJS)
- スクレイピング:Scrapy + Playwright/Puppeteer(JSレンダリングが必要な場合)
- DB:MongoDB(Atlas) / Redis(キュー・キャッシュ)
- キュー:RabbitMQ / Redis Streams / Celery(Python)
- LINE連携:LINE Messaging API(Webhook + Push API)
- フロントエンド:React / Vue(SPA)
- デプロイ:Docker + Kubernetes(GKE/EKS/ECS)
- CI/CD:GitHub Actions / GitLab CI
- 監視:Prometheus + Grafana、ログはELKスタック(Elasticsearch, Logstash, Kibana)
- シークレット管理:AWS Secrets Manager / GCP Secret Manager
---
## 13. 開発スケジュール(概算)
フェーズ0(設計): 2週間
フェーズ1(MVP実装: 基本ユーザ管理、キーワード管理、スクレイパー、通知): 6–8週間
フェーズ2(UI改善、運用監視、法的整備、テスト): 4週間
ローンチ準備+リリース: 2週間
合計(MVPローンチまで): 約14–16週間(リソースや優先度により変動)
---
## 14. リスクと対策
- サイト側ブロック・規約変更
- 対策:定期的な利用規約チェック、API提供の有無確認、連絡窓口を確保
- 通知の過剰送信によるユーザ離脱
- 対策:ユーザ側の通知設定強化、ダイジェスト機能、頻度制御
- 正規表現等による過負荷
- 対策:正規表現の制限、入力バリデーション、計算量上限
- LINE APIのレート制限
- 対策:通知キューとスロットリング実装、バッチ送信
---
## 15. 付録
### A. サンプル通知テンプレート(即時)
[ココナラ] 新着案件が見つかりました!
タイトル: ロゴデザイン依頼
抜粋: シンプルでモダンなロゴを希望します...
キーワード: ロゴ
価格: 10,000円
詳細: https://coconala.jp/requests/xxxxx
### B. マッチ発生時フロー(シーケンス)
1. Scraper が投稿を取得 → DBに upsert(post_id/url をキー)
2. Postの upsert 時にマッチングジョブをトリガー
3. マッチが検出され Match レコードを作成
4. 通知キューへPush(即時/ダイジェストの判定)
5. 通知配信ワーカーがLINE Messaging APIへ送信
6. 送信結果を NotificationLog に保存。失敗時は再試行/管理者通知
---
必要であれば、以下の追加を作成します:
- 詳細なAPI仕様書(各エンドポイントのリクエスト/レスポンス定義)
- DBスキーマ定義(Mongoコレクションの具体構造)
- フロントエンド画面ワイヤーフレーム(各画面のモック)
- スクレイピング設計書(対象ページごとの取得要件・セレクタ設計)
- テストケース一覧(受入テスト仕様)
どれを優先して作成しますか?
ChatGPT 5 版とChatGPT 5 mini 版との違い
ChatGPT 5 に違いを分析させると下記のようになりました。
mini 版の方が要件定義書であるにもかかわらず実装寄りに近い内容となってる?
要件定義書なので、実装に入る前の方針に抜け漏れのない方が良いですね。
| 観点 | ChatGPT 5 版 | ChatGPT 5 mini 版 |
|---|---|---|
| 位置づけ | 要件定義フェーズの正式文書 | 設計移行フェーズの実装仕様書 |
| 粒度 | 機能・非機能・リスクを網羅的 | 実現手段・技術・スキーマまで具体化 |
| 目的 | 合意形成・範囲定義 | 実装準備・開発ガイド |
| 想定読者 | PM・法務・顧客・開発リーダ | 開発チーム(実装者・SRE・QA) |
| 文書構成 | 標準的UML風章立て | 技術仕様書スタイル(API・DB・CI/CD明記) |
| スタイル | フォーマル(条項整理型) | 実践的・工学的(コード設計に直結) |
ChatGPT 5 nano版の場合
最後にnano 版を試してみます。正直なところ、こちらも決して悪い内容ではないです。
「以下は、」のあたりは要件定義書本体に不要な部分なので、手作業で取り除くことになるでしょう。
以下は、要件案をベースに不足部分を補完した要件定義書(Markdown形式)です。
# 要件定義書(案)- ココナラ求人監視Bot with LINE通知
作成日: 2025-11-06
著者: 要件策定者
---
## 1. 目的・背景
- 目的: ココナラに新規で募集が出た場合、ユーザーが設定したキーワードに該当し、LINEへ通知するBotを提供する。
- 背景: 在宅ワークや副業機会を逃さず取得したいユーザーのニーズに対し、手動での情報収集を自動化することで作業効率を高める。
- 想定ユーザー: ココナラの個人または法人アカウントを利用し、自身の興味領域に合致する案件情報を即時取得したい人。
---
## 2. 用語の定義
- ココナラ: 日本語のクラウドソーシングサービス。「募集情報」や「案件案件」を指す。
- キーワード: ユーザーが求人情報と一致判定を行うために登録する語句(例: 「Unity」「ゲームエンジン」「3Dモデル開発」)。
- LINE通知: LINE公式アプリへメッセージを送信する通知機能。LINE Notify または LINE Messaging API を用いる。
- スクレイピング: 公開されているココナラの募集情報ページを定期的に取得し、データを抽出する行為。
- 非リレーショナルDB: MongoDB、DynamoDBなどのスキーマレス/ドキュメント指向データベースを指す。
- ユーザーアカウント: Web UIへログインし、キーワード管理・設定を行うための認証済みアカウント。
---
## 3. システム概要・前提
- 構成概略:
- フロントエンド: Webブラウザ用UI(キーワード管理、設定、通知履歴確認)。
- バックエンド: APIサーバ(認証・CRUD、スケジューリング、マッチング、通知処理)。
- スクレイパー: ココナラの募集情報を定期的に取得・抽出。
- データベース: 非リレーショナルDB(ユーザー、キーワード、募集情報、通知履歴などの保存)。
- 通知連携: LINE Notify/LINE Messaging APIによりLINEへ通知。
- ユーザーのLINE通知は、各ユーザーがLINEアカウントと連携させる形で実現する。連携時に取得したアクセストークンを安全に保管する。
- 法的/利用規約上の留意点: スクレイピングは対象サイトの規約・robots.txtを遵守すること。実装時には公式APIの利用可能性も検討する。適切なインターバル・リクエスト間隔を設け、過負荷を回避する。
---
## 4. 受け入れ範囲・前提条件
- 受け入れ範囲:
- ユーザー登録・認証(メール/パスワード、あるいはOAuthベースの認証)とセッション管理
- キーワードの登録・編集・削除
- ココナラの募集情報の定期スクレイピング(推奨間隔: 15〜30分)
- 新着かつキーワード一致の求人情報を検知し、LINEへ通知
- 通知履歴の閲覧と再通知の抑制(既読/未読、重複通知の回避)
- 管理者用の監視・ログ閲覧機能(任意)
- 前提条件:
- 各ユーザーはLINE Notify経由の通知許可を提供すること
- スクレイピング対象のページ構造が変更された場合、解析ロジックをアップデートすること
- Stripe/決済は初期段階では未対応(無料プラン/試用は検討可能)
---
## 5. 機能要件
### 5.1 ユーザー管理
- ユーザー登録・認証
- メールアドレス/パスワード、またはOAuthベースの認証をサポート
- パスワードはハッシュ化して保存(例: bcrypt、Argon2)
- セッション/トークンの有効期限・リフレッシュ機構
- LINE連携設定
- ユーザーがLINE NotifyまたはLINE Messaging APIの権限を承認して通知先を設定
- アクセストークンの安全な保存(暗号化・アクセス制御)
- LINE通知の停止・再開の切替え
### 5.2 キーワード管理
- CRUD機能
- キーワードの作成、編集、削除、重複チェック
- キーワードのカテゴリ/重み付け(任意)を設定可能
- キーワードバリデーション
- 空白文字・禁止文字の検知
- 文字数制限の適用
### 5.3 スクレイピング・データ蓄積
- スクレイピングスケジュール
- 定期実行(例: 15〜30分間隔)で募集情報を取得
- ページ構造変更時のフォールバック機構
- データ抽出・正規化
- 募集ID、タイトル、概要、応募条件、報酬、掲載日、URL、出品者情報などを抽出
- 重複排除: 取得済みの求人IDをキーとして新規性を判定
- 非リレーショナルDBへの格納
- 募集情報をドキュメント形式で保存
- ユーザーとキーワードの紐付け情報、取得時刻を保持
- データ整合性
- 取得失敗時のリトライポリシー、エラーログの蓄積
### 5.4 マッチングと通知
- マッチング条件
- 新規求人がユーザーが登録した少なくとも1件以上のキーワードと一致する場合に通知対象とする
- キーワードの前方一致/部分一致/正規表現等の高度マッチングは将来機能として拡張可能
- 通知送信
- LINE Notify/LINE Messaging APIを用いて通知
- 通知内容例: タイトル、URL、応募要件/報酬、掲載日、マッチ理由
- 通知の重複回避・抑制
- 通知履歴
- 各通知のステータス(配信済み・失敗・スキップ)を記録
- ユーザー毎の通知履歴閲覧機能
### 5.5 管理機能(任意)
- アプリ監視ダッシュボード
- スクレイパーの実行状況、失敗件数、レート制限状況の表示
- ログ閲覧・設定変更
- 設定変更履歴の追跡
---
## 6. 非機能要件
### 6.1 パフォーマンス
- スクレイピングは分散/並列処理を検討(同一IPの制限に配慮)
- 1ユーザーあたりの通知キューは遅延を最小化(目標: 受信後30秒以内〜数分程度の遅延)
### 6.2 可用性・信頼性
- 99.9%以上のアップタイムを目標
- レート制限・バックオフを実装してサイト負荷を低減
### 6.3 セキュリティ
- 通信はTLSを使用
- パスワードはハッシュ化して保存、メール確認・再設定フローを提供
- アクセストークン(LINE連携情報)は暗号化ストレージで保護
- 機密データの権限管理(最小権限原則)
- 入力値検証、CSRF対策、セキュアなセッション管理
### 6.4 可観測性
- ログ、メトリクス、アラートの収集・可視化
- 脆弱性・監査ログの保持期間を定義
### 6.5 拡張性・保守性
- マイクロサービス設計またはモジュール設計推奨
- API仕様は後方互換性を考慮して変更
---
## 7. データモデル概要(主要エンティティ)
- ユーザー(User)
- user_id (PK)
- email
- password_hash
- created_at
- last_login
- line_notify_token_encrypted
- line_linked (bool)
- キーワード(Keyword)
- keyword_id (PK)
- user_id (FK)
- text
- category (任意)
- weight (任意)
- created_at
- updated_at
- 募集情報(JobAd)
- job_id (PK, external_idとして使用)
- title
- summary
- url
- employer
- rewards
- posted_at
- scraped_at
- keywords_matched: [keyword_id]
- 通知履歴(NotificationLog)
- log_id (PK)
- user_id (FK)
- job_id (FK)
- notified_at
- status (sent / failed / skipped)
- error_message (optional)
- 設定(Settings)
- user_id (FK)
- scrape_interval_minutes
- notification_enabled (bool)
- last_scraped_at
---
## 8. 外部インターフェース/連携仕様
- ココナラスクレイピングAPI(内部実装)
- エンドポイント:内部スケジュールジョブで呼び出し
- 入力/出力:なし/抽出データ
- 認証:サービス間認証(内部)
- 注意点:robots.txt遵守、アクセス間隔遵守、ページ構造変更対応
- LINE通知連携
- LINE Notify API(推奨)または LINE Messaging API
- ユーザーごとにLINEアクセストークンを保存
- API呼出し形式: POST https://notify-api.line.me/api/notify
- ヘッダー: Authorization: Bearer {token}
- ボディ: message=<通知文>&stickerPackageId=<optional>
- 失敗時のリトライポリシーを設定
- 認証・認可
- JWT または OAuth 2.0を採用(セッション管理含む)
- APIゲートウェイ経由の認証・認可
---
## 9. ユーザーインターフェース要件(UI/UX)
- ダッシュボード
- 近況サマリー(最新のマッチ件数、未読通知数)
- キーワード管理への遷移リンク
- スクレイピング設定の表示
- キーワード管理画面
- 新規作成・編集・削除
- キーワードの一覧表示、検索、フィルタ
- 通知履歴画面
- 各通知の日時・求人タイトル・URL・ステータス表示
- 再通知の有無・再送機能(任意)
- 設定画面
- スクレイピング間隔の設定
- LINE連携の状態表示/再リンク
- レスポンシブ対応
- PC/タブレット/スマートフォンでの閲覧を想定
---
## 10. セキュリティ・プライバシー対策
- データ保護
- 暗号化: at rest/ transit
- Token/Secretの安全保存(KMS/Vault等の利用を検討)
- 認証
- 強力なパスワードポリシー
- セッション管理(セキュア属性・HttpOnly・同時セッション数制限)
- アクセス監査
- 重要操作の監査ログを保存
- LINE連携
- ユーザーがLINEアカウントを明示的に許可した場合のみ通知
- 法令順守
- 日本の個人情報保護法・関連法規の遵守
- データ最小化・必要最小限のデータ保持
---
## 11. 品質保証・テスト計画
- テストタイプ
- 単体テスト、結合テスト、統合テスト、E2Eテスト
- スクレイパの健全性テスト(HTML構造変化時の回復性)
- 負荷・ストレステスト(同時通知件数、キーワード数の増大時の挙動)
- テストケース例
- 新規ユーザー登録後、キーワード追加が正しく反映される
- 新規求人がキーワードと一致し、LINEへ通知される
- 通知履歴が正しく記録され、再通知設定が機能する
- キーワードの重複登録が拒否される
- 受け入れ基準
- KPI達成: 通知遅延時間、誤検知率、通知成功率
- セキュリティ要件クリア(SQL/NoSQLインジェクション等の脆弱性がないこと)
---
## 12. デプロイ・運用計画
- デプロイ戦略
- CI/CDパイプラインを構築(PR→ビルド→テスト→デプロイ)
- ステージング環境と本番環境を分離
- 実行環境
- クラウドサービス(例: AWS/Azure/GCP)を想定
- コンテナ化(Docker)+オーケストレーション(Kubernetes/ ECS)を検討
- モニタリング
- アプリケーション監視(エラーログ、レスポンス時間、スループット)
- スクレイパー稼働状況のライブモニタリング
- バックアップ/リカバリ
- データバックアップの定期実施、リストア手順の整備
---
## 13. リスクと対策
- リスク: ココナラのページ構造変更によるスクレイピングの破損
- 対策: 監視と自動アラート、柔軟なパーシングロジック、変更検知
- リスク: LINE連携の権限喪失・トークン失効
- 対策: トークンの有効性検証と再認証フロー実装
- リスク: 法的問題(スクレイピングの規約違反)
- 対策: 利用規約の遵守、必要に応じて公式APIの利用検討
---
## 14. 未来展望(拡張性の提案)
- 高度マッチング機能
- 正規表現・ベクトル検索・機械学習によるスコアリング
- 複数求人サイト対応
- ニュースレター型通知の追加
- 通知チャネルの拡張
- Slack/Discordメール等への通知対応
- 料金プラン連携
- 有料キーワード・追加通知枠の提供(ビジネスモデルの検討)
---
## 15. 受け渡し時の成果物一覧
- 要件定義書(本ドキュメント)
- アーキテクチャ図(レイヤー構成図、データフロー図)※本回答ではテキスト記述
- データモデル定義書(エンティティ・属性一覧)
- API仕様(必要時)
- テスト計画書・受入基準
- デプロイ手順書(CI/CD設定例)
---
もし追加で希望するフォーマット(例: ULM/PlantUML図、API仕様をOpenAPI形式で出力、ER図サンプル等)があれば教えてください。具体的なスキーマやサンプルAPIエンドポイント、データマッピング例などを別ドキュメントとして追記します。
ChatGPT 5 mini 版とChatGPT 5 nano 版との違い
mini よりもnano の方がさらに開発寄りになるのかと思ったら違いました。。。
| 項目 | ChatGPT 5 mini 版 | ChatGPT 5 nano 版 |
|---|---|---|
| 性格 | 技術仕様書/開発チーム向け | 上流要件定義/PM・顧客向け |
| 目的 | 実装に必要な要件・構造の網羅 | システムの目的・範囲・受入基準の明確化 |
| レベル | 詳細設計寄り(準設計書) | 要件整理・合意形成段階 |
| 対象者 | エンジニア・開発リーダ | PM・顧客・企画担当 |
| 強み | 技術詳細・再現性 | 俯瞰構造・柔軟性 |
| 弱み | 文量多・上位者に説明しづらい | 実装者にとって情報不足 |
| 統合方向 | 「開発仕様書」へ直結できる | 「提案書」や「上位要件」フェーズで活用 |
感想
今回はプロンプト側でどのような要件定義書にすべきかを詳しく書いていなかったので、内容のブレが大きかったかもしれません。
今回生成した4つの要件定義書を、どのモデルで生成したものかわからないようにして要件定義担当者に比較してもらうともっと本格的な比較ができそう。
モデルをランダム順に選択して要件定義書を4つ生成して、まずは自分で比較してみます(そのうち)。