|
オリジナル:Sun Tao(Datawhale) Datawhaleのヒント 著者: Sun Tao、Datawhaleのティーチングアシスタント 最近 AI 界で最大の衝撃は間違いなく Manus です。 2日前、OWLとOpenManusチームを招き、ネットワーク全体でManusオープンソースの再現を初めてライブ配信しました。ライブ配信の録画は、ビデオチャンネルでご覧いただけます。 今日は、Manus のオープンソース偽造フレームワーク OWL の実践的な経験と技術的な詳細を共有します。 OWL プロジェクト アドレス: https://github.com/camel-ai/owl 🦉 OWL とは何ですか? 🦉 OWL は、CAMEL-AI フレームワーク (https://github.com/camel-ai/c...) をベースにした最先端のマルチエージェントコラボレーションフレームワークです。タスク自動化の限界を押し広げると、公式紹介では次のように述べられています。 私たちのビジョンは、AIエージェントが連携して現実世界のタスクを解決する方法に革命を起こすことです。OWLは、動的なエージェントインタラクションを活用することで、様々な領域において、より自然で効率的、かつ強力なタスク自動化を実現します。 現在、OWL は GAIA ベンチマークで平均スコア 58.18 を達成しており、オープンソース フレームワークの中で 1 位にランクされています。 デモはこちらです: <iframe class="video_iframe rich_pages" data-src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3891252008598175744" data-mpvid="wxv_3891252008598175744" data-vidtype="2" data-cover="http%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FvI9nYe94fsFwYIfY6tkfTkjtdKz7WWt sGdxPetGB3UB1Mskb101FPKvSpsicTndqqLcWe9cLDKeVpaX2Y04gliaQ%2F0%3Fwx_fmt%3Djpeg"></iframe> Manus のデモ ビデオをご覧になった方は、現在の大規模モデルでは一部のタスクを一度に処理できないため、私たちが提起した問題に関しては、Manus がまずタスクを細分化し、その進行状況を記録する TODO.md ファイルを作成していることがわかります。 OWLでも同様の考え方が用いられています。OWLのプロセス全体は、CAMELフレームワークのRolePlayingメソッドに基づいています。CAMELは、CAMEL独自の協調エージェントフレームワークです。このフレームワークは、定義済みのキューワードを用いて、異なるエージェントごとに固有の初期設定を作成します。 ロールプレイングでは、ユーザーロールはタスクを細分化し、アシスタントロールに指示をその都度与える役割を担います。アシスタントロールは指示を実行する役割を担います。このプロセスにおいて、アシスタントロールは、天気やニュースなどのリアルタイム情報を取得するためのツール、計算ツール、OWLで定義された特定のツール(Webページの制御、ファイル、表、画像などの処理のためのツールを含む)など、設定された様々なツールを使用できます。 まずは事例を見てみましょう。私の質問は「国際女性デー(3月8日)に小紅書で母に贈るプレゼントを選ぶのを手伝ってください」です。 <iframe class="video_iframe rich_pages" data-src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3891255666349916167" data-mpvid="wxv_3891255666349916167" data-vidtype="2" data-cover="http%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FvI9nYe94fsFwYIfY6tkfTkjtdKz7WWtsf AUWf4MicSPtr7icicSViaZmrraEWACzianZK0Exsg6kZwia5Qf6XlZGpDWA%2F0%3Fwx_fmt%3Djpeg"></iframe> 動作中、エージェントはまずWebToolkitを呼び出すことがわかります。WebToolkitは、プランニングエージェントとWebエージェントを含むインテリジェントエージェントをカプセル化したツールです。ブラウザシミュレーションインタラクションタスクが開始されると、プランニングエージェントはまず詳細なプランを提供し、Webエージェントが実行する具体的なアクションを選択する際にガイドとして使用されます。 では、エージェントはどのようにブラウザを制御するのでしょうか?まず、タスクが定義された後、ウェブサイトにリダイレクトします。このウェブサイトは、ユーザーが指定するか、エージェントが自己計画中に提案するパラメータ「start_url」によって決定されます。ウェブサイトにリダイレクトした後、WebToolkitは現在のページをスクリーンショットとして保存し、そのページ内のすべての要素にタグを付けます。 このステップの実装方法は次のとおりです。 1. インタラクティブな要素は JavaScript 経由で取得されます。 def get_interactive_elements(self) -> List[Dict[str, Any]]: try: self.page.evaluate(self.page_script) except Exception as e: logger.warning(f"Error evaluating page script: {e}") result = cast( Dict[str, Dict[str, Any]], self.page.evaluate("MultimodalWebSurfer.getInteractiveRects();") ) typed_results: Dict[str, InteractiveRegion] = {} for k in result: typed_results[k] = interactiveregion_from_dict(result[k]) return typed_results 2. `add_set_of_mark` 関数はスクリーンショットにマーカーを描画する役割を担います。 def _add_set_of_mark( screenshot: Image.Image, ROIs: Dict[str, InteractiveRegion] ) -> Tuple[Image.Image, List[str], List[str], List[str]]: # ... 初始化代码... # 为每个交互区域绘制标记 for idx, (identifier, region) in enumerate(ROIs.items()): for rect in region.rects: _draw_roi(draw, idx, font, rect) # ... 其他处理... # ... 返回结果... 3. `_draw_roi` 関数は実際の描画を担当します。 def _draw_roi( draw: ImageDraw.ImageDraw, idx: int, font: ImageFont.FreeTypeFont | ImageFont.ImageFont, rect: DOMRectangle ) -> None: # 计算矩形坐标 x, y = rect["x"], rect["y"] width, height = rect["width"], rect["height"] # 选择颜色 color = _color(idx) # 绘制矩形边框 draw.rectangle([(x, y), (x + width, y + height)], outline=color, width=2) # 绘制标签 label = str(idx) text_width, text_height = font.getsize(label) # 确定标签位置 label_x = x + width / 2 - text_width / 2 label_y = max(y - text_height - 2, TOP_NO_LABEL_ZONE) # 绘制标签背景和文本 draw.rectangle([(label_x - 2, label_y - 2), (label_x + text_width + 2, label_y + text_height + 2)], fill=color) draw.text((label_x, label_y), label, fill=(255, 255, 255, 255), font=font) この関数は、下の画像に示すように、要素の周囲に色付きの長方形の境界線を描画し、各要素に数値の ID ラベルを割り当て、最後に要素の上に背景付きのラベルを描画します。 生成されたタグ付きページ(./tmpディレクトリに保存されます)は、Webエージェントが画像入力を受け取る場所です。Webエージェントは、画像と指示に基づいて次のアクションを実行します。Webエージェントの動作ロジックを理解するには、まずプランニングエージェントの動作を理解する必要があります。以下は、そのプロンプトです。 planning_system_prompt = """ You are a helpful planning agent that can assist users in planning complex tasks which need multi-step browser interaction. """ これは、planning_agent の基本的な役割を定義します。つまり、ユーザーが複雑なタスクを計画するのを支援するエージェントであり、特に複数ステップのブラウザ操作を必要とするタスクに重点を置いています。planning_agent は、初期の計画フェーズで以下のヒントを使用します。 planning_prompt = f""" <task>{task_prompt}</task> According to the problem above, if we use browser interaction, what is the general process of the interaction after visiting the webpage `{start_url}`? Please note that it can be viewed as Partially Observable MDP. Do not over-confident about your plan. Please first restate the task in detail, and then provide a detailed plan to solve the task. """ このプロンプトには planning_agent が必要です: - タスクを言い直す
- 詳細なソリューションプランを提供する
- 部分的に観測可能なマルコフ決定プロセスの特性を考慮します (Web ページでは部分的な観測のみが可能です)。
タスクの実行中に、計画エージェントは新しい状況に基づいて計画を調整する必要が生じる場合があります。 replanning_prompt = f""" We are using browser interaction to solve a complex task which needs multi-step actions. Here are the overall task: <overall_task>{task_prompt}</overall_task> In order to solve the task, we made a detailed plan previously. Here is the detailed plan: <detailed plan>{detailed_plan}</detailed plan> According to the task above, we have made a series of observations, reasonings, and actions. Here are the latest {self.history_window} trajectory (at most) we have taken: <history>{self.history[-self.history_window:]}</history> However, the task is not completed yet. As the task is partially observable, we may need to replan the task based on the current state of the browser if necessary. Now please carefully examine the current task planning schema, and our history actions, and then judge whether the task needs to be fundamentally replanned. If so, please provide a detailed replanned schema (including the restated overall task). Your output should be in json format, including the following fields: - `if_need_replan`: bool, A boolean value indicating whether the task needs to be fundamentally replanned. - `replanned_schema`: str, The replanned schema for the task, which should not be changed too much compared with the original one. If the task does not need to be replanned, the value should be an empty string. """ ここで、{task_prompt} は、私たちが提供した元のタスク入力です。「国際女性デー(3 月 8 日)に小紅書で母にふさわしい贈り物を探すのを手伝ってください」。 `{detailed_plan}` は以前に生成された計画を表し、`{self.history_window}` のデフォルトは 5 です。これは、プランニングエージェントが最新の情報を動的に組み合わせて次のステップを計画することを意味します。プロンプトは、プランニングエージェントに構造化された出力の使用を要求します。生成された計画は、タスクを完了するために Web エージェントに送信されます。 次に、web_agent のプロンプトを見て、その動作ロジックをさらに理解してみましょう。 system_prompt = """ You are a helpful web agent that can assist users in browsing the web. Given a high-level task, you can leverage predefined browser tools to help users achieve their goals. """ web_agent の基本的な役割は、簡潔なシステム プロンプトを使用して定義されます。つまり、ユーザーが Web ページを閲覧するのを支援し、定義済みのブラウザー ツールを使用してユーザーの目標を達成できるエージェントです。 エージェントがコンピュータを操作する必要があると判断した場合、提供されているbrowser_simulationメソッドを使用します。このメソッドはウェブページを継続的に監視し、web_agentはウェブページを監視するたびに以下の形式のプロンプトを受け取ります。 observe_prompt =f""" Please act as a web agent to help me complete the following high-level task:<task>{task_prompt}</task> Now,Ihavemadescreenshot(onlythecurrentviewport,notthefullwebpage)basedonthecurrentbrowserstate,andmarkedinteractiveelementsinthewebpage. Pleasecarefullyexaminetherequirementsofthetask,andcurrentstateofthebrowser,andprovidethenextappropriateactiontotake. {detailed_plan_prompt} Here are the current available browser functions you can use: {AVAILABLE_ACTIONS_PROMPT} Herearethelatest {self.history_window} trajectory (at most) you have taken: <history> {self.history[-self.history_window:]} </history> Youroutputshouldbeinjsonformat,including the following fields: -`observation`:Thedetailedimagedescriptionaboutthecurrentviewport.Donotover-confidentaboutthecorrectnessofthehistoryactions.Youshouldalwayscheckthecurrentviewporttomakesurethecorrectnessofthenextaction. -`reasoning`:Thereasoningaboutthenextactionyouwanttotake,andthepossibleobstaclesyoumayencounter,andhowtosolvethem.Donotforgettocheckthehistoryactionstoavoidthesamemistakes. -`action_code`:Theactioncodeyouwanttotake.Itisonlyonestepactioncode,withoutanyothertexts(suchasannotation) Here are an example of the output: ```json {{ "observation": [IMAGE_DESCRIPTION], "reasoning": [YOUR_REASONING], "action_code":`fill_input_id([ID], [TEXT])` }} Here are some tips for you: -Never forget the overall question:**{task_prompt}** -Maybeafteracertainoperation(egclick_id),thepagecontenthasnotchanged.Youcancheckwhethertheactionstepissuccessfulbylookingatthe`success`oftheactionstepinthehistory.Ifsuccessful,itmeansthatthepagecontentisindeedthesameaftertheclick.Youneedtotryothermethods. -Ifusingonewaytosolvetheproblemisnotsuccessful,tryotherways.MakesureyourprovidedIDiscorrect! -Somecasesareverycomplexandneedtobeachievebyaniterativeprocess.Youcanusethe`back()`functiontogobacktothepreviouspagetotryothermethods. -Therearemanylinksonthepage,whichmaybeusefulforsolvingtheproblem.Youcanusethe`click_id()`functiontoclickonthelinktoseeifitisuseful. -AlwayskeepinmindthatyouractionmustbebasedontheIDshowninthecurrentimageorviewport,nottheIDshowninthehistory. -Donotuse`stop()`lightly.Alwaysremindyourselfthattheimageonlyshowsapartofthefullpage.Ifyoucannotfindtheanswer,trytousefunctionslike`scroll_up()`and`scroll_down()`tocheckthefullcontentofthewebpagebeforedoinganythingelse,becausetheanswerornextkeystepmaybehiddeninthecontentbelow. -Ifthewebpageneedshumanverification,youmustavoidprocessingit.Pleaseuse`back()`togobacktothepreviouspage,andtryotherways. -Ifyouhavetriedeverythingandstillcannotresolvetheissue,pleasestopthesimulation,andreportissuesyouhaveencountered. -Checkthehistoryactionscarefully,detectwhetheryouhaverepeatedlymadethesameactionsornot. -Whendealingwithwikipediarevisionhistoryrelatedtasks,youneedtothinkaboutthesolutionflexibly.First,adjustthebrowsinghistorydisplayedonasinglepagetothemaximum,andthenmakeuseofthefind_text_on_pagefunction.Thisisextremelyusefulwhichcanquicklylocatethetextyouwanttofindandskipmassiveamountofuselessinformation. -Flexiblyuseinteractiveelementslikeslidedownselectionbartofilterouttheinformationyouneed.Sometimestheyareextremelyuseful. ``` """ 単純な GPT 翻訳の結果は次のとおりです。 observe_prompt = f""" 请充当一个Web代理,帮助我完成以下高级任务:<task>{task_prompt}</task> 现在,我已经基于当前的浏览器状态截取了屏幕截图(仅限当前视口,不是整个网页),并在网页上标记了交互元素。 请仔细检查任务的要求以及当前浏览器的状态,并提供下一个适当的操作步骤。 {detailed_plan_prompt}以下是你可以使用的当前可用浏览器功能: {AVAILABLE_ACTIONS_PROMPT}以下是你最近执行的(最多){self.history_window}条操作记录: <history> {self.history[-self.history_window:]} </history>你的输出应采用JSON格式,并包含以下字段: observation:关于当前视口的详细图像描述。不要过于自信地假设历史操作是正确的。你应该始终检查当前视口,以确保下一步操作的正确性。 reasoning:你想要执行的下一步操作的推理,包括可能遇到的障碍以及如何解决这些问题。请检查历史操作,以避免重复错误。 action_code:你想要执行的操作代码,仅限于一个单步操作代码,不应包含任何额外的文本(如注释)。以下是一个输出示例: json复制编辑{{"observation": [IMAGE_DESCRIPTION], "reasoning": [YOUR_REASONING], "action_code": `fill_input_id([ID], [TEXT])` }}以下是一些提示:始终牢记总体任务: {task_prompt}在执行某些操作(例如click_id)后,页面内容可能没有发生变化。请检查历史记录中该操作的success字段,如果其值为true,则说明点击后的页面内容确实没有变化,你需要尝试其他方法。如果使用某种方法无法解决问题,请尝试其他方法,并确保提供的ID是正确的!某些复杂的情况可能需要通过迭代过程来完成。你可以使用back()函数返回上一页,尝试其他方法。页面上可能有许多链接,这些链接可能有助于解决问题。你可以使用click_id()函数点击链接,以查看其是否有用。始终记住,你的操作必须基于当前图像或视口中显示的ID,而不是历史记录中显示的ID。不要轻易使用stop()。请记住,图像只显示了页面的一部分。如果找不到答案,请尝试使用scroll_up()和scroll_down()等功能,以查看网页的完整内容,因为关键步骤可能隐藏在页面下方。如果网页需要人工验证,请避免处理它。请使用back()返回上一页,并尝试其他方法。如果尝试了所有方法仍然无法解决问题,请停止模拟,并报告遇到的问题。仔细检查历史操作,确保自己没有重复执行相同的操作。在处理维基百科修订历史相关任务时,需要灵活思考解决方案。 首先,将单页显示的浏览历史调整到最大,然后使用find_text_on_page函数。这个功能非常有用,可以快速定位你要查找的文本,并跳过大量无关信息。灵活使用交互元素,例如下拉选择栏,以筛选出你需要的信息。有时候,它们会非常有帮助。 """ ここで、{task_prompt} は、私たちが提供した元のタスク入力です:「国際女性デー (3 月 8 日) に小紅書で母にふさわしい贈り物を探すのを手伝ってください」。 {detailed_plan_prompt} は planning_agent によって生成され、{AVAILABLE_ACTIONS_PROMPT} は web_agent が使用できるメソッドのリストを定義します。 WebToolkitのブラウザ制御メソッドは、主にPlaywrightライブラリを通じて実装されています。owlでは、主に以下のメソッドが実装されています。 - 1. fill_input_id(identifier: Union[str, int], text: str): 入力ボックス(検索ボックスなど)に指定されたテキストを入力し、Enter キーを押します。
- 2. click_id(identifier: Union[str, int]): 指定されたIDを持つ要素をクリックします。
- 3. hover_id(identifier: Union[str, int]): 指定されたIDの要素の上にマウスを移動します。
- 4. `download_file_id(identifier: Union[str, int])`: 指定されたIDのファイルをダウンロードします。ダウンロードしたファイルへのパスを返します。ファイルのダウンロードに成功した場合は、シミュレーションを停止し、ダウンロードしたファイルへのパスをレポートして、以降の処理に使用できます。
- 5. scroll_to_bottom(): ページの一番下までスクロールします。
- 6. scroll_to_top(): ページの先頭までスクロールします。
- 7. scroll_up(): ページを上にスクロールします。現在のビューポートより上にある要素を表示したい場合に便利です。
- 8. `scroll_down()`: ページを下にスクロールします。現在のビューポートより下の要素を表示したい場合に便利です。ページが変化しない場合は、ページが下までスクロールしたことを意味します。
- 9. `back()`: 前のページに戻ります。現在のページが不要になった場合などに便利です。
- 10. stop(): タスクが完了したか失敗した(応答が見つからない)ため、操作を停止します。この場合、出力に応答を指定する必要があります。
- 11. get_url(): 現在のページの URL を取得します。
- 12. `find_text_on_page(search_text: str)`: 現在のページ上で指定された次のテキストを検索し、ページをスクロールして目的のテキストを表示します。これはCtrl + Fキーを押してテキストを検索するのと同じ動作で、現在のページに特定のテキストが含まれているかどうかを素早く確認したい場合に非常に便利です。
- 13. visit_page(url: str): 特定のURLページにアクセスします。
- 14. `click_blank_area()`: ページの空白領域をクリックすると、現在選択されている要素からフォーカスが外れます。これは、要素をクリックしてもフォーカスが自動的に外れない場合(メニューバーなど)、更新されたウェブページを自動的にレンダリングできるようにするために便利です。
- 15. ask_question_about_video(question: str): YouTube ウェブサイトなど、ビデオを含む現在のウェブページについて質問します。
`{self.history_window}` のデフォルト値は 5 です。これは、Web エージェントが処理を続行する前に、最新のアクションを動的に考慮することを意味します。プロンプトでは、Web エージェントが構造化された出力を使用することが求められます。 {{"observation": [IMAGE_DESCRIPTION], "reasoning": [YOUR_REASONING], "action_code": `fill_input_id([ID], [TEXT])` }} web_agent が出力されると、WebToolkit が出力を解析し、`_act` が action_code を実行します。その後の `_act` アクションのほとんどは、Playwright ライブラリを使用して実行されます。Playwright は、Microsoft が開発したオープンソースのブラウザ自動化ツールで、以下の機能を備えています。 - クロスブラウザサポート: Chromium、Firefox、WebKit をサポート
- モダンAPI: 簡潔で強力なAPIを提供します
- マルチタブとフレームのサポート: 複雑な Web ページ構造を処理できます。
- モバイルデバイスのエミュレーション: モバイルデバイスのエミュレーションをサポート
つまり、Playwright は、さまざまなユーザー操作をシミュレートできる完全なキーボードとマウスの API を提供します。 この場合、web_agentはまずclick_idメソッド(クリック)を使用します。次のマーカーは130です。ご覧のとおり、web_agentはログインページが原因で検索の次のステップに進めないことを検出し、まずこのウィンドウを閉じます。つまり、要素番号130をクリックします。 邪魔なウィンドウを閉じると、WebToolkit が現在のページのスクリーンショットを再度撮影し、注釈を付けたことがわかります。 当社の Web エージェントもアクションを再設計し、fill_input_id(137, "3.8 Goddess Day Gift for Mom") を使用して、入力ボックス (検索ボックスなど) に指定されたテキストを入力して Enter キーを押すことで検索機能を完了します。 しかし、この最後のケースは実際には失敗しました。鋭い観察力を持つ人なら、137番が検索ボックスではなく検索ボタンであることに気付いたかもしれません。検索ボックスの背景は青緑色でしたが、137番で覆われていたため、タスクは失敗しました。OWLチームは今後、「マークの設定」メソッドを最適化し、コマンドラインWeb検索とドキュメント抽出を組み合わせることで、プロセス全体をより堅牢なものにする予定です。 別のケースを試してみましょう。「GitHubでCMAELチームが開発したOASISプロジェクトを見つけるのを手伝ってください。そして、このプロジェクトについて簡単に説明してください。」全体のプロセスはかなり長いので、ここではいくつか抜粋します。 <iframe class="video_iframe rich_pages" data-src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3891259024511074312" data-mpvid="wxv_3891259024511074312" data-vidtype="2" data-cover="http%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FvI9nYe94fsFwYIfY6tkfTkjtdKz7WWts BN5y45bAAgktEJPwNt6AHhw41RJMwFKicGBRNm7c1myIsia0tY8rQib3A%2F0%3Fwx_fmt%3Djpeg"></iframe> ご覧のとおり、OWL は単独でウェブページ全体を閲覧しています。今回は、OWL はタスク全体を正常に完了し、レポートを生成しました。 左の画像はプロセスのスクリーンショットで、右の画像は最終レポートです。 別のケースを見てみましょう。今回は、OWLを使って長沙での3日間の旅行プランを作成したいとします。 <iframe class="video_iframe rich_pages" data-src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3891264789716140033" data-mpvid="wxv_3891264789716140033" data-vidtype="2" data-cover="http%3A%2F%2Fmmbiz.qpic.cn%2Fsz_mmbiz_jpg%2FvI9nYe94fsFwYIfY6tkfTkjtdKz7WWt soloBEv2vB1AfgVfrSCbCJhnhw2QlibLlgBia1wRkL3boqRQF6qtjVI8Q%2F0%3Fwx_fmt%3Djpeg"></iframe> 今回は、OWLはWebToolkitを使用せず、異なるプロセスに従っていることがわかります。Google Search APIを使用して6件の結果を取得し、そのうち3件を除外しました。 予備調査 結果のフィルタリング 十分な数の検索結果が取得されると、そのURLはDocumentProcessingToolkitに渡され、処理されます。このツールキットには、FirecrawlやChunkrなどのURLのコンテンツを解析できる処理ツールが統合されています。 最後に、プロセス全体を最終的な旅行ガイドにまとめます。 長沙で勉強した私にとって、このガイドは非常に役に立ちました。 経験複数のケースでの実世界テストを通じて、OWLは驚くほど優れたマルチモーダル処理能力とエージェント連携メカニズムを発揮しました。特に、邪魔になるページを自律的に閉じる機能は実に刺激的でした。その後、Manusで同じ状況を経験したところ、特定のウェブサイトで検索するように指示したにもかかわらず、Manusはすぐにインターフェースを終了し、別の方法を使ってしまいました。 OWLは、ニーズに基づいてタスクを完了するための最速の方法を自動的に決定します。全体的なプロセスには、多くの想像力を掻き立てる余地があります。例えば、将来的には画像アノテーションタスクにおいて人間の作業を代替し、大幅な人件費を削減できるかもしれません。 WebToolkitの実装も非常に独創的です。2つのエージェント間の連携メカニズムが実装されています。「戦略」レベルを担当し、全体的な計画を提供するPlanningAgentと、「戦術」レベルを担当し、具体的な操作を実行するWebAgentです。この連携プロセス全体は、人間の脳がまず考え、次に指示を出し、そして身体がそれを実行するというプロセスと非常に似ています。 しかし、場合によっては、APIを直接使用してタスクを完了する方が、WebToolkitを使用するよりもはるかに高速であることがわかります。WebToolkitの利点は、より多くの機能(オープンインターフェースを持たないWebサイトの操作など)を備えており、マルチモーダル操作のサポートが充実している点です。 OWLのもう一つの強みは、検索ツール、文書処理ツール、ビデオ、画像、音声理解ツールなど、様々なツールキットとの優れた統合性と適応性です。これにより、OWLは幅広い状況に対応できます。 ユーザーガイドここまで読んで、皆さんもぜひOWLを試してみたくなったのではないでしょうか。以下では、必要な環境の設定手順をご紹介します。 まず、owl ソースコードをダウンロードして設定し、環境をセットアップします。 git clone https://github.com/camel-ai/owl.git cd owl 仮想環境の設定 使用Conda(推荐): conda create -n owl python=3.11 conda activate owl
使用venv(备用): python -m venv owl_env # Windows 系统owl_env\Scripts\activate # Unix 或MacOS 系统source owl_env/bin/activate
依存関係をインストールします: python -m pip install -r requirements.txt playwright install モデルの設定については、作者の設定を参照してください。使用するモデルはすべてQwenシリーズです。WebAgentは画像入力を受け付けるため、マルチモーダルモデルである必要があります。APIアプリケーションの詳細は以下をご覧ください。 クイックスタートガイド( QWEN_API_KEYを設定するだけ) from dotenv import load_dotenv from dotenv import load_dotenv 使用する API は、次の Web サイトでQWEN API キーを申請することで取得できます。 リンク: https://help.aliyun.com/zh/mo... 大規模なモデルをAPI経由で呼び出すには、APIキーが必要です。Qwenを例にすると、BailianプラットフォームからAPIキーを取得できます。 オプションモデル範囲 Alibaba Cloud Bailian モデル ライブラリ (https://bailian.console.aliyu...) で、Inference API を選択します。ライブラリ内の任意のモデルを選択できます。 次に、./owlディレクトリに.envファイルを作成します。.env_template(https://github.com/camel-ai/o..._template)を参考に、必要なキーを設定してください。最初のケースを簡単に体験したい場合は、QWEN_API_KEYのみを設定してください。より詳細な機能を体験したい場合は、QWEN_API_KEY、CHUNKR_API_KEY、FIRECRAWL_API_KEY、GOOGLE_API_KEY、SEARCH_ENGINE_IDを設定する必要があります(Google APIがない場合は、代わりにduckduckgoを使用できます。上記のクイック体験を参照してください)。 すべてが構成されたら、実行できます。 python run.py Datawhale マルチエージェントチュートリアル、CAMEL、OWL オープンソースアドレス: - チュートリアル リンク: https://github.com/datawhalec...
- CAMEL: https://github.com/camel-ai/c...
- フクロウ: https://github.com/camel-ai/owl
いいね!(3件のいいね!)↓ |