「大型言語モデルを使用して開発するために知っておくべきすべて」

「美容とファッションのプロが教える、大型言語モデルを使用した開発のポイント」

安定拡散によって生成された画像

LLMベースのアプリケーションの開発を始めるために必要なコアテクノロジーをわかりやすく説明します。

この記事の目的は、LLMベースのアプリケーションの開発を始めるために必要な主要なテクノロジーをわかりやすく説明することです。ソフトウェア開発者、データサイエンティスト、AI愛好家を対象としており、機械学習の基本的な概念を理解していて、さらに深く探求したいと思っている方に役立つリンクも提供しています。おもしろくなること間違いありません!

1. 大規模言語モデル(LLM)の紹介

LLMについては、すでに何度も聞いたことがあるかもしれませんので、これ以上深くは触れません。知っておく必要があるのは、Large Language Model(LLM)は、前に予測したトークンに基づいて次のトークンを予測するための大規模なニューラルネットワークモデルであるということです。それだけです。

モデルのパラメータ数の比較。GPT-3がどれだけ大きいかを見てください。そして、GPT-4については誰も知りません...

LLMの人気は、その多様性と効果によるものです。翻訳、要約、意味解析など、さまざまな課題に完璧に対応します。

LLMの機能性

LLMを使用したプロジェクトのいくつかの例:

  • Notion AI — 文章の品質向上、コンテンツ生成、スペルや文法の修正、声や語調の編集、翻訳などに役立ちます。
  • GitHub Copilot — 自動補完のような提案を行うことで、コードを改善します。
  • Dropbox Dash — 自然言語検索機能を提供し、また回答の元となるファイルを特定することもできます。

LLMの動作原理を詳しく理解したい場合は、「ハイプなしの大規模言語モデルの非常に優れた紹介」という素晴らしい記事をマーク・リードル氏が執筆したので、強くおすすめします。

2. オープンソース対クローズドソースモデル

いくつかの違いがありますが、主な違いとして以下を挙げます:

  • プライバシー — 大企業が自己ホスティングソリューションを選ぶ最も重要な理由の一つです。
  • 高速プロトタイピング — アイデアを過度な費用負担なく素早くテストできるため、小規模スタートアップにとって非常に便利です。
  • 生成の品質 — 特定のタスクにモデルを微調整するか、有料APIを使用するかのいずれかです。

何が良いか悪いかの明確な答えはありません。以下のポイントを強調しました:

詳細について深く掘り下げることに興味がある場合は、「ホステッドLLMは必要ないですよね?」という私の記事をお読みいただくことをおすすめします。

  • LLaMA-2 by Meta
  • Falcon by アブダビの技術イノベーション研究所
  • Mistral by Mistral AI

すべてのモデルを表示するには、LLMコレクションを調べてみてください。

3. プロンプトエンジニアリングの技術

はい、はい、多くの人はこれを疑似科学だと考えたり、一時的なブームだと思ったりしています。しかしながら、私たちはまだLLMの働き方を完全に理解していません。なぜ彼らは時に高品質な応答を提供し、他の時には事実をでっち上げるのでしょうか?また、「一緒にステップバイステップで考えてみましょう」とプロンプトに追加すると、なぜ品質が向上するのでしょうか?

感情的な色づけはどのモデルでも品質を高めます。ソース

これらすべての理由から、科学者や愛好家はさまざまなプロンプトで実験を行い、モデルの性能を向上させようとするしかありません。

LLMを用いた問題解決の様々なアプローチを示す図

複雑なプロンプトチェーンで退屈させるつもりはありません。かわりに、即座にパフォーマンスを向上させるいくつかの例をご紹介します:

  1. 「一緒にステップバイステップで考えてみましょう」 — 推論や論理的なタスクには非常に効果的です。
  2. 「深呼吸をして、この問題をステップバイステップで解決しましょう」— 前述のポイントの改良版です。品質を数パーセント向上させることができます。
  3. 「これは私のキャリアにとって非常に重要です」 — プロンプトの末尾に追加するだけで、品質が5〜20%向上することに気づくでしょう。

