大規模言語モデル(LLM)のアプリケーションアーキテクチャ

A16zは今週、大規模言語モデル(LLM)のアプリケーションアーキテクチャに焦点を当てた記事を発表しました:https://a16z.com/2023/06/20/emerging-architectures-for-llm-applications/

この記事では、スタートアップや大企業がLLMアプリケーションの設計と実装でよく使用するシステム、ツール、デザインパターンについて詳しく解説しています。技術的背景を持たない読者として、これらのアプリケーションの背後にあるアーキテクチャ設計の考え方を理解しようと試みました:


上記の図は主に「in-context learning」デザインパターンに基づいています。

では、「in-context learning」が何なのかをまず理解する必要があります。ウィキペディアの関連項目を参照してください:https://en.wikipedia.org/wiki/In-context_learning_(natural_language_processing)

は、与えられたテキストの文脈に基づいてモデルがどのように次のテキスト内容を予測または生成するかを主に説明しています。つまり、モデルは前の文の情報を用いて関連性があり適切な応答を生成します。これは人間の会話の習慣を模倣しており、我々は常に会話の文脈に基づいて次に何を言うべきかを考え決めています。

例えば、「今日は天気がどう?」と私が質問すると、あなたは現在の場所と時間に基づいて「今日は晴れています」とか「今日は雨です」と答えます。これが文脈(現在の天候状況)を利用して私の質問に応える例です。

したがって、この文脈における「In-context learning」は、言語モデルが与えられた対話の文脈に基づいて適切な応答を生成する能力を指します。

大規模言語モデル(LLM)を使用する主な方法は以下の3つがあります:

  1. ゼロから独自のモデルを訓練する
  2. オープンソースモデルをベースに微調整を行う(fine-tuning)
  3. APIを直接使用する

その中で、文脈学習(in-context learning)は主に第三の方法に適用されます。ゼロからモデルを訓練したり微調整を行うよりもAPIを直接使用する方が簡単ですが、プロンプト(prompt)の長さが増えるにつれてAPI呼び出し費用が指数関数的に増加するため、効率的に文脈学習を利用する方法も非常に重要となります。詳細についてはa16zの別の記事をご覧ください:https://a16z.com/2023/05/25/ai-canon/

この記事では、全体のワークフローを3つの主要ステップに分解しています:

  1. :この段階では、プライベートデータ(法的文書を例に取る)を処理し保存することで、その後の検索が可能になるようにします。これは通常、ドキュメントを小さな部分に分割し、埋め込みモデルを通じて処理し、特殊なデータベースであるベクトルデータベースに保存することを含みます。この部分については以前の記事で詳しく説明しました:
  2. )、およびベクトルデータベースから検索された関連ドキュメントを含みます。
  3. プロンプト実行/推論:プロンプトがコンパイルされると、それらは事前学習済みのLLM(大規模言語モデル)に提出されて処理されます。これには専用のモデルAPIやオープンソースまたは自己訓練済みのモデルの使用が含まれます。一部の開発者はこの段階でログ記録、キャッシュ、検証などの機能を追加するかもしれません。この部分については以前の記事で触れていませんが、将来的にこの点について詳しく説明する記事を書くことができます。


これら3つのステップをそれぞれ詳しく解析してみましょう:

データ前処理/埋め込み

はPDF、CSV、SQLなど様々な形式のドキュメントや構造化データを含む可能性があります。これらのデータを処理および変換する方法は多く、DatabricksやAirflowのようなETL(抽出、変換、ロード)ツールを使う人もいれば、LangChainやLlamaIndexのようなオーケストレーションフレームワークを使う人もいます。

とは、単語、文章、ユーザー、商品などの高次元、離散的または順不同のデータを低次元、連続的、順序付けられたベクトルに変換する手法です。多くの開発者はOpenAI API、例えばtext-embedding-ada-002モデルを直接使用することを選択します。一部の大企業はCohereを使用することがありますが、オープンソースを好む開発者はHugging FaceのSentence Transformersライブラリを選ぶかもしれません。https://huggingface.co/sentence-transformers

は、ベクトルデータを格納および処理するための特別なデータベースです。埋め込みベクトル(Embeddings)を効率的に保存し、これらの埋め込みに対して効率的なクエリをサポートします。多くの人がPineconeを使用していますが、Weaviate、Vespa、Qdrantといったオープンソースの選択肢もあります。また、ChromaやFaissといったローカルベクトル管理ライブラリ、pgvectorのような強化されたOLTPシステムもあります。

は通常、予測を生成する際にモデルが参照できる入力データの量または範囲を指します。例えば、テキストデータを処理する際、文脈ウィンドウは現在の単語周辺の単語の数を指すことがあります。言語モデルの場合、より大きな文脈ウィンドウはモデルがより多くの履歴情報を考慮して予測を生成できることを意味します。

