Autogenを使用した要件定義の作成 Part2

# はじめに
[前回の記事](https://qiita.com/mkuwan/items/643aa29bc3e6623943f2)でMicrosoftのAutogenを使用した要件定義作成の例を示しましたが、プロンプト作成や、長文をやりくりする手法の一例を追加したので、改めて記事とさせていただきます。
こんなのが出力されるものを実装しています。
![ListBoxDataTrigger2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/0a718f41-1205-efd2-5e2a-61f48d5751fa.gif)
今回目標としたのは以下の2点です
- プロンプトをパラメータを加えて指示内容が変化するような関数を作成してみたこと
- LLMのトークンオーバーへの対策

まだまだ自分も勉強中なので、こんなことしなくても、別のやりかたあるよ、なんてこともあるとは思いますので、良い案をお持ちの方は教えていただけると幸いです。
あと出力例はとても長くなってしまうので、折りたたんでいます。必要に応じて展開してご覧ください。

# 環境
- Windows11
- GPU RTX4070TiSuper
- LLM: [LM Studio](https://lmstudio.ai/)を利用しています
- Model: Mistral Nemmo Instruct 2407, コンテキスト長を8000にして読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/c6304ce1-0ea5-53a2-746e-ffc8d973bca6.png)
- UI: Streamlitを使用

## 設定
### LM Studioとの接続用の設定
例として二つのモデルを記載しています。
llama3.1は localhost:11434/v1 となっていてollamaと接続する場合です。
今回はLM Studioと接続するためlocalhost:1234/v1を使用します。
```json
[
    {
        "model": "llama3.1",
        "base_url": "http://localhost:11434/v1",
        "api_key": "ollama"
    },
    {
        "model": "mistral-nemo-instruct-2407",
        "base_url": "http://localhost:1234/v1",
        "api_key": "lm-studio"
    }
]
```

### 要件定義書作成項目設定
要件定義書を作成するためには、様々な項目がありますが、それらを選択して必要なものを作れる方がよいかと思いました。
pythonでハードコーディングするのもありですが、定義ファイルを読み込んで画面に表示させるのもありかと思って作成しました。(ただ抽象化するために結果としてはコードがとても長くなってしまいます)
```json
{
  "requirements": [
    {
      "title": "プロジェクト概要",
      "title_index": "01",
      "items": [
        {"subject": "目的", "subject_index": "01"},
        {"subject": "範囲", "subject_index": "02"},
        {"subject": "前提条件", "subject_index": "03"},
        {"subject": "アプローチ", "subject_index": "04"},
        {"subject": "スコープ", "subject_index": "05"},
        {"subject": "成果物", "subject_index": "06"},
        {"subject": "リスク", "subject_index": "07"},
        {"subject": "課題", "subject_index": "08"},
        {"subject": "システム構成図", "subject_index": "09"}
      ]
    },
    {
      "title": "機能要件",
      "title_index": "02",
      "items": [
        {"subject": "システム機能の一覧", "subject_index": "01"},
        {"subject": "ユースケース", "subject_index": "02"},
        {"subject": "画面・ユーザーインターフェース", "subject_index": "03"},
        {"subject": "帳票", "subject_index": "04"},
        {"subject": "情報・データ", "subject_index": "05"},
        {"subject": "外部インターフェース", "subject_index": "06"},
        {"subject": "制約事項", "subject_index": "07"}
      ]
    },
    {
      "title": "データ要件",
      "title_index": "03",
      "items": [
        {"subject": "データベース要件一覧", "subject_index": "01"},
        {"subject": "データモデル", "subject_index": "02"},
        {"subject": "データフロー", "subject_index": "03"},
        {"subject": "データの保存", "subject_index": "04"},
        {"subject": "データの保護", "subject_index": "05"},
        {"subject": "データの品質", "subject_index": "06"},
        {"subject": "データセキュリティ", "subject_index": "07"}
      ]
    },
    {
      "title": "非機能要件",
      "title_index": "04",
      "items": [
        {"subject": "性能", "subject_index": "01"},
        {"subject": "信頼性", "subject_index": "02"},
        {"subject": "セキュリティ", "subject_index": "03"},
        {"subject": "保守性", "subject_index": "04"},
        {"subject": "運用性", "subject_index": "05"},
        {"subject": "拡張性", "subject_index": "06"},
        {"subject": "移行性", "subject_index": "07"},
        {"subject": "可用性", "subject_index": "08"},
        {"subject": "システムの冗長性・耐障害性", "subject_index": "09"}
      ]
    },
    {
      "title": "制約条件",
      "title_index": "05",
      "items": [
        {"subject": "予算", "subject_index": "01"},
        {"subject": "スケジュール", "subject_index": "02"},
        {"subject": "リソース", "subject_index": "03"},
        {"subject": "技術", "subject_index": "04"},
        {"subject": "法規制", "subject_index": "05"}
      ]
    },
    {
      "title": "リスク管理",
      "title_index": "06",
      "items": [
        {"subject": "リスク一覧", "subject_index": "01"},
        {"subject": "リスクの定義", "subject_index": "02"},
        {"subject": "リスクの評価", "subject_index": "03"},
        {"subject": "リスクの対応", "subject_index": "04"},
        {"subject": "リスクの監視", "subject_index": "05"},
        {"subject": "リスクの報告", "subject_index": "06"}
      ]
    },
    {
      "title": "テスト計画",
      "title_index": "07",
      "items": [
        {"subject": "テストの範囲", "subject_index": "01"},
        {"subject": "テストの種類", "subject_index": "02"},
        {"subject": "テストの項目", "subject_index": "03"},
        {"subject": "テストの方法", "subject_index": "04"},
        {"subject": "テストのスケジュール", "subject_index": "05"},
        {"subject": "テストの報告", "subject_index": "06"}
      ]
    },
    {
      "title": "運用と保守",
      "title_index": "10",
      "items": [
        {"subject": "運用計画", "subject_index": "01"},
        {"subject": "保守計画", "subject_index": "02"},
        {"subject": "サポート体制", "subject_index": "03"}
      ]
    }
  ]
}
```

# 画面構成
## RequirementDocumentItems.jsonを読み込み
Streamlitでの画面サンプル
- 要件定義概要を入力し、作成したい項目を選択していく感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/67b3b83e-678a-536b-e011-9bdc18eaa33c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/cf3ef15b-deb4-4ccb-c945-7ae50a9c5192.png)

## JSONを読み込んで表示させるためのコード
LLMの設定読み込み
stream: Trueについて
autogenでstream表示するのは難易度が高いみたいなので実装はしていませんが、コンソール部分のみstream表示されます。
```python
# LLMの設定
config_list = autogen.config_list_from_json(
    env_or_file="pages/LLM_CONFIG_LIST.json",
)

filter_mistral = {"model": ["mistral-nemo-instruct-2407"]}

llm_config = {
    "cache_seed": None,
    "temperature": 0,
    "config_list": autogen.filter_config(config_list, filter_mistral),
    "timeout": 600,
    "price": [0, 0],
    "stream": True,
}
```
要件定義作成項目用jsonファイルの読み込み
```python
# RequirementDocumentItems.jsonのデータを読み込む
with open('pages/RequirementDocumentItems.json', 'r', encoding='utf-8') as f:
    requirement_document_items = json.load(f).get('requirements')
```

JSONから先ほどの画面が生成させるコード
とても長くなってしまうので中略しています
```python
# 要件定義書の作成項目をJSONファイルから読み込んで表示させます
# とりあえず、件数としては最大14, 各項目の最大件数は9としています
with st.container():
    st.markdown('### 要件定義作成')
    # requirement_document_itemsからtitleとitemsを取得
    overview = st.text_area("要件定義概要")
    for item in requirement_document_items:
        title = item.get('title')
        st.markdown(f"**{title}**")

        title_index = item.get('title_index')
        if title_index == "01":
            title01 = title
            col0101, col0102, col0103 = st.columns(3)
            col0104, col0105, col0106 = st.columns(3)
            col0107, col0108, col0109 = st.columns(3)
            check0101, check0102, check0103 = False, False, False
            check0104, check0105, check0106 = False, False, False
            check0107, check0108, check0109 = False, False, False
            subject0101, subject0102, subject0103 = "", "", ""
            subject0104, subject0105, subject0106 = "", "", ""
            subject0107, subject0108, subject0109 = "", "", ""
            appendix01 = ""
            items = item.get('items')
            for i, subject in enumerate(items):
                if subject.get('subject_index') == "01":
                    with col0101:
                        check0101 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0101 = subject.get('subject')
                elif subject.get('subject_index') == "02":
                    with col0102:
                        check0102 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0102 = subject.get('subject')
                elif subject.get('subject_index') == "03":
                    with col0103:
                        check0103 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0103 = subject.get('subject')
                elif subject.get('subject_index') == "04":
                    with col0104:
                        check0104 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0104 = subject.get('subject')
                elif subject.get('subject_index') == "05":
                    with col0105:
                        check0105 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0105 = subject.get('subject')
                elif subject.get('subject_index') == "06":
                    with col0106:
                        check0106 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0106 = subject.get('subject')
                elif subject.get('subject_index') == "07":
                    with col0107:
                        check0107 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0107 = subject.get('subject')
                elif subject.get('subject_index') == "08":
                    with col0108:
                        check0108 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0108 = subject.get('subject')
                elif subject.get('subject_index') == "09":
                    with col0109:
                        check0109 = st.checkbox(f"{subject.get('subject')}", False)
                        subject0109 = subject.get('subject')
            appendix01 = st.text_area(f"{item.get('title')}補足")

# 以下必要なタイトル分だけ同じコードを書いていくだけです。
# 本当は変数名も抽象化してJSONで指定したものを使えるようにしたかったのですが、結構使いにくかったので実直にそのまま作成しています💦

        elif title_index == "14":
            title14 = title
            col1401, col1402, col1403 = st.columns(3)
            col1404, col1405, col1406 = st.columns(3)
            col1407, col1408, col1409 = st.columns(3)
            check1401, check1402, check1403 = False, False, False
            check1404, check1405, check1406 = False, False, False
            check1407, check1408, check1409 = False, False, False
            subject1401, subject1402, subject1403 = "", "", ""
            subject1404, subject1405, subject1406 = "", "", ""
            subject1407, subject1408, subject1409 = "", "", ""
            appendix14 = ""
            items = item.get('items')
            for i, subject in enumerate(items):
                if subject.get('subject_index') == "01":
                    with col1401:
                        check1401 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1401 = subject.get('subject')
                elif subject.get('subject_index') == "02":
                    with col1402:
                        check1402 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1402 = subject.get('subject')
                elif subject.get('subject_index') == "03":
                    with col1403:
                        check1403 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1403 = subject.get('subject')
                elif subject.get('subject_index') == "04":
                    with col1404:
                        check1404 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1404 = subject.get('subject')
                elif subject.get('subject_index') == "05":
                    with col1405:
                        check1405 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1405 = subject.get('subject')
                elif subject.get('subject_index') == "06":
                    with col1406:
                        check1406 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1406 = subject.get('subject')
                elif subject.get('subject_index') == "07":
                    with col1407:
                        check1407 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1407 = subject.get('subject')
                elif subject.get('subject_index') == "08":
                    with col1408:
                        check1408 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1408 = subject.get('subject')
                elif subject.get('subject_index') == "09":
                    with col1409:
                        check1409 = st.checkbox(f"{subject.get('subject')}", False)
                        subject1409 = subject.get('subject')
            appendix14 = st.text_area(f"{item.get('title')}補足")

    appendix_other = st.text_area("**その他**")
```

## autogenからの回答を画面に表示させる
前回の記事でも書いたものですが、AssistantAgentとUserProxyAgentに対するラッパークラスを作成しています。
出力結果としては、UserProxyAgentのラッパークラスを使用するといい感じになります。
```python
class TrackableAssistantAgent(AssistantAgent):
    """
    AssistantAgentを継承して、メッセージをトラッキングする機能を追加します。
    AssistantAgentに対する指示も表示されるため、通常は使用しないことをお勧めします。
    """
    def _process_received_message(self, message, sender, silent):
        # with st.chat_message(sender.name):
        #     st.markdown(message)
        return super()._process_received_message(message, sender, silent)


class TrackableUserProxyAgent(UserProxyAgent):
    """
    UserProxyAgentを継承して、メッセージをトラッキングする機能を追加します。
    AssistantAgentからの回答を表示できるため、こちらを使用することをお勧めします。
    """
    def _process_received_message(self, message, sender, silent):
        with st.chat_message(sender.name):
            st.markdown(message)
        return super()._process_received_message(message, sender, silent)
```

# LLMのトークンオーバーへの対策
LLMに対してプロンプトを投げるときは特に文字数に制限はありませんが、LLMが生成できる文字数には制限があります。今回の設定では、LM Studioで8000トークンまでとしています。
しかしながら、要件定義をすべて作成したら、当然それ以上の文字数が必要だったりします。
そこで思いついたのが以下の手順です。
1. タイトルごとにドキュメント作成をする(タイトルには記載したい項目を選択)
タイトルごとのドキュメント作成では、Sequential Chatsを使用し、Writer, Reviewer, Writerという順で会話を行い、ドキュメントの精度を向上させる
Writer, Reviewerのプロンプトは、タイトルや項目に合わせてプロンプト生成コードで作成したものを使用する
1. 次のタイトルの会話に進む際は、それまでの内容をまとめたドキュメントを参考としてプロンプトに渡す
1. 各ドキュメントが生成されたら、Pythonコード上で結合し、すべてを一つのドキュメントにする
1. 結合されたドキュメントを別のReviewerが全体の統一感や矛盾などを観点としてレビューを行う
1. 全体に対するレビューをプロンプトに含めて、再度Writer, Reviewer, Writerの順でタイトルごとにドキュメントを作成する
1. 再び各タイトルのドキュメントを結合し、最終的な要件定義書としての回答を得る

このようにプロンプトを工夫しながらLLMにやり取りさせることで、全体的に精度が上がるのではないかと期待しています。