また、すぐに役立つプロンプトテンプレートを共有します:

私たちのXコマンドと明晰な思考を組み合わせて、ステップバイステップのアプローチで迅速かつ正確に回答を解読しましょう。回答には詳細とソースを含めます。これは私のキャリアにとって非常に重要です。

ここで、Xは解決している課題の業界、たとえばプログラミングなどです。

数晩をかけて、プロンプトエンジニアリングの技術を探求することを強くお勧めします。これにより、モデルの振る舞いをより制御するだけでなく、品質を向上させ、幻想を減らすのにも役立ちます。そのために、Prompt Engineering Guideを読むことをおすすめします。

  • prompttools — プロンプトのテストと実験、LLM(たとえばOpenAI、LLaMA)のサポートを提供します。
  • promptfoo — LLMの出力品質のテストと評価。
  • Awesome ChatGPT Prompts — ChatGPTモデルで使用するためのプロンプトの例のコレクション。

4. 新しいデータの統合:検索増幅生成(RAG)

RAGは、LLMと外部の知識ベースを組み合わせた技術です。これにより、モデルに元のトレーニングセットに含まれていない関連情報や特定のデータを追加することができます。

この技術は名前が怖そうですが(コードを「再順位づけ」に追加する場合もあります)、実際にはかなり古く、驚くほどシンプルなテクニックです:

RAGの動作の概略図
  1. 文書を数値に変換します。これを埋め込みと呼びます。
  2. ユーザーの検索クエリも同じモデルを使用して埋め込みに変換します。
  3. コサイン類似度に基づいて通常は上位K件の最も近い文書を見つけます。
  4. LLMにこれらの文書を基に回答を生成させます。

使用するタイミング

  • 最新情報の必要性:ニュース記事のように常に更新される情報がアプリケーションに必要な場合。
  • ドメイン固有のアプリケーション:LLMのトレーニングデータ外の専門知識が必要なアプリケーション。たとえば、内部の企業文書。

使用しない場合

  • 一般的な会話型アプリケーション:情報が一般的で追加のデータを必要としない場合。
  • リソースが限られたシナリオ:RAGの検索コンポーネントは大規模な知識ベースを検索する必要があり、計算コストがかかり時間がかかりますが、ファインチューニングよりも速く、費用がかかります。

RAGを使用したアプリケーションの構築

素晴らしい出発点はLlamaIndexライブラリを使用することです。これにより、データをLLMに簡単に接続できます。次のわずか数行のコードだけで実現できます:

from llama_index import VectorStoreIndex, SimpleDirectoryReader
# 1. 文書を読み込む
documents = SimpleDirectoryReader("YOUR_DATA").load_data()
# 2. 文書をベクトルに変換
index = VectorStoreIndex.from_documents(documents)
# 3. 質問を行う
query_engine = index.as_query_engine()
response = query_engine.query("上司の誕生日はいつですか?")
print(response)

実際のアプリケーションでは、ことが複雑になることに留意してください。開発には多くの微妙な問題が起こります。たとえば、取得された文書が常に質問と関連していない場合や、速度に問題がある場合があります。ただし、この段階でも、検索システムの品質を大幅に向上させることができます。

5. LLMの微調整

微調整は、事前にトレーニングされたLLMを特定のデータセット上で継続的にトレーニングするプロセスです。既にRAGを使用してデータを追加できるので、なぜモデルをさらにトレーニングする必要があるのか疑問に思うかもしれません。単純な答えは、特定のドメインを理解したり、スタイルを定義するためには、微調整だけが対応できるということです。たとえば、私は個人のやりとりを使ってモデルを微調整し、自分自身のコピーを作成しました

著者のやりとりを使ってモデルを微調整したデモ

もし、その重要性を納得していただけたのなら、その仕組みを見てみましょう(ネタバレ — それほど難しくありません):

