Dataikuドキュメントのチャットボット開発:RAGシステムの構築と直面した課題
はじめに
Dataikuのドキュメントに対して質問応答できるチャットボットの開発を試みましたが、いくつかの技術的な課題に直面し、完全な実装には至りませんでした。この記事では、実装過程で遭遇した問題と、その教訓を共有します。
全然うまくいかなかった
実装で直面した主な課題
1. 環境構築の問題
- Azure OpenAIの認証情報の設定(これは事前にまとめておかないと不便)
- 必要なライブラリのバージョン互換性(新しい技術はClaude-3.5 sonnetが意味不明な実装ループに陥るので、ここの実装の仕方は適宜適切なフォローを入れないと)
- パス指定の問題(絶対パスと相対パス なんかComposerがバグってDockerの外に実装しまくってました。)
ライブラリのエラードキュメントに基づく実装は読み取ってくれても、
最新の実装方法は別の手段で渡しておかないとよくわからんことになる?
2. ベクトルDBに関する問題
そもそもここは一度ドキュメントを読んで、もう少し理解を深めて
手元で機能の実行から試すべきだった。
self.vector_store = Chroma.from_texts(
texts=[t["page_content"] for t in texts],
embedding=self.embeddings,
metadatas=[t["metadata"] for t in texts],
persist_directory="/Users/imanos19/Desktop/Cursor/dataiku-docs-chatbot/data/vector_store"
)
- Chromaデータベースの永続化に関するエラー
- メモリ使用量の問題
- データの整合性の確保
3. テキスト処理の課題
text_splitter = MarkdownTextSplitter(chunk_size=3000, chunk_overlap=100)
- 大量のテキストデータの効率的な分割
- Markdownフォーマットの適切な処理
- 文脈の保持と分割の最適化
主な学びと反省点
1. アーキテクチャ設計
- 問題点: RAGだからと最初からUIとエンべディングとチャット機能まとめて実装を試みた
- 改善案: マイクロサービス的なアプローチで、機能ごとに分離して開発すべきだった
新しいものはテストして実装するを当たり前の所作としてやれるように。
2. エラーハンドリング
-
問題点: 包括的なエラーハンドリングがうまく掴めてない。
- Dockerで都度実行は前レビューを受けた通り環境構築・実行に時間がかかる
- 手元ファイルで実行しようとする場合のpip3などでどの程度インストールしていいのかわからん
-
改善案:
- より詳細なログ出力
- エラーの種類に応じた適切な処理
- リトライメカニズムの実装
とりあえずやらせてみて、期待する挙動をしなかったら、
最小限で試して、動くものにして、スケールさせるを最速で
3. テスト戦略
- 問題点: 単体テストが不十分
-
改善案:
- テストファーストの開発アプローチ
- モックを使用した依存関係の分離
- 段階的なテスト実装
どのタイミングでローカルからDockerにうつしたらいいの?
ある程度アプリケーションができて、仮想環境でみんなが実行できるようにするタイミング?
技術的な教訓
1. 依存関係管理
from langchain_openai import AzureOpenAIEmbeddings
from langchain_openai import AzureChatOpenAI
- ライブラリのバージョン互換性を事前に確認
- requirements.txtの適切な管理
- 仮想環境の使用の重要性
この辺はEmbedding用にまとめておいていつでも使えるように
2. 設定管理
load_dotenv()
- 環境変数の適切な管理
- 設定の外部化
- デプロイメント環境との整合性
今後の改善案
-
段階的な実装アプローチ
- 小さな機能から始める
- 各段階でのテストを充実させる
- フィードバックループを短くする
-
エラー対策の強化
- 詳細なエラーログの実装
- 自動リカバリーメカニズムの導入
- 監視システムの構築
-
スケーラビリティの考慮
- データ量増加への対応
- パフォーマンスチューニング
- キャッシュ戦略の検討
まとめ
このプロジェクトは完全な実装には至りませんでしたが、RAGシステムの実装における重要な教訓を得ることができました。特に、以下の点が重要だと感じました:
- 事前の十分な設計と計画の重要性
- 段階的な実装とテストの必要性
- エラーハンドリングの重要性
- スケーラビリティを考慮した設計の必要性