# 実際のコード
## 項目選択
画面の各項目から選択されたものをピックアップして、対象のみに絞ったものにします
```python
def create_message(title, subjects: [], appendix, check_messages: dict):
    """
    チェックメッセージを作成します
    """
    if title not in check_messages:
        check_messages[title] = {
            "subjects": subjects,
            "appendix": appendix
        }
    # もしタイトルがすでに辞書に存在していたら、そのタイトルのsubjectリスト、補足に変更する
    else:
        check_messages[title]["subjects"] = subjects
        check_messages[title]["appendix"] = appendix
```
具体的にどんなコードで使用されているかと言いますと以下の通りです。
省略していますが、項目数に応じてコードも増えます。
この辺り、どう解消できるか要検討事項ですね・・・
```python
check_messages = {}
if overview:
    check_messages = {}
    temp_title = ""
    temp_subjects = []
    temp_appendix = ""
    if check0101:
        temp_title = title01
        temp_subjects.append(subject0101)
    if check0102:
        temp_title = title01
        temp_subjects.append(subject0102)
    if check0103:
        temp_title = title01
        temp_subjects.append(subject0103)
    if check0104:
        temp_title = title01
        temp_subjects.append(subject0104)
    if check0105:
        temp_title = title01
        temp_subjects.append(subject0105)
    if check0106:
        temp_title = title01
        temp_subjects.append(subject0106)
    if check0107:
        temp_title = title01
        temp_subjects.append(subject0107)
    if check0108:
        temp_title = title01
        temp_subjects.append(subject0108)
    if check0109:
        temp_title = title01
        temp_subjects.append(subject0109)
    if appendix01:
        temp_title = title01
        temp_appendix = appendix01
    if temp_title:
        create_message(temp_title, subjects=temp_subjects, appendix=temp_appendix, check_messages=check_messages)

# これをずっと繰り返しています
# ああ大変だなあ💦

    temp_title = ""
    temp_subjects = []
    temp_appendix = ""
    if check1401:
        temp_title = title14
        temp_subjects.append(subject1401)
    if check1402:
        temp_title = title14
        temp_subjects.append(subject1402)
    if check1403:
        temp_title = title14
        temp_subjects.append(subject1403)
    if check1404:
        temp_title = title14
        temp_subjects.append(subject1404)
    if check1405:
        temp_title = title14
        temp_subjects.append(subject1405)
    if check1406:
        temp_title = title14
        temp_subjects.append(subject1406)
    if check1407:
        temp_title = title14
        temp_subjects.append(subject1407)
    if check1408:
        temp_title = title14
        temp_subjects.append(subject1408)
    if check1409:
        temp_title = title14
        temp_subjects.append(subject1409)
    if appendix14:
        temp_title = title14
        temp_appendix = appendix14
    if temp_title:
        create_message(temp_title, subjects=temp_subjects, appendix=temp_appendix, check_messages=check_messages)

    if appendix_other:
        create_message("その他",subjects=[], appendix=appendix_other, check_messages=check_messages)
```

## プロンプト作成
選択された項目やタイトルなどに応じて、プロンプトを内容を一部変更して作成するようなコードです。
```python
def create_writer_task(requirement_documents_summary, title, subjects, appendix, pre_created_document= "", all_review=""):
    return f"""
Role:
- あなたは、アプリケーション開発における設計の専門家です。
Task:
- [要件定義書概要]に関する要件定義書のうち、指定された[タイトル]と[項目]、[追記]に関する部分を作成してください。
- 要件定義書を作成するにあたって不足している情報がある場合は、ユーザーに対し質問を行ってください。
- {pre_created_document}がある場合は、他のタイトルとして作成されているものですので、その内容を参考にしてください。
- {all_review}(「要件定義全体に対するレビュー」)がある場合は、要件定義書に反映させてください。
-　情報が不足している場合は、不足している部分をそのまま伝えてください。
- 今回の要件定義として不要な項目である場合は、「不要と判断しました」と記載してください。
- レビュアーからの指摘事項は反映する必要ありますが、作成するドキュメントには記載する必要はありません。指示された要件定義書のみを作成してください。
- 必ず日本語で回答してください。
Format:
- 要件定義書はMarkdown形式で記述してください。
- 図・フローチャート・テーブル等を記載する場合は、MarkdownもしくはMermaid形式で記述してください。
- 最大で4000文字までとします。
制限:
- 指定された[要件定義書概要]、[タイトル]、[項目]、[追記]に関係ない事項を絶対に作成しないでください。
- ウェブサイト等のリンクを絶対に利用しないでください。
- 画像を利用しないでください。
- レビュアーからの文言は含めず、要件定義書のみを作成してください。
作成項目:
- [要件定義書概要]: {requirement_documents_summary}
- [タイトル]: {title}
- [項目]: {subjects}
- [追記]: {appendix}
"""


def create_writer_after_review_task(requirement_documents_summary, title, subjects, appendix, pre_created_document="", all_review="", user_input=""):
    return f"""
Role:
- あなたは、アプリケーション開発における設計の専門家です。
Task:
- レビュアーやユーザーからの指摘を受けて、要件定義書を修正してください。
- [要件定義書概要]に関する要件定義書のうち、指定された[タイトル]と[項目]、[追記]に関する部分を作成してください。
- 要件定義書を作成するにあたって不足している情報がある場合は、ユーザーに対し質問を行ってください。
-　情報が不足している場合は、不足している部分をそのまま伝えてください。
- 今回の要件定義として不要な項目である場合は、「不要と判断しました」と記載してください。
- レビュアーからの指摘事項は反映する必要ありますが、作成するドキュメントには記載する必要はありません。指示された要件定義書のみを作成してください。
- 省略せず、必ず要件定義書全体を記述してください。
- 必ず日本語で回答してください。
- {pre_created_document}がある場合は、他のタイトルとして作成されているものですので、その内容を参考にしてください。
- {user_input}(ユーザーからの回答)がある場合は、要件定義書に反映させてください。
　　ユーザーからの回答は設計者の質問への回答であったり、要件定義書に対する修正内容である場合があります。
- {all_review}(「要件定義全体に対するレビュー」)がある場合は、要件定義書に反映させてください。
Format:
- 要件定義書はMarkdown形式で記述してください。
- 図・フローチャート・テーブル等を記載する場合は、MarkdownもしくはMermaid形式で記述してください。
- 最大で4000文字までとします。
制限:
- 指定された[要件定義書概要]、[タイトル]、[項目]、[追記]に関係ない事項を絶対に作成しないでください。
- ウェブサイト等のリンクを絶対に利用しないでください。
- 画像を利用しないでください。
- レビュアーからの文言は含めず、要件定義書のみを作成してください。
作成項目:
- [要件定義書概要]: {requirement_documents_summary}
- [タイトル]: {title}
- [項目]: {subjects}
- [追記]: {appendix}
"""


def create_reviewer_task(requirement_documents_summary, title, subjects, appendix, pre_created_document="", all_review="", user_input=""):
    return f"""
Role:
- あなたは、アプリケーション開発における設計の専門家です。
Task:
- 設計者が作成した要件定義書をレビューしてください。 
- 要件定義書に不備がある場合は、指摘を行ってください。
- 要件定義書作成項目に対するレビューを行い、それ以外に関してはレビューを行わないでください。
- レビュー対象は[要件定義書概要]に関する要件定義書のうち指定された[タイトル]と[項目]、[追記]に関する部分のみです。
- 必ず日本語で回答してください。
- {pre_created_document}がある場合は、他のタイトルとして作成されているものですので、その内容を参考にしてください。
- {user_input}(ユーザーからの指示)がある場合は、要件定義書のレビューに反映してください。
- {all_review}(「要件定義全体に対するレビュー」)がある場合は、これを参考に要件定義書をレビューしてください。
要件定義書作成項目:
- [要件定義書概要]: {requirement_documents_summary}
- [タイトル]: {title}
- [項目]: {subjects}
- [追記]: {appendix}
要件定義書作成ルール:
- Format
- 要件定義書はMarkdown形式で記述してください。
- 図・フローチャート・テーブル等を記載する場合は、MarkdownもしくはMermaid形式で記述してください。
- 最大で4000文字までとします。
- 制限
- 指定された[タイトル]と[項目]、[追記]に関係ない事項を絶対に作成しないでください。
- ウェブサイト等のリンクを絶対に利用しないでください。
- 画像を利用しないでください。
レビュー観点:
- 要件定義書が指示内容に従っているか
- 要件定義書が正確かつ明確に記述されているか
- 要件定義書が適切な情報を提供しているか
- 要件定義書が適切なフォーマットで記述されているか
- 要件定義書作成ルールに違反していないか
- 誤字脱字がないか
- 表現や文体は統一感があるか
- その他、必要に応じて指摘してください。
"""

def create_all_reviewer_task(all_contents, titles):
    return f"""
Role:
- あなたは、アプリケーション開発における設計の専門家です。
Task:
- {all_contents}は以下に示した要件定義書タイトル毎に分割して要件定義書を作成したものを結合したものです。
各タイトル毎に分割して作成したため、それぞれの比較をまだ行っていません。
あなたは、それぞれのタイトル毎に分割して作成した要件定義書を以下に示すレビュー観点に従ってレビューを行ってください。
- 回答は最大で4000文字までとしてください。
- 「要件定義全体に対するレビュー」と題名をつけてください。
- 必ず日本語で回答してください。
各タイトル:
- {titles}
要件定義書作成ルール:
- 要件定義書はMarkdown形式で記述していること。
- 図・フローチャート・テーブル等を記載する場合は、MarkdownもしくはMermaid形式で記述していること。
- 指定された[タイトル]と[項目]、[追記]に関係ない事項を作成しない。
- ウェブサイト等のリンクを絶対に利用しない。
- 画像を利用しない。
レビュー観点:
- 各タイトル間の関係に矛盾や齟齬がないか。
たとえばタイトルAでは入金処理が必要とされているが、タイトルBでは入金処理についての記述がない場合など。
矛盾・祖語については特に注目して確認してください。
- 各タイトル間で内容の連続性が保たれているかどうか。
たとえばタイトルAでは登録機能にユーザー名と住所があるのに、タイトルBでは登録機能にユーザー名しかない場合など。
連続性についても特に注目して確認してください。
- 各タイトル別ではなく、ドキュメント全体での表現や文体は統一はされているか。
たとえば「です・ます調」「である調」などひとつに統一された表現となっているかを確認しください。
- どのタイトルの内容にも含まれていない項目については無視してください
"""
```

## Agents
Writer, Reviewer, All_Reviewer(全体に対するレビュアー), user_proxy(会話のスタート用です)の四人のエージェントを作成します。
user_proxyでis_termination_msg入ってますが、実際には使用されていないです。
```python
writer = TrackableAssistantAgent(
    name="Writer",
    llm_config=llm_config,
    max_consecutive_auto_reply=2,
    system_message="あなたは、アプリケーション開発における設計の専門家です。"
)

reviewer = TrackableAssistantAgent(
    name="Reviewer",
    llm_config=llm_config,
    max_consecutive_auto_reply=2,
    system_message="あなたは、アプリケーション開発における設計の専門家です。",
)

all_reviewer = TrackableAssistantAgent(
    name="AllReviewer",
    llm_config=llm_config,
    max_consecutive_auto_reply=2,
    system_message="あなたは、アプリケーション開発における設計の専門家です。",
)

user_proxy = TrackableUserProxyAgent(
    name="User",
    human_input_mode="NEVER",
    is_termination_msg=lambda x: x.get("content", "").find("TERMINATE") >= 0,
    code_execution_config=False,
)

```

## 会話スタート
Sequential Chatsのcarry_overを使用したパターンも検証しました関係で名残としてコードに存在しています。PoCコードなので、このようにサンプルとしては不要なものも含まれている場合がありますのでご了承ください。

```python
    # チャット開始
    if st.button("作成"):
        st.session_state.messages = []
        st.session_state.carry_over = []
        st.session_state.all_contents = ""
        # Doc01_RequirementsSpecificationDocumentフォルダの中身を削除します
        # Doc01_RequirementsSpecificationDocumentフォルダがない場合は作成します
        if os.path.exists("Doc01_RequirementsSpecificationDocument"):
            shutil.rmtree("Doc01_RequirementsSpecificationDocument")
        os.mkdir("Doc01_RequirementsSpecificationDocument")
        pre_created_document = ""
        for title in check_messages.keys():
            chat_results = user_proxy.initiate_chats(
                [
                    {
                        "chat_id": 0,
                        "recipient": writer,
                        "message": create_writer_task(overview, title, check_messages[title]['subjects'], check_messages[title]['appendix'], pre_created_document),
                        "clear_history": True,
                        "silent": False,
                        "max_turns": 1,
                        "summary_method": "last_msg"
                    },
                    {
                        "chat_id": 1,
                        "recipient": reviewer,
                        "message": create_reviewer_task(overview, title, check_messages[title]['subjects'], check_messages[title]['appendix'], pre_created_document),
                        "clear_history": False,
                        "silent": False,
                        "max_turns": 1,
                        "summary_method": "last_msg"
                    },
                    {
                        "chat_id": 2,
                        "recipient": writer,
                        "message": create_writer_after_review_task(overview, title, check_messages[title]['subjects'], check_messages[title]['appendix'], pre_created_document),
                        "clear_history": False,
                        "silent": False,
                        "max_turns": 1,
                        "summary_method": "last_msg"
                    }
                ]
            )

            pre_created_document = pre_created_document + chat_results[-1].summary + "\n"

            # 作成された各データを1つのデータにまとめます
            st.session_state.all_contents = st.session_state.all_contents + chat_results[-1].summary + "\n"
            
        # 全体のレビューを行う
        all_review_result = user_proxy.initiate_chat(
            all_reviewer,
            max_turns=1,
            message=create_all_reviewer_task(st.session_state.all_contents, ", ".join(check_messages.keys())),
        )

        alL_review = all_review_result.summary

        # 全体のレビューも含めて再度ドキュメント生成を行う
        pre_created_document = ""
        for title in check_messages.keys():
            chat_last_results = user_proxy.initiate_chats(
                [
                    {
                        "chat_id": 0,
                        "recipient": writer,
                        "message": create_writer_task(overview, title, check_messages[title]['subjects'],
                                                      check_messages[title]['appendix'], pre_created_document, alL_review),
                        "clear_history": True,
                        "silent": False,
                        "max_turns": 1,
                        "summary_method": "last_msg"
                    },
                    {
                        "chat_id": 1,
                        "recipient": reviewer,
                        "message": create_reviewer_task(overview, title, check_messages[title]['subjects'],
                                                        check_messages[title]['appendix'], pre_created_document, alL_review),
                        "clear_history": False,
                        "silent": False,
                        "max_turns": 1,
                        "summary_method": "last_msg"
                    },
                    {
                        "chat_id": 2,
                        "recipient": writer,
                        "message": create_writer_after_review_task(overview, title, check_messages[title]['subjects'],
                                                                   check_messages[title]['appendix'], pre_created_document,  alL_review),
                        "clear_history": False,
                        "silent": False,
                        "max_turns": 1,
                        "summary_method": "last_msg"
                    }
                ]
            )

            pre_created_document = pre_created_document + chat_last_results[-1].summary + "\n"

            # chat_results[-1].summaryをtitle.mdとしてDoc01_RequirementsSpecificationDocumentフォルダに保存します
            # エンコードをutf-8に指定して保存します
            # 同名ファイルがある場合は先に削除をしてから保存します
            # もしDoc01_RequirementsSpecificationDocumentフォルダがない場合は作成します
            if not os.path.exists("Doc01_RequirementsSpecificationDocument"):
                os.mkdir("Doc01_RequirementsSpecificationDocument")
            if os.path.exists(f"Doc01_RequirementsSpecificationDocument/{title}.md"):
                os.remove(f"Doc01_RequirementsSpecificationDocument/{title}.md")
            with open(f"Doc01_RequirementsSpecificationDocument/{title}.md", mode="w", encoding="utf-8") as f:
                f.write(chat_last_results[-1].summary)
                
```

