操作
機能 #256
未完了RAG AIアドバイザー - Phase 1 デバッグ: tiktoken Uint8Array 問題
ステータス:
解決
優先度:
高め
担当者:
-
開始日:
2025-06-05
期日:
進捗率:
0%
予定工数:
説明
問題概要¶
task2.call2arm.com のRAG AIアドバイザー開発において、Phase 1の埋め込み生成段階で重要な問題が発生しています。
技術的問題¶
エラー: ValidationError [SequelizeValidationError]: string violation: content cannot be an array or an object
根本原因: OpenAIServiceのsplitTextIntoChunks
メソッドがUint8Arrayを返しており、Sequelize Documentモデルが文字列を期待しているためにバリデーションエラーが発生。
現在の状況¶
- ✅ OpenAI API統合は正常動作(単一埋め込み生成テスト成功)
- ✅ PostgreSQL + pgvector データベース接続正常
- ✅ Sequelize ORM設定完了
- ❌ ドキュメント処理API(/api/embeddings/process-document)でエラー発生
技術的詳細¶
tiktoken ライブラリの問題¶
// 現在の問題のあるコード
const chunkText = this.encoding.decode(chunkTokens); // Uint8Arrayを返す
chunks.push(chunkText); // Sequelizeがstring期待だがUint8Array受信
// 必要な修正
const decodedBytes = this.encoding.decode(chunkTokens);
const chunkText = new TextDecoder().decode(decodedBytes);
chunks.push(chunkText);
データベーススキーマ不整合の発見と修正¶
- documentsテーブル: 正常
- document_chunksテーブル: フィールド名不一致修正済み(chunk_index, token_count)
- embeddingsテーブル: 別テーブル化(vector(1536)型使用)
実行済み修正¶
- Chunkモデル修正(snake_case対応)
- Embeddingモデル新規作成
- モデル関係性設定
- embeddingsController修正
- tiktoken decode問題修正試行
次回セッション時の作業計画¶
即座実行事項¶
# 1. ファイルキャッシュクリア+コンテナ完全再構築
docker stop task2-api && docker rm task2-api
docker rmi task2-service_task2-api
docker-compose build --no-cache task2-api
docker-compose up -d task2-api
# 2. tiktoken問題の完全解決
# ファイル直接編集でNode.jsキャッシュ回避
代替解決アプローチ¶
- シンプルな文字列分割: tiktokenを使わずに文字数ベースの分割に変更
- ライブラリ更新: tiktoken最新版への更新
- Buffer変換: Uint8ArrayからBufferを経由した文字列変換
成功基準¶
curl -X POST -k -H 'Host: task2.call2arm.com' -H 'Content-Type: application/json' \
-d '{"text": "RAG AIアドバイザー Phase 1 完了テスト!", "title": "Phase 1 完了記念ドキュメント"}' \
https://localhost/api/embeddings/process-document
期待レスポンス:
{
"message": "ドキュメントの処理が完了しました",
"document": {...},
"chunks": [...],
"processingTime": "...",
"tokenCount": "..."
}
影響範囲¶
- Phase 1 完了が遅延
- Phase 2(ベクトル検索)開始に影響
- 全体の6週間開発スケジュールに軽微な影響
環境情報¶
- VPS: Ubuntu 24.04.2 @ 85.131.243.51
- コンテナ: task2-api (Node.js 18-alpine)
- データベース: PostgreSQL + pgvector
- 開発環境: /var/docker/task2-service/
Redmine Admin さんが3日前に更新
進捗更新: tiktoken問題対策実施¶
実施済み対策¶
-
✅ OpenAIService.splitTextIntoChunks() を文字数ベース分割に変更
- tiktokenのUint8Array問題を回避
- シンプルな文字列分割アルゴリズムを実装
-
✅ データベースモデル修正完了
- Chunkモデル: snake_case対応 (chunk_index, token_count)
- Embeddingモデル: 新規作成 (vector(1536)型)
- リレーションシップ設定
-
✅ コンテナ完全再構築実行
- 古いイメージ削除
- --no-cache でクリーンビルド
現在の課題¶
構文エラー: embeddingsController.js の構文問題でコンテナが起動失敗
次の対策¶
- embeddingsController.js の完全作成し直し
- 最小限の機能でPhase 1テスト実行
- 段階的な機能追加
期待される解決時間¶
約30分以内でPhase 1完了予定
Redmine Admin さんが3日前に更新
- ステータス を 新規 から 進行中 に変更
重要な問題発見: Docker ボリュームマウントの不整合¶
問題の詳細¶
- ホスト側でファイル修正済みだがコンテナ内に反映されない
-
/app/src/routes/embeddings.js:31
のgenerateBatchEmbeddings
メソッドが undefined - 複数回のファイル修正・コンテナ再構築でも同じエラーが永続
技術的調査結果¶
- ✅ OpenAI API統合: 正常動作確認済み
- ✅ 文字数ベース分割: 実装完了
- ✅ データベーススキーマ: 修正完了
- ❌ Docker ボリュームマウント: 不整合
推奨解決策¶
即座実行可能な代替案¶
- 新規プロジェクトディレクトリ作成: 完全クリーン環境
- 最小機能版API: Phase1必須機能のみ実装
- Docker Compose設定見直し: ボリュームマウント再設定
Phase 1完了への最短ルート¶
# 新規ディレクトリで最小機能版を構築
mkdir /var/docker/rag-simple
# 必要最小限のファイルのみで埋め込み処理API構築
# tiktoken問題回避済みのOpenAIService使用
Phase 2先行実装提案¶
現在の状況を活用して、Phase 2のベクトル検索機能を先行実装することを提案します。
- 既存データベース活用: PostgreSQL+pgvectorは動作確認済み
-
検索API実装:
/api/search/
エンドポイント群 - 統合テスト: Phase 1完了後の統合テスト準備
時間効率の最適化¶
- Phase 1修正: 30分
- Phase 2実装: 60分
- 統合テスト: 30分
→ 2時間以内でPhase 1+2完了予定
Redmine Admin さんが3日前に更新
- ステータス を 進行中 から 解決 に変更
🔄 チケット #256 → #257 移行¶
現状まとめ¶
- 問題: ホットフィックスの繰り返しによる設計不透明化
- 技術的課題: tiktoken, Docker, モジュール依存関係エラー
- 根本原因: アーキテクチャ設計の解像度不足
次のアクション¶
チケット #257 にて以下を実施:
- 🔍 設計レビュー: 現状分析とアーキテクチャ可視化
- 📐 再設計: 堅牢なレイヤー分離アーキテクチャ構築
- 🚀 移行計画: 段階的実装戦略の策定
推奨作業方法¶
新しい会話セッションでの実施を推奨
- 理由: アーキテクチャレビューは集中的な分析が必要
- 目標: 2-3時間で完全な設計書と実装計画を完成
- 成果物: チケット #257 に定義された成果物一式
このセッションでの成果¶
✅ 問題の根本原因特定
✅ 解決アプローチの明確化
✅ 次フェーズのチケット作成
✅ 効率的な作業戦略の策定
次回セッション開始時: チケット #257 の内容に基づいてアーキテクチャレビューを実施してください。
操作