ドメイン固有のデータでモデルを微調整する古典的なアプローチ(すべてのアイコンはflaticonから取得)
  1. トレーニング済みのLLM、いわゆるベースLLMを取得します。これらはHuggingFaceからダウンロードできます。
  2. トレーニングデータを準備します。指示と応答だけをコンパイルする必要があります。以下はそのようなデータセットの例です。また、GPT-4を使用して合成データを生成することもできます。
  3. 適切な微調整方法を選択します。現在はLoRAQLoRAが人気です。
  4. 新しいデータでモデルを微調整します。

使用するタイミング

  • ニッチなアプリケーション: 専門的または非伝統的なトピックを扱うアプリケーションの場合。たとえば、法的文書アプリケーションでは法的な専門用語を理解し処理する必要があります。
  • カスタムな言語スタイル: 特定のトーンやスタイルが必要なアプリケーションの場合。たとえば、AIキャラクターを作成する場合、それが有名人であるか、本のキャラクターであるか。

使用しないタイミング

  • 広範なアプリケーション: アプリケーションの範囲が一般的で専門知識を必要としない場合。
  • データの制約: 微調整には関連するデータのかなりの量が必要です。ただし、別のLLMを使用していつでもそれらを生成することができます。たとえば、52,000のLLM生成指示・応答ペアからなるAlpacaデータセットは、今年の初めに最初の微調整Llama v1モデルを作成するために使用されました。

LLMを微調整する

モデルの微調整に関する数多くの記事があります。VoAGIだけでも数千あります。したがって、このトピックについては深く踏み込むことは避け、高レベルのライブラリであるLit-GPTを紹介します。これにより、トレーニングプロセスの多くを隠すことができます。トレーニングプロセスをカスタマイズする余地はあまりありませんが、簡単に実験を実施し、初期結果を得ることができます。わずか数行のコードが必要です:

# 1. モデルをダウンロードする:python scripts/download.py --repo_id meta-llama/Llama-2-7b# 2. チェックポイントをlit-gpt形式に変換する:python scripts/convert_hf_checkpoint.py --checkpoint_dir checkpoints/llama# 3. 調整データセットを生成する:python scripts/prepare_alpaca.py  # データセットはあなたのものである必要があります# 4. fine-tuningスクリプトを実行するpython finetune/lora.py \    --checkpoint_dir checkpoints/llama/    --data_dir your_data_folder/    --out_dir my_finetuned_model/ 

以上です!トレーニングプロセスが始まります:

このプロセスには時間がかかることに注意してください。単一のA100 GPUでFalcon-7Bをfeintuningするには、およそ10時間30GBのメモリが必要です。

もちろん、わずかに簡略化しており、まだ全容を把握していませんが、結果を向上させるためには、さまざまなアダプター、そのパラメーター、さらには他の多くの要素を理解する必要があります。しかし、このような単純な反復でも、指示に従う新しいモデルが得られます。

6. LLMアプリケーションのデプロイ

時には、単に「デプロイ」ボタンを押したいだけです…

幸いにも、これはかなり実現可能です。大規模な言語モデルを展開するために特化した多数のフレームワークが存在します。彼らが非常に優れている理由は何でしょうか?

  • 多くの事前に作成されたラッパーと統合。
  • 利用可能なモデルの大量の選択肢。
  • 多数の内部最適化。
  • 迅速なプロトタイピング。

適切なフレームワークの選択

LLMアプリケーションを展開するためのフレームワークの選択は、モデルのサイズ、アプリケーションのスケーラビリティ要件、展開環境など、さまざまな要素に依存します。現在、フレームワークの種類はまだ多くありませんので、それほど違いを理解するのは難しくないはずです。以下に、すぐに始めるのに役立つチートシートを用意しました:

また、私の記事「LLMのサービングのための7つのフレームワーク」では、既存のソリューションについて詳しく説明しています。モデルを展開する予定であれば、ぜひチェックしてみてください。

