大嶋氏の自己紹介

大嶋勇樹氏:では、「プロンプトエンジニアリングから始めるLangChain入門」ということで始めます。

最初に私の自己紹介ですが、名前は大嶋勇樹と申します。最近はよく「しま」さんとか、そんなふうに呼ばれています。キャリアは、都内のIT企業に新卒で就職して、そこからフリーランスエンジニアを経て、今は会社を設立していろいろやっています。最近は実務に就き始めのエンジニアのスキルアップのサポートということで、研修や勉強会の開催、Udemy講座の作成をやっていたりします。

今日は実務に就き始めとかはあまり関係ないテーマですが、データ分析や機械学習に関連する業務経験だと、AWSでデータ分析基盤みたいなものを作ったり、DockerやKubernetesを使って機械学習アプリケーションの基盤を作ったりしています。

LangChainのキャッチアップはプロンプトエンジニアリングから学ぶとスムーズ

自己紹介はこのぐらいにして、「プロンプトエンジニアリングから始めるLangChain入門」ということで入っていこうと思います。

まず背景として、ChatGPTは2022年末に公開されて以来、特に一般にも知られるようなキーワードとして、すごく盛り上がっていると思います。そしてChatGPTが使っているGPT-3.5やGPT-4といったモデルは、大規模言語モデル、LLM、Large Language Modelと呼ばれています。LLM周辺のトピックとして、特にこの数ヶ月は毎日のように新しい発表が話題になっていると思います。

そんな中、LLMを使ったアプリケーションを開発するためのツールとして、LangChainがすごく注目を集めています。そして、LangChainをキャッチアップするには、LLMに狙いどおりの動きをさせるためには、内部で使われているプロンプトエンジニアリングから学ぶとスムーズかなと、私が実際にLangChainをちょっと勉強してみて思ったところです。

そこで、この勉強会ではプロンプトエンジニアリングから始めて、LangChainに入門していきます。

今日は参加者も多いので、前提を一応補足すると、今日の主な対象者は、LLMを使ってなにか作ってみたいと思っている方や、アプリケーションを作るイメージをつけたいという方を想定しています。前提知識としては、ChatGPTに触れたことがある、またPythonの基礎知識がある程度としています。

そして、もう1点だけ注意事項として、今回の発表でLLMや機械学習自体の仕組みの話はないです。あくまでLLMを使ったアプリケーション開発がテーマです。また、LangChainに触れたことがない方を想定した内容なので、すでにLangChainに触れたことがある、ある程度触っている方には初歩的かもしれませんが、そのあたりはご了承ください。

LLMとは、OpenAIとは

ということでアジェンダです。OpenAIのLLMの概要から始めて、プロンプトエンジニアリングの概要、そしてLangChain入門と進めていこうと思います。

では、さっそくOpenAIのLLMの概要から入っていきますが、今日は1時間ぐらいを想定した勉強会なので、このあたりはさらっといこうと思っています。

そもそも「LLMとは?」「OpenAIとは?」というところがまず疑問としてあるかもしれませんが、ここはせっかくなのでChatGPTに聞いてみるのがいいかなと思います。

「LLMって何?」と事前にChatGPTのGPT-4に聞いてみると、「LLMとは、一般的にLarge Language Modelの略で、大規模な自然言語モデルを指します」と。そして、「これらのモデルは、機械学習、深層学習技術を利用して、テキストデータの理解や生成を行います。代表的なLLMには、OpenAIが開発したGPTシリーズがあります」と、こんな感じで自己紹介をしてくれます。

もう1つ、OpenAIのLLMの概要みたいな話で、「OpenAIとは?」についてもChatGPTのGPT-4に聞いてみました。

「OpenAIとは?」と聞くと、「OpenAIは、人工知能の研究と開発を行うプライベート企業で、2015年に設立されました。主な目標は、友好的で人間の利益にかなうかたちでAGIを開発することです。人工一般知能とは」とか、いろいろ説明してくれます。

信憑性として完全に大丈夫かは別として、そこそこいい回答を返してくれているんじゃないかなと思います。

GPT-4やGPT-3.5は“モデルのファミリー”

今「ChatGPTのGPT-4」みたいな言い方をしましたが、ChatGPTはGPT-4だったり、GPTの3.5といったモデルを使っています。ChatGPTのプラン次第ですが、Plusプランに入ると、GPT-4を選んでチャット、メッセージを送って応答を得ることができるようになっています。

(スライドを示して)こんな感じで、OpenAIのモデルには大きくこんな分類があります。例えばGPT-4やGPT-3.5、GPT-3のような自然言語やコードを生成するモデルもあれば、「Whisper」という音声をテキストに変換するモデルもあれば、「Embeddings」という、テキストを数値のベクトルに変換するモデルもあります。ほかにもいろいろありますが、OpenAIのモデルはそもそもこんなふうにいろいろな分類があります。

主にGPT-4やGPT-3.5を使ったアプリケーション開発が今日の主なトピックですが、そういったことをする時は、こういったモデルをOpenAIのAPI経由で使うことになります。

そして、ここが最初に混乱しやすいところです。今日はそんなに大事じゃないのでなんとなくの理解でもいいんですが、実はGPT-4やGPT-3.5やGPT-3というのは、実際にはモデルの集まりみたいなものだったりします。“モデルのファミリー”みたいな表現を公式ドキュメントでもしています。

GPT-4は実際のモデルの名前も「gpt-4」だったりするのでややこしいんですが、GPT-3.5といった場合には、実際のモデルは「gpt-3.5-turbo」や「text-davinci-003」や「text-davinci-002」など、実際のモデルはいろいろあって、その集まりをGPT-3.5と言っています。GPTの3でも、実際のモデルは「text-curie-001」や「text-babbage-001」や「text-ada-001」などになっています。

