プロジェクト

全般

プロフィール

バグ #565

未完了

【RAG UI開発】開発支援AIチャット画面実装

Redmine Admin さんが5日前に追加. 5日前に更新.

ステータス:
新規
優先度:
高め
担当者:
-
開始日:
2025-06-15
期日:
進捗率:

0%

予定工数:

説明

概要

RAGシステムのユーザーインターフェース開発。開発者が日常的に使いやすい、実用的なUIを構築する。

目的

  • 開発支援に特化したチャットインターフェース
  • インフラ状況の可視化
  • Redmine連携機能の直感的な操作

UI要件

1. メイン画面構成

┌─────────────────────────────────────────────────────┐
│  task2 RAG - 開発支援AIアシスタント                │
├─────────────┬─────────────────────┬─────────────────┤
│ サイドバー  │  チャットエリア     │ 情報パネル    │
│             │                     │                │
│ ・履歴      │  [会話表示]         │ ・コンテキスト │
│ ・お気に入り │                     │ ・ソース      │
│ ・設定      │  [入力欄]           │ ・アクション  │
└─────────────┴─────────────────────┴─────────────────┘

2. 主要コンポーネント

2.1 チャットエリア

  • 会話表示: ユーザーとAIの対話を時系列表示
  • コード表示: シンタックスハイライト対応
  • コピー機能: ワンクリックでコマンドやコードをコピー
  • ソース表示: 回答の根拠となった情報源を表示

2.2 クイックアクション

// よく使うアクション
- 最新のエラーログを確認
- Dockerコンテナの状態確認
- 関連するRedmineチケット検索
- デプロイ手順の確認

2.3 コンテキストパネル

  • 現在のインフラ状態(リアルタイム更新)
  • 最近の障害情報
  • 作業中のチケット情報

3. 技術スタック

  • フレームワーク: React 18
  • スタイリング: TailwindCSS 3
  • 状態管理: Zustand or Context API
  • アイコン: Lucide React
  • コード表示: react-syntax-highlighter
  • 通信: Axios + WebSocket(リアルタイム更新用)

4. デザイン要件

4.1 カラーテーマ

/* ダークモード対応 */
--primary: #3B82F6;     /* Blue 500 */
--secondary: #10B981;   /* Emerald 500 */
--warning: #F59E0B;     /* Amber 500 */
--error: #EF4444;       /* Red 500 */
--background: #111827;  /* Gray 900 */
--surface: #1F2937;     /* Gray 800 */

4.2 レスポンシブ対応

  • デスクトップ: 3カラムレイアウト
  • タブレット: 2カラム(サイドバー折りたたみ)
  • モバイル: 1カラム(タブ切り替え)

5. 機能要件

5.1 基本機能(MVP)

  • テキストベースのチャット
  • 基本的な質問応答
  • コード表示とコピー
  • ソース情報の表示
  • セッション保持

5.2 拡張機能(Phase 2)

  • チャット履歴の永続化
  • お気に入り質問の登録
  • Redmineチケット作成UI
  • インフラ状態のリアルタイム表示
  • ファイルアップロード対応

6. 画面遷移

/ai-chat (メイン)
├── /ai-chat/history      (履歴一覧)
├── /ai-chat/session/:id  (特定セッション)
├── /ai-chat/settings     (設定)
└── /ai-chat/help         (使い方)

7. コンポーネント構造

src/
├── pages/
│   └── AIChat/
│       ├── index.jsx
│       ├── History.jsx
│       └── Settings.jsx
├── components/
│   └── RAG/
│       ├── ChatArea/
│       │   ├── index.jsx
│       │   ├── MessageBubble.jsx
│       │   ├── CodeBlock.jsx
│       │   └── SourceInfo.jsx
│       ├── Sidebar/
│       │   ├── index.jsx
│       │   ├── SessionList.jsx
│       │   └── QuickActions.jsx
│       └── InfoPanel/
│           ├── index.jsx
│           ├── ContextDisplay.jsx
│           └── ActionButtons.jsx
├── hooks/
│   ├── useChat.js
│   ├── useWebSocket.js
│   └── useInfraStatus.js
└── services/
    ├── ragService.js
    └── redmineService.js

8. ユーザビリティ要件

8.1 パフォーマンス

  • 初回表示: 3秒以内
  • チャット応答表示: 即座に「入力中...」表示
  • コード補完: 100ms以内