LLMの推論のためのフレームワークの比較

デプロイのための例のコード

理論から実践に移りましょう、そしてText Generation Inferenceを使用してLLaMA-2をデプロイしましょう。そして、おそらくお察しの通り、わずか数行のコードが必要です:

# 1. モデルを保存するフォルダを作成します:mkdir data
# 2. Dockerコンテナを実行します (RestAPIサービスを起動します):docker run --gpus all --shm-size 1g -p 8080:80 \    -v $volume:/data \    ghcr.io/huggingface/text-generation-inference:1.1.0    --model-id meta-llama/Llama-2-7b
# 3. そして、リクエストを作成できるようになります:curl 127.0.0.1:8080/generate \    -X POST \    -d '{"inputs":"Tell me a joke!","parameters":{"max_new_tokens":20}}' \    -H 'Content-Type: application/json'

それで終わりです!ログ記録、モニタリングのためのPrometheusエンドポイント、トークンのストリーミングなど、組み込みの機能を持つRestAPIサービスをセットアップしました。これはまさに魔法ですね。

APIドキュメンテーション

7. 背後に残るもの

LLMベースのアプリケーションの開発に必要な主要な概念を説明しましたが、将来的にはまだいくつかの側面に遭遇する可能性があります。そのため、いくつかの役立つリンクを残しておきます:

最適化

最初のモデルを起動すると、望んだよりも速くなく、多くのリソースを消費することに気付くかもしれません。この場合、どのように最適化できるかを理解する必要があります。

評価

微調整されたモデルがあるとします。しかし、その品質が向上したかどうかを確信するにはどうすればよいでしょうか?どのようなメトリックを使用すれば良いでしょうか?

  • 大規模言語モデルの評価について — ベンチマークやメトリックの概要についての良いオーバービュー記事です。
  • evals — LLMとLLMシステムの評価のための最も一般的なフレームワークです。

ベクトルデータベース

RAGを使用する場合、ベクトルをメモリに保存する方法からデータベースに移行する必要があります。このためには、現在市場にあるものとその制限を理解することが重要です。

LLMエージェント

私の意見では、LLMの最も有望な進展です。複数のモデルが協力して作業するためには、以下のリンクを探索することをお勧めします。

  • LLMベースの自律エージェントに関する調査 — これはおそらく最も包括的なLLMベースのエージェントの概要です。
  • autogen — 複数のエージェントを使用して会話し、タスクを解決するLLMアプリケーションの開発を可能にするフレームワークです。
  • OpenAgents — 野生の言語エージェントを使用してホスティングするためのオープンプラットフォームです。

ヒューマンフィードバックからの強化学習(RLHF)

ユーザーにモデルへのアクセスを許可すると、責任を負うことになります。もし粗野な応答を返してしまったら?または爆弾作成の材料を明らかにしてしまったら?これを避けるために、以下の記事をご覧ください:

  • ヒューマンフィードバックからの強化学習(RLHF)の説明 — RLHF技術の詳細を示す概要記事です。
  • RL4LMs — モジュラーなRLライブラリで、言語モデルを人間の優先順位に合わせて調整します。
  • TRL — 教師あり微調整ステップ(SFT)、報酬モデリングステップ(RM)、Proximal Policy Optimization(PPO)ステップまで、トランスフォーマーラングエージェントのトレーニングに使用するツールセットです。

結論

宣伝に疲れた私たちにも関わらず、LLMは長期間にわたって存在し続け、そのスタックを理解し、シンプルなアプリケーションを書く能力は大きな助けになります。私が少しでもこの分野に没頭させ、それが複雑で恐ろしいものではないことを示せたなら幸いです。

ご覧いただき、ありがとうございました。新しい記事をお楽しみに!

免責事項: 本記事の情報は2023年11月現在のものですが、その後の変更があることをご了承ください。

特記がない限り、すべての画像は著者の作成です。

質問や提案がありましたら、気軽にLinkedInで連絡ください。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more