Q1: 機能分離の進め方(RAGでUI・エンベディング・チャットを一気に実装しない方法)
課題
- 全機能をまとめて実装しようとすると、依存関係が複雑化し、デバッグやテストが困難になる。
改善案
-
マイクロサービス的なアプローチ
-
各機能(UI、エンベディング、チャット)の役割を分離。
-
小さい単位で動作するモジュールを作成し、連携させる。
- 例:
- エンベディング生成API: ユーザー入力を埋め込みに変換。
- データベースAPI: 検索やデータの取得。
- チャットUI: APIと通信する軽量なフロントエンド。
- 例:
-
ツール例:
- FastAPI(バックエンドAPI開発)
- Postman(APIテスト)
- React(UIフロントエンド)
-
学び:
Fast API化して使えるように指定き一つずつテスト
確認ポイント:そもそもAPI化していくのっていいやり方?とかの判断がつかない。
-
段階的実装
- 以下の順に進める:
- ベクトルデータベースの動作確認(Chromaの永続化)。
- エンベディングAPIの開発とテスト。
- チャットUIのプロトタイプ作成。
- 各段階で単体テストを行い、不具合を早期に発見。
- 以下の順に進める:
学び:
上記のような段階的実装の計画をGPT4oやGemini、Perplexityに解説させて、
手順を明確にイメージすることを最初にやっていくと理解が進む
確認ポイント:そもそも分かんない中での技術的に妥当性のある設計をどう行うか
→エンジニアが重要視している観点を言語化する擦り合わせをそのうちやりたい
-
テスト自動化
- 各モジュールをユニットテストで確認する。
- ツール例: pytest, unittest
確認ポイント:ここは後々学んでいこう。今はまだイメージが湧かない。後回し。
Q2: 包括的なエラーハンドリングと環境構築の効率化
課題
- Dockerの構築に時間がかかる。
- 必要なライブラリや依存関係の整理が不十分。
改善案
-
仮想環境の利用
- Dockerの代わりに、開発初期は仮想環境(
venv
やconda
)を使用。 - 環境再現性を高めるため、必要なパッケージをリスト化する。
-
例:
python -m venv .venv source .venv/bin/activate pip install -r requirements.txt
-
例:
- Dockerの代わりに、開発初期は仮想環境(
学び:
ここはアドバイス頂いていたポイントなのでトライしてみる。
確認ポイント:
インストールしたパッケージはいつ削除したり整理したらいいんだろう
-
requirements.txt
の活用- 必要最低限のパッケージのみ記載し、定期的に依存関係をチェック。
-
パッケージのバージョン固定例:
langchain==0.0.250 chromadb==0.4.8
-
パッケージのバージョン固定例:
- 必要最低限のパッケージのみ記載し、定期的に依存関係をチェック。
学び:
ドキュメント化しておくことで定期的にパッケージの情報をチェックできる
-
Dockerへの移行タイミング
- ローカルで単体機能を確認し、複数の開発環境でテスト後にDocker化。
- Docker Composeを利用して依存関係を明確化。
version: '3.9' services: app: build: . volumes: - .:/app environment: - DEBUG=true
学び:
一旦、ローカルな仮想環境で作って、適切なタイミングでDockerに移行
確認ポイント:
複数の開発環境や、Docker Composeはまだ使ってないのでよくわからん。
-
包括的エラーハンドリングの導入
- 開発環境では詳細ログを出力し、本番環境では簡潔なメッセージを表示。
-
例:
import logging logging.basicConfig(level=logging.DEBUG) try: # 実行コード except FileNotFoundError as e: logging.error(f"ファイルが見つかりません: {e}") except Exception as e: logging.error(f"予期しないエラー: {e}")
学び:
開発フェーズと本番フェーズで使うログを分けることは学びになる。
開発環境:開発者は詳細な情報を得られ、問題解決が容易になります。
本番環境:エンドユーザーは不必要に詳細な技術情報に惑わされることなく、適切なエラーメッセージを受け取ります。
Q3: ライブラリのバージョン管理と最新情報の追跡
課題
- ライブラリのエラーや古い情報を基にした実装ミス。
改善案
-
バージョン固定とアップデート管理
- 互換性が確認されたバージョンを
requirements.txt
に明記。 - 定期的にバージョンをチェックし、アップデート。
-
ツール例:
pip-tools
pip install pip-tools pip-compile requirements.in
-
ツール例:
- 互換性が確認されたバージョンを
-
ライブラリのドキュメントを最新状態で管理
- 公式リポジトリの監視(GitHub)。
- ライブラリ変更の追跡には以下を活用:
- GitHubの
Watch
機能。 - Libraries.ioでの依存関係チェック。
- GitHubの
-
開発環境での確認プロセス
- 新しい技術や手法を実装する前に、最小限のプロジェクトで検証。
- サンプルコードや公式のエクザンプルを活用。
-
エラードキュメントのカスタマイズ
- プロジェクト内で共通のエラー解決ガイドを作成。
- チーム全員が参照可能なナレッジベースを構築(例: Notion, Confluence)。
学び:
ここでいう特に、3をちゃんとやるのが初期の段階では大事だなと。
その上で、バージョン固定や、アップデートの際のテスト方法や、エラー解決を考えていく
段取りを考えていく。ここもドキュメントを探した後、AIをフル活用しよう。
確認ポイント:
参考としているリンクや、ライブラリに関するリンクなどをどうやって
集中的に管理していくのかのベストプラクティスを知りたい。
短期的にはディレクトリに一つマークダウンのテキストファイルを作って、
中期的には、Gitで管理していくのが良い?
Q4: 手元での高速モック開発を進めるベストプラクティス
ベストプラクティス
-
軽量フレームワークの採用
- プロトタイプ開発には以下を使用:
- FastAPI: 高速なAPIサーバー構築。
- Streamlit: データ分析向けのUIプロトタイピング。
- プロトタイプ開発には以下を使用:
-
ホットリロードの活用
- 開発中にコード変更を即時反映:
uvicorn app:app --reload
- 開発中にコード変更を即時反映:
学び:
アプリケーションの起動にめっちゃ時間かかっていたので、
上記法の活用ができたらいいかも!
確認ポイント:
フレームワークはなんとなくイメージがつくけど、使ってみて確認しよう
-
モックデータの生成
- データベースや外部APIの代わりにモックを使用:
-
ライブラリ例:
unittest.mock
,pytest-mock
-
ライブラリ例:
- データベースや外部APIの代わりにモックを使用:
学び:
色々戻り値をリスト化しておいたりすれば、返し方も指定できる。
もう少し先にテストする
-
コンテナの軽量化
- 最初はDocker Composeを使用せず、単一の
Dockerfile
で最小構成を構築。
- 最初はDocker Composeを使用せず、単一の
-
スクリプト化と自動化
- 開発環境の初期化をスクリプトで自動化:
# init.sh python -m venv .venv source .venv/bin/activate pip install -r requirements.txt
- 開発環境の初期化をスクリプトで自動化:
学び:
都度コマンド打つの面倒だったので、開発環境の起動から、必要なパッケージのインストールまでの手順をまとめておく
仮想環境の作成 (python -m venv .venv)
仮想環境の有効化 (source .venv/bin/activate or source .venv/Scripts/activate for Windows)
必要なパッケージのインストール (pip install -r requirements.txt)
-
コードフォーマットとLintの統合
- フォーマットツール:
black
- 静的解析:
flake8
,mypy
- コード保存時に自動適用。
- フォーマットツール:
結論
- 各課題には、段階的アプローチ、軽量化、標準化が有効。
- 小さく試し、早く改善するプロセスをチーム全体で共有することが成功への鍵。