# 結果
以下のように設定しました。
4タイトルを選択しています。
**要件定義概要**
図書館で利用するアプリケーション開発を想定しています。
貸出・書籍管理・利用者管理など様々な機能が必要と思いますが、まずは基本機能を実装し、その後少しずつ機能拡張していくような計画を考えています。
この条件での要件定義を作成してください。
**プロジェクト概要**
- 目的
- 範囲
- 前提条件

**機能要件**
- システム機能の一覧
- ユースケース
- 画面・ユーザーインターフェース

**データ要件**
- データベース要件一覧
- データモデル
- データフロー

**非機能要件**
- 性能
- セキュリティ
- 拡張性

**出力結果**
出力はとても長いので折りたたんでいます。出力されたものをそのまま掲載していますので、うまくいっているところ、いっていないところなどあります。それぞれの中身をぜひ見ていただければと思います。

<details><summary><b>1回目のSequence Chats</b></summary>

Writer: # 図書館アプリケーション開発プロジェクト要件定義書

## プロジェクト概要

### 目的

本プロジェクトの目的は、図書館で利用するためのアプリケーションを開発することである。このアプリケーションは、貸出・書籍管理・利用者管理などの基本的な機能を提供し、将来的に機能を拡張していく計画が立てられている。

### 範囲

本プロジェクトでは、以下の機能を実装することとされている：

1. **利用者管理**
   - 利用者の登録・更新・削除
   - 利用者の検索

2. **書籍管理**
   - 図書の登録・更新・削除
   - 図書の検索
   - 図書の貸出・返却の管理

3. **貸出管理**
   - 貸出の申請・承認・キャンセル
   - 貸出中の図書の一覧表示

4. **基本的なユーザーインターフェース**
   - 利用者と管理者向けの画面

### 前提条件

本プロジェクトでは、以下の前提条件が存在する：

- アプリケーションはWebアプリケーションとして開発される。
- 利用者と管理者は、それぞれ専用のログイン機能を持つ。
- 図書館の図書データは、既存のシステムから取得できるものとする。

**不要と判断しました：**
- アプリケーションのデバイス対応に関する要件
- セキュリティに関する詳細な要件
Reviewer: # 図書館アプリケーション開発プロジェクト要件定義書

## プロジェクト概要

### 目的

本プロジェクトの目的は、図書館で利用するためのアプリケーションを開発することである。このアプリケーションは、貸出・書籍管理・利用者管理などの基本的な機能を提供し、将来的に機能を拡張していく計画が立てられている。

### 範囲

本プロジェクトでは、以下の機能を実装することとされている：

1. **利用者管理**
   - 利用者の登録・更新・削除
   - 利用者の検索

2. **書籍管理**
   - 図書の登録・更新・削除
   - 図書の検索
   - 図書の貸出・返却の管理

3. **貸出管理**
   - 貸出の申請・承認・キャンセル
   - 貸出中の図書の一覧表示

4. **基本的なユーザーインターフェース**
   - 利用者と管理者向けの画面

### 前提条件

本プロジェクトでは、以下の前提条件が存在する：

- アプリケーションはWebアプリケーションとして開発される。
- 利用者と管理者は、それぞれ専用のログイン機能を持つ。
- 図書館の図書データは、既存のシステムから取得できるものとする。

**不要と判断しました：**
- アプリケーションのデバイス対応に関する要件
- セキュリティに関する詳細な要件

## レビュー結果

### 正しいこと

- 要件定義書は指示内容に従っており、正確かつ明確に記述されている。
- 適切な情報を提供しており、適切なフォーマットで記述されている。
- 誤字脱字はなく、表現や文体は統一感がある。

### 指摘事項

- **前提条件**の「図書館の図書データは、既存のシステムから取得できるものとする。」という記述は、要件定義書としては不適切である。これは実装に関する詳細であり、要件定義書では避けるべきである。
- **不要と判断しました**の部分は、要件定義書作成項目に含まれていないため、この部分を削除すべきである。

### その他の指摘

- **範囲**の各機能について、それぞれの機能が what（何を行うか）を記述しているが、どのように行うかについては記述されていない。例えば、「利用者管理」では「利用者の登録・更新・削除」とあるが、この処理は誰が行うのか、どのような画面で行うのかなどの情報が必要である。
- **前提条件**に「アプリケーションはWebアプリケーションとして開発される。」という記述があるが、この要件はプロジェクトの範囲を超えるものであり、要件定義書から削除すべきである。
Writer: # 図書館アプリケーション開発プロジェクト要件定義書

## プロジェクト概要

### 目的

本プロジェクトの目的は、図書館で利用するためのアプリケーションを開発することである。このアプリケーションは、貸出・書籍管理・利用者管理などの基本的な機能を提供し、将来的に機能を拡張していく計画が立てられている。

### 範囲

本プロジェクトでは、以下の機能を実装することとされている：

1. **利用者管理**
   - 利用者の登録・更新・削除（管理者のみ）
   - 利用者の検索（利用者と管理者）

2. **書籍管理**
   - 図書の登録・更新・削除（管理者のみ）
   - 図書の検索（利用者と管理者）
   - 図書の貸出・返却の管理（利用者と管理者）

3. **貸出管理**
   - 貸出の申請・承認・キャンセル（利用者と管理者）
   - 貸出中の図書の一覧表示（利用者と管理者）

4. **基本的なユーザーインターフェース**
   - 利用者向け画面
   - 管理者向け画面

### 前提条件

本プロジェクトでは、以下の前提条件が存在する：

- アプリケーションはWebアプリケーションとして開発される。
- 図書館の図書データは、既存のシステムから取得できるものとする。

**不要と判断しました：**
- セキュリティに関する詳細な要件
Writer: # 図書館アプリケーション機能要件

## システム機能の一覧

以下は、図書館アプリケーションで実装する予定の主要な機能の一覧である。

| 機能 | 概要 |
| --- | --- |
| 利用者管理 | 利用者の登録・更新・削除（管理者のみ）、利用者の検索（利用者と管理者） |
| 書籍管理 | 図書の登録・更新・削除（管理者のみ）、図書の検索（利用者と管理者）、図書の貸出・返却の管理（利用者と管理者） |
| 貸出管理 | 貸出の申請・承認・キャンセル（利用者と管理者）、貸出中の図書の一覧表示（利用者と管理者） |
| 基本的なユーザーインターフェース | 利用者向け画面、管理者向け画面 |

## ユースケース

### 利用者管理

**アクター:** 管理者

1. **利用者の登録**
   - 管理者は、新しい利用者を登録することができる。
   - 登録時には、利用者の基本情報（名前、連絡先など）を入力する。

2. **利用者の更新**
   - 管理者は、既存の利用者の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

3. **利用者の削除**
   - 管理者は、不要になった利用者を削除することができる。

**アクター:** 利用者

4. **利用者の検索**
   - 利用者と管理者は、利用者の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

### 書籍管理

**アクター:** 管理者

5. **図書の登録**
   - 管理者は、新しい図書を登録することができる。
   - 登録時には、図書の基本情報（タイトル、著者、出版社など）を入力する。

6. **図書の更新**
   - 管理者は、既存の図書の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

7. **図書の削除**
   - 管理者は、不要になった図書を削除することができる。

**アクター:** 利用者と管理者

8. **図書の検索**
   - 利用者と管理者は、図書の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

9. **貸出・返却の管理**
   - 利用者は、図書を貸出申請することができる。
   - 管理者は、貸出申請を承認またはキャンセルすることができる。
   - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

### 貸出管理

**アクター:** 利用者と管理者

10. **貸出の申請・承認・キャンセル**
    - 利用者は、図書の貸出を申請することができる。
    - 管理者は、貸出申請を承認またはキャンセルすることができる。

11. **貸出中の図書の一覧表示**
    - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

## 画面・ユーザーインターフェース

### 利用者向け画面

- **ログイン画面:** 利用者は、アプリケーションにログインするための画面。
- **図書検索画面:** 利用者は、図書を検索するための画面。
- **貸出申請画面:** 利用者は、図書の貸出を申請するための画面。
- **貸出中の図書一覧画面:** 利用者は、貸出中の図書の一覧を表示するための画面。

### 管理者向け画面

- **ログイン画面:** 管理者は、アプリケーションにログインするための画面。
- **利用者管理画面:** 管理者は、利用者の登録・更新・削除を行うための画面。
- **図書管理画面:** 管理者は、図書の登録・更新・剹除を行うための画面。
- **貸出管理画面:** 管理者は、貸出申請を承認またはキャンセルするための画面。また、貸出中の図書の一覧を表示することもできる。

**追記:**

上記の機能要件に基づき、以下の質問があります。

1. 利用者管理画面で、利用者の検索機能は必要ですか？
2. 図書管理画面で、図書の検索結果をカテゴリ別にフィルタリングする機能は必要ですか？
3. 貸出管理画面で、貸出期限の設定や延長機能は必要ですか？

回答をいただけると、要件定義書をより正確に作成することができます。
Reviewer: # 図書館アプリケーション機能要件

## システム機能の一覧

以下は、図書館アプリケーションで実装する予定の主要な機能の一覧である。

| 機能 | 概要 |
| --- | --- |
| 利用者管理 | 利用者の登録・更新・削除（管理者のみ）、利用者の検索（利用者と管理者） |
| 書籍管理 | 図書の登録・更新・削除（管理者のみ）、図書の検索（利用者と管理者）、図書の貸出・返却の管理（利用者と管理者） |
| 貸出管理 | 貸出の申請・承認・キャンセル（利用者と管理者）、貸出中の図書の一覧表示（利用者と管理者） |
| 基本的なユーザーインターフェース | 利用者向け画面、管理者向け画面 |

## ユースケース

### 利用者管理

**アクター:** 管理者

1. **利用者の登録**
   - 管理者は、新しい利用者を登録することができる。
   - 登録時には、利用者の基本情報（名前、連絡先など）を入力する。

2. **利用者の更新**
   - 管理者は、既存の利用者の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

3. **利用者の削除**
   - 管理者は、不要になった利用者を削除することができる。

**アクター:** 利用者

4. **利用者の検索**
   - 利用者と管理者は、利用者の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

### 書籍管理

**アクター:** 管理者

5. **図書の登録**
   - 管理者は、新しい図書を登録することができる。
   - 登録時には、図書の基本情報（タイトル、著者、出版社など）を入力する。

6. **図書の更新**
   - 管理者は、既存の図書の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

7. **図書の削除**
   - 管理者は、不要になった図書を削除することができる。

**アクター:** 利用者と管理者

8. **図書の検索**
   - 利用者と管理者は、図書の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

9. **貸出・返却の管理**
   - 利用者は、図書を貸出申請することができる。
   - 管理者は、貸出申請を承認またはキャンセルすることができる。
   - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

### 貸出管理

**アクター:** 利用者と管理者

10. **貸出の申請・承認・キャンセル**
    - 利用者は、図書の貸出を申請することができる。
    - 管理者は、貸出申請を承認またはキャンセルすることができる。

11. **貸出中の図書の一覧表示**
    - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

## 画面・ユーザーインターフェース

### 利用者向け画面

- **ログイン画面:** 利用者は、アプリケーションにログインするための画面。
- **図書検索画面:** 利用者は、図書を検索するための画面。
- **貸出申請画面:** 利用者は、図書の貸出を申請するための画面。
- **貸出中の図書一覧画面:** 利用者は、貸出中の図書の一覧を表示するための画面。

### 管理者向け画面

- **ログイン画面:** 管理者は、アプリケーションにログインするための画面。
- **利用者管理画面:** 管理者は、利用者の登録・更新・削除を行うための画面。
- **図書管理画面:** 管理者は、図書の登録・更新・剹除を行うための画面。
- **貸出管理画面:** 管理者は、貸出申請を承認またはキャンセルするための画面。また、貸出中の図書の一覧を表示することもできる。

**追記:**

上記の機能要件に基づき、以下の質問があります。

1. 利用者管理画面で、利用者の検索機能は必要ですか？
   - はい、必要です。利用者の検索機能は、管理者が利用者を特定するために不可欠な機能です。
2. 図書管理画面で、図書の検索結果をカテゴリ別にフィルタリングする機能は必要ですか？
   - いいえ、必要ありません。図書の検索結果をカテゴリ別にフィルタリングする機能は、利用者向けの画面で提供されるべき機能です。
3. 貸出管理画面で、貸出期限の設定や延長機能は必要ですか？
   - はい、必要です。貸出期限の設定と延長機能は、図書館の運用を円滑に行うために不可欠な機能です。