8.2 アクセシビリティ

  • キーボードナビゲーション対応
  • スクリーンリーダー対応
  • ハイコントラストモード

8.3 エラーハンドリング

  • 接続エラー時の再試行
  • オフライン時のローカルキャッシュ
  • エラーメッセージの分かりやすい表示

9. 実装スケジュール

Week 1: 基本UI実装

  • Day 1-2: プロジェクトセットアップとコンポーネント構造
  • Day 3-4: チャットエリアの実装
  • Day 5-7: APIとの連携とテスト

Week 2: 機能拡張

  • Day 1-2: サイドバーと履歴機能
  • Day 3-4: コンテキストパネルと情報表示
  • Day 5-7: Redmine連携UI

Week 3: 最適化と品質向上

  • Day 1-2: レスポンシブ対応
  • Day 3-4: パフォーマンス最適化
  • Day 5: アクセシビリティ対応

10. 成果物

  1. ソースコード

    • Reactコンポーネント一式
    • カスタムフック
    • APIサービス層
  2. ドキュメント

    • コンポーネントカタログ
    • 使用方法ガイド
    • デザインシステム
  3. テスト

    • ユニットテスト
    • 統合テスト
    • E2Eテスト

関連チケット

  • #564: 【6月15日版RAG開発PJ】親チケット
  • #563: RAG付AIチャット機能実装(バックエンド)

受入条件

  1. 開発者が直感的に使えるUI
  2. 5秒以内にインフラ関連の質問に回答表示
  3. コードのコピー&ペーストが容易
  4. モバイルでも基本機能が使用可能

Redmine Admin さんが5日前に更新

html.call2arm.com での試験ページ展開計画

現在の構成確認

html.call2arm.com は静的ホスティング用に設定されています:

  • コンテナ: html-call2arm-nginx
  • ポート: 10080:80, 10443:443
  • プロキシ: html-call2arm-proxy

試験ページの展開方法

1. 静的ビルドのデプロイ

# Reactアプリをビルド
cd /var/docker/task2-service/app/web
npm run build

# html.call2arm.com のドキュメントルートにコピー
cp -r build/* /var/docker/html-call2arm/public/rag-demo/

2. アクセスURL

https://html.call2arm.com/rag-demo/

実装手順

  1. ビルド設定の調整

    • PUBLIC_URL環境変数の設定
    • API_BASE_URLの設定
  2. nginx設定

    • SPAルーティング対応
    • APIプロキシ設定
  3. 展開スクリプト作成

    • 自動ビルド
    • 自動デプロイ

これにより、localhost不要で直接アクセス可能な試験環境を構築できます。

Redmine Admin さんが5日前に更新

UIデザイン方針の更新 - LINEデザイン言語との互換性

既存task.call2arm.comのデザイン言語

task.call2arm.comがLINEのデザイン言語で構築されているため、RAG UIも同じデザインシステムに準拠して実装します。

LINEデザイン言語の特徴

  1. カラーパレット

    • Primary Green: #00B900
    • Secondary Colors: 明るく親しみやすい色調
    • Background: 白基調(ライトテーマ)
    • Text: 高コントラストで読みやすい
  2. タイポグラフィ

    • 日本語に最適化されたフォントサイズ
    • 明確な階層構造
    • 十分な行間と余白
  3. コンポーネント

    • 角丸のボタンとカード
    • 親しみやすいアイコン
    • 明確なタップ/クリックエリア
    • スムーズなアニメーション
  4. レイアウト

    • モバイルファースト
    • 直感的なナビゲーション
    • 情報の優先度が明確

UI実装の更新方針

1. カラースキームの変更

/* ダークテーマから LINEライトテーマへ */
:root {
  --primary-color: #00B900;        /* LINE Green */
  --primary-hover: #00A000;        /* Darker Green */
  --secondary-color: #3B5998;      /* Blue */
  --bg-primary: #FFFFFF;           /* White */
  --bg-secondary: #F7F7F7;         /* Light Gray */
  --bg-tertiary: #EEEEEE;          /* Lighter Gray */
  --text-primary: #1E1E1E;         /* Dark Text */
  --text-secondary: #707070;       /* Gray Text */
  --border-color: #E0E0E0;         /* Light Border */
  --shadow: 0 2px 4px rgba(0,0,0,0.1);
}

2. コンポーネントスタイル

  • ボタン: 角丸、シャドウ付き、押下感のあるアニメーション
  • カード: 白背景、軽いシャドウ、十分なパディング
  • 入力フィールド: 大きめのサイズ、明確なフォーカス状態
  • メッセージバブル: LINE風の吹き出しデザイン

