
25,527 文字

さて、CrewAIを使った開発の第2部へようこそ。今回は特別ゲストとして、CrewAIの創設者であり、CEOのJoeをお迎えしています。
「ありがとうございます。参加できて嬉しいです」
私のチャンネルをご覧の方なら、Joeをご存知でしょう。彼は既に何度か異なる動画やライブストリームに登場しています。私はCrewAIに投資もしており、本当にCrewAIが大好きなんです。いつも言っているように、エージェントに関して強気で、CrewAIは間違いなく私のお気に入りのフレームワークです。
今回は、本当に面白いものを作っています。このビデオでは、Joeの助けを借りて、それをさらに発展させ、より良いものにしていきます。まずは、これまでに作ったものについて、Joeと皆さんに説明させてください。
私は人工知能に関する教育コンテンツポータルの作成を考えていました。すべて文章によるコンテンツで、記事やチュートリアル、様々なトピックに関する詳細な内容になります。そこで、リサーチを手伝い、記事やコンテンツ、チュートリアルの第一稿を作成するためにクルーを結成しようと考えました。
Joe、これは本当にうまく機能したんです。Pythonの環境設定で少し苦労したものの(いつもそうなんですが、あなたからいくつかのアドバイスをもらえると思います)、全体的にとても上手く動きました。後でお話ししますが、様々なモデルをテストして、どれが良くて、どれがそうでないか確認しました。おそらくあなたは既にどれが一番良いか知っているでしょうが。
なお、今日書くコードはすべてGitHubにプッシュする予定で、パブリックリポジトリとして公開します。リンクは説明欄に載せておきます。
まず最初に、レポートの例をお見せしましょう。研究テーマは「大規模言語モデルのファインチューニングの基礎」でした。エージェントとタスクの定義は後でお見せしますが、かなり良い出来でした。現在GPT-4を使用していると思います。ミニかもしれませんが、確認はしておきます。なかなか良いものの、長くなく、そこまで詳しくありません。もっと詳細で包括的なものにしようと色々試してみましたが、うまくいきませんでした。
01モデルもテストしましたが、これらは素晴らしい結果を出しました。最も包括的で詳細な、よく書かれたレポートを生成します。非01モデルでも同様の結果を得る方法があるはずですが、01モデルは指数関数的にコストが高いので。これらすべてについて、Joeに質問させてください。
それでは、エージェントを見ていきましょう。研究者と教育コンテンツ作成者がいます。レビュアーエージェントの追加も考えていて、それは今日一緒に作業できるかもしれません。基本的に、上級研究者にトピックを与え、serper検索ツールを使って徹底的な研究を行わせます。これは私が追加したもので、serperにサインアップしてAPIを取得し、前回のビデオで使用しました。研究はとてもうまくいっているようです。
次に教育コンテンツ作成者がいて、基本的にトピックの研究と研究結果に基づいて、詳細で綿密で説得力のある教育コンテンツを作成します。ご覧の通り、ほぼすべての行で「包括的」「広範」「詳細」と指定していますが、非01モデルでそれを実現することができません。しかし、それについては後で話しましょう。
これらがエージェントで、次にタスクがあります。研究タスクとレポートタスクです。研究タスクは徹底的な研究を行い、レポートタスクではコンテクストを確認し、各トピックを教育コンテンツの完全なセクションに展開します。各セクションは最低5文以上にすると指定しました。また、レビュアータスクのプレースホルダーも作り始めました。
ここで一旦話を止めて、Joeの意見を聞かせていただきたいと思います。まず第一に、素晴らしいユースケースですね。私も大好きです。第二に、多くのアイデアがあります。はい、01は間違いなくはるかに高価で、そのため多くの人が使用を控えています。時間もかかりますし。私が発見したのは、実は通常のモデルよりもより頻繁にハルシネーションを起こすということです。その理由は、通常のエージェントには提供されたツール以外の選択肢があまりないのに対し、01モデルは思考の連鎖があるため、ツールを使用する前に結論を導き出そうとする傾向があるからです。
このような長文フォーマットのコンテンツを生成したい場合のユースケースは以前にも見てきました。通常、うまく機能するコンセプトとして、クルーを計画段階と執筆段階に分けるというものがあります。つまり、まず研究を行い、その研究結果を理解したうえで、エージェントが理想的なプレゼンテーション方法、トピック、タイトル、サブタイトル、詳しく説明する内容などを考えます。そこからプランを得て、その後で実際の執筆に移ります。これは通常、はるかに良い結果をもたらします。最後にレビュアーを加えることもできます。
なるほど、それは理にかなっていますね。実際、そうすることでエージェントがより協力的に作業できるようになります。現在は1つのエージェントが研究を行い、その研究を報告エージェントまたはコンテンツ作成エージェントに渡して書くだけですが、代わりに「これがすべての異なるセクションです。このセクションを取得して書き、次のセクションを取得して書く」というように進めることができますね?
その通りです。私が言及していたのは、さらに1つ前のステップで、追加のエージェントがプランニングを行うというものですが、あなたが述べたのが次のステップで、そこでは2つのクルーを持つことになります。1つはプランの作成に集中し、もう1つは各段落やページの執筆にのみ集中します。50ページにも及ぶレポートを作成しようとする人々のためにこれを見てきました。そして、CrewAIの新機能であるフローを使用することで、これはとてもうまく機能するでしょう。
やってみましょう!あと、Joe、もう1つ。私はLang Trace AIを使ってトレースを追跡しています。CrewAIのプラグインもあることは既にご存知でしょう。このビデオのスポンサーではありませんが、以前から素晴らしいパートナーとして協力してきました。コストや所要時間などのすべての情報を、ここで簡単に確認できるのが本当に気に入っています。私は通常、作業を進める際にこれを参照しています。
素晴らしいですね。正直なところ、observabilityはAIエージェントの構築において大きな要素なので、あなたは正しい方向に進んでいると思います。
[スポンサーメッセージの部分は省略]
さて、Joe、どこから始めるべきだと思いますか?
まずはこのクルーを一旦脇に置いて、フローのための新しいCLIを使うためのフォルダに移動しましょう。このクルーをフローに組み込むつもりです。これは私が今まで使ったことのない機能なので、とても楽しみです。
新しいターミナルを開いて、正しいフォルダに戻りましょう。VMベースのeduですね。はい、正しい場所にいます。
では、crew AI create flowを実行して、名前を付けてください。名前を付ける際の標準的な方法はありますか?
このようなケースでは、「educational_content」などがよいでしょうが、正解も不正解もありません。
クルーと同じ名前にしても良いですか、それとも別の名前にすべきですか?
別の名前にしましょう。
私のクルーはeduという名前なので、EDU_flowと呼ぶことにします。他に必要なことはありますか?
それで大丈夫です。
では、Enterを押しましょう。Joe、フローとは何か、どのように使用すべきか説明していただけますか?
フローは、クルー同士を協力させたい場合や、どこかからメールを取得してクルーに渡すなど、通常のPythonコードを使用したい場合があることに気づいて開発しました。データを合理的な方法で一方から他方へ移動させる方法をユーザーに提供する必要がありました。
そこでフローが生まれました。非常に薄いレイヤーですが、非常にシンプルで使いやすく、そのような作業を可能にします。
crew AI create flowコマンドを実行し、名前を付けただけで、メインのeduフォルダ内にこのクルーのソース、テスト、その他のファイルを含むフォルダが作成されました。ソース内には何があるか見てみましょう。クルー、ツールがありますね、とても馴染みがある感じです。次は何をしますか?
まず、既存のクルーをそのクルーフォルダ内に移動して、使用できるようにしましょう。どのファイルやフォルダを移動すればよいですか?
ソース全体を…いや、実際にはターミナルの左側にあるeduフォルダを見てみましょう。そのeduフォルダがクルーですよね?
はい、そうです。
では、フローフォルダを一旦別の場所に移動させることをお勧めします。edu_flowの中にすべてを入れたいからです。
分かりました。edu_flowフォルダをデスクトップに移動し、eduフォルダ全体を取って、edu_flowに移動させればよいですか?
その通りです。edu_flowのsrc/cruisesに移動させてください。
では、Cursorで見やすくするために再度開きましょう。edu_flowにeduクルーが入っていますね。
はい、そしてそれをsrcのcruisesフォルダに移動させてください。
ソースのedu_flow/cruisesにサンプルのPクルーがありますね。eduクルーをそこに移動させます。
crew edu_crewがあり、ソース、設定、定義がすべてそこにあります。素晴らしい。
すべてが入りました。フローとクルーができました。管理のために、すぐにやっておくべきことがあります。環境変数を.envからメインのクルーフローの.envにコピーする必要があります。
了解です。では、それをやりましょう。
フローのメインファイルを見てみましょう。一番下の方です。
fl_mainファイルですね。
はい。ご覧の通り、フローは非常にシンプルです。先ほど言ったように、非常に薄いレイヤーです。poem_flowがあり、19行目に*でアノテーションされた関数があります。この*アノテーションは、その関数がフローの初期関数であることを示しています。そして、イベントベースのシステムがあり、generate_sentence_countをリッスンしているものは、その後に実行されます。23行目を見ると、その関数をリッスンしている別の関数があります。その関数が終わると、generate_poemが呼び出され、generate_poemが終わるとsave_poemが呼び出されます。
これは非常にシンプルなフローですが、この方法を使って、開始関数を作り、それがトピックに関する研究を行い、深く掘り下げてプランを作成する1つのクルーをトリガーし、その後、別のクルーがそれをリッスンして、実際に各章や段落のコンテンツを書くというように使用できます。コンテンツの量に応じてですが。
つまり、私の理解が正しければ、1つのクルーが研究と準備を行い、もう1つのクルーが実際にコンテンツを作成するということですね?
はい、これが最も高度なセットアップです。1つのクルーですべてを行うこともできますが、これが本当に必要な方法です。
面白いですね。私はおそらく1つのクルーで試していたでしょうが、フローが利用可能だと知って良かったです。
そうですね。まずここで少し変更を加えましょう。poemのstateを削除します。10行目から13行目まで全部削除してください。
はい、そうしました。
次に、いくつかのクラスの名前を変更します。poem_flowを実際のフローであるedu_flowに変更し、正しいクルーをインポートします。
poem_crewの「crew」部分は必要ですか?それとも単にedu_crewにすべきですか?
あなたの場合、eduだけで十分だと思います。
なるほど。Cursorが自動補完してくれましたね。
はい、Cursorの機能の1つは自動補完です。eduの後にドットを入力すると、提案が表示されます。Tabを押すと行が自動補完されます。
Cursorはかなり賢いようですね。全てのネストされたディレクトリからパスを取得しているみたいです。
後で動作確認はできますが、インポートする方法は確実にありますよ。属性を渡す必要はありません。poemの部分は削除できますが、flowは必要です。括弧は削除できます。
はい、そしてこれをedu_flowに変更します。
その通りです。13行目のgenerate_sentenceを「research_content」や「research_topic」に変更しましょう。
次に、14行目と15行目を削除して、最初のクルーが何をするかを示すコメントを追加します。
素晴らしい。そして、2番目の関数も同様に、generate_researched_contentをリッスンするように変更できます。
そうですね、関数の中身も削除して、コメントだけ残しておきましょう。
この関数名は上の関数と同じにしても良いですか?
異なる名前にする必要がありますが、今の名前付けの方法で良いと思います。
なるほど、気づきませんでした。
コメントだけの関数は動作しないので、次の行にpassを追加してください。最初の関数にも同様にpassを追加します。
22行目から27行目は削除して、後ろのedu_flowもすべて変更しましょう。
では、実際にクルーを作成する前に、ターミナルで「crew AI flow plot」を実行してみましょう。
新しい環境が作成されましたが、yesかnoを選ぶべきか迷います。いつも間違えてしまうような…現在はbaseaですが、正しくないようです。
私はPythonのバージョンを固定しているので、そのような表示はあまり見ません。コンピュータにネイティブのPythonをインストールしていて、仮想環境はあまり使用していません。
完了したようです。
Finderを開いてみてください。flow.htmlが作成されているはずです。それをレンダリングできます。
おお、見てください!拡大して見てみましょう。これはとてもシンプルですが、下のラベルを見ると、ルーター、トリガー、その他のものを使ってかなり複雑にできることが分かります。
すごいですね!まだ非常にシンプルな使用例ですが、素晴らしいです。
例えば、これをCMSに自動的にプッシュしたい場合、このフローから出る必要はありません。generate_educational_contentをリッスンする別の関数を作成し、通常のPythonコードでAPIを呼び出してCMSにプッシュすることができます。これで、より複雑なフローができます。
それは私が最終的に必要とすることです。CMSにプッシュしたいと考えています。その時が来たら、ぜひアドバイスをいただきたいと思います。
素晴らしい!では、真のクルーを追加しましょう。おそらくあなたの… 研究用の新しいクルーを作成しましょう。コマンドは「crew AI flow create-crew」だったと思いますが…
ヘルプを確認してみましょう。「add-crew」というコマンドがありますね。
そうです。edu_flow内に新しいクルーを作成します。コマンドは「crew AI flow add-crew」で、クルーの名前を「edu-research」としましょう。
Enterを押してみましょう。作成されました。
フォルダ内にクルーが作成されましたね。サンプルのpoem_crewは削除して構いません。
素晴らしい。通常通り、agents.ymlファイルにエージェントの定義があり、task.ymlファイルにタスクの定義があります。
以前のものと比べると、これらのセットアップはかなりコンパクトになっていることに気付くでしょう。特に古いものと比較すると分かります。古いものは独立したクルーだったため、独自の環境変数、ツールフォルダ、その他多くのものを持っていました。これは、フロー全体のセットアップを利用しているため、より薄くシンプルなバージョンになっています。
なるほど。では、研究クルーができました。eduクルー(古いもの)は参考用に残しておくとして、研究クルーと実際のコンテンツ作成クルーを作成する必要がありますね?
はい、新しいクルーを作成しましょう。
「edu_content_writer」という名前で、同じコマンド「crew AI flow add-crew」を実行します。
はい、見てください。素晴らしい。edu_content_writer、edu_research、そして参考用の古いeduがあります。
これで通常通り、クルーファイルのようにエージェントとタスクをyamlファイルに追加できます。今は単純に始めて、後で改良していきましょう。
では、eduフォルダを開いて、古い定義を再利用しないように気を付けましょう。エージェントの定義…これが以前使用したものです。今は研究者だけ必要なので、それだけを取ります。
ところで、Cursorのヒントをいくつかお伝えしてもよいですか?
ぜひお願いします。コーディングから少し離れていたので、かなり慣れていないんです。
心配いりません。agents.yamlの古いファイルに移動して、全体をコピーしてください。両方のエージェントを選択して…
はい、完了です。
では、研究用の新しいファイルに移動して…agents.yamlを開いて…全体を選択し、Command+Kを押します。そして「研究とトピックの説明のためのエージェントを作成したい」と入力し、「これは例です」と言って、先ほどコピーした内容を貼り付けます。
面白いですね。通常はLlama-2-70b-chat-hfを使用しますか?それともClaude-3.5-sonnetを使うべきですか?
私はChatの場合、Sonnetの大ファンです。通常はClaude-3-sonnetを使用します。あなたはどれを使用していますか?
新しい…上にある通常の3.5を使用していると思います。
では、それを使いましょう。
「以前のエージェント定義からの情報に基づいて、教育コンテンツを作成するためのエージェントを作成する」と入力しましょう。
なお、Enterを押す前に、いくつか追加したいことがあります。何を取り出したいのか具体的に説明しましょう。最終的なエージェントからは、長文コンテンツを書くための完全な計画が必要です。タイトル、サブタイトル、各トピックが重要な理由、そして情報の出典も含めるべきでしょう。
では、研究エージェントの最終目標は…「serperツールを使用してウェブ検索を行い、与えられたトピックについての関連情報を収集すること」と書きましょうか。
そして、最後に計画が必要で、その計画にはいくつかの要素が必要だと…詳しく説明してください。
はい、その通りです。これらはエージェントですよね。タスクの一部として保存した方が良いかもしれません。
このくらいで十分でしょう。Enterを押してみましょう。Cursorが本当に輝くところです。準備ができたら、Command+Enterを押すと提案が受け入れられます。
完了しましたか?
上級研究者…了解です。
しかし、このクルーには両方のエージェントは必要ありませんよね?研究者だけで十分では?
両方持っていた方が良いと思います。研究フェーズの最初のエージェントは、あらゆる情報を見つけ出し、幅広く深く調査します。2番目のエージェントには計画を作成してほしいのです。研究者が見つけたすべての情報から、非常に構造化された計画が必要です。「5つのセクションがあり、これらがそのセクションで、各セクションでこれらが主要なポイントになる」というような感じです。
なるほど。以前のバージョンでは、検索者と教育コンテンツ作成者がいて、後者が実際にコンテンツを書いていましたが、ここで必要なのはそれとは少し違いますね。教育コンテンツプランナーのような役割でしょうか?
そうですね。
それと、何か変更するたびにタブが表示されるのに気付きましたか?
ええ、Tabを押すだけで補完してくれますね。今日からCursorを使い始めましたが、本当に価値がありますね。素晴らしいです。
では、これはどうでしょうか?複雑な研究を明確な…をチェックさせてください。エージェントに関してはこれで良さそうですが、タスクについてはプランの内容をもっと詳しく説明する必要があります。
研究者の名前をもう少し詳しくすべきでしょうか?教育コンテンツ…まあ、内部使用だけなので、実際の動作には影響しませんよね。
そうですね。では、もっとシンプルにして、「Planner」(プランナー)としましょう。
よし、次はタスクを見てみましょう。古いものは必要ありませんね。ここで新しいタスクを…はい、ここです。
研究タスク、報告タスク…古い情報を取得してコピー&ペーストしましょう。いいえ、ペーストせずに、Command+Kを押します。
なるほど。これらのエージェントタスクを、以下の情報を含めて編集する…そして、古いコードのスニペットから…それから、おそらく…実はインラインで編集を見てみたいので、このまま試してみましょう。
もちろんです。ちなみに、Command+Kを続けて使うことができます。また、Command+Lという機能もあります。Command+Kはアドホックな変更用で、Command+Lは右側にチャットメニューを開いて継続的に対話できます。
研究タスクがありますね、これは良さそうです。報告の代わりに計画タスクにすべきですね。
まず研究タスクを見てみましょう。「トピックについて徹底的な研究を行う」…それをきれいにしましょう。「トピックについて徹底的な研究を行い、興味深く関連性のある情報を見つける」。同じ行に「2024年現在」を入れて…ここでserperツールの使用を明示的に指定すべきでしょうか?
必要ありません。ただし、研究に少しフレーバーを加えることをお勧めします。例えば、未来に関する資料を作ろうとしているなら、「最先端のコンテンツ、最も関連性の高い情報を探している」と言えます。あるいは、エグゼクティブ向けなら、「エグゼクティブの意思決定者が市場やトピックを理解するための情報を探している」というように。
私が探しているのは、初心者向けでありながら包括的なコンテンツです。また、トピックの定義の仕方によっても変わってくると思います。「大規模言語モデルのファインチューニング入門」と「大規模言語モデルの高度なファインチューニング」では、そこで調整できますよね?
その通りです。あなたが得ようとしているのは、基本レベルから中級レベルまでの情報のように見えます。コンテンツを積み上げていく感じですね。何か追加してもいいかもしれませんが、最初から完璧にする必要はありません。いつでも戻って変更できます。
分かりました。途中で試してみるのが好きなので、このままいきましょう。期待される出力は「徹底的な研究レポート」…でも、これはレポートなのでしょうか?
本当に欲しいのは情報を集めることなので…レポートという言葉は適切でしょうか?
レポートで良いと思います。2番目のタスク、つまりキーとなるのは、レポートよりもプランですね。
では、「トピックに関する徹底的な研究レポートと、後で教育コンテンツに変換できる関連情報」。研究レポートには、コンテンツ作成に使用したソースへの参照も含める必要があります。
完璧です。ただし、「変換できる」の代わりに「インスピレーションを与える」と言い換えることをお勧めします。
その変更の理由は?
実際のコンテンツの執筆に移行させたくないからです。次のプランニングエージェントのために、できるだけ生の情報を得たいのです。次のエージェントが「これをどのように面白くしたり、エッジの効いたものにしたり、別の方法で説明したりできるか」を見つけ出すからです。2番目のエージェントに渡す情報が生であればあるほど、より良い結果が得られると思います。
素晴らしい!
では、プランニングタスクについて。「受け取ったコンテキストを確認し、各トピックを教育コンテンツの完全なセクションに展開する」…これは変更が必要ですね。「受け取ったコンテンツを確認し、インスピレーションを得て」…いや、「インスピレーションを得て」は違います。「素晴らしい教育コンテンツのプランを作成する。対象は」…そこで別の変数、ペルソナを入れることができます。
はい、「audience_level」(対象レベル)にしましょう。
とても良いですね。初級者、中級者、上級者…
おそらく、それを上にも加えた方が良いですね。
確かに。研究者には全てを取得させたいと思いますが…実際には、検索を変更する可能性があるので、重要かもしれません。
「対象レベルに向けたトピックに関する徹底的な研究レポート」…いや、もしかしたら後ろの方が良いかもしれません。「トピックに関する研究で、後で対象レベルに向けた教育コンテンツのインスピレーションとなるもの」。
「対象レベルに向けた」で良いですね。
そして13行目から15行目は、実際のプランの内容に置き換える必要があります。ここでより多くの変数を補間したり、「これを教育的に、洞察に富んだものにしたい」などと言ったりできます。そして、具体的にどのようなプランが必要かを…。
申し訳ありません、続けてください。
プランは「詳細で包括的である必要がある」…そうですね、それだけで…。
そして今度は「以下のリストを返す」と書いて、箇条書きで…サブタイトルなどを指定できます。これは説明ではなく、期待される出力に入れた方が良いと思います。
はい、そこに入れましょう。
では試してみましょう。「マークダウン形式で、プランを作成するために使用した参照/ソースを必ず含めてください」…プランにはそれは必要ありませんよね?
そうですね、マークダウンは全く必要ありません。実際にはpydanticオブジェクトを使用するからです。
了解です。「完全な教育…」いや、それは違います。
この部分全体を削除する必要があります。「対象レベルのための詳細なプラン」…これをどう定義すべきでしょう?
私の考えでは、1ページで欲しいものは、各セクションのプランです。つまり、「プランはセクションのシリーズで構成され、各セクションにはサブタイトル、高レベルの目標」と言うでしょう。各セクションにタイトル、サブタイトル、高レベルの目標が必要で、「このセクションが重要な理由」「重要性」、そしてセクションの詳細な分析を加えるのが良いでしょう。参考文献やソースの場所を追加する価値もあるかもしれません。
セクションの詳細な分析は必要ですか?
いいえ、それは省きましょう。
また、タイトルも削除できます。記事は1つのタイトルしか持たないことを覚えておいてください。これはセクションについてだけです。
「サブタイトルと参照されたソース」だけで。
そして教育コンテンツプランナー…今はプランナーと呼んでいるので、それを変更する必要があります。
どうでしょうか?
かなり良さそうです。試してみて、どうなるか見てみましょうか?
メインの.pyファイルに戻って、このクルーをインポートしましょう。
edu_flow…これですね。
はい。9行目でクルーをインポートしてみましょう。
研究クルー…すごいですね。
いいえ、うまくいきませんでした。8行目を一旦削除してみてください。Cursorが混乱しているかもしれません。
正しいパスは何になるでしょう…ちょっと待ってください。
cruises.edu.edu_research…
もしかしたらcrewは必要ないかもしれません。
edu_research…そして再度edu_research…申し訳ありません、edu_search_crew…
はい、そうです。では14行目で実際にedu_research_crew.kickoff()を呼び出すことができます。今はテスト中なので、kickoffにinputsを直接渡すことができます。audience_levelとtopicを渡します。
ただし、audience_levelとtopicは「inputs」という親キーを持つ辞書の中にある必要があります。
なんてこと!そんな方法は知りませんでした。これは本当に素晴らしい!
申し訳ありません、こんなに興奮してしまって。ところで、CEOのSundarが、彼らのコードの25%が現在AIによって書かれていると言っているのを見ましたか?
正直なところ、クルーAIではその割合はもっと高いと思います。そうあるべきですからね。これは本当に素晴らしいですね。
では、どうなるか見てみましょう。
はい、いくつかの正しいインポートがあり、オブジェクトを作成し、コンテンツのアウトラインを作成しています。
これは良さそうですね。ただし、少し行き過ぎているかもしれません。例えば、content_outlineは…これは単に受け入れを…
はい。14行目と同様に、単にlist[str]に置き換えることができます。
Cursorは聞いているんでしょうか?それがまさに…すごいですね。
そして、12行目から14行目は削除できます。もう必要ありません。
これは完璧です。ご覧のように、ここに2つのオブジェクトがあります。これは通常のPythonです。セクションには、タイトル、高レベルの目標、重要性、ソース、コンテンツのアウトラインがあり、各属性の型が定義されています。そして、上記のオブジェクトのリストを持つ教育プランという別のオブジェクトが作成されます。多くのセクションが含まれることになります。
では、その教育プランという名前をコピーしましょう。それが必要なオブジェクトですから。
名前だけですね、educational_planというオブジェクトを。
最終タスクに移動して… yamlファイルでも構いません。output_fileの代わりに、output…確認させてください。それでいいと思います。
output_pydanticですね、そして教育プランという同じ名前を貼り付けます。
完璧です。
これは、メインファイルでkickoffを呼び出した後に.pydanticを呼び出すと、まさにそのオブジェクトが得られ、そのオブジェクトが自動的に次の関数に渡されることを意味します。次の関数では、もはやmarkdownのプランは得られません。
必要があれば得ることもできますが、現在のセットアップではそうではありません。
そして、21行目の後には何を追加しますか?
コンマを追加して、planと書きます。今まさにそのオブジェクトを取得しているからです。
型を指定する必要はありません。型と2つの…はい、そのとおりです。
これで計画ができました。plan.sectionsを呼び出すことができます。なぜなら、オブジェクトにセクションがあることが分かっているからです。
これはどこで定義されているのでしょうか?
実際には上の関数から来ています。20行目でresearch_contentをリッスンしているのが分かりますか?その関数が終了すると、その戻り値が次の関数にパイプされます。
18行目で見落としていたことがありますね。クルーの実行全体の前に、returnを追加する必要があります。
その通りです。なぜ…もちろん、そのとおりです。
Cursorが言っているとおりですね。
そうです。今、それを次の関数の引数として渡しています。1つだけ渡しているので、それをplanと呼べます。また、そのオブジェクトが何であるかが分かっているので、planにはsectionsという属性があることも分かっています。
22行目では、plan…構文は何でしたっけ?
for sectionですね、Cursorが正確に…
ただし、23行目のprintの代わりに、そのセクションを実際に書くクルーを呼び出します。でもまだそれを定義していないので、定義する必要があります。
その通りです。「ここでクルーを呼び出す」とコメントしましょう。forの前に1つ追加したいことがあります。今は空の文字列、いや、配列にしましょうか、final_contentという変数を作成します。
そして、forループ内でクルーを呼び出すたびに、その結果をfinal_contentに追加していきます。
素晴らしい!その前に、コンテンツ作成クルーを作成する必要がありますね。いや、既に作ってありましたね。エージェントとタスクを定義するだけです。
はい。edu_content_writerのconfigを確認しましょう。これらが必要なものですね。
既に作成済みですが、これまでの内容に基づいて更新する必要はありますか?
そう思います。より凝ったことをしたい場合は、研究からエージェントの定義をコピーして、Cursorを使って「これらの研究エージェントがあって、今は書き込みとレビューを行うエージェントが必要だ」と伝えることができます。
なるほど!では、エージェントから始めましょう。これをコピーして…Command+Kを押して…「この前のedu_researchクルーからエージェントの定義があります。今度は、研究クルーが見つけた情報を使用するコンテンツ作成クルーを作成してください」。
見てみましょう。教育コンテンツライター、教育編集者、品質レビュアー…かなり凝ったものになりましたね。
そうですね!ただ、対象レベル(audience_level)への言及が見当たらないので、それを追加しましょう。
はい、「対象レベルも参照するようにしてください」。
素晴らしい!すごい…私の頭が爆発しそうです!
では、これをコピーしてタスクに移動し、「さて、agents.ymlからこのコードを使って、各エージェントに関連するタスクを作成するのを手伝ってください」と言いましょう。一つ付け加えたいことがありますが…どうやら理解してくれたようですね。
期待される出力…そうですね、それがポイントでしたか?
その通りです。
すごい!私は耳から耳まで笑顔です。Cursorに感動し、クルーに感動しています。もっとコードを書かなければ…このような長時間の動画をもっと作って、ただコードを書いて何かを作る様子を見せたいと思います。本当にこういうのが好きなんです。もっと期待してください。そして、Joe、助けていただき本当にありがとうございます。
いいえ、私も本当に楽しんでいます。最近は忙しくて自分でクルーを作る機会が少なくなっていたので、これは素晴らしい経験です。
よし、ここまでで良さそうですね。main.pyに戻りましょう。教育研究と同じように、クルーをインポートする必要がありますね。
はい、その通りです。完璧です。これはグレーアウトされている理由はありますか?
いいえ、まだ使用していないだけです。使用すれば…はい、そうです。
なんてこと!ところで、セクションのことですが、これはpydanticオブジェクトなので、何が必要で…ここではシンプルに保ちますが…セクションに対してto_jsonを呼び出すことができます。そうすればJSONオブジェクトに変換されます。間違っているかもしれませんが、確認してみましょう。
はい、そして最後のdo_pydanticは必要ありません。もう一つ付け加えたいことは、最後にprint(final_content)を追加することです。
forの外に?
はい、その通りです。
これはファイルに保存されるのでしょうか、それともここに出力されるだけでしょうか?
ここに出力されますが、その出力を受け取って、ファイルに保存したり、クラウドにプッシュしたり、何でもできる別の関数を作ることができます。しかし、これは動作するはずです。エージェントやタスクにはあまり時間をかけなかったので、どんな出力が得られるか分かりませんが、実行してみましょう。
kickoffを実行してみます。クリアして…
そこに問題があるようですね。実行を停止できます。教育コンテンツクルーにもinputsを渡す必要があります。audience_levelとtopicです。上の行で改行して…
inputsを入力し始めれば、Cursorが補完してくれるはずです。audience_levelも…content_planは必要ないと思います。topicとresearchだけですが、15-17行目のようにハードコードする必要があります。後で整理しましょう。
そうですね。これらの変数を2回入力したくないので…
はい、すぐに修正しましょう。入力変数を抽出して、DRYにしましょう。
Command+Kでは選択した部分しか変更されないので、この場合はCommand+Lを使った方が良いでしょう。
「入力変数を抽出して、DRYにする」…
これで良さそうですね。
受け入れましょう。ずっと良くなりました。
では、実行してみましょう。crew AI flow kickoff…
最初のクルーは問題なく動くはずです。既にテストしましたから…
なるほど、以前はなかったpydanticオブジェクトがあるので、それがどうなるか見てみましょう。
最初のビデオから、そして今あなたと一緒に作業して学んだことの1つは、01は良い結果を出したものの、非常に高価で遅かったということです。しかし、クルーの機能をより活用することで、01の能力を複製し、おそらく超えることができます。
そして、どのモデルでも使えます。はるかに安価で、はるかに高速なモデルを…そしてもちろん、01を試して何が得られるか確認することもできます。私のAI開発に対する基本的なアプローチは、最高のモデルから始めて、必要なものを構築する効率的な方法や異なる方法を見つけたら、より安価な、いわゆる「低品質な」モデルを使用するというものです。なぜなら、このすべてのフレームワークがあなたを助けてくれるからです。
その通りです。良い点は、.envファイルの1行を変更するだけで、このクルーを動かしているモデル全体を変更できることです。それはかなり良いことです。
エラーが出ましたね。edu_research_crew.pyファイルに移動して…いや、申し訳ありません、content_writerクルーの.pyファイルですね。エージェントとタスクの定義を使用するように変更する必要があります。現在は完全なものを使用しています。
Command+Lで「agents.ymlとtasks.ymlの定義を使用するように修正してください」としましょう。
ファイル全体を…これは正しくないようですね。
いいえ、それらのインポートは必要ありませんが、必要な部分だけを受け入れることができます。
例えば、必要のない行は受け入れない…yamlのインポートは必要ありません。これは必要ありません。これは必要です。これも必要です。
なるほど。いくつかの項目がグレーアウトされているのに気付きました。全体を拒否して、もう一度試してみましょう。
チャットで他のファイルを参照することができます。「edu_research_crewと同様に作業していることを確認してください」と入力してみましょう。
これで動くでしょうか…同じエラーですね。
yamlを読み込む必要はないはずです。何をしようとしているのでしょう?混乱していますね。
クルーが既に行っていることの多くを手動で回避しようとしているようです。
手動で修正しましょう。時にはそうする必要があります。
edu_content_writer_crew…これは正しくありませんね。
今やCursorに頼りすぎて、「どうやってCursorを使ってこれを修正すればいいんだろう」と考えてしまいます。
agents.ymlからエージェント名を取得して、正しく置き換えたいと思います。そして、タスクについても同様に。
はい、agents.yml…content_writer、editor、quality_reviewerですね。
もう一度試してみましょう。「agents.yml edu_content_writerとtasks.ymlに一致するようにエージェントとタスクの名前を調整する」。
編集者、writing_task、Ed…これは正しそうですね?
はい、エージェントが1つ足りないだけですね。レビュアーエージェントもありましたよね?
はい、レビュアーエージェントを追加します。
そして、reviewing_taskも?
はい、reviewing_taskも追加します。
名前が正しければ、これで動くはずです。
実行してみましょう。
実は、これを以前使って、本全体を書くクルーのテストをシミュレーションしました。基本的にこれの強化版で、クルーに章を計画させ、1つの章全体を書くクルーを持つことができます。この方法で、かなり長いコンテンツを作成できます。
つまり、そのトリックは、最初にプランを立て、それからエージェントやクルーに各セクションを順番に作らせる、というわけですね。一度にすべてを書かせようとするのではなく。
はい、これは通常、より高品質なコンテンツを生み出します。一種の強化されたチェーンオブソートのようなものです。さらに高いレベルに進んでいます。
素晴らしいですね。実行中ですが、Lang Traceに戻って、どのくらいのコストがかかっているか確認してみましょう。1回の実行あたりのコストが気になります。
3セントですね。とても良い、とても安価です!
そうですね。恐らくGPT-4ファーメイを使用しているからだと思います。
ファーメイがデフォルトですからね。実際に確認できます。いいえ、GPT-4を使用していますね。GPT-4ミニを使用できるはずです。実際、どこかでGPT-4ミニを手動で指定した覚えがあります。
エージェントか.envファイルのどちらかにあるはずです。クルーにありますか?ここには指定されていませんね。agents.yamlか.envファイルにあるはずです。
以前の方法は、ここにコンマを入れてllm=これを指定していましたが、yamlの方が少し扱いやすいことが分かりました。
yamlに全ての定義を1箇所にまとめる方が確かにクリーンですね。
実際にはどこにも指定していないようです。GPT-4…ありました。
でも、これは古いクルーにありましたね?
はい、古いクルーですね。ところで、もう古いクルーは削除して良いですよね?
はい。その内容は、どこにありましたか?edu?このすべてを削除できます。
ところで、1つ見つけたエラーがありますが、おそらくcontent_writer_crewのtasks.yamlファイルで、タスクの名前がquality_review_taskになっているためだと思います。edu_content_writer_crewを更新して、そちらを使用するようにすべきですね。
review_taskを使用しているようですね。
また、52行目も同様です。
修正する前に、「タスクとエージェントの定義における名前が一致していることを確認する」とCursorに聞いてみましょう。
quality_reviewer…他にも間違っているものを見つけたようですね。
素晴らしい!
それを保存しましょう。全て保存できたようですね。もう一度試してみましょうか?
その前に、タスクファイルを確認して、正しいエージェントを参照しているか確認しましょう。タスクにエージェントが含まれていないようですね。この1つには含まれていますが…
では、こうしましょう。「agents.yamlに基づいて、これらのタスクにエージェントを追加する」。
もうCursorのプロになっていますね!
病みつきになります。本当に素晴らしいです!
受け入れましょう。良さそうですね。
保存して準備完了です。
実行しましょう。ところで、Cursorの唯一の欠点は、非常に慣れてしまうことです。例えば、飛行機でのコーディングがずっと難しくなりました。
ローカルで実行できるようにすることはできますが。試してみましたが、苦労しました。ビデオを作成する必要があるかもしれません。Cursorでできるはずですし、VS Codeのプラグインでも動作させることができるはずです。おそらく同じくらいクリーンではありませんが。
インターネットにアクセスできない場合は難しいでしょうね。
さて、crew AI flow kickoffを実行してみましょう。うまくいくことを願って…
ファインチューニングLLMs…教育コンテンツプランナーがレビューしています。これを見てください!
少し大きく表示して、もっと見えるようにしましょう。2番目のクルーが動作しています。ただし、これは…これは正しかった…つまり、ライタークルーは基本的に各セクションに対して複数回実行されるということでしょうか?
その通りです。各セクションに対して1回ずつ実行されます。ところで、ライタークルーのエージェントとタスクを作成した時、あまり時間をかけませんでしたが、調整する価値があります。おそらく長いセクションを書くことになるでしょうが、それは望ましくありません。1、2段落程度にしたいですね。なぜなら、最終的にはすべてがまとまるからです。
コンテンツライタークルーのプロンプトを、より大きな記事のセクションを書くのに適した方法に調整する時間を後で取るべきだと思います。
良いですね。それは別のビデオに取っておきましょう。このビデオはもう長くなっていますから。でも、それは良い次のステップになりそうですね。
既に3つか4つ目のセクションを書いているようですね。数秒以内に最後のものができるはずです。
ここで非常に重要なことを忘れていると思います。
一旦停止しましょう。1つ見落としていることがあります。
フローのmain.pyファイルを見てください。2番目のクルーを実行する時、これらのinputs変数を渡しているのが分かりますね。topicとaudience_levelを渡していますが、sectionを渡していません。sectionをそこに追加する必要があります。
forの前か中で、それを追加できると思います。
forの中でですね。
writer_inputs…
はい、コピーを作成して、Tabを押して、次の行でsectionを追加します。
そしてsectionはto_jsonを呼び出す必要がありますね。
そして、唯一欠けているのは、コンテンツライタークルーのエージェントとタスク、特にタスクでsection変数を期待していないことです。そこに追加する必要があります。
ここでinput変数も渡す必要がありますか?
いいえ、既に実行されています。
ライタークルーのタスクで、sectionのための場所を追加する必要がありますね。ここで…おそらく5行目の説明で、数行改行してsectionを追加します。
そのような感じですね。
これを全てのタスクに追加する必要があるでしょう。最終的に、エージェントとタスクの定義により時間をかける時に、もっと良くできると思いますが、これで少なくとも書いているセクションについて伝えることができます。
なるほど、了解です。
では、もう一度試してみましょうか?準備できましたか?
はい、できました。
to_jsonではないようですね。Cursorに聞いてみましょう。「pydanticをJSONに変換する正しい方法は?」
どこにいたか忘れてしまいました…27行目の他のファイルにありますね。
model_dump_json…そうでしたね!
では、dot_toを…他にもないか確認しましょう。前にもあったような気がしますが。
いいえ、なさそうですね。
もう一度実行してみましょう。
ところで、おそらく将来のフォローアップビデオのためのメモですが、2番目のクルーのエージェントにもツールを追加する余地があると思います。情報を拡張したり、事実を確認したりする必要がある場合に備えて。参考文献があるので、serperを追加することもできます。
もう1つ役立つかもしれないのは、以前書いた、気に入っているドキュメントやコンテンツを検索できるカスタムツールを設定することです。例を確認することができます。これも実際に機能することが分かっています。いくつかの異なる方法で発展させることができます。
高度なことをやってみたいことがあります。今日はやりませんが、あなたの意見を聞かせてください。このコンテンツに基づいて、画像、グラフィック、図表を作成できるようにしたいのです。これは非常に難しそうですが、クルーでは可能でしょうか?
可能です。最近、サポートデータを継続的に分析し、そこから洞察を引き出してグラフを作成したり、matplotlib(データ可視化ライブラリ)を使用したりするユースケースで実現しました。基本的に、コードを書くエージェントを作成して、それを実行させました。
なんて素晴らしいんでしょう!
完了したようですね。なぜかnullが入っていますが、最後のものを見ると、全てのセクションがあるはずです。例えば、下から見ると、最後のセクションが…
ああ、そうですね、1つのセクションだけですね。全体はどうやって見れば良いのでしょう?
出力されているはずなのですが、なぜか…28行目でprint.pydanticを呼び出していますよね。そこを修正する必要があります。
print.pydanticを削除して、rawを追加すれば良いと思います。正しければ…
必要ないかもしれません。でも…とりあえずPDFに出力しましょうか?どうすれば良いですか?
はい、やってみましょう。この後に新しい関数を作成します。
改行して、generate_thingと同様の関数を作成しますか?
はい、save_to_PDFやsave_to_text_fileなど、シンプルにしましょう。その関数をフローの中に1レベル深く移動させる必要があります。
ああ、もちろんです。
generateと同様のリッスンアノテーションを付ける必要があります。そして、passを削除して、実際にテキストファイルに保存します。Command+Kを使って「コンテンツをテキストファイルに保存する」と入力すれば…
ああ、実際にテキストファイルにしましょう。PDFを毎回作成する必要はありませんね。
受け入れて…39行目で1つ追加したいことがあります。改行してreturn final_contentを追加してください。
これで、そのreturnがコンテンツ変数(33行目)に入り、全体が実行されます。
では、実行してみましょう。GPT-4ミニを使ってみませんか?
それはどこで設定すれば良いでしょう?実際、なぜGPT-4ミニを使用していないのでしょう?
システムレベルで環境変数が設定されている可能性しか思いつきません。使用する環境変数を教えましょう。少し待ってください…
分かりました。環境変数を設定します。Alexがこの部分をカットします。
では、もう一度実行してみましょう。crew flow kickoff…
これで面白くなりますね。Lang Traceは機能していますが…
1つ、コストをかけずにできることがあります。これらのエージェントはウェブを検索できますが、ページをスクレイピングしていません。研究者にウェブページをスクレイピングするツールを追加できます。そうすれば、それらのページに深く入り込んで、より多くを学ぶことができます。現在は研究結果だけで作業しています。
次にやることについてメモを取る必要がありますね。これは本当に素晴らしいです。
セクションができました!
はい、最初のセクションのコンテンツを書き始めています。セクション情報がありますね。JSONと表示されていますが問題ありません。導入部、高レベルの目標、なぜ重要か、など、私たちが指定したすべてが含まれています。参考文献もあります。
初期セクション、なぜLLMsが重要かを書いています。そこに書かれているのが分かりますね。
今、品質保証の専門家に移っていますね。
「効果的なファインチューニングの手法」のセクションを作成していますね。深く掘り下げていっています。
はい、「全体的にコンテンツが効果的に整列している」というのは、レビュアーが基本的にフィードバックを述べているということですね。
ただし、1つ気付いたことがあります。最後のエージェントがQAエージェントで、期待される出力がレビューなので、レビューが実際の最終セクションとして扱われているようです。
ライタークルーのエージェントとタスクの定義を調整する必要がありそうですが、今は十分に良い結果が得られると思います。それらの定義にあまり時間をかけなかったので。
なるほど。例えば、その上のものを見てみましょう。ターミナルを広げてみましょう。少し上にスクロール…これが最初のものですか?
いいえ、これはQAによるパフォーマンス品質評価です。その上を見てみましょう。
はい、これは編集者ですね。さらに上を見てみましょう。
そうです。これはセクションの1つの出力です。たくさんのことを書いて、次のエージェントに渡しています。変更を加えるエージェントに。
実行の最後に、最終セクション、つまりセクション全体が欲しいと言うべきでしたが、スクロールすると提案を出して、それらが補間されることになります。
左側に教育コンテンツのテキストファイルがありますが、開いてみましょうか?
ご覧のように、品質評価レポートが実際のコンテンツとして追加されています。それが問題ですね。
よろしければ、すぐに修正しましょうか?
はい、お願いします。コンテンツライターのタスクをすぐに見てみましょう。edu_content_writer_tasksですね。
はい。では、まず編集者の期待される出力を「教育コンテンツの洗練されたバージョンと改善されたCLA」とし、「セクションのコンテンツのみを返す、フィードバックは含めない」と追加しましょう。
完璧です。そして品質レビュータスクについても同様に、期待される出力で「詳細な品質評価」と言っているところを、「フィードバックを取り入れたセクションの更新バージョンが欲しい」というように変更する必要がありますね。
その通りです。その期待される出力全体を削除して、「フィードバックを取り入れたセクションの改善バージョンが欲しい」に置き換えることができます。
フィードバック自体は含めないように。
はい、フィードバック自体は含めません。
そして最初のタスクについて、長い形式のコンテンツの一部となる1、2段落の良く構造化されたセクションについて、といった具合に変更しましょう。
これで良い結果が得られるはずです。
もう一度実行してみましょう。crew kickoff…
これで最後にします。Joe、あなたの時間は非常に貴重なので、既に十分に時間を取っていただきました。
いいえ、Lang Trace SDKがないというエラーが出ましたね。
ああ、私のお気に入りのエラーです。python-sdkかな…よく分かりません。
VM内にいるので、pipをセットアップしていませんでした。pip install ltrace-python-sdkを試してみましょう…ただの推測ですが。
モジュールltracesにnetがない…ところで、GitHubを見てください。コピーしたファイルを見ると…
langtrace.dbからインポートしているのが分かりますね。メインファイルでそのインポートが必要です。
その通りでした!
これでLang Traceが追跡できるようになりました。Lang Traceが設定され、far-miniを使用しているので、コストも確認できます。とても良いですね。
エージェンティックワークフローで好きなモデルは何ですか?
far-miniです。それがデフォルトになっているのも納得ですね。01を使用する必要性を感じることはありますか?それとも、エージェントの定義をしっかりとすれば、どんなモデルでも01レベルの品質が得られると思いますか?
現時点では、どんなモデルでも01レベルの品質、あるいはそれ以上の品質が得られると信じています。また、より多くのコントロールも可能です。01ではそれほどコントロールができません。良いコンテンツを生成するかもしれませんが、私たちのセットアップでは、これらのトピックについてどのように推論するかをより細かくコントロールできます。
これよりもさらに複雑なことも可能ですが、01を使用する必要性は感じません。コストよりも、レイテンシーが非常に問題になると感じています。
確かに。前回のビデオで、非常に基本的なユースケース(今回あなたに手伝ってもらったような堅牢性もない)でも、1回の実行で50-60セントかかりました。この堅牢性を追加し、これを数十回、数百回実行することを考えると…確実にコストが積み上がりますし、すべてが80%遅くなります。
そうですね。そのようなユースケースもあるかもしれませんが、正直なところ、他のモデルとは非常に異なる動作をするため、モデルをサポートできるようにクルー内でいくつかの変更を加える必要がありました。まだ、そのレベルの推論が必要なユースケースを見つけていません。数学関連なら正当化できるかもしれませんが…
そうですね。私も以前から話していますが、ユースケースの98-99%は、最新の非01モデルで対応可能です。実際、正直に言えば、ユースケースの90%はllama-2でも問題なく対応できるでしょう。
大多数のユースケースは、より安価で、小規模で、効率的なモデルで実現できます。それが素晴らしいですね。特にエージェンティックワークフローで包むと、90%が95%や98%になり、基本的に無料のモデルで対応できるユースケースが増えます。
その通りです。エージェントとタスクの定義を変更する必要があるかもしれませんが、コツを掴めば魔法のように機能します。それは確実に見て取れます。オープンソースモデルの良い点は、自分でホストできることです。特定のデータに公開することについて、それほど心配する必要がありません。すべて内部で完結するからです。
そうですね。企業と話をする中で、それをよく耳にしているでしょうね。
金融や医療分野では、それが話題の中心です。
動作しているようですね。いくつか改善点が見えてきました。例えば、箇条書きの使用を控えめにして、段落を書くように指示できます。
また、各セクションの最後に「要約すると」や「結論として」というような締めくくりを入れようとしているのも気になります。セクションの途中の段落なので、結論や要約は不要だと伝えることができます。最初の作成タスクにいくつかの細かい改善を加えることができそうです。
「必要な場合を除いて箇条書きを使用しない」、そして「各セクションの要約や結論は不要、コンテンツだけで良い」というようにしましょう。
もう一度実行はしませんが、後で使用します。また、「ほとんどのセクションは2-3段落まで」というような制限を加えることもできます。
実際に実行する前に、これらの出力の1つを詳しく読んで、正確さ、完全性、冗長性などをチェックしたいと思います。その後、タスクとエージェントの説明を改善していきます。
おっしゃる通りです。次のステップはたくさんありますね。研究に スクレイパーを追加するだけでも大きな違いが出るでしょう。
2番目のクルー、2番目のエージェントにもスクレイパーを追加できます。このクルーのエージェントは参考文献を見て、データが有効かどうかを確認し、QAを行うことができます。ハルシネーションを防ぐことができます。
確実に様々な方向に発展させることができます。
終了したようですね。educational_contentを開けるはずです。
また、このプロセス全体を高速化するために、定義とクルー、ワークフローをすべて緻密に調整したら、Grojiに切り替えて、100倍のスピードを実現することもできますね。
その通りです。では、educational_contentを見てみましょう。それを消して…ここにありますね。
データ収集…はい、質的な組み合わせの評価…これは良さそうです。時間をかけて読み、内容を理解し、何が欠けているかを確認する必要があります。おそらく少し長くする必要がありますが、長くすること自体が目的ではありません。
それと、面白いことができます。Cursorを使って、この出力やセクションをコピーして、タスク定義に「このタスクのグループがこのセクションを生成しました。もっと長く、もっと深くしたい」などと伝えることができます。そうすれば、それらの定義を調整しようとしてくれます。
素晴らしいですね。今回はこれで十分でしょう。Joe、本当にありがとうございました。これらの新機能に非常に興奮しています。おそらく一日中これで遊ぶことになるでしょう。
そして、このビデオのパート3も作ります。とても楽しいですし、これは実際の使用ケースです。これを使って、みんなのための教育コンテンツを作成する予定です。
コードはすべてプッシュしますので、確認したい方は、説明欄のGitHubリンクから見ることができます。Joe、ありがとうございました。
ご参加ありがとうございました。素晴らしかったです。
この動画を楽しんでいただけた方は、ぜひいいねと登録をお願いします。次回の動画でお会いしましょう。


コメント