回答をいただき、要件定義書を修正しました。
Writer: # 図書館アプリケーション機能要件

## システム機能の一覧

以下は、図書館アプリケーションで実装する予定の主要な機能の一覧である。

| 機能 | 概要 |
| --- | --- |
| 利用者管理 | 利用者の登録・更新・削除（管理者のみ）、利用者の検索（利用者と管理者） |
| 書籍管理 | 図書の登録・更新・削除（管理者のみ）、図書の検索（利用者と管理者）、図書の貸出・返却の管理（利用者と管理者） |
| 貸出管理 | 貸出の申請・承認・キャンセル（利用者と管理者）、貸出中の図書の一覧表示（利用者と管理者） |
| 基本的なユーザーインターフェース | 利用者向け画面、管理者向け画面 |

## ユースケース

### 利用者管理

**アクター:** 管理者

1. **利用者の登録**
   - 管理者は、新しい利用者を登録することができる。
   - 登録時には、利用者の基本情報（名前、連絡先など）を入力する。

2. **利用者の更新**
   - 管理者は、既存の利用者の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

3. **利用者の削除**
   - 管理者は、不要になった利用者を削除することができる。

**アクター:** 利用者

4. **利用者の検索**
   - 利用者と管理者は、利用者の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

### 書籍管理

**アクター:** 管理者

5. **図書の登録**
   - 管理者は、新しい図書を登録することができる。
   - 登録時には、図書の基本情報（タイトル、著者、出版社など）を入力する。

6. **図書の更新**
   - 管理者は、既存の図書の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

7. **図書の削除**
   - 管理者は、不要になった図書を削除することができる。

**アクター:** 利用者と管理者

8. **図書の検索**
   - 利用者と管理者は、図書の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

9. **貸出・返却の管理**
   - 利用者は、図書を貸出申請することができる。
   - 管理者は、貸出申請を承認またはキャンセルすることができる。
   - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

### 貸出管理

**アクター:** 利用者と管理者

10. **貸出の申請・承認・キャンセル**
    - 利用者は、図書の貸出を申請することができる。
    - 管理者は、貸出申請を承認またはキャンセルすることができる。

11. **貸出中の図書の一覧表示**
    - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

## 画面・ユーザーインターフェース

### 利用者向け画面

- **ログイン画面:** 利用者は、アプリケーションにログインするための画面。
- **図書検索画面:** 利用者は、図書を検索するための画面。
- **貸出申請画面:** 利用者は、図書の貸出を申請するための画面。
- **貸出中の図書一覧画面:** 利用者は、貸出中の図書の一覧を表示するための画面。

### 管理者向け画面

- **ログイン画面:** 管理者は、アプリケーションにログインするための画面。
- **利用者管理画面:** 管理者は、利用者の登録・更新・削除を行うための画面。
- **図書管理画面:** 管理者は、図書の登録・更新・剹除を行うための画面。
- **貸出管理画面:** 管理者は、貸出申請を承認またはキャンセルするための画面。また、貸出中の図書の一覧を表示することもできる。

**追記:**

上記の機能要件に基づき、以下の修正点があります。

1. 利用者管理画面で、利用者の検索機能は必要です。この機能は、管理者が利用者を特定するために不可欠な機能です。
2. 図書管理画面で、図書の検索結果をカテゴリ別にフィルタリングする機能は不要です。この機能は、利用者向けの画面で提供されるべき機能です。
3. 貸出管理画面で、貸出期限の設定や延長機能は必要です。図書館の運用を円滑に行うために、この機能は不可欠な機能です。

以上の修正点を反映し、要件定義書を修正しました。
Writer: # 図書館アプリケーションデータ要件

## データベース要件一覧

以下は、図書館アプリケーションで使用する予定の主要なデータベーステーブルとカラムの一覧である。

### ユーザーテーブル

| カラム名 | データ型 |制約 |
| --- | --- | --- |
| user_id (主キー) | INT | AUTO_INCREMENT |
| username | VARCHAR(50) | NOT NULL, UNIQUE |
| password | VARCHAR(255) | NOT NULL |
| email | VARCHAR(100) | NOT NULL, UNIQUE |
| role | ENUM('user', 'admin') | NOT NULL, DEFAULT 'user' |

### 図書テーブル

| カラム名 | データ型 |制約 |
| --- | --- | --- |
| book_id (主キー) | INT | AUTO_INCREMENT |
| title | VARCHAR(255) | NOT NULL |
| author | VARCHAR(100) | NOT NULL |
| publisher | VARCHAR(100) |  |
| publication_year | INT |  |
| status | ENUM('available', 'checked_out') | NOT NULL, DEFAULT 'available' |

### 貸出テーブル

| カラム名 | データ型 |制約 |
| --- | --- | --- |
| loan_id (主キー) | INT | AUTO_INCREMENT |
| user_id (外部キー) | INT | NOT NULL, REFERENCES users(user_id) |
| book_id (外部キー) | INT | NOT NULL, REFERENCES books(book_id) |
| checkout_date | DATE | NOT NULL |
| due_date | DATE | NOT NULL |
| return_date | DATE |  |

## データモデル

図書館アプリケーションのデータモデルは、以下の図のようになっている。

```mermaid
erDiagram

users {
  user_id PK
  username UK
  password
  email UK
  role
}

books {
  book_id PK
  title
  author
  publisher
  publication_year
  status
}

loans {
  loan_id PK
  user_id FK
  book_id FK
  checkout_date
  due_date
  return_date
}

users ||--o{ loans : "borrows"
books ||--o{ loans : "lent_to"
```

## データフロー

以下は、図書館アプリケーションで実装する予定の主要なデータフローの一覧である。

1. **利用者登録**
   - 利用者が新規登録をリクエストすると、アプリケーションはユーザーテーブルに新しいレコードを挿入する。
   - 新しい利用者の情報（username, password, email, role）は、リクエストから取得される。

2. **図書登録**
   - 管理者が新規図書登録をリクエストすると、アプリケーションは図書テーブルに新しいレコードを挿入する。
   - 新しい図書の情報（title, author, publisher, publication_year, status）は、リクエストから取得される。

3. **貸出申請**
   - 利用者が貸出申請をリクエストすると、アプリケーションは貸出テーブルに新しいレコードを挿入する。
   - 新しい貸出の情報（user_id, book_id, checkout_date, due_date）は、リクエストから取得される。

4. **貸出承認**
   - 管理者が貸出承認をリクエストすると、アプリケーションは貸出テーブルの対象レコードのstatusカラムを'checked_out'に更新する。
   - また、図書テーブルの対象レコードのstatusカラムも'checked_out'に更新する。

5. **返却処理**
   - 利用者が返却リクエストを送信すると、アプリケーションは貸出テーブルの対象レコードのreturn_dateカラムを現在日時で更新する。
   - また、図書テーブルの対象レコードのstatusカラムも'available'に更新する。
Reviewer: 要件定義書レビュー結果

プロジェクト概要
- 目的：明確に記述されています。
- 範囲：必要な機能がすべて記載されているようです。利用者管理、書籍管理、貸出管理の各機能について、実装する予定の機能が詳細に記述されています。
- 前提条件：前提条件として、アプリケーションがWebアプリケーションとして開発されることと、図書館の図書データが既存のシステムから取得できるものとすることが記載されています。しかし、セキュリティに関する詳細な要件は不要と判断されているようです。
- 不備：特にありません。

機能要件
- システム機能の一覧：必要な機能がすべて記載されているようです。利用者管理、書籍管理、貸出管理の各機能について、実装する予定の機能が詳細に記述されています。
- ユースケース：各機能について、アクターとそのアクターが行うことができる操作が明確に記述されています。しかし、利用者管理画面で利用者の検索機能は必要であるにもかかわらず、ユースケースには記載されていません。
- 画面・ユーザーインターフェース：利用者向け画面と管理者向け画面について、各画面で実装する予定の機能が明確に記述されています。しかし、図書管理画面で図書の検索結果をカテゴリ別にフィルタリングする機能は不要であるにもかかわらず、ユースケースには記載されています。
- 不備：利用者管理画面で利用者の検索機能が必要であり、図書管理画面で図書の検索結果をカテゴリ別にフィルタリングする機能は不要であることが指摘されました。

データ要件
- データベース要件一覧：図書館アプリケーションで使用する予定の主要なデータベーステーブルとカラムの一覧が記載されています。各テーブルとカラムについて、データ型と制約が明確に記述されています。
- データモデル：図書館アプリケーションのデータモデルが図で示されています。ユーザーテーブル、図書テーブル、貸出テーブルの各テーブルとそれらの間の関係性が明確に示されています。
- データフロー：図書館アプリケーションで実装する予定の主要なデータフローの一覧が記載されています。各データフローについて、リクエストから取得される情報とテーブルへの挿入や更新が明確に記述されています。
- 不備：特にありません。

要件定義書全体
- 要件定義書は指示内容に従っており、正確かつ明確に記述されているようです。適切な情報を提供しており、適切なフォーマットで記述されています。また、要件定義書作成ルールに違反していないようです。
- 誤字脱字はありません。表現や文体は統一感があります。
- 不備：特にありません。

指摘事項
- 利用者管理画面で利用者の検索機能が必要であること。
- 図書管理画面で図書の検索結果をカテゴリ別にフィルタリングする機能は不要であること。
Writer: **修正後要件定義書**

## プロジェクト概要

### 目的

本プロジェクトの目的は、図書館で利用するためのアプリケーションを開発することである。このアプリケーションは、貸出・書籍管理・利用者管理などの基本的な機能を提供し、将来的に機能を拡張していく計画が立てられている。

### 範囲

本プロジェクトでは、以下の機能を実装することとされている：

1. **利用者管理**
   - 利用者の登録・更新・削除（管理者のみ）
   - 利用者の検索（利用者と管理者） **追記：この機能は、管理者が利用者を特定するために不可欠な機能です。**
   - 利用者の貸出履歴の表示（利用者と管理者）

2. **書籍管理**
   - 図書の登録・更新・削除（管理者のみ）
   - 図書の検索（利用者と管理者）
   - 図書の貸出・返却の管理（利用者と管理者）

3. **貸出管理**
   - 貸出の申請・承認・キャンセル（利用者と管理者）
   - 貸出期限の設定や延長 **追記：図書館の運用を円滑に行うために、この機能は不可欠な機能です。**
   - 貸出中の図書の一覧表示（利用者と管理者）

4. **基本的なユーザーインターフェース**
   - 利用者向け画面
   - 管理者向け画面

### 前提条件

本プロジェクトでは、以下の前提条件が存在する：

- アプリケーションはWebアプリケーションとして開発される。
- 図書館の図書データは、既存のシステムから取得できるものとする。

**不要と判断しました：**
- セキュリティに関する詳細な要件

## システム機能の一覧

以下は、図書館アプリケーションで実装する予定の主要な機能の一覧である。

| 機能 | 概要 |
| --- | --- |
| 利用者管理 | 利用者の登録・更新・削除（管理者のみ）、利用者の検索（利用者と管理者）、利用者の貸出履歴の表示（利用者と管理者） **追記：この機能は、管理者が利用者を特定するために不可欠な機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**
| 書籍管理 | 図書の登録・更新・削除（管理者のみ）、図書の検索（利用者と管理者）、図書の貸出・返却の管理（利用者と管理者） |
| 貸出管理 | 貸出の申請・承認・キャンセル（利用者と管理者）、貸出期限の設定や延長 **追記：図書館の運用を円滑に行うために、この機能は不可欠な機能です。また、利用者は自らの貸出期限を確認することができるようになります。**、貸出中の図書の一覧表示（利用者と管理者） |
| 基本的なユーザーインターフェース | 利用者向け画面、管理者向け画面 |

## ユースケース

### 利用者管理

**アクター:** 管理者

1. **利用者の登録**
   - 管理者は、新しい利用者を登録することができる。
   - 登録時には、利用者の基本情報（名前、連絡先など）を入力する。

2. **利用者の更新**
   - 管理者は、既存の利用者の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

3. **利用者の削除**
   - 管理者は、不要になった利用者を削除することができる。

**アクター:** 利用者

4. **利用者の検索**
   - 利用者と管理者は、利用者の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。 **追記：この機能は、管理者が利用者を特定するために不可欠な機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**

5. **貸出履歴の表示**
   - 利用者と管理者は、利用者の貸出履歴を表示することができる。

### 書籍管理

**アクター:** 管理者

6. **図書の登録**
   - 管理者は、新しい図書を登録することができる。
   - 登録時には、図書の基本情報（タイトル、著者、出版社など）を入力する。

7. **図書の更新**
   - 管理者は、既存の図書の情報を更新することができる。
   - 更新時には、変更したい情報を入力する。

8. **図書の削除**
   - 管理者は、不要になった図書を削除することができる。

**アクター:** 利用者と管理者

9. **図書の検索**
   - 利用者と管理者は、図書の基本情報で検索を行うことができる。
   - 検索結果は、一覧表示される。

10. **貸出・返却の管理**
    - 利用者は、図書を貸出申請することができる。
    - 管理者は、貸出申請を承認またはキャンセルすることができる。
    - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

### 貸出管理

**アクター:** 利用者と管理者

11. **貸出の申請・承認・キャンセル**
    - 利用者は、図書の貸出を申請することができる。
    - 管理者は、貸出申請を承認またはキャンセルすることができる。

12. **貸出期限の設定や延長**
    - 利用者と管理者は、図書の貸出期限を設定または延長することができる。 **追記：図書館の運用を円滑に行うために、この機能は不可欠な機能です。また、利用者は自らの貸出期限を確認することができるようになります。**

13. **貸出中の図書の一覧表示**
    - 利用者と管理者は、貸出中の図書の一覧を表示することができる。

## 画面・ユーザーインターフェース

### 利用者向け画面