3. アイコン使用

  • LINE SEED Font Icons または同等のアイコンセット
  • 親しみやすい丸みのあるアイコン
  • 適切なサイズと色使い

更新されたUI仕様

チャット画面のデザイン

┌─────────────────────────────────────────────┐
│  🟢 RAG AI Assistant                        │  <- LINEグリーンのヘッダー
├─────────────────────────────────────────────┤
│                                             │
│  ┌─────────────────────┐                   │
│  │ こんにちは!        │ <- ユーザー       │
│  └─────────────────────┘   (緑色バブル)   │
│                                             │
│  ┌─────────────────────┐                   │
│  │ お手伝いします      │ <- AI            │
│  └─────────────────────┘   (白色バブル)   │
│                                             │
├─────────────────────────────────────────────┤
│  [メッセージを入力...]  [送信]              │
└─────────────────────────────────────────────┘

実装上の注意点

  1. 既存システムとの一貫性: task.call2arm.comの既存UIと違和感のないデザイン
  2. アクセシビリティ: 高コントラスト、適切なフォントサイズ
  3. レスポンシブ: モバイルでも使いやすいUI
  4. パフォーマンス: 軽量で高速な表示

Redmine Admin さんが5日前に更新

UI実装方針の最適化 - 既存コンポーネントの流用

実装方針の変更

task2.call2arm.comの既存Reactコンポーネントを最大限活用し、RAG機能に必要な部品のみを追加実装する方式に変更します。

既存コンポーネントの確認

task2.call2arm.comで利用可能なコンポーネント:

  1. 基本UIコンポーネント

    • Button, Card, Modal, Input
    • Header, Sidebar, Layout
    • LoadingSpinner, ErrorBoundary
  2. タスク管理コンポーネント

    • TaskList, TaskCard
    • FilterBar, SearchBox
    • StatusBadge, PriorityIcon
  3. 共通機能

    • API通信フック (useApi)
    • 認証コンテキスト
    • テーマ設定

追加が必要なRAG専用コンポーネント

1. ChatMessage コンポーネント

// 既存のCardコンポーネントを拡張
import { Card } from '../shared/Card';

const ChatMessage = ({ message, isUser }) => {
  return (
    <Card 
      className={`chat-message ${isUser ? 'user' : 'assistant'}`}
      variant={isUser ? 'primary' : 'default'}
    >
      {/* メッセージ内容 */}
    </Card>
  );
};

2. SourceReference コンポーネント

// 既存のBadgeコンポーネントを活用
import { Badge } from '../shared/Badge';

const SourceReference = ({ sources }) => {
  return sources.map(source => (
    <Badge 
      key={source.id}
      variant={source.type}
      icon={getSourceIcon(source.type)}
    >
      {source.title}
    </Badge>
  ));
};

3. ChatInput コンポーネント

// 既存のInputとButtonを組み合わせ
import { Input, Button } from '../shared';

const ChatInput = ({ onSend }) => {
  return (
    <div className="chat-input-wrapper">
      <Input 
        placeholder="質問を入力..."
        onEnter={onSend}
      />
      <Button 
        icon="send"
        onClick={onSend}
        variant="primary"
      />
    </div>
  );
};

実装手順

  1. 既存コンポーネントのインポートマップ作成

    • shared/components からの一括インポート
    • スタイルシートの継承
  2. RAG専用コンポーネントの最小限実装

    • ChatMessage(メッセージ表示)
    • SourceReference(参照元表示)
    • ChatInput(入力エリア)
  3. 既存ページレイアウトの活用

    • MainLayout コンポーネントの利用
    • 既存のルーティング設定への追加

メリット

  • 開発工数の大幅削減
  • UIの一貫性確保
  • メンテナンス性の向上
  • バンドルサイズの最適化

Redmine Admin さんが5日前に更新

作業指示 - 既存コンポーネント活用版RAG UI実装

実装方針

task2.call2arm.comの既存Reactコンポーネントを最大限活用し、RAG機能に必要な最小限の追加実装を行う。

前提条件の確認

1. 既存コンポーネントの所在確認

# task2のソースコード構造確認
cd /var/docker/task2-service/app/web/src
ls -la components/

