バグ #564
未完了【6月15日版RAG開発PJ】task2.call2arm.com マルチソースRAGシステム開発
0%
説明
プロジェクト概要¶
task2.call2arm.com環境にRAG(Retrieval-Augmented Generation)システムを実装し、業務効率化を実現する2025年6月15日版の開発プロジェクト。
目的¶
- Redmineチケット、ニュース記事、ドキュメントを統合的に検索・回答するAIシステムの構築
- Claude APIとOpenAI Embeddingsを活用した高精度な情報検索
- 既存のtask2環境への seamless な統合
主要機能¶
-
マルチデータソースRAG
- Redmineチケット検索・回答
- ニュース記事検索・回答
- ドキュメント検索・回答
-
AIチャットインターフェース
- 自然言語での質問対応
- コンテキストを考慮した回答生成
- 情報源の明示
-
ベクトル検索基盤
- PostgreSQL + pgvector
- OpenAI Embeddings
- 類似度ベース検索
技術スタック¶
バックエンド¶
- Node.js + Express
- PostgreSQL + pgvector
- Claude 3 Opus API
- OpenAI Embeddings API
フロントエンド¶
- React
- TailwindCSS
- リアルタイムチャットUI
インフラ¶
- Docker Compose
- Nginx
- SSL/TLS (Let's Encrypt)
開発フェーズ¶
Phase 1: 基盤構築(1週間)¶
- PostgreSQL + pgvector環境構築
- データベーススキーマ設計・実装
- 基本API構造の実装
Phase 2: バックエンド実装(2週間)¶
- RAGサービスコア機能
- データインデクサー実装
- RedmineIndexer
- NewsIndexer
- DocumentIndexer
- チャットAPI実装
Phase 3: フロントエンド実装(1週間)¶
- チャットUIコンポーネント
- リアルタイム応答機能
- ソース表示機能
Phase 4: 統合・テスト(1週間)¶
- システム統合テスト
- パフォーマンス最適化
- セキュリティ対策
Phase 5: デプロイ・運用(3日)¶
- 本番環境デプロイ
- 監視設定
- 運用ドキュメント作成
成果物¶
- RAG付AIチャットシステム(稼働中)
- 技術ドキュメント一式
- 運用マニュアル
- APIドキュメント
関連チケット¶
- #563: task2.call2arm.com - RAG付AIチャット機能実装(実装計画)
リソース¶
- 実装計画書
- セットアップスクリプト
- インデクサー実装コード
期待される効果¶
- 情報検索時間の大幅削減
- 過去のナレッジの有効活用
- チーム全体の生産性向上
- AIを活用した業務支援体制の確立
Redmine Admin さんが5日前に更新
RAG拡張詳細仕様書作成完了¶
作成内容¶
1. 画面追加仕様¶
-
AIチャット画面 (
/ai-chat
): メインのAIアシスタント機能 -
AI検索画面 (
/ai-search
): 高度な統合検索機能 -
AI管理画面 (
/ai-admin
): インデックス管理・パフォーマンス監視
2. 機能追加仕様¶
-
チャット機能拡張
- コンテキスト保持機能(最大10ターン)
- ソース詳細表示機能
- セッション管理
-
検索機能拡張
- ファセット検索
- セマンティック・キーワードのハイブリッド検索
- 類似ドキュメント検索
-
管理機能拡張
- リアルタイムインデックス統計
- スケジュール再インデックス
- パフォーマンスモニタリング
3. API関数追加(12エンドポイント)¶
-
/api/rag/chat/contextual
- コンテキスト付きチャット -
/api/rag/chat/history/:sessionId
- チャット履歴取得 -
/api/rag/search/advanced
- 高度な検索 -
/api/rag/search/similar
- 類似ドキュメント検索 -
/api/rag/admin/reindex
- インデックス再構築 -
/api/rag/admin/index/:sourceType
- インデックス削除 - 他6エンドポイント
4. 詳細関数実装¶
- EmbeddingGenerator: バッチ処理・キャッシュ・リトライ機能付き
- TextChunker: 日本語対応の文章分割・オーバーラップ処理
- AnswerGenerator: テンプレートベースの構造化回答生成
- PerformanceMonitor: 詳細なパフォーマンスメトリクス収集
5. データベース拡張¶
- 4つの新規テーブル追加
- パフォーマンス最適化インデックス
- 日本語全文検索対応
6. フロントエンドコンポーネント¶
- ChatHistoryコンポーネント
- QuickActionsコンポーネント
- SourceViewerコンポーネント
- 検索結果表示コンポーネント
技術的特徴¶
- スケーラビリティ: バッチ処理とキャッシング
- 信頼性: リトライ機構とエラーハンドリング
- パフォーマンス: 最適化されたインデックス構造
- UX: 直感的なUIとリアルタイム応答
関連ドキュメント¶
- 詳細仕様書(artifact: task2-rag-extension-details)
これらの拡張により、task2は単なるタスク管理ツールから、AI駆動の総合業務支援プラットフォームへと進化します。
Redmine Admin さんが5日前に更新
実装優先順位と段階的リリース計画¶
Phase 1: 基本RAG機能(第1週)¶
目標: 最小限のRAG機能を実装し、基本的な質問応答を可能にする
-
バックエンド基盤
- PostgreSQL + pgvector環境構築
- 基本的なエンベディング生成(EmbeddingService)
- シンプルなRAGService実装
-
初期データインデックス
- Redmineチケットのインデックス作成
- 基本的な類似検索機能
-
最小限のAPI
- POST /api/rag/chat(基本チャット)
- GET /api/rag/stats(統計情報)
Phase 2: UI統合とUX改善(第2週)¶
目標: ユーザーが実際に使えるインターフェースを提供
-
フロントエンド実装
- AIチャット画面の基本実装
- メッセージ表示とローディング状態
- レスポンシブデザイン対応
-
データソース拡張
- ニュース記事のインデックス追加
- ドキュメントファイルのインデックス追加
-
エラーハンドリング
- ユーザーフレンドリーなエラーメッセージ
- 接続エラー時のリトライ機能
Phase 3: 高度な機能追加(第3-4週)¶
目標: 生産性を大幅に向上させる高度な機能を実装
-
コンテキスト管理
- セッション管理機能
- 会話履歴の保持と参照
- コンテキストを考慮した回答生成
-
検索機能強化
- ファセット検索の実装
- ハイブリッド検索(セマンティック+キーワード)
- 類似ドキュメント検索
-
管理機能
- AI管理画面の実装
- インデックス管理機能
- パフォーマンスモニタリング
Phase 4: 最適化と品質向上(第5週)¶
目標: 本番環境での安定稼働とパフォーマンス最適化
-
パフォーマンス最適化
- バッチ処理の実装
- キャッシング戦略
- インデックス最適化
-
品質保証
- E2Eテストの実装
- 負荷テストの実施
- セキュリティ監査
-
運用準備
- 監視ダッシュボード設定
- アラート設定
- 運用ドキュメント作成
技術的判断ポイント¶
1. ベクトルDBの選択¶
-
PostgreSQL + pgvector(推奨)
- 既存インフラとの統合が容易
- 運用ノウハウの活用可能
- トランザクション整合性
-
代替案: Pinecone, Weaviate
- より高性能だが運用コスト増
- Phase 3以降で検討
2. エンベディングモデル¶
-
OpenAI text-embedding-ada-002(初期実装)
- コスト効率が良い
- 十分な精度
-
将来的な選択肢
- OpenAI text-embedding-3-small/large
- 日本語特化モデル
3. チャンキング戦略¶
- 初期: 固定サイズ(500トークン)
- 改善版: センテンス境界考慮
- 最適化版: セマンティックチャンキング
リスクと対策¶
1. パフォーマンスリスク¶
- リスク: 大量データでの検索速度低下
-
対策:
- 段階的なインデックス作成
- 適切なキャッシング
- 必要に応じて専用ベクトルDBへ移行
2. コストリスク¶
- リスク: API利用料の増大
-
対策:
- 利用量モニタリング
- キャッシングによる重複削減
- レート制限の実装
3. 品質リスク¶
- リスク: 不正確な回答や情報漏洩
-
対策:
- 回答の信頼度スコア表示
- ソース情報の明示
- アクセス制御の実装
成功指標(KPI)¶
定量的指標¶
- 平均応答時間: 3秒以内
- 検索精度: 関連性スコア80%以上
- システム稼働率: 99.5%以上
- 日次アクティブユーザー: 50名以上
定性的指標¶
- ユーザー満足度: アンケートで4.0/5.0以上
- 情報検索時間: 従来比50%削減
- 誤回答率: 5%以下
次のアクション¶
-
環境準備(今日中)
- VPS環境でのPostgreSQL + pgvector設定
- 開発用APIキーの取得と設定
-
初期実装(今週中)
- 基本的なエンベディング生成機能
- Redmineチケットの初回インデックス作成
- 簡易チャットAPIの実装
-
デモ環境構築(来週前半)
- task2環境でのデモ版公開
- 初期ユーザーからのフィードバック収集
これらの計画に基づいて、着実に実装を進めていきます。
Redmine Admin さんが5日前に更新
利用シナリオに基づく設計方針の明確化¶
目指すRAGチャットの姿¶
「自己進化する開発支援AI」 - 開発者の作業コンテキストを深く理解し、プロジェクト固有の知識を活用して最適な支援を提供するシステム
主要利用シナリオ¶
1. 開発作業管理・設計支援¶
開発者「task2のAPIにキャッシュ機能を追加したい」
↓
RAGチャット:
- 過去の類似実装(#172のnginx設定問題)を参照
- 現在のインフラ構成(33コンテナ、Docker Compose)を考慮
- 具体的な実装提案とリスク警告を提示
- 関連チケットの自動作成
2. インフラ固有の問題解決¶
開発者「task2-uiのヘルスチェックが断続的に失敗する」
↓
RAGチャット:
- 過去の障害パターン(IPv6/IPv4名前解決問題)を分析
- 現在のnginx設定とDockerネットワーク構成を確認
- 段階的なトラブルシューティング手順を提案
3. プロジェクト立ち上げ支援¶
開発者「新規マーケティングプロジェクトを開始したい」
↓
RAGチャット:
- プロジェクトテンプレートの提案
- 必要なチケット階層の自動生成
- タスク分解と工数見積もり
- 過去の類似プロジェクトからの学習事項
実装アプローチの調整¶
Phase 1改訂: コンテキスト重視の基盤構築¶
-
プロジェクト固有知識の優先インデックス化
// 優先度の高いデータソース const priorityIndexing = { 1: 'インフラ構成ドキュメント(VPS仕様書)', 2: '障害対応チケット(#100-#200の緊急対応)', 3: '開発標準プラクティス', 4: 'docker-compose.yml、nginx設定ファイル' };
-
コンテキスト認識エンジン
class ContextAwareRAG { async analyzeQuery(query) { // クエリから作業コンテキストを推定 const context = await this.detectContext(query); // コンテキストに応じた検索戦略を選択 if (context.type === 'infrastructure') { return this.searchWithInfraContext(query); } else if (context.type === 'development') { return this.searchWithDevContext(query); } } }
-
動的プロンプトテンプレート
const contextualPrompts = { infrastructure: ` 現在のVPS環境構成を考慮してください: - 33コンテナ稼働中 - Docker Compose + Nginx + SNI - 過去の障害: {recentIssues} 質問: {query} `, development: ` 開発標準に従って回答してください: - 技術スタック: React + TailwindCSS - ワークフロー: SSH→VS Code→MCP→テスト - 必須: Redmineチケット作成 質問: {query} ` };
Phase 2改訂: アクション実行機能¶
-
自動チケット作成機能
class TicketAutoCreation { async createFromChat(conversation, projectType) { const tickets = await this.generateTicketHierarchy( conversation, projectType ); // 親チケット作成 const parent = await this.createRedmineTicket(tickets.parent); // 子チケット一括作成 for (const child of tickets.children) { await this.createRedmineTicket({ ...child, parent_issue_id: parent.id }); } return { parent, children: tickets.children }; } }
-
コード生成とファイル更新
class CodeAssistant { async generateAndApply(request, context) { // 既存コードの分析 const analysis = await this.analyzeExistingCode(context.files); // 安全な変更提案 const changes = await this.generateChanges(request, analysis); // プレビューと確認 const preview = await this.previewChanges(changes); // 適用(バックアップ付き) if (preview.approved) { await this.applyChangesWithBackup(changes); } } }
特殊機能の実装¶
1. プロジェクト学習機能¶
class ProjectLearning {
async learnFromProject(projectId) {
// チケット履歴から学習
const tickets = await this.fetchProjectTickets(projectId);
const patterns = await this.extractPatterns(tickets);
// 成功/失敗パターンの抽出
const insights = {
successPatterns: patterns.filter(p => p.outcome === 'success'),
failurePatterns: patterns.filter(p => p.outcome === 'failure'),
avgCompletionTime: this.calculateAvgTime(tickets),
commonIssues: this.findCommonIssues(tickets)
};
// 学習結果をRAGに統合
await this.updateRAGKnowledge(insights);
}
}
2. 製品仕様ベース応答¶
class SpecificationBasedRAG {
async handleProductQuery(query, attachedSpecs) {
// 仕様書の解析
const specs = await this.parseSpecifications(attachedSpecs);
// 仕様に基づいたコンテキスト構築
const context = {
productFeatures: specs.features,
technicalConstraints: specs.constraints,
businessRules: specs.rules
};
// 仕様準拠の回答生成
return await this.generateSpecCompliantAnswer(query, context);
}
}
データ構造の拡張¶
-- プロジェクトコンテキストテーブル
CREATE TABLE project_contexts (
id SERIAL PRIMARY KEY,
project_id INTEGER,
context_type VARCHAR(50), -- 'infrastructure', 'development', 'marketing'
learned_patterns JSONB,
success_metrics JSONB,
common_issues JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- アクション履歴テーブル
CREATE TABLE rag_actions (
id SERIAL PRIMARY KEY,
session_id UUID,
action_type VARCHAR(50), -- 'create_ticket', 'update_code', 'generate_report'
action_details JSONB,
result JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 仕様書管理テーブル
CREATE TABLE product_specifications (
id SERIAL PRIMARY KEY,
product_name VARCHAR(255),
version VARCHAR(50),
specification JSONB,
embedding vector(1536),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
UI/UXの最適化¶
開発者向けチャットUI¶
const DeveloperChat = () => {
return (
<div className="flex h-full">
{/* コンテキスト表示エリア */}
<div className="w-64 bg-gray-900 text-white p-4">
<CurrentContext
project={currentProject}
infrastructure={infraStatus}
recentIssues={recentIssues}
/>
</div>
{/* メインチャット */}
<div className="flex-1">
<ChatArea
onCodeGenerate={handleCodeGenerate}
onTicketCreate={handleTicketCreate}
onSpecAttach={handleSpecAttach}
/>
</div>
{/* アクションパネル */}
<div className="w-80 border-l">
<ActionPanel
suggestedActions={suggestedActions}
recentActions={recentActions}
/>
</div>
</div>
);
};
期待される効果¶
-
開発効率の向上
- コンテキストを踏まえた的確な回答
- 過去の失敗パターンを避ける提案
- 自動的なタスク管理
-
知識の蓄積と活用
- プロジェクト固有のノウハウ蓄積
- チーム全体での知識共有
- 新規メンバーのオンボーディング短縮
-
品質向上
- 過去のバグパターンに基づく予防
- 仕様準拠の確実な実装
- 標準プラクティスの自動適用
この方向性で実装を進めることで、単なるQ&Aツールではなく、真の開発パートナーとなるAIシステムを構築します。
Redmine Admin さんが5日前に更新
MVP実装計画策定完了 - 開発支援特化版¶
実装方針の転換¶
従来の汎用的なRAGから、**「自己進化する開発支援AI」**として明確に方向性を定義。実際の開発作業での即座の価値提供を最優先に設計。
MVP機能(第1週で実装)¶
1. インフラ構成認識RAG¶
目的: 複雑なインフラ構成を理解した的確な回答
初期インデックス対象:
-
/root/nginx-proxy/conf.d/*.conf
- nginx設定 -
/var/docker/*/docker-compose.yml
- 全サービス構成 -
~/Documents/仕様書/*.md
- システム仕様書 - Redmineチケット #150-#200 - 最近の障害対応
動作例:
Q: "task2-uiのヘルスチェックが断続的に失敗します"
A: "過去の事例 #172 を参照すると、IPv6/IPv4の名前解決問題の可能性があります。
現在の設定を確認したところ、ヘルスチェックでlocalhostを使用しています。
以下の対処を推奨:
1. docker logs task2-ui で詳細確認
2. ヘルスチェックを127.0.0.1に変更
[具体的なコード例と手順を表示]"
2. 開発ワークフロー統合¶
自動チケット作成機能:
- 開発要件の解析
- Redmineチケットの自動生成
- 子チケットへのタスク分解
- 工数見積もり
コード変更支援:
- 現在のコードを解析
- 過去の類似変更を検索
- 安全な変更提案とリスク警告
- バックアップとテストコマンド生成
3. プロジェクト学習機能¶
- 成功/失敗パターンの抽出
- チーム固有のベストプラクティス
- 障害傾向の分析と予防提案
実装アプローチ¶
30分で開始できるMVPセットアップ¶
- PostgreSQL + pgvector環境(Docker追加)
- 最小限のスキーマ(knowledge_chunks テーブル)
- インフラ設定の自動インデックス化
- シンプルなチャットAPI
- 基本的なWeb UI
セットアップコマンド(1行)¶
cd /var/docker/task2-service && wget -O setup-mvp.sh [URL] && bash setup-mvp.sh
具体的な価値提供¶
開発効率の向上¶
- 現在: インフラ問題の調査に30分以上
- RAG導入後: 過去の事例から即座に解決策提示(5分以内)
知識の蓄積と共有¶
- 現在: 個人の経験に依存、引き継ぎ困難
- RAG導入後: チーム全体の知識を体系化、新メンバーも即戦力
プロジェクト管理の自動化¶
- 現在: 手動でチケット作成、タスク分解
- RAG導入後: 要件から自動的にチケット階層生成
Week 1 実装スケジュール¶
Day 1-2: データベース環境構築
- PostgreSQL + pgvector セットアップ
- 基本スキーマ作成
Day 3-4: インフラ設定のインデックス化
- nginx/Docker設定の読み込み
- Redmine最新チケットの取得
Day 5-7: 基本チャット機能
- 質問応答API実装
- インフラコンテキスト付き回答
- MVP版Web UI
次のイテレーション計画¶
Week 2: Redmine連携強化
- チケット自動作成の実装
- 関連チケット検索機能
- 進捗レポート生成
Week 3: コード生成支援
- 安全なコード変更提案
- テストコード生成
- デプロイスクリプト生成
Week 4: 学習機能実装
- パターン分析エンジン
- ベストプラクティス抽出
- 自動的な知識更新
成功の定義(MVP段階)¶
- インフラ関連の質問に正確に回答(精度80%以上)
- 過去の障害パターンを認識(関連チケット提示)
- 基本的なチケット作成支援(手動作業50%削減)
- 日常的に使われる(1日5回以上の利用)
アーティファクト¶
- MVP実装計画書(artifact: task2-rag-mvp-implementation)
- 即座に使えるセットアップスクリプト
- 最小限のUIコンポーネント
このMVPアプローチにより、理論的な完璧さよりも実用性を重視し、実際の開発作業で今すぐ価値を提供できるシステムを構築します。
Redmine Admin さんが5日前に更新
MVP実装開始¶
Day 1: データベース環境構築を開始します。
実装場所: /var/docker/task2-service
作業内容: PostgreSQL + pgvector環境のセットアップ
Redmine Admin さんが5日前に更新
MVP実装完了報告 📋¶
実装期間¶
2025-06-15 20:40 - 21:05 (25分間)
実装概要¶
既存のRedmine UIを保持しつつ、RAG AI機能を疎結合なプラグインとして統合
成果物 ✅¶
-
PostgreSQL + pgvector データベース環境 - 完了
- 既存DB活用、テーブル構造確認済み
- ベクトル検索機能動作確認済み
-
RAGインデクサー実装 - 完了
- InfraIndexer.js (nginx設定、docker設定、Redmineチケット対応)
- 手動テスト済み、正常動作確認
-
RAGチャットサービス - 完了
- RAGChatService.js (OpenAI Embeddings + Claude API)
- ベクトル検索とAI回答生成機能
-
プラグイン型UI実装 - 完了
- rag-plugin.js (疎結合なJavaScriptプラグイン)
- 既存Redmine UIに影響を与えない設計
- 右下フローティングチャットウィジェット
アーキテクチャ特徴 🏗️¶
- 疎結合設計: 既存Redmine UIとの独立性保持
- プラグイン型: 有効/無効切り替え可能
- API分離: RESTful API経由での連携
- UI非侵略: 既存UIに影響なし
動作確認 ✅¶
- データベース接続: OK
- ベクトル埋め込み生成: OK
- 類似度検索: OK (0.467 similarity)
- チャット応答: OK
アクセス方法¶
- URL: https://task2.call2arm.com/redmine-ui/
- RAGプラグイン: 右下の🤖ボタンをクリック
技術スタック¶
- Backend: Node.js + PostgreSQL + pgvector
- AI: OpenAI Embeddings + Claude API
- Frontend: JavaScript Plugin (vanilla)
- Integration: RESTful API
今後の拡張計画¶
- Redmineチケット#150-200の自動インデックス化
- インフラ設定ドキュメントの追加
- 応答精度の向上
- ユーザーフィードバック機能
MVP実装完了 🎉