- **ログイン画面:** 利用者は、アプリケーションにログインするための画面。
- **図書検索画面:** 利用者は、図書を検索するための画面。 **修正：この機能は、利用者向けの画面で提供されるべき機能です。**
- **貸出申請画面:** 利用者は、図書の貸出を申請するための画面。
- **貸出中の図書一覧画面:** 利用者は、貸出中の図書の一覧を表示するための画面。 **修正：この機能は、利用者向けの画面で提供されるべき機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**
- **貸出期限管理画面:** 利用者は、図書の貸出期限を設定または延長するための画面。 **追記：この機能は、利用者向けの画面で提供されるべき機能です。また、利用者は自らの貸出期限を確認することができるようになります。**

### 管理者向け画面

- **ログイン画面:** 管理者は、アプリケーションにログインするための画面。
- **利用者管理画面:** 管理者は、利用者の登録・更新・削除を行うための画面。 **修正：この機能は、管理者が利用者を特定するために不可欠な機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**
- **図書管理画面:** 管理者は、図書の登録・更新・剹除を行うための画面。 **修正：この機能は、利用者向けの画面で提供されるべき機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**
- **貸出管理画面:** 管理者は、貸出申請を承認またはキャンセルするための画面。また、貸出中の図書の一覧を表示することもできる。 **修正：この機能は、利用者向けの画面で提供されるべき機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**
- **図書検索管理画面:** 管理者は、図書の基本情報で検索を行うための画面。 **追記：この機能は、利用者向けの画面で提供されるべき機能です。また、利用者は自らの貸出履歴を確認することができるようになります。**

**修正後データ要件**

## データベース要件一覧

以下は、図書館アプリケーションで使用する予定の主要なデータベーステーブルとカラムの一覧である。

### ユーザーテーブル

| カラム名 | データ型 |制約 |
| --- | --- | --- |
| user_id (主キー) | INT | AUTO_INCREMENT |
| username | VARCHAR(50) | NOT NULL, UNIQUE |
| password | VARCHAR(255) | NOT NULL |
| email | VARCHAR(100) | NOT NULL, UNIQUE |
| role | ENUM('user', 'admin') | NOT NULL, DEFAULT 'user' |

### 図書テーブル

| カラム名 | データ型 |制約 |
| --- | --- | --- |
| book_id (主キー) | INT | AUTO_INCREMENT |
| title | VARCHAR(255) | NOT NULL |
| author | VARCHAR(100) | NOT NULL |
| publisher | VARCHAR(100) |  |
| publication_year | INT |  |
| status | ENUM('available', 'checked_out') | NOT NULL, DEFAULT 'available' |

### 貸出テーブル

| カラム名 | データ型 |制約 |
| --- | --- | --- |
| loan_id (主キー) | INT | AUTO_INCREMENT |
| user_id (外部キー) | INT | NOT NULL, REFERENCES users(user_id) |
| book_id (外部キー) | INT | NOT NULL, REFERENCES books(book_id) |
| checkout_date | DATE | NOT NULL |
| due_date | DATE | NOT NULL |
| return_date | DATE |  |

**修正後データモデル**

図書館アプリケーションのデータモデルは、以下の図のようになっている。

```mermaid
erDiagram

users {
    user_id PK
    username UK
    password
    email UK
    role
}

books {
    book_id PK
    title
    author
    publisher
    publication_year
    status
}

loans {
    loan_id PK
    user_id FK
    book_id FK
    checkout_date
    due_date
    return_date
}

users ||--o{ loans : "borrows"
books ||--o{ loans : "lent_to"
```

**修正後データフロー**

図書館アプリケーションのデータフローは、以下のようになっている。

1. 利用者がログインする。
2. 利用者が図書を検索する。
3. 利用者が図書の貸出を申請する。
4. 管理者が貸出申請を承認またはキャンセルする。
5. 利用者と管理者が貸出中の図書の一覧を表示する。
6. 利用者と管理者が図書の貸出期限を設定または延長する。
7. 利用者と管理者が利用者の貸出履歴を確認する。

以上、図書館アプリケーションの要件定義書に関する修正点を反映したものである。
Writer: **図書館アプリケーション非機能要件**

## 性能

### レスポンス時間

本アプリケーションでは、以下の基準を満たすこととされている：

- ユーザーが画面遷移を行う際のレスポンス時間は、3秒以内とする。
- データベースからの検索結果を表示する際のレスポンス時間は、5秒以内とする。

### システム容量

本アプリケーションでは、以下の基準を満たすこととされている：

- 同時接続ユーザー数は、1000人まで対応する。
- 図書データベースの規模は、10万冊まで対応する。

## セキュリティ

### ユーザー認証

本アプリケーションでは、以下の基準を満たすこととされている：

- ユーザーは、ログイン時にユーザー名とパスワードを入力し、正しい組み合わせが入力された場合にのみシステムへのアクセスを許可する。
- パスワードは、暗号化されて保存される。

### データ保護

本アプリケーションでは、以下の基準を満たすこととされている：

- 図書館の図書データは、最新のセキュリティ技術を用いて保護する。
- ユーザーの個人情報は、プライバシー保護法に則り保護する。

### アクセス制御

本アプリケーションでは、以下の基準を満たすこととされている：

- 管理者ユーザーのみが、利用者管理画面や図書管理画面へのアクセスを許可される。
- ユーザーは、自らの権限に応じて、特定の機能へのアクセスを制御する。

## 拡張性

### モジュール化

本アプリケーションでは、以下の基準を満たすこととされている：

- 各機能は、モジュール化されており、独立して開発・テスト・デプロイが可能である。
- 新しい機能の追加や既存機能の修正が容易に行えるように設計する。

### データベース設計

本アプリケーションでは、以下の基準を満たすこととされている：

- データベースは、正規化原則に従って設計される。
- データベーススキーマは、柔軟に拡張可能なように設計する。

### アーキテクチャ

本アプリケーションでは、以下の基準を満たすこととされている：

- アプリケーションは、MVC（Model-View-Controller）アーキテクチャに従って設計される。
- アプリケーションは、微小サービスアーキテクチャに従って設計され、各機能が独立したサービスとして実装される。

以上の非機能要件を満たすことにより、図書館アプリケーションは高い信頼性・安定性・拡張性を持つこととされている。
Reviewer: **レビュー結果**

- **指示内容に従っているか:** 要件定義書は、指示されたタイトルと項目、追記に関係する部分のみが含まれており、その他の事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 要件定義書は、各項目の内容が明確に記述されており、要件を正確に表現しています。ただし、一部の用語（例えば「柔軟に拡張可能なように」など）は曖昧であり、より具体的な表現にすることを推奨します。
- **適切な情報を提供しているか:** 要件定義書は、非機能要件として性能、セキュリティ、拡張性に関する必要な情報を提供しています。ただし、「アクセス制御」項目では、ユーザーの権限に応じたアクセス制御について記述されていますが、具体的な実装方法や制御レベルなどは記述されていません。
- **適切なフォーマットで記述されているか:** 要件定義書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。また、最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 要件定義書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。
- **誤字脱字がないか:** 要件定義書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 要件定義書の表現と文体は、比較的統一されており、読みやすいです。ただし、「柔軟に拡張可能なように」などの曖昧な用語を除き、より具体的な表現にすることを推奨します。
- **その他の指摘:** 「アクセス制御」項目では、ユーザーの権限に応じたアクセス制御について記述されていますが、具体的な実装方法や制御レベルなどは記述されていません。また、「拡張性」項目では、データベース設計とアーキテクチャに関する基準が記述されていますが、システムのモジュール化に関する基準は記述されていませんでした。

**改善点:**

1. 「柔軟に拡張可能なように」などの曖昧な用語をより具体的な表現にする。
2. 「アクセス制御」項目で、ユーザーの権限に応じたアクセス制御について、具体的な実装方法や制御レベルなどを記述する。
3. 「拡張性」項目で、システムのモジュール化に関する基準を記述する。

以上の改善点を反映し、要件定義書を修正することを推奨します。
Writer: **図書館アプリケーション非機能要件（修正後）**

## 性能

### レスポンス時間

本アプリケーションでは、以下の基準を満たすこととされている：

- ユーザーが画面遷移を行う際のレスポンス時間は、3秒以内とする。
- データベースからの検索結果を表示する際のレスポンス時間は、5秒以内とする。

### システム容量

本アプリケーションでは、以下の基準を満たすこととされている：

- 同時接続ユーザー数は、1000人まで対応する。
- 図書データの登録・更新・削除は、1秒以内に完了させる。

## セキュリティ

### ユーザー認証とアクセス制御

本アプリケーションでは、以下の基準を満たすこととされている：

- ユーザーは、ログイン時にユーザー名とパスワードを入力し、正しい組み合わせが入力された場合にのみログインを許可する。
- 管理者権限を持つユーザーは、利用者の登録・更新・削除や図書データの管理など、特定の機能にアクセスできるようにする。
- ユーザーは、自らのアカウント情報のみを閲覧・編集できるようにする。

### データ保護

本アプリケーションでは、以下の基準を満たすこととされている：

- ユーザーのパスワードは、ハッシュ化してデータベースに保存する。
- 図書館内で利用される図書データは、暗号化されてデータベースに保存する。

## 拡張性

### モジュール化

本アプリケーションでは、以下の基準を満たすこととされている：

- 各機能は、独立したモジュールとして設計される。
- 新しい機能の追加や既存機能の修正が容易に行えるように設計する。

### データベース設計

本アプリケーションでは、以下の基準を満たすこととされている：

- データベースは、正規化原則に従って設計される。
- データベーススキーマは、柔軟に拡張可能なように設計する。例えば、新しいカラムの追加やテーブルの分割が容易に行えるようにする。

### アーキテクチャ

本アプリケーションでは、以下の基準を満たすこととされている：

- アプリケーションは、MVC（Model-View-Controller）アーキテクチャに従って設計される。
- アプリケーションは、微小サービスアーキテクチャに従って設計され、各機能が独立したサービスとして実装される。例えば、利用者管理機能と図書管理機能は、別々のサービスとして実装される。

以上の非機能要件を満たすことにより、図書館アプリケーションは高い信頼性・安定性・拡張性を持つこととされている。
**レビュー結果**

- **指示内容に従っているか:** 要件定義書は、指示されたタイトルと項目、追記に関係する部分のみが含まれており、その他の事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 要件定義書は、各項目の内容が明確に記述されており、要件を正確に表現しています。ただし、「柔軟に拡張可能なように」などの曖昧な用語は修正されていませんでした。
- **適切な情報を提供しているか:** 要件定義書は、非機能要件として性能、セキュリティ、拡張性に関する必要な情報を提供しています。ただし、「アクセス制御」項目では、ユーザーの権限に応じたアクセス制御について記述されていますが、具体的な実装方法や制御レベルなどは記述されていませんでした。
- **適切なフォーマットで記述されているか:** 要件定義書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。また、最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 要件定義書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。
- **誤字脱字がないか:** 要件定義書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 要件定義書の表現と文体は、比較的統一されており、読みやすいです。ただし、「柔軟に拡張可能なように」などの曖昧な用語は修正されていませんでした。
- **その他の指摘:** 「アクセス制御」項目では、ユーザーの権限に応じたアクセス制御について記述されていますが、具体的な実装方法や制御レベルなどは記述されていませんでした。また、「拡張性」項目で、システムのモジュール化とデータベース設計に関する基準は修正されましたが、アーキテクチャに関する基準は修正されていませんでした。

**修正点:**

- 「柔軟に拡張可能なように」などの曖昧な用語を明確な要件に置き換える必要があります。
- 「アクセス制御」項目で、ユーザーの権限に応じたアクセス制御について具体的な実装方法や制御レベルなどを記述する必要があります。
- 「拡張性」項目で、アーキテクチャに関する基準を明確な要件に置き換える必要があります。
</details>

<details><summary><b>全体のレビュー</b></summary>
AllReviewer: 要件定義全体に対するレビュー

プロジェクト概要、機能要件、データ要件、非機能要件の各タイトル間で関係性と連続性を確認し、表現や文体の統一性もチェックしました。以下はそれぞれのタイトルについてのレビュー結果です。

1. **プロジェクト概要**
   - 目的、範囲、前提条件が明確に記述されており、他のタイトルと矛盾する部分はありませんでした。
   - 機能要件や非機能要件との連続性も保たれているように見えます。

2. **機能要件**
   - 利用者管理、書籍管理、貸出管理、ユーザーインターフェースの各機能が明確に記述されており、プロジェクト概要と矛盾する部分はありませんでした。
   - データ要件や非機能要件との連続性も保たれているように見えます。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
   - 表現や文体は比較的統一されており、読みやすいです。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。

3. **データ要件**
   - ユーザーテーブル、図書テーブル、貸出テーブルの各テーブル構造が明確に記述されており、機能要件と矛盾する部分はありませんでした。
   - データベーススキーマの柔軟な拡張可能性や正規化原則に従った設計など、データベース設計に関する基準も記述されています。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
   - データモデル図やデータフロー図も記述されており、機能要件との連続性も保たれているように見えます。

4. **非機能要件**
   - 性能、セキュリティ、拡張性に関する基準が明確に記述されており、プロジェクト概要や機能要件と矛盾する部分はありませんでした。
   - 「アクセス制御」項目では、ユーザーの権限に応じたアクセス制御について具体的な実装方法や制御レベルなどを記述する必要があります。また、「拡張性」項目で、アーキテクチャに関する基準も明確な要件に置き換える必要があります。
   - 表現や文体は比較的統一されており、読みやすいです。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。

以上、各タイトル間で関係性と連続性は保たれているようであり、表現や文体も比較的統一されています。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。また、「アクセス制御」項目と「拡張性」項目の基準も明確な要件に置き換える必要があります。

</details>

<details><summary><b>再度Sequence Chats</b></summary>
Writer: # プロジェクト概要

## 目的

本プロジェクトの目的は、図書館で利用するアプリケーションを開発し、貸出・書籍管理・利用者管理などの基本機能を実装することである。その後、少しずつ機能を拡張していく計画を立てている。

## 範囲

本プロジェクトの範囲は以下の通りである。

- アプリケーション開発
  - フロントエンド開発
  - バックエンド開発
  - データベース設計
- 機能実装
  - 利用者管理機能
    - ユーザー登録、ログイン、アカウント管理
  - 書籍管理機能
    - 図書の登録、検索、削除
  - 貸出管理機能
    - 貸出申請、貸出状況確認、返却処理

## 前提条件