# 以下のディレクトリ構造を想定
components/
├── shared/          # 共通コンポーネント
│   ├── Button.jsx
│   ├── Card.jsx
│   ├── Input.jsx
│   ├── Badge.jsx
│   ├── Avatar.jsx
│   ├── CodeBlock.jsx
│   ├── LoadingSpinner.jsx
│   ├── StatusIndicator.jsx
│   ├── EmptyState.jsx
│   └── Tooltip.jsx
├── Layout/          # レイアウトコンポーネント
│   ├── MainLayout.jsx
│   ├── Sidebar.jsx
│   └── Header.jsx
└── ... 

2. 既存フックの確認

# カスタムフックの確認
ls -la hooks/
# useApi.js
# useInfraStatus.js
# useAuth.js

作業手順

Phase 1: ディレクトリ構造の作成(10分)

# AIChat機能用ディレクトリ作成
mkdir -p src/pages/AIChat/components

Phase 2: RAG専用コンポーネントの実装(1時間)

2.1 メインページコンポーネント
# src/pages/AIChat/index.jsx
# artifact: task2-rag-optimized-components から
# 既存のMainLayout, Card, Button等をインポート
2.2 追加コンポーネント(新規作成は4つのみ)
src/pages/AIChat/components/
├── ChatMessage.jsx      # メッセージ表示(既存Card拡張)
├── ChatInput.jsx        # 入力エリア(既存Input/Button組合せ)
├── SourceReferences.jsx # 参照元表示(既存Badge活用)
└── MessageContent.jsx   # コンテンツパーサー

Phase 3: 既存システムへの統合(30分)

3.1 ルーティング追加
// src/routes/index.jsx または同等ファイル
import AIChat from '../pages/AIChat';

// routesに追加
{
  path: '/ai-chat',
  element: <AIChat />,
  title: 'AI チャット'
}
3.2 ナビゲーション追加
// src/navigation/menuItems.js または同等ファイル
{
  id: 'ai-chat',
  title: 'AI チャット',
  icon: 'robot',  // 既存のアイコンシステムを使用
  path: '/ai-chat',
  badge: 'NEW'
}
3.3 API設定
// 既存のAPI設定ファイルに追加
const API_ENDPOINTS = {
  // 既存のエンドポイント...
  RAG_CHAT: '/api/rag/chat',
  RAG_SESSIONS: '/api/rag/sessions',
  RAG_STATS: '/api/rag/stats'
};

Phase 4: スタイル調整(30分)

4.1 既存テーマの拡張
/* 既存のスタイルシートに追加 */
.message-bubble {
  /* 既存のCard スタイルを継承 */
}

.chat-message.user {
  /* LINEグリーンを使用 */
  background-color: var(--primary-color);
}

.chat-message.assistant {
  /* 既存の背景色を使用 */
  background-color: var(--card-bg);
}

Phase 5: 動作確認(30分)

5.1 ローカルテスト
# 開発サーバーで確認
npm run dev

# ブラウザで確認
http://localhost:3006/ai-chat
5.2 ビルドテスト
# プロダクションビルド
npm run build

# バンドルサイズ確認
# 既存 + 最小限の増加(目標: +50KB以下)

実装における重要な注意点

1. インポートパスの確認

// 相対パスに注意
import { Card } from '../../components/shared/Card';
// または エイリアスを使用
import { Card } from '@/components/shared/Card';

2. 既存のデザインシステム準拠

  • カラー変数は既存のCSS変数を使用
  • spacing、border-radius等も既存の値を使用
  • アニメーションも既存のものを流用

3. 状態管理

  • 可能な限り既存のContext/Reduxを活用
  • RAG専用の状態は最小限に

4. エラーハンドリング

  • 既存のエラー処理パターンに従う
  • ErrorBoundaryコンポーネントの活用

確認チェックリスト

  • 既存コンポーネントの import が正しく機能している
  • UIデザインが既存のtask2と完全に一致している
  • 新規コードは最小限(4コンポーネントのみ)
  • バンドルサイズの増加が許容範囲内
  • 既存機能への影響がない
  • ルーティングが正しく動作
  • API通信が既存のパターンに従っている

デプロイ手順

# 1. ビルド
cd /var/docker/task2-service/app/web
npm run build

# 2. コンテナ再起動
cd /var/docker/task2-service
docker-compose restart task2-ui

# 3. 動作確認
curl -I https://task2.call2arm.com/ai-chat

完了後の確認URL

この実装により、最小限の労力で既存システムにRAG機能を統合できます。

他の形式にエクスポート: Atom PDF