はじめに
LLMアプリケーションを構築する上でのプロセスの整理を行う。
LLMの勉強を進めていく中で、アプリケーションを開発・成立させていくための技術の全体像を把握する必要があると考えた。
アプリケーション開発をプロセス化していく中で、求められる技術の把握と手の内化に役立てる。
更新履歴
- 2024/10/07: 初版作成
内容
鋭意勉強中のため、随時更新していく
PlantUMLにて全体像整理(Qiitaにて埋め込み)
ポイント
- 入力データ
- バイナリデータをLLM入力可能なデータに整える必要
- Microsoft Officeドキュメントは真には構造化データではない部分があり、整形必要
- バイナリデータをLLM入力可能なデータに整える必要
- プロンプトエンジニアリング
- 構造化データのプロンプト化、マークダウン記法などを活用
- トークン数制限を念頭に、現実的な入力情報長の調整
- プロンプトフォーマットの試行錯誤
- 何をプロンプトとして与えるかの検討(例:従来の思考回路・作業模擬)
- 判断に必要な入力リソースの整理
- プロンプトフォーマットとプロンプト入力データの組み合わせ試行錯誤
- RAG
- 筋の良いエンベディング手法の検討
- アプリケーションに合ったデータベース手法の選択
- アプリケーションに合った検索方法の選択
- LLM
- 出力スキーマによる、後段処理フレンドリーな出力管理
- オーケストレータ
- ライブラリ過度期でのオーケストレータの選択
- 実行結果管理
- 構造化された実行結果の管理
- アノテーション
- 今後、無駄化しないアノテーションスキーマの定義
- 評価・分析
- アプリケーションレベルの評価方法の確立
- 評価対象が複数面あることを考慮した、評価指標の組み合わせ
- CostとDeliverの非機能要件の評価、現実的に使用されるアプリケーションとなりうるか
- Cost的に現実的な評価フローの自動化
- 評価結果・分析結果の管理
- ワークフロー
- ライブラリ過度期でのワークフローライブラリの選択
- UI
- ユーザの要望に耐えうる拡張性
- バックエンドが過度期なため、フロントエンド・バックエンドの分離
ソースコード
@startuml
skinparam component {
BackgroundColor APPLICATION
}
skinparam database {
BackgroundColor Aqua
}
skinparam interface {
BackgroundColor DeepSkyBlue
}
skinparam package {
BackgroundColor AliceBlue
}
skinparam frame {
BackgroundColor LightCyan
}
top to bottom direction
title "LLMアプリケーションのプロセス整理"
package "要求分析"
package "要件定義"
package "入力リソース" {
package "テキストデータ" {
interface txt
interface csv
interface image
interface ソースコード
interface markdown
interface json
interface xml
}
package "バイナリデータ" {
package "MSデータ" {
interface Word
interface Powerpoint
interface Excel
}
}
}
package "MSデータ前処理" {
[整形]
[クレンジング]
[excel2table]
[ドキュメント内画像理解]
}
"MSデータ" --> MSデータ前処理
package "入力データ" {
frame "構造化データ" {
interface テーブル
}
frame "非構造化データ" {
interface テキスト
}
frame "半構造化データ" {
interface 音声
interface 画像
}
}
テキストデータ ---> 入力データ
MSデータ前処理 ---> 入力データ
package "データクレンジング" {
[テキスト正規化]
[テキストチャンキング]
[品質フィルタリング]
}
データクレンジング <--> 入力データ
package "構造化データテキスト化"{
[テーブルマークダウン変換]
}
テーブル --> 構造化データテキスト化
構造化データテキスト化 --> テキスト
package "プロンプトエンジニアリング"{
interface プロンプトフォーマット
[message構成]
[トークン制限の管理]
[マルチモーダル入力]
[プロンプト作成]
interface プロンプト
プロンプトフォーマット --> [プロンプト作成]
[プロンプト作成] --> プロンプト
}
半構造化データ ---> マルチモーダル入力
マルチモーダル入力 ---> プロンプト作成
テキスト ---> プロンプト作成
package "エンベディング" {
[構造化データエンベディング]
[非構造化データエンベディング]
[半構造化データエンベディング]
interface エンベディングデータ
}
構造化データ ---> 構造化データエンベディング
非構造化データ ---> 非構造化データエンベディング
半構造化データ ---> 半構造化データエンベディング
構造化データエンベディング ---> エンベディングデータ
非構造化データエンベディング ---> エンベディングデータ
半構造化データエンベディング ---> エンベディングデータ
package "RAG" {
[検索器]
package データベース {
database ベクトルDB {
interface インデックス
interface データストア
}
database リレーショナルDB
database "SQL DB"
database グラフ {
interface ノード
interface エッジ
}
}
package "検索方法" {
[ベクトル検索]
[全文検索]
[GraphRAG]
}
検索器 <--> データベース
検索器 <--> 検索方法
}
エンベディングデータ ---> データベース
package "LLM" {
interface LLMパラメータ
interface 出力スキーマ
[LLM推論]
package クラウドLLM {
[Azure-OpenAI]
[Google-Gemini]
[Amazon-Bedrock]
}
package ローカルLLM {
[ollama-lamma]
}
LLM推論 <--> クラウドLLM
LLM推論 <--> ローカルLLM
}
[オーケストレータ]
オーケストレータ ---> 検索器 : クエリ
検索器 ---> オーケストレータ : 知識
LLMパラメータ ---> オーケストレータ
出力スキーマ ---> オーケストレータ
プロンプト ---> オーケストレータ
オーケストレータ ---> LLM出力結果
package "実行結果管理" {
[実行結果の収集]
database 実行結果DB
}
LLMパラメータ ---> 実行結果の収集
LLM出力結果 ---> 実行結果の収集
出力スキーマ ---> 実行結果の収集
実行結果の収集 ---> 実行結果DB
interface 評価可能な実行結果
実行結果DB ---> 評価可能な実行結果
package "アノテーション" {
[アノテーション実行]
package "手動アノテーション" {
[アノテーション効率化ツール]
}
package "自動アノテーション" {
[自動アノテーションツール]
}
アノテーション実行 <--> 手動アノテーション
アノテーション実行 <--> 自動アノテーション
interface アノテーションデータ
interface アノテーションスキーマ
入力データ ---> アノテーション実行
プロンプト ---> アノテーション実行
アノテーションスキーマ ---> アノテーション実行
アノテーション実行 ---> アノテーションデータ
}
package "評価・分析" {
top to bottom direction
package "評価手法" {
package "非モデルベース手法" {
package "統計的手法" {
[BLUE Score]
[ROUGE]
[GTP Score]
}
[真値との突き合わせ]
}
package "モデルベース" {
package "LLMベース"{
["LLM as Judge"]
package "LLMベース評価手法" {
[GTP Score]
[SelfCheckGPT]
[QAC Score]
[GEval]
}
package "人手出力確認" {
[判断根拠の出力]
[Prompt Chainでの理由質問]
}
}
package "Embeddingベース"{
[BERTScore]
}
}
}
package "評価対象" {
["LLMモデルの評価"]
["fine-tuningの評価"]
["プロンプトの評価"]
package "RAGの評価" {
[文脈の関連性]
[回答の忠実性]
[回答の関連性]
}
}
package "評価レベル" {
[アルゴリズムレベルの評価]
package "アプリケーションレベルの評価" {
[ユーザテスト]
[ユーザーの受け入れ]
[プロジェクトKPI]
}
}
package "RAGの評価" {
[xxx]
}
package "評価タイミング" {
[オンライン評価]
[オフライン評価]
}
package "非機能要件の評価" {
package "コストの評価" {
[API使用料の評価]
[トークン数]
}
package "Deliverの評価" {
[処理速度の評価]
[レイテンシーの評価]
}
}
package "自動評価" {
[CICD]
[MLOps]
[LLMOps]
}
package "評価注意点" {
interface 乱数の揺れ
}
database 評価結果
database 分析結果
[評価実行]
評価手法 --- 評価実行
評価対象 --- 評価実行
評価レベル --- 評価実行
RAGの評価 --- 評価実行
評価タイミング --- 評価実行
非機能要件の評価 --- 評価実行
}
評価実行 ---> 評価可能な実行結果
評価実行 ---> アノテーションデータ
package "対策" {
package "対策対象の選択" {
frame "プロンプトでの改善" {
[プロンプトフォーマットの改善]
[プロンプト入力データの改善]
}
frame "RAGでの改善" {
[RAGの改善]
[RAGデータベースの改善]
}
frame "チューニングでの改善"
frame "モデル選択での改善"
}
database 対策結果
}
評価実行 ---> 対策
package "UI" {
[フロントエンド]
[バックエンド]
}
オーケストレータ <--- バックエンド
package "ワークフロー" {
package "ライブラリ" {
package "CUIベース" {
[langchian]
[langsmith]
}
package "GUiベース" {
[Dify]
}
}
}
オーケストレータ <--- ワークフロー
@enduml
参考文献
書籍
ネット