本プロジェクトを実施するための前提条件は以下の通りである。

- プロジェクトチームの結成
  - フロントエンド開発者：2名
  - バックエンド開発者：2名
  - データベース設計者：1名
- 開発環境の整備
  - フロントエンド開発用PC、ツールなど
  - バックエンド開発用サーバー、ツールなど
  - データベース管理システムなど
- プロジェクトマネジメントツールの導入
Reviewer: **レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「プロジェクト概要」と項目「目的」、「範囲」、「前提条件」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 要件定義書は、各項目の内容が明確に記述されており、プロジェクトの目的や範囲、前提条件を正確に表現しています。ただし、「少しずつ機能を拡張していく計画」という部分は曖昧であり、より具体的な計画を記述することを推奨します。
- **適切な情報を提供しているか:** 要件定義書は、プロジェクトの目的や範囲、前提条件に関する必要な情報を提供しています。ただし、「開発環境の整備」項目では、具体的なツールやシステムなどが記述されていません。
- **適切なフォーマットで記述されているか:** 要件定義書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。また、最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 要件定義書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。
- **誤字脱字がないか:** 要件定義書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 要件定義書の表現と文体は、比較的統一されており、読みやすいです。ただし、「少しずつ機能を拡張していく計画」という部分は曖昧であり、より具体的な計画を記述することを推奨します。
- **その他の指摘:** 「開発環境の整備」項目では、具体的なツールやシステムなどが記述されていません。また、「プロジェクトマネジメントツールの導入」という部分は、プロジェクト全体に関する前提条件として適切かどうか疑問があります。

**改善点:**

1. 「少しずつ機能を拡張していく計画」という部分をより具体的な計画に置き換える。
2. 「開発環境の整備」項目で、具体的なツールやシステムなどを記述する。
3. 「プロジェクトマネジメントツールの導入」という部分は、プロジェクト全体に関する前提条件として適切かどうかを再検討する。

以上の改善点を反映し、要件定義書を修正することを推奨します。
Writer: # プロジェクト概要

## 目的

本プロジェクトの目的は、図書館で利用するアプリケーションを開発し、貸出・書籍管理・利用者管理などの基本機能を実装することである。その後、以下の計画に基づき機能を拡張していく予定である。

1. 機能拡張計画
	* 6ヶ月以内：図書館員向けの管理機能（図書の在庫調整、利用者の登録・削除など）を追加する。
	* 1年目中頃：図書検索機能の拡張（図書のカテゴリ別検索や図書のレビュー機能など）を実装する。
	* 1年半以内：利用者向けの機能強化（図書の予約機能や図書館内の位置情報サービスなど）を追加する。

## 範囲

本プロジェクトの範囲は以下の通りである。

- アプリケーション開発
	+ フロントエンド開発
		- React.js を使用したユーザーインターフェースの実装
	+ バックエンド開発
		- Node.js と Express.js を使用したサーバー側処理の実装
	+ データベース設計
		- MySQL を使用したデータベーススキーマの設計
- 機能実装
	+ 利用者管理機能
		- ユーザー登録、ログイン、アカウント管理
	+ 書籍管理機能
		- 図書の登録、検索、削除
	+ 貸出管理機能
		- 貸出申請、貸出状況確認、返却処理

## 前提条件

本プロジェクトを実施するための前提条件は以下の通りである。

- プロジェクトチームの結成
	+ フロントエンド開発者：2名（React.js の経験が必要）
	+ バックエンド開発者：2名（Node.js と Express.js の経験が必要）
	+ データベース設計者：1名（MySQL の経験が必要）
- 開発環境の整備
	+ フロントエンド開発用PC、React.js 用ツール（Create React App など）など
	+ バックエンド開発用サーバー、Node.js 用ツール（npm など）など
	+ データベース管理システム（MySQL Workbench など）
- プロジェクトマネジメントツールの導入
	+ JIRA を使用したプロジェクトの管理とチームコミュニケーション

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「プロジェクト概要」と項目「目的」、「範囲」、「前提条件」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 要件定義書は、各項目の内容が明確に記述されており、プロジェクトの目的や範囲、前提条件を正確に表現しています。また、「少しずつ機能を拡張していく計画」という部分を具体的な計画に置き換えてあります。
- **適切な情報を提供しているか:** 要件定義書は、プロジェクトの目的や範囲、前提条件に関する必要な情報を提供しています。また、「開発環境の整備」項目では、具体的なツールやシステムなどが記述されています。
- **適切なフォーマットで記述されているか:** 要件定義書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。また、最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 要件定義書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。
- **誤字脱字がないか:** 要件定義書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 要件定義書の表現と文体は、比較的統一されており、読みやすいです。また、「少しずつ機能を拡張していく計画」という部分を具体的な計画に置き換えてあります。
- **その他の指摘:** 「プロジェクトマネジメントツールの導入」という部分は、プロジェクト全体に関する前提条件として適切であり、要件定義書に記述されている内容と整合性が取れています。

**改善点:**

1. 特になし

以上のレビュー結果から、要件定義書は指示された形式と制限を守りつつ、プロジェクトの目的や範囲、前提条件に関する必要な情報を提供しており、正確かつ明確に記述されています。また、「少しずつ機能を拡張していく計画」という部分を具体的な計画に置き換えてあります。
Writer: # 機能要件

## システム機能の一覧

以下は、図書館アプリケーションで必要とされる主な機能の一覧である。

1. **利用者管理**
	* ユーザー登録
		+ 新規ユーザーの登録
		+ ユーザー情報の更新
	* ログイン/ログアウト
		+ ユーザーの認証とセッション管理
	* アカウント管理
		+ パスワードのリセット
		+ アカウントの削除
2. **書籍管理**
	* 図書の登録
		+ 新規図書の登録
		+ 図書情報の更新
	* 図書の検索
		+ キーワード検索
		+ カテゴリ別検索
		+ 評価順・人気順・新着順などで並び替え
	* 図書の削除
3. **貸出管理**
	* 貸出申請
		+ 図書の貸出申請
		+ 貸出日時の指定
	* 貸出状況確認
		+ ユーザーの貸出中図書一覧表示
		+ 貸出期限の通知
	* 返却処理
		+ 図書の返却
		+ 返却日時の記録

## ユースケース

以下は、主なユーザーとシステム間で実行されるユースケースである。

1. **新規ユーザー登録**
	* 新規ユーザーは、アプリケーションにアクセスして新規登録を選択する。
	* ユーザーは、必要な情報（名前、メールアドレス、パスワードなど）を入力し、送信する。
	* システムは、ユーザーの情報をデータベースに保存し、新規登録が完了したことを通知する。
2. **図書の貸出申請**
	* ユーザーは、図書検索機能を使用して目的の図書を探す。
	* ユーザーは、図書の詳細ページで「貸出申請」ボタンをクリックする。
	* システムは、ユーザーの貸出申請を受け付け、貸出可能な日時を確認し、貸出処理を実行する。
3. **図書の返却**
	* ユーザーは、「我的」ページで貸出中の図書一覧を表示させる。
	* ユーザーは、返却したい図書の「返却」ボタンをクリックする。
	* システムは、ユーザーの返却申請を受け付け、図書の貸出状態を更新し、返却処理を実行する。

## 画面・ユーザーインターフェース

以下は、主な画面とユーザーインターフェースに関する要件である。

1. **ログイン/ログアウト**
	* ユーザーは、メールアドレスとパスワードを入力してログインできる。
	* ログイン後、ユーザーのプロフィールページにリダイレクトされる。
	* ユーザーは、プロフィールページから簡単にログアウトできる。
2. **図書検索**
	* ユーザーは、キーワードやカテゴリで図書を検索できる。
	* 検索結果は、評価順・人気順・新着順などで並び替えられる。
	* 図書の詳細ページには、図書のタイトル、著者、カテゴリ、貸出状態、レビューなどが表示される。
3. **利用者管理**
	* ユーザーは、「我的」ページでユーザー情報を編集できる。
	* 図書館員は、「管理画面」からユーザーの登録・削除やアカウントの凍結などを行うことができる。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「機能要件」と項目「システム機能の一覧」、「ユースケース」、「画面・ユーザーインターフェース」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 機能要件書は、各機能やユースケースの内容が明確に記述されており、図書館アプリケーションの目的や範囲を正確に表現しています。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **適切な情報を提供しているか:** 機能要件書は、図書館アプリケーションで必要とされる主な機能やユースケースに関する必要な情報を提供しています。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **適切なフォーマットで記述されているか:** 機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。ただし、最大4000文字の制限に近づいているため、内容を簡潔にまとめる必要があります。
- **作成ルールに違反していないか:** 機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。ただし、最大4000文字の制限に近づいているため、内容を簡潔にまとめる必要があります。
- **誤字脱字がないか:** 機能要件書には、明確な誤字脱字は見当たりませんでした。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **表現や文体は統一感があるか:** 機能要件書の表現と文体は、比較的統一されており、読みやすいです。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **その他の指摘:** 「ユースケース」項目では、各ユースケースの流れを図やフローチャートで表現することで、よりわかりやすくなるかもしれません。また、「画面・ユーザーインターフェース」項目では、各画面のレイアウトやデザインに関する基準も記述する必要があります。

**改善点:**

1. 「柔軟に拡張可能なように」などの曖昧な用語を明確な要件に置き換える。
2. 最大4000文字の制限に近づいているため、内容を簡潔にまとめる。
3. 「ユースケース」項目で、各ユースケースの流れを図やフローチャートで表現する。
4. 「画面・ユーザーインターフェース」項目で、各画面のレイアウトやデザインに関する基準も記述する。
Reviewer: **レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「機能要件」と項目「システム機能の一覧」、「ユースケース」、「画面・ユーザーインターフェース」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 機能要件書は、各機能やユースケースの内容が明確に記述されています。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **適切な情報を提供しているか:** 機能要件書は、図書館アプリケーションで必要とされる主な機能やユースケースに関する必要な情報を提供しています。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **適切なフォーマットで記述されているか:** 機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。ただし、最大4000文字の制限に近づいているため、内容を簡潔にまとめる必要があります。
- **作成ルールに違反していないか:** 機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。ただし、最大4000文字の制限に近づいているため、内容を簡潔にまとめる必要があります。
- **誤字脱字がないか:** 機能要件書には、明確な誤字脱字は見当たりませんでした。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **表現や文体は統一感があるか:** 機能要件書の表現と文体は、比較的統一されており、読みやすいです。ただし、「柔軟に拡張可能なように」などの曖昧な用語が一部あり、明確な要件に置き換える必要があります。
- **その他の指摘:** 「ユースケース」項目では、各ユースケースの流れを図やフローチャートで表現することで、よりわかりやすくなるかもしれません。また、「画面・ユーザーインターフェース」項目では、各画面のレイアウトやデザインに関する基準も記述する必要があります。

**改善点:**

1. 「柔軟に拡張可能なように」などの曖昧な用語を明確な要件に置き換える。
2. 最大4000文字の制限に近づいているため、内容を簡潔にまとめる。
3. 「ユースケース」項目で、各ユースケースの流れを図やフローチャートで表現する。
4. 「画面・ユーザーインターフェース」項目で、各画面のレイアウトやデザインに関する基準も記述する。
Writer: **改善後機能要件**

## システム機能の一覧

以下は、図書館アプリケーションで必要とされる主な機能の一覧である。

1. **利用者管理**
	* ユーザー登録
		+ 新規ユーザーの登録（必須項目：名前、メールアドレス、パスワード）
		+ ユーザー情報の更新（任意項目：住所、電話番号、プロフィール画像など）
	* ログイン/ログアウト
		+ ユーザーの認証とセッション管理
	* アカウント管理
		+ パスワードのリセット（メールによるパスワード再設定リンク送信）
		+ アカウントの削除（図書館員権限でのみ可能）
2. **書籍管理**
	* 図書の登録
		+ 新規図書の登録（必須項目：タイトル、著者、カテゴリ、在庫数）
		+ 図書情報の更新（任意項目：ISBN、出版社、発行年、図書の状態など）
	* 図書検索
		+ キーワードやカテゴリで図書を検索できる。
		+ 検索結果は、評価順・人気順・新着順などで並び替えられる。
	* 図書の削除
		+ 図書館員権限でのみ可能。削除された図書は復元できない。
3. **貸出管理**
	* 貸出申請
		+ ユーザーは、図書検索機能を使用して目的の図書を探し、貸出申請を行うことができる。
		+ システムは、ユーザーの貸出申請を受け付け、貸出可能な日時を確認し、貸出処理を実行する。
	* 貸出状況確認
		+ ユーザーは、「我的」ページで貸出中の図書一覧を表示させることができる。
	* 返却処理
		+ ユーザーは、「我的」ページで返却したい図書の「返却」ボタンをクリックする。
		+ システムは、ユーザーの返却申請を受け付け、図書の貸出状態を更新し、返却処理を実行する。

## ユースケース

以下は、主なユースケースとその流れである。

### 新規ユーザー登録

1. ユーザーは、「新規登録」ボタンをクリックして新規登録画面に移動する。
2. ユーザーは、必要な情報（名前、メールアドレス、パスワード）を入力し、送信する。
3. システムは、ユーザーの情報をデータベースに保存し、新規登録が完了したことを通知する。

### 図書の貸出申請

1. ユーザーは、図書検索機能を使用して目的の図書を探す。
2. ユーザーは、図書の詳細ページで「貸出申請」ボタンをクリックする。
3. システムは、ユーザーの貸出申請を受け付け、貸出可能な日時を確認し、貸出処理を実行する。

### 図書の返却

1. ユーザーは、「我的」ページで貸出中の図書一覧を表示させる。
2. ユーザーは、返却したい図書の「返却」ボタンをクリックする。
3. システムは、ユーザーの返却申請を受け付け、図書の貸出状態を更新し、返却処理を実行する。

## 画面・ユーザーインターフェース

以下は、主な画面とユーザーインターフェースに関する要件である。

1. **ログイン/ログアウト**
	* ユーザーは、メールアドレスとパスワードを入力してログインできる。
	* ログイン後、ユーザーのプロフィールページにリダイレクトされる。
	* ユーザーは、プロフィールページから簡単にログアウトできる。
