|
出典:AI研究局 私たちは日常生活において、エンドツーエンドのアプリケーション構築に取り組んでいます。機械学習プロセスを自動化するための自動化された機械学習プラットフォームや継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインは数多く存在します。また、RoboflowやAndrew Ng氏のLanding AIといったツールも、エンドツーエンドのコンピュータービジョンアプリケーションを自動化または作成するために利用できます。 以前は、OpenAIやHugging Faceを使った大規模言語モデルに基づくアプリケーションを作成したい場合、手作業で行わなければならなかったかもしれません。今では、同じ目的を達成するために、HaystackとLangChainという2つの有名なライブラリがあり、大規模言語モデルに基づくエンドツーエンドのアプリケーションやプロセスの作成に役立ちます。 LangChain を詳しく見てみましょう。 #01 LangChainとは何ですか? LangChainは、言語モデル駆動型アプリケーションの開発方法に革命をもたらす革新的なフレームワークです。 高度な原理を導入することで、LangChainは従来のAPIの限界を再定義します。さらに、LangChainアプリケーションは、言語モデルが環境と対話し、適応することを可能にするインテリジェントエージェントを備えています。 LangChainは複数のモジュールで構成されています。その名前が示すように、 LangChainの主な目的はこれらのモジュールを連結することです。つまり、各モジュールを連結し、このチェーン構造を使用してすべてのモジュールを一度に呼び出すことができます。 これらのモジュールは次の部分で構成されています。 モデル 冒頭で述べたように、これらのモデルは主に大規模言語モデル(LLM)を包含します。大規模言語モデルとは、大規模なラベルなしテキストで学習された多数のパラメータを持つニューラルネットワークモデルを指します。テクノロジー大手は、以下のような様々な大規模言語モデルを開発しています。
LangChainは、大規模な言語モデルとのやり取りを大幅に簡素化します。LangChainが提供するインターフェースと機能により、LLMの強力な機能を既存のアプリケーションに容易に統合できます。LangChainはasyncioライブラリを利用して、LLMの非同期処理をサポートします。 複数のLLMへの同時呼び出しを必要とするネットワークバインディングシナリオ向けに、 LangChainは非同期サポートも提供しています。リクエストを処理しているスレッドを解放することで、サーバーはレスポンスが準備できるまでそのスレッドを他のタスクに再割り当てすることができ、リソース利用率を最大化します。 現在、LangChainはOpenAI、PromptLayerOpenAI、ChatOpenAI、Anthropicなどのモデルの非同期サポートをサポートしていますが、将来的には他のLLMへのサポート拡大も計画しています。`agenerate`メソッドを使用することで、OpenAI LLMを非同期に呼び出すことができます。さらに、LangChainでサポートされているものだけでなく、カスタムLLMラッパーを作成することもできます。 私のアプリケーションではOpenAIを使用し、主にDavinci、Babbage、Curie、Adaモデルを用いて問題を解決しました。各モデルにはそれぞれ独自の利点、トークンの使用方法、ユースケースがあります。 これらのモデルの詳細については、以下をお読みください。 https://subscription.packtpub.com/book/data/9781800563193/2/ch02lvl1sec07/introducing-davinci-babbage-curie-and-ada
「\n\nニワトリはなぜ道を渡ったのですか?\n\n反対側へ行くためです。」 llm_result = llm.generate(["詩を書いてください"]*15)
ご存知の通り、プロンプトとは、ユースケースに基づいて回答を正確かつ具体的に調整するためにシステムに提供する入力情報です。多くの場合、単なるテキストではなく、より構造化された情報が必要になります。対照事前学習とゼロショット学習に基づく多くの新しい物体検出・分類アルゴリズムは、結果予測のための効果的な入力情報としてプロンプトを使用しています。例えば、OpenAIのCLIPとMETAのGrounding DINOはどちらも、予測のための入力情報としてプロンプトを使用しています。 LangChainでは、必要に応じてプロンプトテンプレートを設定し、メインチェーンに接続して出力予測を行うことができます。さらに、LangChainは出力結果をさらに精緻化するための出力パーサー機能も提供しています。出力パーサーの役割は、(1)モデル出力のフォーマットをガイドし、(2)出力を必要な形式に解析することです(必要に応じて再試行を含む)。 LangChainでは、ヒントテンプレートを入力として提供できます。テンプレートとは、回答を取得するための特定の形式または設計図を指します。LangChainは、さまざまな種類のタスクのヒントを生成するために使用できる、事前に設計されたヒントテンプレートを提供しています。ただし、場合によっては、事前設定されたテンプレートがニーズを満たさないことがあります。そのような場合は、カスタムヒントテンプレートを使用できます。
LangChainでは、チェーンとプロキシはデフォルトでステートレスモードで動作します。つまり、各受信クエリを個別に処理します。ただし、一部のアプリケーション(チャットボットなど)では、以前のインタラクションの記録を保持することが、短期的にも長期的にもパフォーマンス向上の上で重要です。ここで「メモリ」という概念が登場します。 LangChainは2種類のメモリコンポーネントを提供します。まず、LangChainは過去のチャットメッセージを管理および操作するためのヘルパーツールを提供します。これらのツールはモジュール化されており、あらゆるユースケースに対応します。次に、LangChainはこれらのツールをチェーン構造に簡単に統合できるため、非常に柔軟で様々な状況に適応できます。
出力:
チェーンは、様々なコンポーネントを統合されたアプリケーションに組み合わせる手段を提供します。例えば、ユーザー入力を受け取り、PromptTemplateを用いてフォーマットし、フォーマットされた応答をLLM(大規模言語モデル)に渡すようなチェーンを作成できます。複数のチェーンを他のコンポーネントと統合することで、より複雑なチェーン構造を生成できます。 LLMChainは、LLMオブジェクトのクエリに最もよく使用されるメソッドの1つと考えられています。入力されたキーと値のペア、およびメモリ上のキーと値のペア(存在する場合)をプロンプトテンプレートに従ってフォーマットし、フォーマットされた文字列をLLMに送信します。LLMは出力を生成して返します。
アプリケーションによっては、LLM(大規模言語モデル)やその他のツールの呼び出し順序が事前に決められているだけでなく、ユーザー入力に基づいて決定される不確定な呼び出し順序も必要になる場合があります。このような場合、複数のツールにアクセスできる「エージェント」がシーケンスに関与します。エージェントはユーザー入力に基づいて、これらのツールを呼び出すかどうかを決定し、呼び出しに必要な入力を決定します。 ドキュメントによると、プロキシの高レベル擬似コードはおおよそ次のようになります。
このプロセスは、エージェントがツールが不要であると判断し、ユーザーに直接応答するまで継続されます。
LangChainを用いて大規模な言語モデルを用いたパイプラインアプリケーションを構築するには、すべてのモジュールと連鎖操作を理解することが不可欠です。これはLangChainの簡単な紹介に過ぎません。 #02 LangChainの実用的なアプリケーション 雑談はここまでにして、早速LangChainを使ったシンプルなアプリケーションの構築に取り掛かりましょう。中でも特に興味深いのは、カスタムデータを使った質疑応答ボットの作成です。 免責事項/警告:このコードは、アプリケーションの構築方法を示すためのデモンストレーションのみを目的としています。コードの最適化を保証するものではなく、具体的な問題によってはさらなる改善が必要になる場合があります。 モジュールのインポートを開始する
環境の設定 OpenAI API キーを取得する方法はご存知だと思いますが、それでも説明したいと思います。
llm = ChatOpenAI(温度=0、モデル名="gpt-3.5-turbo") ここで、独自のデータを追加できます。PDF、テキスト、ドキュメント、CSVなど、任意の形式を使用できます。データ形式に応じて、以下のコードのコメントアウト/アンコメントを行ってください。
埋め込みは、モデルによって処理・生成されたトークンの実体と文脈情報を捉えた数値ベクトルまたは配列として表現されます。これらの埋め込みは、モデルのパラメータまたは重みから導出され、入力テキストと出力テキストのエンコードとデコードに使用されます。 このようにして埋め込みが作成されます。 簡単に言えば、LLMにおける埋め込みとは、テキストを数値ベクトルとして表現する方法です。これにより、言語モデルは単語やフレーズの意味を理解し、テキスト分類、要約、翻訳などのタスクを実行できるようになります。 簡単に言えば、埋め込みとは単語を数値に変換する手法です。これは、大規模なテキストコーパスを用いて機械学習モデルを学習させることで実現されます。モデルは各単語を一意の数値ベクトルに関連付けることを学習します。このベクトルは、単語の意味と他の単語との関係を表します。
埋め込みベクトルはベクトルデータベースに直接保存されます。PineconeやFAISSなど、多くのベクトルデータベースが利用可能です。ここではFAISSを使用します。
独自のヒントを使って、クエリと回答を絞り込むことができます。ヒントを書き終えたら、最終的なチェーンにリンクさせましょう。 qa = 会話検索チェーン.from_llm(ChatOpenAI(温度=0.8), vectorstore.as_retriever(),qa_prompt=QA_PROMPT) シンプルなGradoを使ってWebアプリケーションを作成します。Streamlitやその他のフロントエンドテクノロジーも選択可能です。さらに、Hugging Faceやlocalhostへのデプロイなど、無料のデプロイオプションも多数用意されています。これらについては後ほど説明します。
LangChainスナップショット これは、異なるモジュールを接続して最終的なチェーンを作成する方法を示す簡単な入門編です。モジュールとコードを微調整することで、さまざまな機能を実現できます。実際に遊んでみることが、最高の研究と言えるでしょう! #03 LangChainのトークンとモデル トークン トークンは単語の構成要素と見なすことができます。APIはヒントを処理する前に入力をトークンに分解します。トークンの分割は必ずしも単語の始まりまたは終わりと完全に一致するわけではなく、末尾のスペースやサブワードが含まれる場合もあります。 自然言語処理では、段落を文や単語に分割するためにトークナイザーがよく使用されます。ここでは、文や段落を単語で構成される小さなチャンクに分割します。 上の画像は、テキストをトークンに分割する方法を示しています。異なる色は異なるトークンを表します。目安として、1トークンは一般的な英語テキストの4文字にほぼ相当します。つまり、100トークンはおよそ75語に相当します。 特定のテキストのトークンの数を確認したい場合は、OpenAI の Tokenizer で直接確認できます。
最後に、上記の関数を使用します。
出力: 最終トークン数: 2094 まず、OpenAIが提供する様々なモデルについて理解しましょう。このブログでは、OpenAIのモデルに焦点を当てます。また、ハグ顔モデルやコヒーレAIモデルも利用できます。 まずは基本モデルを理解しましょう。 モデル GPTは大規模なデータセットで学習されるため、非常に強力です。しかし、この強力な機能にはコストがかかるため、OpenAIはエンジンとも呼ばれるいくつかの代替モデルを提供しています。 ダヴィンチは最大かつ最も強力なエンジンです。他のエンジンが実行できるすべてのタスクを実行できます。バベッジは2番目に強力なエンジンで、キュリーとエイダが実行できるタスクを実行できます。エイダは最も弱いエンジンですが、最高の性能と最も低価格を誇ります。 GPTは進化を続けており、様々なバージョンのモデルが提供されています。GPTシリーズには約50種類のモデルがあります。 OpenAIの公式モデルページからのスクリーンショット そのため、画像生成・編集、音声処理・エンコードなど、用途に応じて異なるモデルが利用可能です。テキスト処理や自然言語処理では、タスクを正確に実行できるモデルを選択する必要があります。上の図には、利用可能な3つのモデルが表示されています。
しかし、GPT-4は現在、限定的なテスト段階にあり、特定の承認されたユーザーのみが使用できるため、直接使用することはできません。ウェイティングリストに登録して承認を待つ必要があります。そのため、GPT-3とGPT-3.5の2つの選択肢しか残されていません。 OpenAIの公式モデルページからのスクリーンショット 上の画像は、GPT-3とGPT-3.5で利用可能なモデルを示しています。これらのモデルは、Davinci、Babbage、Curie、Adaの異なるバージョンに基づいていることがわかります。 上のグラフを見ると、「最大トークン数」という列があります。「最大トークン数」はOpenAIモデルのパラメータで、1回のリクエストで生成できるトークン数を制限するものです。この制限には、プロンプト用のトークン数と補完用のトークン数の両方が含まれます。 つまり、プロンプトで1,000トークンを使用する場合、補完テキストとして生成できるトークンは最大3,000トークンまでです。さらに、「最大トークン数」の制限はOpenAIサーバーによって適用されます。この制限を超えるテキストを生成しようとすると、リクエストは拒否されます。 GPT-3ベースのモデルでは「最大トークン数」の値が低く(2049)、GPT-3.5ベースのモデルでは値が高く(4096)、そのため、GPT-3.5モデルはより多くのデータを処理できます。 次に、さまざまなモデルの価格を見てみましょう。 GPT-3.5をベースにした「gpt-3.5-turbo」モデルを選択できます。 5000 語あり、「gpt-3.5-turbo」モデルを使用していると仮定すると、次のようになります。 5000 語はおよそ 6667 トークンに相当します。 さて、1000トークンには0.002ドルが必要です。 したがって、6667 トークンの場合、約 0.0133 ドルが必要になります。 処理に必要な使用量は大まかに計算できます。また、反復回数はトークン数を変化させるパラメータなので、計算時に考慮する必要があります。 トークンの重要性はご理解いただけたかと思います。だからこそ、ドキュメント内のノイズを減らし、トークン処理のコストを削減するために、非常にクリーンで適切な前処理を行う必要があるのです。つまり、ノイズ除去など、テキストを適切にクリーニングすることが極めて重要です。余分なスペースを削除するだけでも、APIキーのコストを節約できます。 メモリ グラフ内のすべてのモデルを表示してみましょう。 要約 トークンは、質問応答やその他のLLM関連タスクに不可欠です。真のゲームチェンジャーは、より安価なモデルの使用を可能にする方法でデータを前処理する方法です。モデルの選択は、許容できるトレードオフによって異なります。Davinciファミリーは速度と精度が向上しますが、コストは高くなります。GPT-3.5 Turboベースのモデルはコスト効率は高くなりますが、速度は遅くなります。 |