AIホストクラブシステム:ユーザビリティ改善事例
📋 プロジェクト概要
システム名: AIホストクラブ
技術スタック: Python/Flask, JavaScript, SQLite
改修期間: 1日
改修内容: チャット継続機能のUX改善
🎯 改修の発端
妹からの貴重なフィードバック
開発したAIホストクラブシステムを実際に妹に使ってもらったところ、以下のような要望が出ました:
「1ターンずつでもいいと思う。でも『それでね』とか『でね』という言葉があったら、前の会話を引き継ぐようにできないかな?」
従来の仕様の問題点
- 固定的な会話スタイル: 必ず5ターン連続で会話が続く
- 柔軟性の欠如: ユーザーが途中で話題を変えたくても継続を強制される
- 自然な会話の阻害: 「それでね」などの継続表現を使いたいときの対応ができない
💡 解決アプローチの検討
当初検討した案
1. 自然言語処理による自動判定
// 継続表現の検知例
const continuationWords = ['それでね', 'でね', 'さっきの話だけど', 'あと', 'ちなみに'];
問題点:
- 実装コストが高い
- 誤判定のリスク
- ユーザーが知らないルール
2. ボタン分離方式
[新しい話題で送信] [続きを話す]
問題点:
- UIが複雑
- 操作が煩雑
3. チェックボックス方式 ✅
☐ 前の会話の続き
[送信]
採用理由:
- 実装が最も容易
- 判定エラーがゼロ
- 直感的な操作
🔧 実装プロセス
Step 1: 基本的なチェックボックス実装
HTML側の変更
<div>
<label>
<input type="checkbox" id="continue-previous-chat">
前の会話の続き
</label>
</div>
JavaScript側の制御
const isContinuation = document.getElementById('continue-previous-chat').checked;
if (isContinuation) {
// 前の会話を引き継ぎ
endpoint = '/continue_chat';
} else {
// 新しい会話
endpoint = '/start_chat';
}
Step 2: より複雑な要求への対応
妹からさらに詳細な要求が:
「3回まで会話を引き継いで、4回目、5回目は単発でもできるようにしたい」
これにより、ターン毎の柔軟な選択が必要であることが判明。
Step 3: 根本的な仕様見直し
問題の発見: セッション設計の誤解
- 当初:チェックなし = 1ターン限定チャット
- 実際の要望:1セッション5ターン内での話題切り替え
正しい仕様:
1セッション = 最大5ターン (固定)
├── ターン1: チェックなし → 新しい話題
├── ターン2: チェックあり → ターン1を引き継ぎ
├── ターン3: チェックなし → 新しい話題(ターン1-2は無視)
├── ターン4: チェックあり → ターン3を引き継ぎ
└── ターン5: 自動終了
Step 4: 継続フォームへのチェックボックス追加
継続フォームの改修
<div id="continue-chat-form">
<textarea id="continue-message"></textarea>
<!-- 新規追加 -->
<label>
<input type="checkbox" id="continue-previous-turn">
前のターンの続き
</label>
<button id="continue-chat-btn">送信する</button>
</div>
バックエンドでの会話履歴制御
if is_continuation:
# 全履歴を参照(前のターンを引き継ぎ)
conversation_history = ChatMessage.query.filter_by(
session_id=session_id
).order_by(ChatMessage.timestamp.asc()).all()
else:
# 履歴を参照しない(新しい話題)
conversation_history = None
📊 改修結果
Before(改修前)
- ❌ 5ターン強制継続
- ❌ 途中での話題変更不可
- ❌ 画面遷移による操作の複雑化
After(改修後)
- ✅ ターン毎の柔軟な選択
- ✅ 同一セッション内での話題切り替え
- ✅ 直感的なチェックボックス操作
- ✅ 自然な会話の流れを維持
使用例
【ユーザーの実際の使い方】
1ターン目: 「今日仕事で嫌なことがあった」(チェックなし)
2ターン目: 「それでね、上司に怒られて...」(チェックあり)
3ターン目: 「話変わるけど、今度旅行に行くんだ」(チェックなし)
4ターン目: 「その旅行先なんだけど...」(チェックあり)
5ターン目: 「全然関係ないけど最近の趣味は...」(チェックなし)
🎓 学んだこと
1. ユーザーテストの重要性
- 開発者の想定 ≠ 実際のユーザーニーズ
- 実際に使ってもらうことで見えてくる課題
- 妹という身近なユーザーからの率直なフィードバックの価値
2. 段階的な要求仕様の明確化
- 最初の要求:「1ターンずつでもいい」
- 詳細化された要求:「3回継続 + 2回単発」
- 最終的な本質:「ターン毎の柔軟な選択」
3. シンプルな解決策の効果
- 複雑な自然言語処理よりもシンプルなUI解決
- チェックボックス1つで複雑な要求を実現
- 実装コストとユーザビリティのバランス
4. 仕様設計の重要性
- セッション設計の根本的見直しの必要性
- 表面的な機能追加vs根本的な設計変更
- ユーザーの使用パターンを想定した設計の重要性
🔚 まとめ
本事例は、ユーザーフィードバックから始まる段階的な要求分析と、シンプルで効果的なUI解決の好例です。
技術的な複雑さに頼らず、ユーザーの自然な操作感を重視した設計により、柔軟で使いやすいチャットシステムを実現できました。
特に「妹テスト」という身近なユーザーテストの価値と、要求の段階的な明確化プロセスは、今後のシステム開発において重要な指針となる経験でした。