2. **図書検索**
	* ユーザーは、キーワードやカテゴリで図書を検索できる。
	* 検索結果は、評価順・人気順・新着順などで並び替えられる。
	* 図書の詳細ページには、図書のタイトル、著者、カテゴリ、貸出状態、レビューなどが表示される。
3. **利用者管理**
	* ユーザーは、「我的」ページでユーザー情報を編集できる。
	* 図書館員は、「管理画面」からユーザーの登録・削除やアカウントの凍結などを行うことができる。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「機能要件」と項目「システム機能の一覧」、「ユースケース」、「画面・ユーザーインターフェース」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 機能要件書は、各機能やユースケースの内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 機能要件書は、図書館アプリケーションで必要とされる主な機能やユースケースに関する必要な情報を提供しています。各機能の必須項目や任意項目なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 機能要件書の表現と文体は、比較的統一されており、読みやすいです。各機能やユースケースの内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし
Writer: # データ要件

## データベース要件一覧

以下は、図書館アプリケーションで使用する主なテーブルとカラムの一覧である。

### ユーザーテーブル

| カラム名 | データ型 | Null許容 | デフォルト値 | 説明 |
| --- | --- | --- | --- | --- |
| id | INT | No | AUTO_INCREMENT | ユーザーの一意なID |
| name | VARCHAR(50) | No |  | ユーザー名 |
| email | VARCHAR(100) | No |  | メールアドレス |
| password_hash | CHAR(64) | No |  | パスワードハッシュ値 |
| created_at | DATETIME | Yes | CURRENT_TIMESTAMP | アカウント作成日時 |
| updated_at | DATETIME | Yes | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | アカウント更新日時 |

### 図書テーブル

| カラム名 | データ型 | Null許容 | デフォルト値 | 説明 |
| --- | --- | --- | --- | --- |
| id | INT | No | AUTO_INCREMENT | 図書の一意なID |
| title | VARCHAR(255) | No |  | 図書タイトル |
| author | VARCHAR(100) | No |  | 著者名 |
| category_id | INT | No |  | カテゴリID（外部キー） |
| isbn | VARCHAR(13) | Yes |  | ISBN番号 |
| publisher | VARCHAR(100) | Yes |  | 出版社 |
| publication_year | INT | Yes |  | 発行年 |
| status_id | INT | No |  | 図書の状態ID（外部キー） |
| created_at | DATETIME | Yes | CURRENT_TIMESTAMP | 図書登録日時 |
| updated_at | DATETIME | Yes | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 図書更新日時 |

### 貸出テーブル

| カラム名 | データ型 | Null許容 | デフォルト値 | 説明 |
| --- | --- | --- | --- | --- |
| id | INT | No | AUTO_INCREMENT | 貸出の一意なID |
| user_id | INT | No |  | ユーザーID（外部キー） |
| book_id | INT | No |  | 図書ID（外部キー） |
| checkout_date | DATETIME | No |  | 貸出日時 |
| due_date | DATETIME | No |  | 返却予定日時 |
| return_date | DATETIME | Yes | NULL | 返却日時 |
| created_at | DATETIME | Yes | CURRENT_TIMESTAMP | 貸出登録日時 |
| updated_at | DATETIME | Yes | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 貸出更新日時 |

### カテゴリテーブル

| カラム名 | データ型 | Null許容 | デフォルト値 | 説明 |
| --- | --- | --- | --- | --- |
| id | INT | No | AUTO_INCREMENT | カテゴリの一意なID |
| name | VARCHAR(50) | No |  | カテゴリ名 |
| created_at | DATETIME | Yes | CURRENT_TIMESTAMP | カテゴリ作成日時 |
| updated_at | DATETIME | Yes | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | カテゴリ更新日時 |

### 図書の状態テーブル

| カラム名 | データ型 | Null許容 | デフォルト値 | 説明 |
| --- | --- | --- | --- | --- |
| id | INT | No | AUTO_INCREMENT | 図書の状態の一意なID |
| name | VARCHAR(50) | No |  | 図書の状態名（例：貸出中、在庫あり） |
| created_at | DATETIME | Yes | CURRENT_TIMESTAMP | 図書の状態作成日時 |
| updated_at | DATETIME | Yes | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 図書の状態更新日時 |

## データモデル

図書館アプリケーションで使用する主なテーブル間の関係を以下のデータモデル図に示す。

```mermaid
erDiagram

USER {
  id PK
  name
  email UK
  password_hash
  created_at
  updated_at
}

BOOK {
  id PK
  title
  author
  category_id FK
  isbn
  publisher
  publication_year
  status_id FK
  created_at
  updated_at
}

LOAN {
  id PK
  user_id FK
  book_id FK
  checkout_date
  due_date
  return_date
  created_at
  updated_at
}

CATEGORY {
  id PK
  name UK
  created_at
  updated_at
}

STATUS {
  id PK
  name UK
  created_at
  updated_at
}

USER ||--o{ LOAN : "borrows"
BOOK ||--o{ LOAN : "loaned_to"
USER ||--|| CATEGORY : "has_category"
BOOK ||--|| STATUS : "has_status"
```

## データフロー

以下は、図書館アプリケーションで使用する主なデータの流れを示すデータフロー図である。

```mermaid
graph TD;
    A[ユーザー登録] --> B[ユーザーテーブルに新規レコード作成];
    C[図書登録] --> D[図書テーブルに新規レコード作成];
    E[貸出申請] --> F[貸出テーブルに新規レコード作成];
    G[返却処理] --> H[貸出テーブルのreturn_dateを更新];
```

このデータフロー図は、ユーザー登録から図書の貸出までの主なデータの流れを示している。各プロセスで使用するテーブルやカラムも明確に記述されている。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「データ要件」と項目「データベース要件一覧」、「データモデル」、「データフロー」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** データ要件書は、各テーブルやカラムの内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** データ要件書は、図書館アプリケーションで使用する主なテーブルやカラムに関する必要な情報を提供しています。各テーブルの主キーや外部キーなども明確に記述されています。
- **適切なフォーマットで記述されているか:** データ要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** データ要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** データ要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** データ要件書の表現と文体は、比較的統一されており、読みやすいです。各テーブルやカラムの内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし
Reviewer: # 図書館アプリケーション開発プロジェクト要件定義書

## プロジェクト概要

### 目的

本プロジェクトの目的は、図書館で利用するためのアプリケーションを開発することである。このアプリケーションは、貸出・書籍管理・利用者管理などの基本的な機能を提供し、将来的に機能を拡張していく計画が立てられている。

### 範囲

本プロジェクトでは、以下の機能を実装することとされている：

1. **利用者管理**
   - 利用者の登録・更新・削除
   - 利用者の検索

2. **書籍管理**
   - 図書の登録・更新・削除
   - 図書の検索
   - 図書の貸出・返却の管理

3. **貸出管理**
   - 貸出の申請・承認・キャンセル
   - 貸出中の図書の一覧表示

4. **基本的なユーザーインターフェース**
   - 利用者と管理者向けの画面

### 前提条件

本プロジェクトでは、以下の前提条件が存在する：

- アプリケーションはWebアプリケーションとして開発される。
- 利用者と管理者は、それぞれ専用のログイン機能を持つ。
- 図書館の図書データは、既存のシステムから取得できるものとする。

**不要と判断しました：**
- アプリケーションのデバイス対応に関する要件
- セキュリティに関する詳細な要件
Writer: # 非機能要件

## 機能外の要件一覧

以下は、図書館アプリケーションで必要とされる主な非機能要件である。

1. **性能**
	* アプリケーションは、最大500名の利用者をサポートできるように設計すること。
	* 図書検索機能は、最大3秒以内に結果を返すこと。
	* 貸出申請や返却処理などの主要な操作は、最大5秒以内に完了すること。
2. **セキュリティ**
	* ユーザーのパスワードは、BCryptなどの強力なハッシュ関数を使用して保存すること。
	* セッション管理では、HTTPSを使用して通信を暗号化し、CSRF攻撃から保護すること。
	* 図書館員権限でのみ可能な操作は、ログインしたユーザーの権限を確認して実行すること。
3. **拡張性**
	* アプリケーションは、将来的に機能を追加しやすいように設計すること。
	* データベーススキーマは、柔軟に拡張可能なように設計すること。
	* アーキテクチャは、モジュール化されており、各機能が独立して開発・テスト・デプロイできるように設計すること。
4. **ユーザビリティ**
	* アプリケーションのユーザーインターフェースは、利用者にとって直感的で使いやすいものとすること。
	* 画面レイアウトや操作方法などは、利用者のフィードバックを反映して改善すること。
5. **互換性**
	* アプリケーションは、主なWebブラウザ（Chrome、Firefox、Safari、Edge）で動作すること。
	* 図書館員向けの管理機能は、デスクトップ環境でのみ利用可能とすること。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「非機能要件」と項目「機能外の要件一覧」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 非機能要件書は、各要件の内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 非機能要件書は、図書館アプリケーションで必要とされる主な非機能要件に関する必要な情報を提供しています。各要件の基準や制約なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 非機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 非機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 非機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 非機能要件書の表現と文体は、比較的統一されており、読みやすいです。各要件の内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし
Writer: # 非機能要件

## 機能外の要件一覧

以下は、図書館アプリケーションで必要とされる主な非機能要件である。

1. **性能**
	* アプリケーションは、最大500名の利用者をサポートできるように設計すること。
	* 図書検索機能は、最大3秒以内に結果を返すこと。
	* 貸出申請や返却処理などの主要な操作は、最大5秒以内に完了すること。
2. **セキュリティ**
	* ユーザーのパスワードは、BCryptなどの強力なハッシュ関数を使用して保存すること。
	* セッション管理では、HTTPSを使用して通信を暗号化し、CSRF攻撃から保護すること。
	* 図書館員権限でのみ可能な操作は、ログインしたユーザーの権限を確認して実行すること。
3. **拡張性**
	* アプリケーションは、将来的に機能を追加しやすいように設計すること。
	* データベーススキーマは、柔軟に拡張可能なように設計すること。具体的には、正規化原則に従った設計を行うこと。
	* アーキテクチャは、モジュール化されており、各機能が独立して開発・テスト・デプロイできるように設計すること。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「非機能要件」と項目「性能」、「セキュリティ」、「拡張性」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 非機能要件書は、各要件の内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 非機能要件書は、図書館アプリケーションで必要とされる主な非機能要件に関する必要な情報を提供しています。各要件の基準や制約なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 非機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 非機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 非機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 非機能要件書の表現と文体は、比較的統一されており、読みやすいです。各要件の内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし
Reviewer: # 図書館アプリケーション開発プロジェクト要件定義書

## プロジェクト概要

### 目的

本プロジェクトの目的は、図書館で利用するためのアプリケーションを開発することである。このアプリケーションは、貸出・書籍管理・利用者管理などの基本的な機能を提供し、将来的に機能を拡張していく計画が立てられている。

### 範囲

本プロジェクトでは、以下の機能を実装することとされている：

1. **利用者管理**
   - 利用者の登録・更新・削除
   - 利用者の検索

2. **書籍管理**
   - 図書の登録・更新・削除
   - 図書の検索
   - 図書の貸出・返却の管理

3. **貸出管理**
   - 貸出の申請・承認・キャンセル
   - 貸出中の図書の一覧表示

4. **基本的なユーザーインターフェース**
   - 利用者と管理者向けの画面

### 前提条件

本プロジェクトでは、以下の前提条件が存在する：

- アプリケーションはWebアプリケーションとして開発される。
- 利用者と管理者は、それぞれ専用のログイン機能を持つ。
- 図書館の図書データは、既存のシステムから取得できるものとする。

**不要と判断しました：**
- アプリケーションのデバイス対応に関する要件
- セキュリティに関する詳細な要件

## 機能要件

### 利用者管理

| 必須項目 | 任意項目 |
| --- | --- |
| 利用者ID（自動生成） | 利用者名 |
| メールアドレス | 生年月日 |
| パスワード | 電話番号 |
| ログイン可能な権限 | 住所 |

#### ユースケース

- **利用者登録**
  - 新規利用者は、必要項目を入力して登録する。
  - 管理者は、新規利用者の登録を承認する。

- **利用者更新**
  - 利用者は、自分のプロフィールを更新できる。
  - 管理者は、任意の利用者のプロフィールを更新できる。

- **利用者削除**
  - 管理者は、任意の利用者を削除できる。

- **利用者検索**
  - 利用者は、自分の登録情報を検索することができる。
  - 管理者は、任意の利用者を検索することができる。

### 書籍管理

| 必須項目 | 任意項目 |
| --- | --- |
| 図書ID（自動生成） | 図書名 |
| 分類 | 著者 |
| 発行年 | 出版社 |
| 在庫数 | 備考 |

#### ユースケース

- **図書登録**
  - 管理者は、新しい図書を登録する。

- **図書更新**
  - 管理者は、任意の図書の情報を更新できる。

- **図書削除**
  - 管理者は、任意の図書を削除できる。

- **図書検索**
  - 利用者は、図書をキーワードで検索することができる。
  - 管理者は、任意の図書を検索することができる。

### 貸出管理

| 必須項目 | 任意項目 |
| --- | --- |
| 貸出ID（自動生成） | 貸出日 |
| 利用者ID | 返却日 |
| 図書ID | 備考 |

#### ユースケース

- **貸出申請**
  - 利用者は、任意の図書を貸出申請する。

- **貸出承認**
  - 管理者は、貸出申請を承認する。

- **貸出キャンセル**
  - 利用者は、貸出申請をキャンセルする。
  - 管理者は、任意の貸出申請をキャンセルできる。

- **返却処理**
  - 利用者は、図書を返却する。
  - 管理者は、任意の図書の返却処理を行う。

- **貸出中一覧表示**
  - 利用者は、自分の貸出中の図書の一覧を表示することができる。
  - 管理者は、全ての貸出中の図書の一覧を表示することができる。

### 基本的なユーザーインターフェース

#### ユースケース

- **ログイン**
  - 利用者と管理者は、それぞれ専用のログイン画面からアプリケーションにログインすることができる。

- **利用者画面**
  - ログインした利用者は、図書検索や貸出申請などの機能を利用できる。

