WEBVTT 00:00.950 --> 00:04.760 さて、 まず最初にお気づきになるのは、 私があなたのためにノートを開いていないということだ。 00:04.760 --> 00:08.090 今回はコードを見るだけだからだ。 00:08.090 --> 00:11.150 ええと、 このレコーディングにはノートはありません。 00:11.150 --> 00:22.880 このビデオでは、 私たちが書いている実際のエージェント・フレームワークを最終的に見ていきます。 00:22.880 --> 00:27.530 とても派手なことのように聞こえるが、 実際は驚くほど簡単なことだ。 00:27.530 --> 00:32.240 既製品のようなパッケージを使いたくなかったのは、 より高度な機能を実行するためには、 00:32.240 --> 00:40.340 さまざまなllmやPythonコードの断片をつなげるだけでは不十分だということを伝えたかったからだ。 00:40.640 --> 00:45.440 さて、 一般的にこの種のエージェントフレームワークについて語るとき、 00:45.440 --> 00:53.990 あなたが探しているのは、 データベース、 あー、 データベース接続を処理できるものです。 00:54.080 --> 00:57.590 だから、 永続的な記憶というものが欲しいんだ。 00:57.770 --> 01:05.040 異なるチャットや異なるインスタンス間で生き残ることができるので、 メモリがどのように機能するかを理解することができます。 01:05.700 --> 01:13.620 それに、 さっき言ったロギングのようなことも、 自分の環境で何が起きたかを理解するための良い練習になる。 01:13.620 --> 01:20.250 そして、 このフレームワークを使うことができるGradio UIを作りたいというユーザー・インターフェイスの懸念も出てくるだろう。 01:20.250 --> 01:21.960 だから、 それを処理しなければならない。 01:21.960 --> 01:26.850 しかし、 その最後については、 次のシリーズで紹介するつもりだ。 01:27.030 --> 01:31.500 とりあえず、 僕らのフレームワークを見てみよう。 01:31.500 --> 01:34.080 その前に、 いくつか指摘しておきたいことがある。 01:34.080 --> 01:38.580 まず、 エージェント・フォルダーを見て、 それぞれのクラスを調べた。 01:38.580 --> 01:40.920 これは別の仕事の単位を表している。 01:40.920 --> 01:45.450 そして、 それぞれがエージェントのサブクラスであることにお気づきだろう。 01:45.570 --> 01:47.100 それは何だろう? 01:47.130 --> 01:52.260 彼がサブクラス化しているエージェントには、 いろいろな機能があるはずだ。 01:52.260 --> 01:55.920 このスーパークラスにはほとんど機能がない。 01:55.920 --> 02:00.210 ええと、 これは単なる抽象クラスです。 02:00.270 --> 02:03.820 ええと、 メッセージを記録することができます。 02:03.910 --> 02:07.090 そして、 メッセージのログを取る方法は、 ログを取ることだ。 インフォメーション 02:07.120 --> 02:08.530 お馴染みだろう。 02:08.560 --> 02:10.360 Pythonのロギングは使ったことがあるだろう。 02:10.360 --> 02:11.200 だから君は可愛いんだ。 02:11.230 --> 02:17.590 お馴染みの伐採。 インフォメーション・ログは、 あなたがロガーを設定した場所に、 ええと、 ログを記録します。 02:17.620 --> 02:18.550 そして 02:18.700 --> 02:23.560 僕がここでやっていることの中で、 ちょっと違うのは、 そうだね。 02:23.590 --> 02:27.190 エージェントのサブクラスの名前を追加します。 02:27.190 --> 02:28.840 それは、 それは、 それは、 それは。 02:28.870 --> 02:34.120 実は、 このログメッセージを送信して、 それぞれに色をつけているんだ。 02:34.210 --> 02:39.400 そうすれば、 どのエージェントが何をしているのかがわかる。 02:39.400 --> 02:46.300 例えば、 スペシャリスト・エージェントに戻ってみると、 自分で名前をつけているのがわかる。 02:46.330 --> 02:47.560 専門エージェントの。 02:47.560 --> 02:51.310 そしてその色は赤。 02:51.340 --> 02:52.270 赤く表示される。 02:52.270 --> 02:54.610 そして、 私がしていないことに気づいたかもしれないことがわかるだろう。 02:54.640 --> 02:56.980 ロギング。 情報 セルフ・ドット・ログを取った。 02:56.980 --> 03:00.070 これは、 スーパークラスでログ・メッセージを呼び出せるようにするためだ。 03:00.070 --> 03:04.820 だから、 このエージェント・スーパークラスには派手さはない。 03:04.820 --> 03:06.920 ただ、 コンスタントにログを取ることができたということだ。 03:06.920 --> 03:11.090 その機能を別のクラスに含めることも同様にできたはずだ。 03:11.090 --> 03:14.480 エージェントについては特に何もない。 03:14.930 --> 03:15.860 分かった。 03:15.860 --> 03:22.250 もうひとつ、 メモリーJSONと呼ばれるJSONファイルをお見せしましょう。 03:22.250 --> 03:24.710 そしてそれは単純なJSONの一部である。 03:24.710 --> 03:29.150 もし存在しなければ、 手動で作成される。 03:29.150 --> 03:32.870 派手なエディターではなく、 普通のエディターで開いてみよう。 03:32.870 --> 03:34.700 そして、 こんな感じだ。 03:34.700 --> 03:36.440 これはリストだ。 03:36.680 --> 03:43.250 外側にJSON blobのリストがあるのがわかるだろう。 03:43.250 --> 03:48.320 そして、 それぞれのJSONブロブは、 あなたにとって見慣れたものだろう。 03:48.350 --> 03:49.700 それが何なのか分かりますか? 03:50.120 --> 03:55.070 そう、 もちろんJSONに変換された機会オブジェクトだ。 03:55.460 --> 04:02.240 商品説明、 価格、 URLが記載され、 モデルから得られた見積もりが表示され、 04:02.240 --> 04:08.370 単純にこの数字からこの数字を引いた値引きが表示される。 04:08.400 --> 04:08.880 おっと。 04:08.910 --> 04:09.630 その数字だ。 04:09.660 --> 04:10.020 ハ。 04:10.380 --> 04:15.300 つまり、 私たちが本当に価値があると思う金額より、 どれだけ安く提供されているかということだ。 04:15.300 --> 04:20.790 というわけで、 このメモリーには3つの取引が浮上している。 04:21.060 --> 04:26.730 さて、 このようにJSONファイルに保存するのは、 おそらく最も工業的な強さではないだろう。 04:26.730 --> 04:32.160 もしそれがデータベース化されれば、 複数のエージェント・フレームワークの実行に対応できるだろう。 04:32.160 --> 04:38.220 しかし、 エージェントフレームワークは1つしかなく、 このメモリに書き込むのは、 仕事をするときに1回だけだ。 04:38.220 --> 04:42.150 だから厳密には必要なかったが、 もちろんクロームには簡単に入れることができる。 04:42.150 --> 04:47.550 私たちはすでにデータベースを持っているので、 もし望むなら、 それを練習として使うこともできる。 04:47.880 --> 04:52.620 うーん、 それは確かに良いことで、 良いプロダクションの改善になるだろうね。 04:53.250 --> 05:01.620 しかし、 いずれにせよ、 実際の、 あー、 フレームワークそのもの、 エージェントのフレームワークを見る時が来た。 05:01.710 --> 05:04.620 ええと、 ではすぐにそうしましょう。 05:06.220 --> 05:12.460 そして、 これから起こることをあまり漏らさないように、 適切なクラスを取り上げたい。 05:12.460 --> 05:12.970 これだ。 05:12.970 --> 05:14.770 ディール・エージェントのフレームワーク 05:15.130 --> 05:16.540 ああ、 わかった。 05:16.540 --> 05:24.790 つまり、 エージェントのフレームワークは、 まずロギングを設定するものだ。 05:24.790 --> 05:31.870 これはPythonの標準的なもので、 誰かがロギングを行ったときに、 そのロギングが行われるようにするものです。 情報は、 ええと、 スタンダードに送信され、 05:32.020 --> 05:36.790 いくつかの構造を持っています。 05:36.790 --> 05:43.300 これはPythonの標準的な、 えーと、 えーと、 定型文のようなもので、 ログを適切に記録するためのものです。 05:43.300 --> 05:46.330 そして、 これがディール・エージェントのフレームワークだ。 05:46.330 --> 05:51.640 データベースがコード化されているんだ。 僕が何度かうっかり省いてしまったことが、 05:51.640 --> 05:55.480 メモリファイルの名前と一緒にコード化されている。 05:55.600 --> 05:58.750 起動するとロギングが始まる。 05:58.780 --> 06:00.730 それ自体がログメッセージを作成する。 06:00.730 --> 06:02.170 envをロードする。 06:02.200 --> 06:05.770 これはもちろん、 すべてのJupyterノートブックで常に行っていることだ。 06:05.770 --> 06:07.520 だから、 これは今やる必要がある。 06:07.760 --> 06:12.800 データベースを作成したり、 データベースにアクセスしたりする。 06:13.250 --> 06:17.090 そのJSONファイルからメモリーを読み込む。 06:17.390 --> 06:28.070 商品コレクションを取得し、 プランニング・エージェントにセットする。 06:28.100 --> 06:30.110 そして、 準備ができたと言うだろう。 06:30.620 --> 06:35.930 このリード・メモリーの方法は、 まさに書いてあるとおりのものだ。 06:35.930 --> 06:39.140 ファイル名をハードコードしていないのがわかるだろう。 06:39.140 --> 06:40.160 よくやった、 よくやった。 06:40.190 --> 06:40.700 私が? 06:40.820 --> 06:43.880 これはJSONから読み込まれる。 06:43.880 --> 06:52.130 もしそれがまだ存在しなければ、 ただ空のものを返す。 06:52.160 --> 07:00.890 このメソッドはメモリを書き出し、 その機会をメモリファイルに書き出す。 07:01.940 --> 07:08.710 ここには、 独自のエージェントフレームワークタグを持つログメッセージを送信するメソッドがあります。 07:09.490 --> 07:14.590 次に、 プランニング・エージェントを実際にキックオフする実行メソッドがある。 07:14.800 --> 07:20.860 そして、 結果が返ってきたら、 セルフ・ドット・プランナーを呼び出すと書いてある。 07:21.070 --> 07:22.120 それを計画する。 07:22.120 --> 07:23.500 もちろん、 それが大事な瞬間だ。 07:23.500 --> 07:26.200 それが、 僕らが実際にこの仕事を始めた時だ。 07:26.200 --> 07:28.750 そして、 記憶の中を通り過ぎる。 07:28.780 --> 07:32.350 知っているチャンスの記憶の中を通り過ぎる。 07:32.350 --> 07:38.050 そして、 その結果をログに記録する。 07:38.050 --> 07:43.990 そして、 結果が「なし」でなかった場合、 プランナーは何も新しいものが見つからなければ「なし」を返すかもしれないことを覚えておいてほしい。 07:43.990 --> 07:50.020 しかし、 それが本当の結果であれば、 それをメモリに追加し、 メモリを書き込んで結果を返す。 07:50.020 --> 07:51.220 それだけだ。 07:51.220 --> 07:57.970 この最後のピースは、 次回のUIで出てくるが、 とりあえず、 これでフレームワークは終わり。 07:58.420 --> 07:59.980 では、 どうやってこのフレームワークを動かすのか? 07:59.980 --> 08:01.690 では、 コマンドラインから実行してみよう。 08:01.690 --> 08:03.100 これはもう現実だ。 08:03.100 --> 08:05.500 これはもはや、 すべてPythonのコードだ。 08:05.500 --> 08:09.080 我々はJupyterの世界の外にいるので、 便宜上このインターフェースを使っている。 08:09.080 --> 08:09.710 本当に。 08:09.980 --> 08:12.440 でも、 VSCodeか何かを使っているかもしれない。 08:12.470 --> 08:16.310 ターミナルを起動するには、 ここでプラスボタンを押す。 08:16.310 --> 08:20.330 JupyterLabでも可能で、 このように新しいターミナルを開くことができる。 08:20.330 --> 08:25.010 これはもちろん、 あなたが好きなようにやってもいい。 08:25.130 --> 08:29.540 ええと、 それはアナコンダのプロンプトかもしれないし、 あなたが使っているものかもしれない。 08:29.540 --> 08:32.240 マックを使っているなら、 新しいターミナル・ウィンドウを立ち上げればいい。 08:32.330 --> 08:36.380 でも、 まずcondaの環境をアクティブにする必要がある。 08:36.560 --> 08:54.350 LMSを起動させると、 皆さんもよくご存知のように、 私の環境はベースからLMSに変わります。 08:54.350 --> 09:01.730 これでPythonのエージェントフレームワークと言えるようになったはずだ。 09:02.510 --> 09:04.010 スペルは正しく。 09:06.410 --> 09:07.490 ドットパイ。 09:07.640 --> 09:08.990 それでいいはずだ。 09:09.000 --> 09:11.670 でも、 その前にもうひとつお見せしなければならないことがある。 09:11.820 --> 09:14.190 私も忘れるところだった。 09:14.190 --> 09:16.320 この最後の数行だけだ。 09:16.320 --> 09:20.070 これを見せなかったらどうなるんだろうと思ったかもしれない。 09:20.460 --> 09:26.700 もちろん、 このファイルがメインであるようにコマンドラインから実行されるのであれば、 09:26.700 --> 09:32.550 ディール・エージェント・フレームワークの新しいインスタンスを作成します。 09:32.550 --> 09:35.760 そして、 先ほど見たrunメソッドを呼び出す。 09:35.790 --> 09:39.780 それが、 ちょっとしたミッシングリンクなんだ。 09:39.810 --> 09:40.320 それでいい。 09:40.320 --> 09:41.640 これで実行できるはずだ。 09:41.670 --> 09:42.540 深呼吸をする。 09:42.540 --> 09:43.410 そうしよう。 09:46.950 --> 09:49.020 考えている間、 長い間休止しているのか? 09:51.060 --> 09:51.930 分かった。 09:51.930 --> 09:53.310 何が起こっているのか見てみよう。 09:53.310 --> 09:55.800 エージェントフレームワークは初期化中だと言っている。 09:55.800 --> 09:58.350 プランニング・エージェントはスキャナーを初期化している。 09:58.380 --> 09:59.850 エージェントが準備完了。 09:59.850 --> 10:02.550 アンサンブル・エージェントは準備を整える。 10:02.550 --> 10:04.170 だから、 これを見るのはちょっと難しい。 10:04.170 --> 10:09.600 モーダルに接続するスペシャリスト・エージェントの準備を整える。 10:10.300 --> 10:12.910 そしてフロンティア・モデルの準備が整う。 10:12.940 --> 10:14.920 その文の変圧器に負荷をかけなければならない。 10:14.920 --> 10:16.360 そこで起きていることがわかるだろう。 10:16.360 --> 10:19.810 そして、 ランダムフォレスト・エージェントも準備を整える。 10:19.810 --> 10:21.340 それで完了だ。 10:21.430 --> 10:24.340 アンサンブルの準備もメッセンジャーの準備もできている。 10:24.340 --> 10:25.810 そしてすべてが青で統一されている。 10:25.840 --> 10:28.360 ここでは、 Agent Frameworkの準備ができたと表示されます。 10:28.360 --> 10:33.130 すべてのエージェントをインスタンス化して作成し、 セットアップする。 10:33.130 --> 10:39.970 彼らは、 専門家モデルがモーダルに接続されている単一のものを持っている彼らのモデルの重みをロードしている。 10:40.390 --> 10:46.180 そして、 彼らは今、 その、 行動の準備を整えている。 10:46.210 --> 10:51.010 モデルのウェイトが読み込まれ、 走り出した。 10:51.040 --> 10:56.110 スキャナー・エージェントは、 ここで、 あー、 受信したんだけど、 そこでエラーが出てるんだ。 10:56.110 --> 10:57.160 改善するよ。 10:57.160 --> 10:59.020 実際の結果数は表示されない。 10:59.020 --> 11:02.290 印刷の前に "F "が必要なんだ。 11:02.620 --> 11:05.080 ええと、 あなたがご覧になる前に直しておきます。 11:05.170 --> 11:07.660 ええと、 だから、 スキャナー捜査官がその電話をかけているんだ。 11:07.780 --> 11:17.960 そして今、 プランニング・エージェントは契約の値付けをしていて、 私のマシンが温まるまでモーダルで待機している。 11:18.050 --> 11:26.420 あー、 でも料理番組で言うように、 あー、 どういう意味かわかるかな、 あー、 料理番組でオーブンに入れて、 11:26.420 --> 11:33.980 これがさっき入れたやつだ、 と言ってオーブンから出すんだ。 11:33.980 --> 11:37.100 そういうことをされると、 いつも悪巧みだと思う。 11:37.190 --> 11:39.800 でも、 私がこれをやっただけだということを信じてほしい。 11:39.800 --> 11:46.070 数分前にキックオフして、 こっちに走ってきたんだ。 11:46.070 --> 11:54.140 そして、 基本的に、 戻ってきた5つの案件のそれぞれについて、 異なるモデルすべてに一連の呼び出しを行ったことがわかる。 11:54.140 --> 11:55.670 それぞれに目を通すことができる。 11:55.700 --> 11:58.490 アンサンブルモデルは数値を返す。 11:58.700 --> 12:01.160 ええと、 だから、 私たちは働き直すべきだ。 12:01.190 --> 12:06.350 まずスペシャリスト・モデルが数値を計算し、 次にフロンティア・モデルがラグ・ルックアップで数値を計算し、 12:06.350 --> 12:08.990 次にランダムフォレスト・モデルが計算する。 12:08.990 --> 12:10.430 そしてアンサンブルモデル。 12:10.430 --> 12:12.870 そして、 それは計画担当者の話に戻る。 12:13.200 --> 12:15.300 そして、 このすべてに目を通すことができる。 12:15.300 --> 12:20.100 そして、 これが完了すると、 プッシュ通知が送信された。 12:20.340 --> 12:29.700 それは第13世代i5を搭載した認定整備済みノートパソコンで、 12:29.700 --> 12:45.030 見積もりは925ドル、 560ドルで販売されていたものよりも非常に健全なディスカウントだった。 12:45.030 --> 12:46.950 そうだ。 12:46.950 --> 12:50.970 それがエージェント・フレームワークの走りだった。 12:51.210 --> 12:55.980 そうだね、 そうなるのを見るのは信じられないほど満足なことだよ。 12:55.980 --> 13:00.870 一日中見ていても飽きない。 13:00.870 --> 13:04.200 とても楽しいと言わざるを得ない。 13:04.230 --> 13:09.780 ほら、 オーブンから出すためにそれを置く必要もなかった。 13:09.780 --> 13:14.960 モードが温まると、 さまざまなものを回転させるのが非常に速いのがわかるだろう。 13:15.170 --> 13:16.910 だから、 そこを通るんだ。 13:16.910 --> 13:18.020 何かを思いついたんだ。 13:18.020 --> 13:22.790 そしてもちろん、 今提案していることは、 ちょっと前に提案したこととは違う。 13:23.000 --> 13:26.870 携帯電話にも通知が来たし、 時計にも間違いなく通知が来た。 13:27.350 --> 13:34.880 だから、 私たちはただフレームワーク全体が動き、 私が通知を受けるのを見ただけだ。 13:34.880 --> 13:42.980 そして、 このトレースを読んで、 各エージェントがこの問題を解決するためにどのように協力しているかを見ることができる。 13:43.280 --> 13:51.470 だから、 あとは自律的に常に動くようにするだけだ。 13:51.470 --> 13:57.680 そうしている間に、 私たちはグラディオの使い方を知っているし、 その良さも知っているのだから、 素晴らしいUIを叩きつけることもできるだろう。 13:57.710 --> 14:01.190 そして、 そのすべてを明日やるつもりだ。 14:01.250 --> 14:04.460 でも今は、 もちろん楽しんでもらおうと思う。 14:04.460 --> 14:07.670 とても満足できるものだから、 何度か走ってほしいね。 14:07.700 --> 14:08.900 正直、 大好きだよ。 14:08.930 --> 14:14.540 皆さんも私と同じように楽しんでいることを願っている。