WEBVTT 00:00.680 --> 00:05.900 LMにツールを装備するプロジェクトを続けよう。 00:05.900 --> 00:12.200 関数を記述するために、 このコードを作成しました。 00:12.200 --> 00:20.930 そして次のステップは、 toolsと呼ばれるものを作成する。 00:20.960 --> 00:22.340 そして私たちの場合は1つしかない。 00:22.340 --> 00:24.560 それはファンクションである。 00:24.560 --> 00:28.460 そして、 その機能がここにある。 00:28.460 --> 00:31.880 ツールというリストに入っている。 00:32.840 --> 00:38.630 そして今、 このGPTでLMを与える時が来た。 00:38.660 --> 00:41.570 多くの人にとって、 このツールを使う力は大きい。 00:41.570 --> 00:43.190 どうなるんだ? 00:43.190 --> 00:48.710 だから、 ちょっと手こずるんだ......警告しておくけど、 ちょっと手こずることを精神的に覚悟しておいてほしい。 00:48.710 --> 00:51.980 それは、 あなたにとって非常に見慣れたものから始まる。 00:51.980 --> 00:54.680 これはいつものチャット機能です。 00:54.680 --> 00:55.760 よくご存知でしょう。 00:55.760 --> 01:03.290 あなたが知っているメッセージを履歴に残し、 それを使ってOpenAIに送るメッセージを作成する。 01:03.320 --> 01:05.930 さて、 ここには小さな微妙な違いがある。 01:05.930 --> 01:06.950 何かが変わった。 01:06.950 --> 01:08.360 何かが追加された。 01:08.570 --> 01:10.880 あなたがそれを見つけるまで、 少し待ちます。 01:10.910 --> 01:16.220 一度目につければ一目瞭然だが、 そこにはちょっとした補足がある。 01:16.220 --> 01:19.070 そして、 もし見たなら、 とても素晴らしかった。 01:19.070 --> 01:20.720 そうでないなら、 それは非常に明白だ。 01:20.720 --> 01:21.500 これだ。 01:22.370 --> 01:23.870 道具の中でパスする。 01:23.870 --> 01:27.350 APIはまったく同じチャット・ドット補完、 ドット作成だ。 01:27.380 --> 01:31.520 モデルを与え、 メッセージを与え、 そしてツールも与える。 01:31.520 --> 01:34.970 つまり、 このオブジェクトをここに置くのだ。 01:35.270 --> 01:44.420 ChatGPTは、 OpenAIがそれを受け取り、 プロンプトを構築するとき、 LLMに送信されるトークン、 01:44.420 --> 01:55.700 GPT 4 LLMに送信されるトークンを受け取り、 私たちの機能を説明する一連のトークンに変換します。 01:55.700 --> 02:05.180 LLMは、 この英語を使って何をするのかを説明し、 LLMが呼び出すことのできる関数であることを知らせる。 02:05.210 --> 02:14.120 それが機能するのは、 LLMにその能力を与えるために、 トークンをそのように使う例をたくさん使って訓練されているからだ。 02:14.690 --> 02:21.080 そして、 次に何が起こるかを見たとき、 マジックの一部は失われようとしている。 02:22.430 --> 02:28.430 あなたが覚えているLLMから戻ってくるものは、 応答選択肢ゼロである。 02:28.430 --> 02:35.450 そして、 私たちがすることは、 最終的な理由がこのツールの呼び出しなのかどうかを見極めることだ。 02:35.450 --> 02:41.300 GPT4位が「まだ答えは出ていない。 02:41.300 --> 02:48.410 そのかわり、 あなたのツールのひとつを呼び出して、 その出力を教えてほしいから、 もうやめよう。 02:48.470 --> 02:56.240 そうなれば、 GPT4からメッセージを収集する必要がある。 02:56.450 --> 03:00.800 つまり、 これはそのレスポンス・チョイスのゼロ・ドット・メッセージを集めたものだ。 03:00.860 --> 03:07.970 送り返されたものが何であれ、 それは実際、 ツールの実行を要求するものだ。 03:08.180 --> 03:13.390 そして、 そのメッセージを解きほぐすための作業が少しある。 03:13.450 --> 03:15.820 それが何をしたいのかを見極め、 それを実行する。 03:15.820 --> 03:17.710 そして、 私はそのすべてを別の関数に入れた。 03:17.710 --> 03:18.370 私はズルをしてきた。 03:18.370 --> 03:21.400 ここに全部書いてもいいんだけど、 ごちゃごちゃしちゃうからね。 03:21.610 --> 03:23.350 だからその代わりに、 私はその部分を切り離した。 03:23.350 --> 03:25.810 だから、 この時点ではすぐに見ることができる。 03:25.810 --> 03:33.250 この機能は、 GPT4ゼロからメッセージを解凍し、 必要であれば、 まあ、 必要であろう。 03:33.250 --> 03:37.060 このツールは我々のツールを呼び出し、 その結果を返す。 03:37.060 --> 03:44.530 GPT4のゼロに戻るレスポンスと、 呼び出された都市は、 ええと、 次にすることは、 03:44.530 --> 03:49.180 メッセージのリストにさらに2行追加することだ。 03:49.210 --> 03:53.410 私たちのメッセージは、 ユーザー・アシスタント、 ユーザー・アシスタントのようなものだ。 03:53.410 --> 03:56.320 これから新しい行を2つ追加する。 03:56.320 --> 04:07.600 その行のひとつがこのメッセージで、 これはGPT4ゼロから戻ってきた、 ツールを呼ぶようにというメッセージ以外の何ものでもない。 04:07.600 --> 04:12.400 そこでまず、 アシスタントにツールの実行を依頼する。 04:12.400 --> 04:19.840 それをメッセージのリストに入れ、 その次にメッセージのリストに入れるのは、 04:19.870 --> 04:23.740 関数を呼び出した結果だ。 04:23.950 --> 04:33.340 このメッセージのリストには、 ユーザー・アシスタント、 ユーザー・アシスタント、 ユーザー・アシスタントがツールを実行すると書いてある。 04:33.340 --> 04:35.710 私たちは、 これがツールの結果だと言っている。 04:35.980 --> 04:40.420 そして、 それをOpenAIに送り返す。 04:40.450 --> 04:41.920 お分かりいただけただろうか。 04:41.950 --> 04:47.470 そうでない場合は、 実行時にここにprint文を入れるだけで、 私が言ったとおりのことがわかる。 04:47.470 --> 04:51.400 そして、 メッセージをすべて印刷すれば、 はっきりとわかると思う。 04:51.430 --> 04:56.170 そのメッセージには、 そのやりとりの全文が表示される。 04:57.160 --> 05:04.060 そして最後に、 いつものようにLMから究極の答えを返す。 05:04.270 --> 05:09.670 ツールを2回実行することは想定していないので、 2度目は通さないことにしているんだが、 05:09.670 --> 05:14.500 入れておいて損はないだろう。 05:14.500 --> 05:20.370 もちろん、 最終的に足りないのは、 05:20.370 --> 05:28.740 この関数を書かなければならないということだ。 05:28.770 --> 05:30.780 知っておいて損はないよ 05:30.930 --> 05:36.510 GPT4から戻ってきたメッセージがこれだ。 05:36.930 --> 05:43.740 そして、 私たちがしなければならないのは、 それを解凍して、 どのツールを呼び出したかったのかを突き止めることだ。 05:43.770 --> 05:49.380 今、 私たちの場合、 どのツールを呼び出したいかはわかっている。 05:49.410 --> 05:53.370 うーん、 でも、 どう動くか見てもらうために、 とりあえずここに置いておくよ。 05:53.430 --> 05:59.850 そして、 ここで本当にすべきことは、 ツール・コールがチケットの値段とイコールであれば、 チケットの値段を知ることができる、 ということだ。 06:10.290 --> 06:12.330 しかし、 我々の場合、 使えるツールは1つしかない。 06:12.330 --> 06:13.560 そういうことだ。 06:13.830 --> 06:18.570 次にできることは、 呼び出したい引数をロードすることだ。 06:18.570 --> 06:23.520 つまり、 このツール・コールの中にドット・ファンクションというツールがある。 06:23.550 --> 06:28.710 どのようなパラメータを選択したかを示すドット引数。 06:28.920 --> 06:31.770 それがJSONの形で戻ってくる。 06:31.770 --> 06:32.880 ええと、 ただのひもです。 06:32.880 --> 06:38.670 だから、 Jsonを使わなければならない。 Loadstring関数をロードして辞書に変換する。 06:38.670 --> 06:44.880 そして、 私たちが実際に持っている唯一の論拠である目的地都市について調べる。 06:44.910 --> 06:48.420 それを調べて、 可変都市に入れる。 06:48.420 --> 06:52.020 というわけで、 道具と議論を解きほぐした。 06:52.020 --> 06:56.190 そして、 残るはこのラインだ。 06:56.190 --> 06:59.670 そして、 そのセリフは明らかに気の利いたものではない。 06:59.670 --> 07:04.890 この行は、 単純にチケット価格の取得関数を呼び出しているだけだ。 07:04.890 --> 07:11.790 我々は、 それが実行したいツールであることを確認し、 都市を抜き出して、 その関数を呼び出した。 07:12.000 --> 07:14.340 そして、 私たちは対応策を構築する。 07:14.340 --> 07:15.990 その返答がこれだ。 07:15.990 --> 07:20.910 これはメッセージの一番下に押し込まれるものだ。 07:20.910 --> 07:21.420 そうだ。 07:21.420 --> 07:24.920 そこに押し込まれることになるが、 彼らの反応はこうだった。 07:24.950 --> 07:29.060 さて、 これらの行にはそれぞれ役割と内容がある。 07:29.390 --> 07:36.470 過去には、 ロールはユーザーであったり、 システム・ユーザーであったり、 システム・ユーザー・アシスタントであったり、 ユーザー・アシスタントであったりした。 07:36.470 --> 07:38.090 まあ、 それ以外にもあるんだけどね。 07:38.120 --> 07:39.590 それはこの言葉のツールである。 07:39.590 --> 07:43.100 だから、 この場合はレスポンスツールに入れた。 07:43.100 --> 07:47.630 そして、 コンテンツには次のような文字列を入れた。 07:47.660 --> 07:52.280 この辞書は、 JSONダンプ文字列関数を使用して文字列に変換される。 07:52.280 --> 07:55.220 そこで、 目的地の都市と料金を入れた。 07:55.220 --> 08:08.180 また、 このツールコールIDをメッセージに追加する必要がある。 これは、 このレスポンスをその直前に来たリクエストにリンクする方法である。 08:08.180 --> 08:20.990 だから、 メッセージを入れているんだ。 ツールを使用する。 この2つを見たときに、 それがこのリクエストに関連していることを完全に理解できるようにするためだ。 08:20.990 --> 08:23.990 それがすべてだ。 08:24.260 --> 08:27.480 今回はかなりの量だったが。 08:27.510 --> 08:29.370 そこには受け止めるべきことがたくさんある。 08:29.580 --> 08:34.710 しかし、 私が言うように、 それを通してステップを踏み、 いくつかのprintステートメントを置き、 それが機能していることを確認する。 08:34.710 --> 08:38.070 しかし、 チャットでこの話を持ち出したらどうなるか、 今から見てみよう。 08:39.720 --> 08:40.800 こんにちは。 08:44.550 --> 08:45.270 こんにちは。 08:45.270 --> 08:46.500 本日はどのようなご用件でしょうか? 08:46.530 --> 08:49.920 ロンドンに行きたい。 08:51.600 --> 08:52.170 もちろんだ。 08:52.170 --> 08:53.460 値段を知りたいですか? 08:53.490 --> 08:54.390 そうだ。 08:55.770 --> 08:59.520 ロンドンまでの往復チケットは7ドル。 99. 08:59.520 --> 09:00.900 だから適正価格だった。 09:00.900 --> 09:08.490 つまり、 Jupyterラボに戻ると、 私たちのツールの名前が印刷されているはずです。 09:08.490 --> 09:11.370 その自信はかなりあると思うが、 ちょっと見てみよう。 09:11.400 --> 09:15.210 さすがにロンドン行きのチケット代はツール・ゲットと呼ばれるだけある。 09:15.240 --> 09:16.740 続けよう。 09:17.220 --> 09:22.620 パリはどう? 09:25.320 --> 09:27.870 899と東京。 09:30.710 --> 09:34.130 東京までの往復航空券は1400ドル。 09:34.760 --> 09:35.930 そしてベルリン。 09:37.280 --> 09:38.660 ベルリンは今、 追加したところだ。 09:38.690 --> 09:39.530 それがあるかどうか見てみよう。 09:39.560 --> 09:41.480 はい、 499です。 09:41.510 --> 09:46.850 確かに効きそうだし、 ティンブク2も。 09:48.710 --> 09:53.420 申し訳ないが、 timbuk2へのチケット料金に関する情報は持っていない。 09:53.810 --> 09:55.520 ええと、 ここを見てみよう。 09:55.520 --> 09:58.940 と呼ばれる一連のツールを見ることができる。 09:58.940 --> 10:02.720 そして、 Timbuk2のために呼ばれたとき、 それが不明と答えたであろうことも知っている。 10:02.720 --> 10:08.960 その結果、 わからないときはわからないと言うようにシステムプロンプトを与えたので、 わからないということがはっきりした。 10:09.680 --> 10:12.530 それとともに、 いろいろなことがあった。 10:12.530 --> 10:13.910 お分かりいただけただろうか。 10:13.910 --> 10:18.560 これは実際、 強力な機能の一部だ。 10:18.560 --> 10:28.580 LMにさらなる力を与えるための強力なテクニックだが、 しかし、 その裏では魔法ではない。 10:28.580 --> 10:38.770 LLMが何かについてもっと情報が必要だと知らせてくれるようにするためだ。 10:38.770 --> 10:40.990 それが、 布団の中での仕事だ。 10:40.990 --> 10:42.850 そして、 それがあなたにとって意味のあるものであることを願っている。 10:42.850 --> 10:45.610 そして、 これをあなた自身のプロジェクトに役立ててほしい。 10:45.610 --> 10:47.350 これを拡張する方法として。 10:47.350 --> 10:56.710 より多くの種類のツールや、 そのフライトの空席状況などを示すようなツールを追加することも検討できる。 10:56.710 --> 10:58.510 だから、 より多くの道具を使うことができる。 10:58.510 --> 11:03.640 あるいは、 本当に大胆にやりたいなら、 実際にフライトを予約するツールを追加することもできる。 11:03.640 --> 11:08.170 これは、 再び呼び出されたときに、 何かを印刷したり、 ファイルに何かを書き込んだりするツールだ。 11:08.170 --> 11:16.390 そうすれば、 LLMは2つ目のツールにコールバックし、 ユーザーがフライトの予約を要求したときに、 実際にフライトを予約することができる。 11:16.390 --> 11:21.100 だから、 それはそれで面白いし、 日付とかについて何度も議論することになる。 11:21.100 --> 11:28.810 そして、 それが終わるころには、 ツールの書き方や、 ソフトウェアで実行されるアクションを実行するためにLLMを装備する方法について、 11:28.810 --> 11:35.560 非常に習熟していることだろう。