HUOXIU

大規模モデルフレームワークを1つの記事で理解する: LangChain

出典:AI研究局

著者: 張偉

私たちは日常生活において、エンドツーエンドのアプリケーション構築に取り組んでいます。機械学習プロセスを自動化するための自動化された機械学習プラットフォームや継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインは数多く存在します。また、RoboflowやAndrew Ng氏のLanding AIといったツールも、エンドツーエンドのコンピュータービジョンアプリケーションを自動化または作成するために利用できます。

以前は、OpenAIやHugging Faceを使った大規模言語モデルに基づくアプリケーションを作成したい場合、手作業で行わなければならなかったかもしれません。今では、同じ目的を達成するために、HaystackとLangChainという2つの有名なライブラリがあり、大規模言語モデルに基づくエンドツーエンドのアプリケーションやプロセスの作成に役立ちます。

LangChain を詳しく見てみましょう。

#01

LangChainとは何ですか?

LangChainは、言語モデル駆動型アプリケーションの開発方法に革命をもたらす革新的なフレームワークです。 高度な原理を導入することで、LangChainは従来のAPIの限界を再定義します。さらに、LangChainアプリケーションは、言語モデルが環境と対話し、適応することを可能にするインテリジェントエージェントを備えています。

LangChainは複数のモジュールで構成されています。その名前が示すように、 LangChainの主な目的はこれらのモジュールを連結することです。つまり、各モジュールを連結し、このチェーン構造を使用してすべてのモジュールを一度に呼び出すことができます。

これらのモジュールは次の部分で構成されています。

モデル

冒頭で述べたように、これらのモデルは主に大規模言語モデル(LLM)を包含します。大規模言語モデルとは、大規模なラベルなしテキストで学習された多数のパラメータを持つニューラルネットワークモデルを指します。テクノロジー大手は、以下のような様々な大規模言語モデルを開発しています。

  • GoogleのBERT
  • OpenAIのGPT-3
  • Google LaMDA
  • Google PaLM
  • Meta AIのLLaMA
  • OpenAIのGPT-4
  • ...

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

ケース1:

# モジュールのインポート
langchain.llmsからOpenAIをインポート

#ここではtext-ada-001を使用していますが、変更することもできます
llm = OpenAI(モデル名= "text-ada-001" 、n=2、ベストオブ=2)

#何でも聞いてください
llm( 「ジョークを言って」 )

出力1:

 「\n\nニワトリはなぜ道を渡ったのですか?\n\n反対側へ行くためです。」

ケース2:

 llm_result = llm.generate(["詩を書いてください"]*15)

出力2:

[Generation(text= "\n\nもし愛が言葉にならないとしたら\n\nもし愛が終わらないとしたら\n\nもし愛が単なる感情だとしたら\n\n私はこの愛を知ることはないだろう\n\nそれは感情ではない\n\nでもそれは私たちがお互いに抱いているものだ\n\n私たちはただ愛が強いものだと知っている\n\nそして私たちは幸せにならずにはいられない\n\n私たちはただ私たちにとっての愛が何であるかを感じる\n\nそして私たちは心からお互いを愛している\n\nただそれがどうなるかはわからない\n\nでも私たちは愛が強いものだと知っている\n\nそして私たちはいつもお互いを\n\n私たちの人生の中にいるだろう。" ),
Generation(text= '\n\n昔々\n\nとても純粋で真実な愛がありました\n\nそれは何世紀も続き\n\n決して古びたり乾いたりすることはありませんでした\n\n感動的で生き生きしていました\n\nそして愛の心臓は\n\n今も強く真実に鼓動しています。' )]

プロンプト

ご存知の通り、プロンプトとは、ユースケースに基づいて回答を正確かつ具体的に調整するためにシステムに提供する入力情報です。多くの場合、単なるテキストではなく、より構造化された情報が必要になります。対照事前学習とゼロショット学習に基づく多くの新しい物体検出・分類アルゴリズムは、結果予測のための効果的な入力情報としてプロンプトを使用しています。例えば、OpenAIのCLIPとMETAのGrounding DINOはどちらも、予測のための入力情報としてプロンプトを使用しています。

LangChainでは、必要に応じてプロンプトテンプレートを設定し、メインチェーンに接続して出力予測を行うことができます。さらに、LangChainは出力結果をさらに精緻化するための出力パーサー機能も提供しています。出力パーサーの役割は、(1)モデル出力のフォーマットをガイドし、(2)出力を必要な形式に解析することです(必要に応じて再試行を含む)。