- **管理者画面**
  - ログインした管理者は、利用者管理や書籍管理などの機能を利用できる。

## データ要件

### ユーザーテーブル

| カラム名 | 型 |
| --- | --- |
| user\_id（主キー） | INT |
| name | VARCHAR(50) |
| email | VARCHAR(100) UNIQUE |
| password | VARCHAR(255) |
| birthdate | DATE |
| phone\_number | VARCHAR(20) |
| address | TEXT |
| role | ENUM('user', 'admin') |

### 図書テーブル

| カラム名 | 型 |
| --- | --- |
| book\_id（主キー） | INT |
| title | VARCHAR(100) |
| category | VARCHAR(50) |
| author | VARCHAR(50) |
| publication\_year | INT |
| publisher | VARCHAR(50) |
| stock | INT |
| note | TEXT |

### 貸出テーブル

| カラム名 | 型 |
| --- | --- |
| loan\_id（主キー） | INT |
| user\_id（外部キー） | INT |
| book\_id（外部キー） | INT |
| loan\_date | DATE |
| return\_date | DATE |
| note | TEXT |

## 非機能要件

### 性能

- アプリケーションは、最大500名の利用者をサポートできるように設計すること。
- 図書検索機能は、最大3秒以内に結果を返すこと。
- 貸出申請や返却処理などの主要な操作は、最大5秒以内に完了すること。

### セキュリティ

- ユーザーのパスワードは、BCryptなどの強力なハッシュ関数を使用して保存すること。
- セッション管理では、HTTPSを使用して通信を暗号化し、CSRF攻撃から保護すること。
- 図書館員権限でのみ可能な操作は、ログインしたユーザーの権限を確認して実行すること。

### 拡張性

- アプリケーションは、将来的に機能を追加しやすいように設計すること。
- データベーススキーマは、柔軟に拡張可能なように設計すること。具体的には、正規化原則に従った設計を行うこと。
- アーキテクチャは、モジュール化されており、各機能が独立して開発・テスト・デプロイできるように設計すること。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「非機能要件」と項目「性能」、「セキュリティ」、「拡張性」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 非機能要件書は、各要件の内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 非機能要件書は、図書館アプリケーションで必要とされる主な非機能要件に関する必要な情報を提供しています。各要件の基準や制約なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 非機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 非機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 非機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 非機能要件書の表現と文体は、比較的統一されており、読みやすいです。各要件の内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし
Writer: **レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「非機能要件」と項目「性能」、「セキュリティ」、「拡張性」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 非機能要件書は、各要件の内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 非機能要件書は、図書館アプリケーションで必要とされる主な非機能要件に関する必要な情報を提供しています。各要件の基準や制約なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 非機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 非機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 非機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 非機能要件書の表現と文体は、比較的統一されており、読みやすいです。各要件の内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし

</details>

<details><summary><b>最終的に完成した要件定義書</b></summary>

# プロジェクト概要

## 目的

本プロジェクトの目的は、図書館で利用するアプリケーションを開発し、貸出・書籍管理・利用者管理などの基本機能を実装することである。その後、以下の計画に基づき機能を拡張していく予定である。

1. 機能拡張計画
	* 6ヶ月以内：図書館員向けの管理機能（図書の在庫調整、利用者の登録・削除など）を追加する。
	* 1年目中頃：図書検索機能の拡張（図書のカテゴリ別検索や図書のレビュー機能など）を実装する。
	* 1年半以内：利用者向けの機能強化（図書の予約機能や図書館内の位置情報サービスなど）を追加する。

## 範囲

本プロジェクトの範囲は以下の通りである。

- アプリケーション開発
	+ フロントエンド開発
		- React.js を使用したユーザーインターフェースの実装
	+ バックエンド開発
		- Node.js と Express.js を使用したサーバー側処理の実装
	+ データベース設計
		- MySQL を使用したデータベーススキーマの設計
- 機能実装
	+ 利用者管理機能
		- ユーザー登録、ログイン、アカウント管理
	+ 書籍管理機能
		- 図書の登録、検索、削除
	+ 貸出管理機能
		- 貸出申請、貸出状況確認、返却処理

## 前提条件

本プロジェクトを実施するための前提条件は以下の通りである。

- プロジェクトチームの結成
	+ フロントエンド開発者：2名（React.js の経験が必要）
	+ バックエンド開発者：2名（Node.js と Express.js の経験が必要）
	+ データベース設計者：1名（MySQL の経験が必要）
- 開発環境の整備
	+ フロントエンド開発用PC、React.js 用ツール（Create React App など）など
	+ バックエンド開発用サーバー、Node.js 用ツール（npm など）など
	+ データベース管理システム（MySQL Workbench など）
- プロジェクトマネジメントツールの導入
	+ JIRA を使用したプロジェクトの管理とチームコミュニケーション

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「プロジェクト概要」と項目「目的」、「範囲」、「前提条件」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 要件定義書は、各項目の内容が明確に記述されており、プロジェクトの目的や範囲、前提条件を正確に表現しています。また、「少しずつ機能を拡張していく計画」という部分を具体的な計画に置き換えてあります。
- **適切な情報を提供しているか:** 要件定義書は、プロジェクトの目的や範囲、前提条件に関する必要な情報を提供しています。また、「開発環境の整備」項目では、具体的なツールやシステムなどが記述されています。
- **適切なフォーマットで記述されているか:** 要件定義書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。また、最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 要件定義書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。
- **誤字脱字がないか:** 要件定義書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 要件定義書の表現と文体は、比較的統一されており、読みやすいです。また、「少しずつ機能を拡張していく計画」という部分を具体的な計画に置き換えてあります。
- **その他の指摘:** 「プロジェクトマネジメントツールの導入」という部分は、プロジェクト全体に関する前提条件として適切であり、要件定義書に記述されている内容と整合性が取れています。

**改善点:**

1. 特になし

以上のレビュー結果から、要件定義書は指示された形式と制限を守りつつ、プロジェクトの目的や範囲、前提条件に関する必要な情報を提供しており、正確かつ明確に記述されています。また、「少しずつ機能を拡張していく計画」という部分を具体的な計画に置き換えてあります。

**改善後機能要件**

## システム機能の一覧

以下は、図書館アプリケーションで必要とされる主な機能の一覧である。

1. **利用者管理**
	* ユーザー登録
		+ 新規ユーザーの登録（必須項目：名前、メールアドレス、パスワード）
		+ ユーザー情報の更新（任意項目：住所、電話番号、プロフィール画像など）
	* ログイン/ログアウト
		+ ユーザーの認証とセッション管理
	* アカウント管理
		+ パスワードのリセット（メールによるパスワード再設定リンク送信）
		+ アカウントの削除（図書館員権限でのみ可能）
2. **書籍管理**
	* 図書の登録
		+ 新規図書の登録（必須項目：タイトル、著者、カテゴリ、在庫数）
		+ 図書情報の更新（任意項目：ISBN、出版社、発行年、図書の状態など）
	* 図書検索
		+ キーワードやカテゴリで図書を検索できる。
		+ 検索結果は、評価順・人気順・新着順などで並び替えられる。
	* 図書の削除
		+ 図書館員権限でのみ可能。削除された図書は復元できない。
3. **貸出管理**
	* 貸出申請
		+ ユーザーは、図書検索機能を使用して目的の図書を探し、貸出申請を行うことができる。
		+ システムは、ユーザーの貸出申請を受け付け、貸出可能な日時を確認し、貸出処理を実行する。
	* 貸出状況確認
		+ ユーザーは、「我的」ページで貸出中の図書一覧を表示させることができる。
	* 返却処理
		+ ユーザーは、「我的」ページで返却したい図書の「返却」ボタンをクリックする。
		+ システムは、ユーザーの返却申請を受け付け、図書の貸出状態を更新し、返却処理を実行する。

## ユースケース

以下は、主なユースケースとその流れである。

### 新規ユーザー登録

1. ユーザーは、「新規登録」ボタンをクリックして新規登録画面に移動する。
2. ユーザーは、必要な情報（名前、メールアドレス、パスワード）を入力し、送信する。
3. システムは、ユーザーの情報をデータベースに保存し、新規登録が完了したことを通知する。

### 図書の貸出申請

1. ユーザーは、図書検索機能を使用して目的の図書を探す。
2. ユーザーは、図書の詳細ページで「貸出申請」ボタンをクリックする。
3. システムは、ユーザーの貸出申請を受け付け、貸出可能な日時を確認し、貸出処理を実行する。

### 図書の返却

1. ユーザーは、「我的」ページで貸出中の図書一覧を表示させる。
2. ユーザーは、返却したい図書の「返却」ボタンをクリックする。
3. システムは、ユーザーの返却申請を受け付け、図書の貸出状態を更新し、返却処理を実行する。

## 画面・ユーザーインターフェース

以下は、主な画面とユーザーインターフェースに関する要件である。

1. **ログイン/ログアウト**
	* ユーザーは、メールアドレスとパスワードを入力してログインできる。
	* ログイン後、ユーザーのプロフィールページにリダイレクトされる。
	* ユーザーは、プロフィールページから簡単にログアウトできる。
2. **図書検索**
	* ユーザーは、キーワードやカテゴリで図書を検索できる。
	* 検索結果は、評価順・人気順・新着順などで並び替えられる。
	* 図書の詳細ページには、図書のタイトル、著者、カテゴリ、貸出状態、レビューなどが表示される。
3. **利用者管理**
	* ユーザーは、「我的」ページでユーザー情報を編集できる。
	* 図書館員は、「管理画面」からユーザーの登録・削除やアカウントの凍結などを行うことができる。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「機能要件」と項目「システム機能の一覧」、「ユースケース」、「画面・ユーザーインターフェース」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 機能要件書は、各機能やユースケースの内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 機能要件書は、図書館アプリケーションで必要とされる主な機能やユースケースに関する必要な情報を提供しています。各機能の必須項目や任意項目なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 機能要件書の表現と文体は、比較的統一されており、読みやすいです。各機能やユースケースの内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし

# 非機能要件

## 機能外の要件一覧

以下は、図書館アプリケーションで必要とされる主な非機能要件である。

1. **性能**
	* アプリケーションは、最大500名の利用者をサポートできるように設計すること。
	* 図書検索機能は、最大3秒以内に結果を返すこと。
	* 貸出申請や返却処理などの主要な操作は、最大5秒以内に完了すること。
2. **セキュリティ**
	* ユーザーのパスワードは、BCryptなどの強力なハッシュ関数を使用して保存すること。
	* セッション管理では、HTTPSを使用して通信を暗号化し、CSRF攻撃から保護すること。
	* 図書館員権限でのみ可能な操作は、ログインしたユーザーの権限を確認して実行すること。
3. **拡張性**
	* アプリケーションは、将来的に機能を追加しやすいように設計すること。
	* データベーススキーマは、柔軟に拡張可能なように設計すること。
	* アーキテクチャは、モジュール化されており、各機能が独立して開発・テスト・デプロイできるように設計すること。
4. **ユーザビリティ**
	* アプリケーションのユーザーインターフェースは、利用者にとって直感的で使いやすいものとすること。
	* 画面レイアウトや操作方法などは、利用者のフィードバックを反映して改善すること。
5. **互換性**
	* アプリケーションは、主なWebブラウザ（Chrome、Firefox、Safari、Edge）で動作すること。
	* 図書館員向けの管理機能は、デスクトップ環境でのみ利用可能とすること。

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「非機能要件」と項目「機能外の要件一覧」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 非機能要件書は、各要件の内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 非機能要件書は、図書館アプリケーションで必要とされる主な非機能要件に関する必要な情報を提供しています。各要件の基準や制約なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 非機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 非機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 非機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 非機能要件書の表現と文体は、比較的統一されており、読みやすいです。各要件の内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし

**レビュー結果**

- **指示内容に従っているか:** 指定されたタイトル「非機能要件」と項目「性能」、「セキュリティ」、「拡張性」が正しく記述されており、関係ない事項は作成されていませんでした。
- **正確かつ明確に記述されているか:** 非機能要件書は、各要件の内容が明確に記述されています。曖昧な用語は置き換えられ、明確な要件に整理されています。
- **適切な情報を提供しているか:** 非機能要件書は、図書館アプリケーションで必要とされる主な非機能要件に関する必要な情報を提供しています。各要件の基準や制約なども明確に記述されています。
- **適切なフォーマットで記述されているか:** 非機能要件書は、Markdown形式で記述されており、図・フローチャート・テーブル等も正しく表示されています。最大4000文字の制限内に収まっています。
- **作成ルールに違反していないか:** 非機能要件書は、指示された形式と制限を守り、ウェブサイト等のリンクや画像を利用していませんでした。また、最大4000文字の制限内に収まっています。
- **誤字脱字がないか:** 非機能要件書には、明確な誤字脱字は見当たりませんでした。
- **表現や文体は統一感があるか:** 非機能要件書の表現と文体は、比較的統一されており、読みやすいです。各要件の内容が明確に記述されています。
- **その他の指摘:** なし

**改善点:**

なし


</details>


# 振り返り
LLMに任せることで精度を上げていくことができましたが、Reviewerがうまく処理できていないところや、Writerの書き方が異なっていたりと、まだまだ課題がありました。このあたりはもっとプロンプトの作り方を工夫していく必要がありそうです。Mermaid形式がうまく作成できていない様子も見られました。
また、たくさんのAI同士の会話をする関係上、最終版が出来上がるまでに時間を要します。
今回はだいたい合計４万字の出力となり、終わるまでに20分くらいかかりました。さらにローカル環境だからなのか、途中で同じ言葉がずっと繰り返されるという症状も出たりしました。Autogenによる問題なのか、ローカル環境だからなのか、モデルに起因するところなのか検証が必要そうです。
ユーザーからの意見を途中で入力することも実装可能でしたが、ユーザーが介在する場合、待ち時間の発生は思ったよりもストレスになるように感じました。簡単なチャットであれば、ユーザーとの対話は問題ありませんが、AI同士の会話が間に入る場合、会話のタイミングも大切になるのではと思います。
課題がたくさん残りましたが、だからこそ工夫やアイデアを考えていく楽しみがあるとも言えるかもしれません(笑)。