データ前処理と埋め込みに関して、ある人々は大規模モデルの利用可能な文脈ウィンドウが大きくなるにつれて、埋め込みがプロンプトにさらに組み込まれる可能性があると考えています。しかし、専門家の意見は逆で、文脈ウィンドウが広がるにつれて計算コストも増加するため、埋め込みを使用することで効率が向上すると考えています。

プロンプト構築/検索

。さらに、チェーン・オブ・サUGHT(CoT, Chain-of-Thought)やツリー・オブ・サUGHT(ToT, Tree of Thoughts)などの高度なプロンプトエンジニアリング技術もあります。具体的にはhttps://www.promptingguide.ai/techniquesを参照してください。これらの技術についても後ほど詳しく解説します。これらの技術はチャットボット(ChatBot)の構築やドキュメントベースの質疑応答などに使用できます。

先ほどのステップで言及したLangChainとLlamaIndexという2つのオーケストレーションフレームワークは、このステップで重要な役割を果たします。これらはプロンプトチェーンに関連する多くの詳細を抽象化し、外部APIとのインターフェース(API呼び出しが必要なタイミングの決定を含む)を定義し、ベクトルデータベースから文脈データを検索し、複数のLLM呼び出し中にメモリを維持します。また、多くの一般的なアプリケーション向けのテンプレートも提供しています。それらの出力は、言語モデルに提出される1つまたは複数のプロンプトです。過去の記事でLangChainについていくつかの紹介を行いましたが、将来さらに詳しい共有を行う予定です

プロンプト実行/推論

現在、OpenAIはLLM分野でリーダーの地位にあります。通常、人々はgpt-4またはgpt-4-32kモデルを起点にLLMアプリケーションを構築します。しかし、製品が拡張段階に入ったとき、彼らは通常、精度は低いものの価格がgpt-4の50分の1であり、動作速度も速いgpt-3.5-turboモデルに移行します。AnthropicのClaudeもAPIを提供しており、その文脈ウィンドウは100kに達します。一部の開発者はオープンソースモデルを選択し、Databricks、Anyscale、Mosaic、Modal、RunPodなどのクラウドサービスは、対応するプリセットツールとサービスを提供する可能性があります。Hugging FaceとReplicateもAIアプリケーションを実行するためのシンプルなAPIとフロントエンドインタフェースを提供しています。

OpenAIのこれらの専有モデルと比較して、LLMのオープンソースモデルはまだギャップがありますが、それが徐々に縮小しています。例えばMetaのLLaMa、そしてTogether、Mosaic、Falcon、Mistralなどがあります。もちろん、MetaはLLaMa2のオープンソース化も準備しています。

は通常、モデルの動作を監視、管理、最適化、デバッグするためのツールを指します。これらのツールは現在の開発者の中で広く使用されているわけではありません。以下にいくつかのタイプのツールが「運用ツール」と見なされる例を挙げます:

  • 、例えばWeights、Biases、MLflow、PromptLayer、Heliconeは、モデルの出力、入力、動作状態を記録し、開発者がモデルの動作を理解するのに役立ちます。
  • 、例えばGuardrailsとRebuffは、モデルの動作速度とリソース使用状況を評価し、開発者がモデルのパフォーマンスを最適化するのに役立ちます。
  • 、例えばRedisは、モデルの出力結果を保存し、必要に応じて迅速に取得できるようにすることで、アプリケーションの応答速度とコスト効率を向上させます。
  • は、モデルの乱用や攻撃を検出し防止し、モデルの安全性と安定性を保護します。

LLMアプリケーションの非モデル部分は通常、Vercelのようなクラウド上でホストされます。また、Steamshipと呼ばれる新しいホスティング方式が登場しており、開発者にLangChain、マルチテナントデータコンテキスト、非同期タスク、ベクトルストレージ、キー管理を含むエンドツーエンドのホスティングサービスを提供しています。もう一つの方向性としては、AnyscaleやModalのような企業がモデルとPythonコードを同じ場所でホストできるようにしていることです。

AIエージェントフレームワーク

、将来的にReflexioについても皆さんにデモンストレーションしたいと思います。しかし、現時点ではほとんどのAIエージェントフレームワークは概念実証段階にあり、驚くべき効果を示すことはできるものの、信頼性と再現性のあるタスクの完了には至っていない状況です。私は彼らの将来の発展を注視し続けます。

過去には不可能だった製品を作り出すもの。どちらの利用方法でも、AIは個々の開発者に数日で驚くべき成果を上げる力を与え、それは大規模なチームが数ヶ月かけて構築する教師あり機械学習プロジェクトを超えるものです。a16zのこのフレームワークは、私たちがこの強力なツールをより効果的に活用する手助けをしてくれます。