LLMが具体的にどのように作られているのかについて、一つの文章でまとめているものはなかなかないようですので、LLMの開発からプロダクト化までの全過程を詳しく説明したいと思います。
LLMをゼロから開発する際には、大きく分けて以下の3つのステップがあります。
①Pre-train(事前学習)
②SFT(Supervised Fine-Tuning:教師ありファインチューニング)
③RLHF(Reinforcement Learning from Human Feedback:人間のフィードバックによる強化学習)
1.Pre-train(事前学習)
Pre-trainでは、モデルに次の単語を予測させる作業を繰り返し行います。
現在のLLMは、ほとんどがTransformerアーキテクチャに基づいて設計されています。そのため、Transformerの構造を理解していれば、Pre-trainを行うことはできます。
Transformerアーキテクチャには、主に2種類のモデル構成があります。
1つは、「Denseモデル」と呼ばれるものです。GPTやLlamaなどがこのタイプに当てはまります。Denseモデルでは、1つの大きなモデルのみ学習させます。
もう1つは、MoE(Mixture of Experts)と呼ばれるモデルです。MoEでは、複数の小さなモデルを組み合わせて学習させます。これらの小さなモデルを「エキスパート」と呼びます。それぞれのエキスパートが得意な分野を持っていて、問題によって適切なエキスパートを使って回答を生成します。一つの大きなモデルよりも高い性能を発揮できます。
現在主流の学習方法は、MicrosoftのDeepSpeed(分散学習)+FlashAttention(速度向上)+VLLM(推理速度向上)を組み合わせて、モデルの事前学習を行います。
2.SFT(教師ありファインチューニング)
SFTでは、LLMが人間の質問にどのように答えることをトレーニングします。
質問応答形式(QA)のデータをモデルに提供し、人間との対話方法を学習させます。(モデル名の後ろに"-instruct"が付いているのはSFT実施済みということです。)
3.RLHF (人間のフィードバックによる強化学習)
RLHFでは、LLMに人間が好むoutputを生成させるようにトレーニングします。(RLHFは、不適切なアウトプットを生成しないようにするためのセキュリティ対策の一環でもあります。)
手法としては、主にDPOとPPOがあります。DPOは、並列処理が可能なため、より大規模なトレーニングに適しています。
具体的な手順は、まず同じプロンプトに対する回答を人手で順位を付けて、報酬モデル(Reward Model)に学習させます。次に、この報酬モデルを用いて元のモデルを監督し、生成された結果の良し悪しを評価します。これによってモデルは人間が好む結果を生成するようになります。
4.LLMの精度について
モデルの精度に影響を与える主な要因は3つあります。
1つ目はデータです。
データの量、分布(領域や言語の割合分布)、品質などは最も重要なポイントです。
2つ目は、モデルの構成です。
GPTやLlamaのDenseモデルにするか、MoEにするか、それともTransformerではなく全く新しいアーキテクチャにするか、どちらでもトレーニング結果に影響します(例えば、最近Transformerとは異なる新しいアーキテクチャ”Mamba”やMamabaとTransformerを組み合わせたJambaも登場しています)。
最後はモデルトレーニングスキル(loss変化によって,パラメータをチューニングしたり)も重要です。
5.ファインチューニングとRAG
モデルを構築した後は、ユースケースに応じて、ファインチューニングやRAGを行うか、あるいは両方を行うかを検討します。
特定のタスク(例えば、特定の業界に関する質問に答えること)にモデルを特化させたい場合は、ファインチューニングを実施します。ファインチューニングとSFTは非常に似ており、コードもほとんどSFTのコードをそのまま使用します。
一般的な手法としては、GPUリソースを節約できるLoRAがあります。
GPUリソースを使用せずにモデルの精度を向上させたい場合や、既存のLLMに新しい知識を追加したい場合は、RAGを検討します。外部データベースを接続することで、モデルの回答精度を向上させ、未知の内容にも対応できるようになります。
6.AI-Agentとプロンプトエンジニアリング
最終的に、これらをパッケージ化してプロダクト化したものがAI-Agentです。Agentの中身は、大量のプロンプトによって構成されており、それらのプロンプトからモデルの動作をステップごとに定義しています。Agentのパフォーマンスをさらに向上させるためには、Multi-Agent(マルチエージェント)などの技術もあります。
このプロダクト化のステップを簡単に実行するためには、langchainやLlamaindexなどのフレームワークを使用します。
プロンプトエンジニアリングとは、モデルに入力する指示を調整することでモデルの出力を向上させる方法です。few-shot(In-context learningとも呼ばれます)などの手法がよく使用されています。
以上が、私の理解に基づくLLMの開発からプロダクト化までの全過程です。細かい理解の誤りがあるかもしれませんが、全体的には正しいかと思います。認識相違があればぜひ教えていただきたいです。