LangChainでは、ヒントテンプレートを入力として提供できます。テンプレートとは、回答を取得するための特定の形式または設計図を指します。LangChainは、さまざまな種類のタスクのヒントを生成するために使用できる、事前に設計されたヒントテンプレートを提供しています。ただし、場合によっては、事前設定されたテンプレートがニーズを満たさないことがあります。そのような場合は、カスタムヒントテンプレートを使用できます。

ケーススタディ:

langchainからPromptTemplateをインポート
# このテンプレートはプロンプトの青写真として機能します

テンプレート = """
新しい会社のネーミングコンサルタントとして活躍していただきたいです。
{product} を製造している会社に適した名前は何でしょうか?
「」


プロンプト = プロンプトテンプレート(
input_variables=[ "製品" ],
テンプレート=テンプレート、

prompt.format(product= "カラフルな靴下" )
# -> 新しい会社のネーミングコンサルタントとして活躍してもらいたいです。
# -> カラフルな靴下を製造している会社に適した名前は何でしょうか?

メモリ

LangChainでは、チェーンとプロキシはデフォルトでステートレスモードで動作します。つまり、各受信クエリを個別に処理します。ただし、一部のアプリケーション(チャットボットなど)では、以前のインタラクションの記録を保持することが、短期的にも長期的にもパフォーマンス向上の上で重要です。ここで「メモリ」という概念が登場します。

LangChainは2種類のメモリコンポーネントを提供します。まず、LangChainは過去のチャットメッセージを管理および操作するためのヘルパーツールを提供します。これらのツールはモジュール化されており、あらゆるユースケースに対応します。次に、LangChainはこれらのツールをチェーン構造に簡単に統合できるため、非常に柔軟で様々な状況に適応できます。

ケーススタディ:

langchain.memoryからChatMessageHistoryをインポートする

履歴= チャットメッセージ履歴()
history.add_user_message( "こんにちは!" )

history.add_ai_message( "どうしたの?" )
履歴メッセージ

出力:

[HumanMessage(content= 'hi!' ,Additional_kwargs={}),
AIMessage(content= '調子はどう?' , additional_kwargs={})]

チェーンは、様々なコンポーネントを統合されたアプリケーションに組み合わせる手段を提供します。例えば、ユーザー入力を受け取り、PromptTemplateを用いてフォーマットし、フォーマットされた応答をLLM(大規模言語モデル)に渡すようなチェーンを作成できます。複数のチェーンを他のコンポーネントと統合することで、より複雑なチェーン構造を生成できます。

LLMChainは、LLMオブジェクトのクエリに最もよく使用されるメソッドの1つと考えられています。入力されたキーと値のペア、およびメモリ上のキーと値のペア(存在する場合)をプロンプトテンプレートに従ってフォーマットし、フォーマットされた文字列をLLMに送信します。LLMは出力を生成して返します。

言語モデルを呼び出した後、一連のステップを実行することで、複数のモデル呼び出しを連続して実行できます。このアプローチは、ある呼び出しの出力を別の呼び出しの入力として使用したい場合に特に便利です。この連鎖シーケンスでは、各ステップに入力と出力があり、あるステップの出力が次のステップの入力として使用されます。

#ここですべてを連鎖させています
langchain.chat_models から ChatOpenAI をインポート
langchain.prompts.chat からインポート (
チャットプロンプトテンプレート、
HumanMessagePromptTemplate、

human_message_prompt = ヒューマンメッセージプロンプトテンプレート(
prompt=プロンプトテンプレート(
template= "{product} を製造する会社に適した名前は何でしょうか?" ,
input_variables=[ "製品" ],


chat_prompt_template = ChatPromptTemplate.from_messages([human_message_prompt])
チャット = ChatOpenAI(温度=0.9)
# 温度は答えのランダム性に関するもので、温度が高ければ高いほど答えはランダムになります
#ファイナルチェーン

チェーン = LLMChain(llm=チャット、プロンプト=チャットプロンプトテンプレート)
print (chain.run( "カラフルな靴下" ))

エージェント

アプリケーションによっては、LLM(大規模言語モデル)やその他のツールの呼び出し順序が事前に決められているだけでなく、ユーザー入力に基づいて決定される不確定な呼び出し順序も必要になる場合があります。このような場合、複数のツールにアクセスできる「エージェント」がシーケンスに関与します。エージェントはユーザー入力に基づいて、これらのツールを呼び出すかどうかを決定し、呼び出しに必要な入力を決定します。

ドキュメントによると、プロキシの高レベル擬似コードはおおよそ次のようになります。

  1. ユーザー入力を受け取ります。
  2. エージェントは、入力に基づいてツールを使用するかどうか、およびそのツールへの入力が何であるかを決定します。
  3. ツールを呼び出して、観察結果(つまり、ツールを呼び出してデータを入力した後に取得された出力)を記録します。
  4. ツール、ツールの入力、および観察の履歴がエージェントに返され、エージェントは次に実行するステップを決定します。
  5. エージェントがツールが不要であると判断するまで上記の手順を繰り返し、その後ユーザーに直接応答します。

このプロセスは、エージェントがツールが不要であると判断し、ユーザーに直接応答するまで継続されます。

ケーススタディ:

langchain.agentsからload_toolsをインポートする
langchain.agentsからinitialize_agentをインポートする
langchain.agentsからAgentTypeをインポート
langchain.llmsからOpenAIをインポート

llm = OpenAI(温度=0)

ツール = load_tools([ "serpapi" , "llm-math" ], llm=llm)

エージェント = initialize_agent(tools, llm, エージェント=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

agent.run( "レオ・ディカプリオのガールフレンドは誰ですか?彼女の現在の年齢を 0.43 乗すると何歳ですか?" )

下の図にすべてをまとめてみましょう。

LangChainを用いて大規模な言語モデルを用いたパイプラインアプリケーションを構築するには、すべてのモジュールと連鎖操作を理解することが不可欠です。これはLangChainの簡単な紹介に過ぎません。

#02

LangChainの実用的なアプリケーション

雑談はここまでにして、早速LangChainを使ったシンプルなアプリケーションの構築に取り掛かりましょう。中でも特に興味深いのは、カスタムデータを使った質疑応答ボットの作成です。

免責事項/警告:このコードは、アプリケーションの構築方法を示すためのデモンストレーションのみを目的としています。コードの最適化を保証するものではなく、具体的な問題によってはさらなる改善が必要になる場合があります。

モジュールのインポートを開始する

大規模言語モデルセクション用にLangChainとOpenAIをインポートしてください。まだインストールしていない場合は、まずインストールしてください。

#輸入品
langchain.embeddings.openai から OpenAIEmbeddings をインポート
langchain.vectorstoresからChromaをインポート
langchain.text_splitterからCharacterTextSplitterをインポートします
langchain.chains から ConversationalRetrievalChain をインポートします
langchain.vectorstores から ElasticVectorSearch、Pinecone、Weaviate、FAISS をインポートします
PyPDF2からPdfReaderをインポートする
langchainからOpenAI、VectorDBQAをインポート
langchain.vectorstoresからChromaをインポート
langchain.promptsからPromptTemplateをインポートする
langchain.chainsからConversationChainをインポートする

langchain.document_loadersからTextLoaderをインポートする
# langchain から ConversationalRetrievalChain をインポートします
langchain.chains.question_answeringからload_qa_chainをインポートします
langchainからLLMChainをインポート
# langchain から取得者をインポートする
langchainをインポートする
langchain.chains.conversation.memory から ConversationBufferMemory をインポートします

py2PDFはPDFファイルの読み込みと処理のためのツールです。さらに、ConversationBufferMemoryやConversationBufferWindowMemoryなど、それぞれ特定の機能を持つ様々な種類のメモリがあります。メモリについては最後のセクションで詳しく説明します。

環境の設定

OpenAI API キーを取得する方法はご存知だと思いますが、それでも説明したいと思います。

  1. OpenAI API ページに移動します。
  2. 「新しい秘密鍵を作成」をクリックします
  3. これがAPIキーになります。下記に貼り付けてください。

インポートOS
os.environ[ "OPENAI_API_KEY" ] = "sk-あなたのAPIキー"

どのモデルを使うべきでしょうか?Davinci、Babbage、Curie、それともAdaでしょうか?GPT-3、GPT-3.5、それともGPT-4をベースにしたモデルでしょうか?モデルに関する疑問は数多くありますが、それぞれのモデルは異なるタスクに適しています。安価なモデルもあれば、より高精度なモデルもあります。
簡潔にするために、最もコスト効率の高いモデル「gpt-3.5-turbo」を使用します。温度は、答えのランダム性に影響を与えるパラメータです。温度の値が高いほど、得られる答えはよりランダムになります。

 llm = ChatOpenAI(温度=0、モデル名="gpt-3.5-turbo") 

ここで、独自のデータを追加できます。PDF、テキスト、ドキュメント、CSVなど、任意の形式を使用できます。データ形式に応じて、以下のコードのコメントアウト/アンコメントを行ってください。

# カスタムデータ
langchain.document_loadersからDirectoryLoaderをインポートする
pdf_loader = PdfReader(r 'PDFの場所' )

# excel_loader = DirectoryLoader('./Reports/', glob="**/*.txt")
# word_loader = DirectoryLoader('./Reports/', glob="**/*.docx")

すべてのデータを一度に追加することはできません。データをチャンクに分割して送信し、データ埋め込みを作成します。

埋め込みは、モデルによって処理・生成されたトークンの実体と文脈情報を捉えた数値ベクトルまたは配列として表現されます。これらの埋め込みは、モデルのパラメータまたは重みから導出され、入力テキストと出力テキストのエンコードとデコードに使用されます。

このようにして埋め込みが作成されます。

簡単に言えば、LLMにおける埋め込みとは、テキストを数値ベクトルとして表現する方法です。これにより、言語モデルは単語やフレーズの意味を理解し、テキスト分類、要約、翻訳などのタスクを実行できるようになります。

簡単に言えば、埋め込みとは単語を数値に変換する手法です。これは、大規模なテキストコーパスを用いて機械学習モデルを学習させることで実現されます。モデルは各単語を一意の数値ベクトルに関連付けることを学習します。このベクトルは、単語の意味と他の単語との関係を表します。

上の図とまったく同じことをやってみましょう。

#ファイルの前処理

生のテキスト = ''
iの場合、pageenumerate(pdf_loader.pages):
テキスト = page.extract_text()
テキストの場合:
raw_text += テキスト

# print(raw_text[:100])


text_splitter = 文字テキストスプリッター(
セパレーター = "\n"
チャンクサイズ = 1000、
チャンクオーバーラップ = 200、
長さ関数 = len、

テキスト = text_splitter.split_text(raw_text)

実際には、ユーザーがクエリを開始すると、ベクターストア内で検索が実行され、最適なインデックスが取得されます。このインデックスはLLMに渡されます。LLMはインデックスの内容を再構築し、フォーマットされたレスポンスをユーザーに提供します。
理解を深めるために、ベクトルの保存と埋め込みの概念をさらに深く調べることをお勧めします。

埋め込み = OpenAIEmbeddings()
# vectorstore = Chroma.from_documents(ドキュメント、埋め込み)
ベクトルストア = FAISS.from_texts(テキスト、埋め込み)

埋め込みベクトルはベクトルデータベースに直接保存されます。PineconeやFAISSなど、多くのベクトルデータベースが利用可能です。ここではFAISSを使用します。

prompt_template = """以下の文脈を使って、最後の質問に答えてください。答えがわからない場合は、GTGTTGTGTGTGTGTGTG とだけ言ってください。答えをでっち上げようとしないでください。
{コンテクスト}
質問: {質問}
役に立つ回答:"""

QA_PROMPT = プロンプトテンプレート(
template=prompt_template, input_variables=[ 'context' , "question" ]

独自のヒントを使って、クエリと回答を絞り込むことができます。ヒントを書き終えたら、最終的なチェーンにリンクさせましょう。

最後のチェーンを呼び出しましょう。これは、以前にリンクされたすべてのコンテンツを含みます。ここではConversationalRetrievalChainを使用します。これは、人間のような会話を実現し、以前のチャットログを記憶するのに役立ちます。

 qa = 会話検索チェーン.from_llm(ChatOpenAI(温度=0.8), vectorstore.as_retriever(),qa_prompt=QA_PROMPT) 

シンプルなGradoを使ってWebアプリケーションを作成します。Streamlitやその他のフロントエンドテクノロジーも選択可能です。さらに、Hugging Faceやlocalhostへのデプロイなど、無料のデプロイオプションも多数用意されています。これらについては後ほど説明します。

# フロントエンドウェブアプリ
gradio を gr としてインポート
gr.Blocks() をデモとして使用します:
gr.Markdown( "## Grounding DINO ChatBot" )
チャットボット = gr.Chatbot()
msg = gr.Textbox()
clear = gr.Button( "クリア" )
チャット履歴 = []

def user(user_message, history )
print ( "使用タイプメッセージ:" , type (user_message))
# QAチェーンからの応答を取得する
応答 = qa({ "質問" : ユーザーメッセージ, "チャット履歴" :履歴})
#ユーザーメッセージと応答をチャット履歴に追加する
history.append((user_message, response[ "answer" ]))
印刷履歴
gr.update(value= "" )を返す履歴
msg.submit(ユーザー, [メッセージ, チャットボット], [メッセージ, チャットボット], キュー=False)
clear.click(lambda: None, None, チャットボット, キュー=False)
############################################

__name__ == "__main__"の場合:
デモを起動します(デバッグ=True)

このコードはローカルにリンクを作成し、直接質問したり回答を閲覧したりできるようになります。同時に、統合開発環境(IDE)内でチャット履歴のメンテナンス状況も確認できます。

LangChainスナップショット

これは、異なるモジュールを接続して最終的なチェーンを作成する方法を示す簡単な入門編です。モジュールとコードを微調整することで、さまざまな機能を実現できます。実際に遊んでみることが、最高の研究と言えるでしょう!

#03

LangChainのトークンとモデル

トークン

トークンは単語の構成要素と見なすことができます。APIはヒントを処理する前に入力をトークンに分解します。トークンの分割は必ずしも単語の始まりまたは終わりと完全に一致するわけではなく、末尾のスペースやサブワードが含まれる場合もあります。

自然言語処理では、段落を文や単語に分割するためにトークナイザーがよく使用されます。ここでは、文や段落を単語で構成される小さなチャンクに分割します。

上の画像は、テキストをトークンに分割する方法を示しています。異なる色は異なるトークンを表します。目安として、1トークンは一般的な英語テキストの4文字にほぼ相当します。つまり、100トークンはおよそ75語に相当します。

特定のテキストのトークンの数を確認したい場合は、OpenAI の Tokenizer で直接確認できます。

トークンの数を計算する別の方法は、tiktoken ライブラリを使用することです。

ティックトックをインポートする
#文字列入力を受け取りトークンの数を返す関数を書く
def num_tokens_from_string(文字列: str、エンコーディング名: str) -> int:
"""テキスト文字列内のトークンの数を返します。"""
エンコーディング = tiktoken.encoding_for_model(エンコーディング名)
num_tokens = len(encoding.encode(文字列))
num_tokensを返す

最後に、上記の関数を使用します。

プロンプト = []
データ内のiについて:
prompt.append((num_tokens_from_string(i[ 'prompt' ], "davinci" )))

完了 = []
データ内のjについて:
補完.append((num_tokens_from_string(j[ '補完' ], "davinci" )))

res_list = []
i が範囲(0, len(prompt))内にある場合:
res_list.append(プロンプト[i] + 補完[i])

最終トークンなし = 0
res_list内のiについて:
最終トークンなし+=i
print ( "最終トークンの数" ,no_of_final_token)

出力:

最終トークン数: 2094

さまざまなモデルの選択は、トークンの数によって影響を受けます。

まず、OpenAIが提供する様々なモデルについて理解しましょう。このブログでは、OpenAIのモデルに焦点を当てます。また、ハグ顔モデルやコヒーレAIモデルも利用できます。

まずは基本モデルを理解しましょう。

モデル

GPTは大規模なデータセットで学習されるため、非常に強力です。しかし、この強力な機能にはコストがかかるため、OpenAIはエンジンとも呼ばれるいくつかの代替モデルを提供しています。

ダヴィンチは最大かつ最も強力なエンジンです。他のエンジンが実行できるすべてのタスクを実行できます。バベッジは2番目に強力なエンジンで、キュリーとエイダが実行できるタスクを実行できます。エイダは最も弱いエンジンですが、最高の性能と最も低価格を誇ります。

GPTは進化を続けており、様々なバージョンのモデルが提供されています。GPTシリーズには約50種類のモデルがあります。

OpenAIの公式モデルページからのスクリーンショット

そのため、画像生成・編集、音声処理・エンコードなど、用途に応じて異なるモデルが利用可能です。テキスト処理や自然言語処理では、タスクを正確に実行できるモデルを選択する必要があります。上の図には、利用可能な3つのモデルが表示されています。

  • GPT-3
  • GPT-3.5
  • GPT-4

しかし、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ベースのモデルはコスト効率は高くなりますが、速度は遅くなります。