このモデルの中からどれを使うか選択して使うことになるんですが、もともとはこのtext-ada、babbage、curie、davinciみたいなものがありました。低性能・安価なものから高性能で高価なものまであって、性能と料金がトレードオフみたいな状態だったのが、3月1日にgpt-3.5-turboというものが使えるようになって。それまで使えて(いるものの中で)一番高性能だったtext-davinci-003の10分の1というめちゃくちゃ安価な価格で使えて、これがすごく話題になりました。

さらに、最近はLimited Betaですがgpt-4のモデルも使うことができます。なので、実際にアプリケーションを開発するためにAPIを使う時は、このGPT-3.5などの括りの名前ではなくて、gpt-4やgpt-3.5-turboやtext-davinci-003などの名前でモデルを指定して使うことになります。

OpenAIの文章生成のAPI「Chat」「Completions」

もう少しこのモデルやAPIの使い方について補足しておこうと思います。このOpenAIの文章生成のAPIは、実は「Chat」と「Completions」という2種類があります。

以前からあるこのあたりのモデルについてはCompletionsというAPIが使えるのに対して、最近のちょっと新しいモデルについてはChatというAPIが使えるようになっています。

このAPIは今日は技術的な前提知識が人によってぜんぜん違うと思うので、ざっくり説明になりますが、本当にいわゆるURLみたいなものが違ったり、呼び出す時に与えるパラメーターみたいなものが違ったりします。

実際にはChatのほうが新しいモデルに対応していて、新しいモデルを使おうとするとChatのAPIを使わないといけないみたいになっているので、実際の開発だと性能や料金の観点からChatのAPIを使いたいケースが多いと思います。

このChatのAPIは少し複雑というか、ちょっと変わった使い方になっているので、今日のLangChainの入門というテーマだと少しわかりにくいです。なので、今日のLangChainの入門のためには、CompletionsというAPIを使ったほうがわかりやすいので、今日はCompletionsの中で一番性能のいい、text-davinci-003を使う例で進めていこうと思います。

今ごちゃごちゃとモデルの説明やAPIの説明をしましたが、このあたりは最初はなんとなくでも大丈夫です。

触り始めるとよくわからなくて詰まりやすいので整備しましたが、いったん「text-davinci-003という名前のモデルを使う」というところだけ押さえてもらえれば大丈夫です。

実際にAPIを使うってどんな感じかというところで、実際にコードを資料にも載せているんですが、ちょっと動かしてみようと思います。(画面を示して)こんな感じのPythonのコードを用意して、実行するとAPIを叩けます。poetry run python……。このコードを実行してみます。

そうすると、こんな感じで返ってきます。

何をしたかというと、ざっくりですがOpenAIのAPIキーを指定して、さらにモデルの名前、先ほど話に出したtext-davinci-003を指定しています。が

モデルの名前を指定して、ここは「hello」だけですが、ChatGPTで打つのと同じようなプロンプトを指定して実行しています。すると、こんな感じで応答がいろいろ返ってくるわけですね。

スライドに戻って説明をすると、APIキーを指定するのと、モデルの名前とプロンプトを文字列として指定しました。実はこの「model」「prompt」以外にもいろいろなパラメーターが指定できるんですが、「temperature」は有名なパラメーターなので紹介します。

これは0に近いほど毎回同じ応答になりやすいというようなパラメーターですね。ほかにもいろいろなパラメーターがありますが、そのあたりはドキュメントを参照するといいかなと思います。

(スライドを示して)応答も返ってきましたが、応答はこんな内容です。いろいろごちゃごちゃ書かれていますが、応答のテキスト、ChatGPTでいう画面に表示されるようなテキスト。「Hello there! How are you doing today?」みたいな内容が、「hello」に対して返ってきました。

あとはプロンプトに使われたトークン数。応答のトークン数、そして合計数が表示されます。入力したプロンプトのトークン数と、返ってきた応答のトークン数の合計で料金が発生することになっています。

ということで、ここまでGPT-4やGPT-3.5などの文章生成のためのアプリケーションを開発する場合は、OpenAIのAPIのChatかCompletionsを使うということを見てきました。

そしてCompletionsのAPIを使う時は、モデルの名前、例えばtext-davinci-003と、プロンプトを文字列として渡すと応答が返ってくるということです。簡単に言えば、APIでもプロンプトを渡して応答のテキストを得ること自体は同じです。というのもあって、やはりプロンプトをどう工夫するかが大事ということですね。

Q&A

ということで、(ここから)プロンプトエンジニアリングの概要に入っていきますが、少しQ&Aをいただいているので、一応回答しようと思います。Q&Aをもらえれば適宜回答しようと思います。

今Zoomでご質問いただいたのは、「料金体系の仕組みについて質問させてください。料金体系は1リクエストで100トークンのテキストを送信した場合は、最低料金として0.002が発生するのかどうか?」と。どのタイミングで最低料金が発生するかについては、すみません、そこは僕もドキュメントとかをそこまで見られていなくてわからないです。

ドキュメントを見てもらうのが一番いいと思いますが、正直OpenAIのドキュメントはまだ整いきっていないので、もしかするとわかりにくいかもしれないですね。パッと見た範囲だと見つからなかったかもしれないです。すみません。

チャットのほうで「text-davinci-003だと料金注意ですね」ということですが、これはいわゆる今よく使われるgpt-3.5のものよりも料金が高めなので、ちょっと注意ですね。

もう少し質問をもらっていますが、今日は時間の都合もあるので、特に内容に近いものを優先して回答しようと思います。

いったん続きに進みたいと思います。最後の時間では、できるだけQ&Aを全部、残ったものを回答するつもりです。

(次回につづく)