Upgrade to Pro — share decks privately, control downloads, hide ads and more …

OSSの実装を参考にBedrockエージェントを作る

 OSSの実装を参考にBedrockエージェントを作る

Bedrock Night オンライン 〜AWSで生成AIアプリ開発! 最新ナレッジ共有〜
https://jawsug.connpass.com/event/345497/

で発表した資料です。

moritalous

March 10, 2025
Tweet

More Decks by moritalous

Other Decks in Technology

Transcript

  1. 自己紹介 森田 和明 富士ソフト株式会社 主任 / フェロー(アーキテクト・エバンジェリスト) AWS Ambassador(2023~) AWS Top

    Engineer(2020~) AWS All Certifications Engineer(2024) AWS Community Builder(2024) 生成AIに限らず、AWS関係のアーキテクトとエバンジェリストを やってます。Java Webアプリ開発出身->新しいもの好き X / Qiita / GitHub : @moritalous 2 Nova Canvas & Nova Reelで作成
  2. Bedrockエージェントの2つのタイプ 7 ビルド済みエージェント(※) インラインエージェント ※正式名称がわからなかったので勝手に命名しました ビルド時 • マネージメントコンソールやAPIで実行 前に構築 •

    Action GroupsとInstructionを登 録 実行時 • Input Textだけを渡す ビルド時 • ビルド不要 実行時 • Action Groups、Instruction、 Input Textをパラメーターで渡して実 行
  3. Action Groupsの2つのタイプ 8 Lambda Return Control • Action Groupsの実行が必要なタイミン グでLambdaが呼び出される

    • Action Groupsの実行が必要なタイミン グでAPI呼び出し元に制御が返却される function: 虫取り網 param: カブトムシ function: 虫取り網 param: カブトムシ 使い道  処理時間が長い、GPUが必要  オンプレのデータにアクセス などなど
  4. インラインエージェント呼び出し(Action Groupなし) 11 import random import boto3 client = boto3.client("bedrock-agent-runtime",

    region_name="us-east-1") random_int = random.randint(1, 100000) session_id = f"session-id-{random_int}" foundation_model = "us.anthropic.claude-3-5-sonnet-20241022-v2:0" instruction = "あなたはとても優秀なAIエージェントです。ユーザーの質問に親身になって回答してください" input_text = "プログラムを学習しようと思ってるのですが、おすすめの方法を教えて下さい。" response = client.invoke_inline_agent( sessionId=session_id, foundationModel=foundation_model, instruction=instruction, inputText=input_text, ) for event in response["completion"]: if "chunk" in event: chunk = event["chunk"] print(chunk["bytes"].decode()) invoke_inline_agent API
  5. インラインエージェント呼び出し(Action Groupsあり) 12 def add(a: int, b: int) -> int:

    """Add two numbers.""" return a + b 1. 処理を行う関数を作成 2. 関数の内容をJSONで定義 { "actionGroupName": "add", "functionSchema": { "functions": [ { "name": "add", "parameters": {"a": {"type": "integer"}, "b": {"type": "integer"}}, } ] }, "actionGroupExecutor": {"customControl": "RETURN_CONTROL"}, } response = client.invoke_inline_agent( sessionId=session_id, foundationModel=foundation_model, actionGroups=action_groups_schema, instruction=instruction, inputText=input_text ) 3. invoke_inline_agent API呼び出し ←JSONを関数から自動生成する 方法を書きました いまから始めるBedrockエージェン ト:インライン実行とReturn Controlで爆速ローカル開発 https://qiita.com/moritalous/items/5 c12ca179fac7ca416c3
  6. オープンソースを参考にしてみよう 17 CrewAI https://github.com/crewAIInc/crewAI コンポーネント 主な特徴 クルー トップレベルの 組織 •

    AIエージェントチームを管理 • ワークフローを監督 • コラボレーションを確保 • 成果を提供 AIエージェント 専門的な チームメンバー • 特定の役割を持つ (リサーチャー、ライター) • 指定されたツールを使用 • タスクを委任可能 • 自律的な意思決定が可能 プロセス ワークフロー 管理システム • コラボレーションパターンを定義 • タスクの割り当てを制御 • インタラクションを管理 • 効率的な実行を確保 タスク 個々の作業 • 明確な目標を持つ • 特定のツールを使用 • より大きなプロセスに統合 • 実行可能な結果を生み出す
  7. タスク プロセス クルーといえば 18 船長エージェント 剣士エージェント 航海士エージェント コックエージェント 嘘つきエージェント 船医エージェント

    砂のやつをぶっ飛ばす 雷のやつをぶっ飛ばす 船長が砂を担当 コックがオカマを担当 Outcome 海賊王になる クルー
  8. CrewAI 19 CrewAIではエージェントとタスクをyamlで定義します # src/latest_ai_development/config/agents.yaml researcher: role: > {topic}に関するシニアデータ研究者 goal:

    > {topic}の最先端の開発を発見 backstory: > あなたは、{topic} の最新の動向を発見する才能に恵まれた熟練した 研究者です。最も関連性の高い情報を見つけ出し、それを明確かつ簡潔 に提示する能力で知られています。 reporting_analyst: role: > {topic}に関するレポートアナリスト goal: > データ分析と調査結果に基づいて{topic}の詳細なレポートを作成しま す backstory: > あなたは細部にまで目を配る、細心の注意を払うアナリストです。複雑 なデータを明確で簡潔なレポートに変換し、他の人があなたの提供する 情報を理解し、それに基づいて行動できるようにする能力で知られていま す。 # src/latest_ai_development/config/tasks.yaml research_task: description: > {topic} について徹底的に調査してください。現在の年は 2025 年なの で、興味深く関連性のある情報を見つけてください。 expected_output: > {topic} に関する最も関連性の高い情報を 10 個の箇条書きでまとめ たリスト agent: researcher reporting_task: description: > 取得したコンテキストを確認し、各トピックをレポートの完全なセクショ ンに拡張します。レポートが詳細であり、関連するすべての情報が含まれ ていることを確認します。 expected_output: > 主要なトピックと、それぞれに完全な情報セクションを含む完全なレ ポート。'```' なしのマークダウンとしてフォーマットします。 agent: reporting_analyst output_file: report.md エージェント タスク ・ロール ・ゴール ・バックストーリー ・タスク説明 ・期待するアウトプット
  9. CrewAIでLLMに送信されているプロンプト 20 You are AI LLMs Senior Data Researcher .

    You're a seasoned researcher with a knack for uncovering the latest developments in AI LLMs. Known for your ability to find the most relevant information and present it in a clear and concise manner. Your personal goal is: Uncover cutting-edge developments in AI LLMs To give my best complete final answer to the task respond using the exact following format: Thought: I now can give a great answer Final Answer: Your final answer must be the great and the most complete as possible, it must be outcome described. I MUST use these formats, my job depends on it! Current Task: Conduct a thorough research about AI LLMs Make sure you find any interesting and relevant information given the current year is 2024. This is the expected criteria for your final answer: A list with 10 bullet points of the most relevant information about AI LLMs you MUST return the actual complete content as the final answer, not a summary. Begin! This is VERY important to you, use the tools available and give your best Final Answer, your job depends on it! Thought: システムプロンプト ユーザープロンプト ロール バックストーリー ゴール タスク説明 期待するアウトプット ・ロール ・ゴール ・バックストーリー ・タスク説明 ・期待するアウトプット
  10. CrewAIを参考にしたBedrockエージェントのInstructionがこれだ! 22 あなたのロール: {role} {backstory} あなたのタスク: {description} あなたのゴール: {goal} 期待するアウトプット:

    {expected_output} Instruction role = "レポートアナリスト" goal = "データ分析と調査結果に基づいて詳細なレポートを作成します" backstory = "あなたは細部にまで目を配る、細心の注意を払うアナリストです。複雑なデー タを明確で簡潔なレポートに変換し、他の人があなたの提供する情報を理解し、それに基づいて 行動できるようにする能力で知られています。" description = "取得したコンテキストを確認し、各トピックをレポートの完全なセクションに 拡張します。レポートが詳細であり、関連するすべての情報が含まれていることを確認します。" expected_output = "主要なトピックと、それぞれに完全な情報セクションを含む完全なレ ポート。'```' なしのマークダウンとしてフォーマットします。" input_text = "iPhone 16eとiPhone 16について調査して"
  11. 「サブエージェント」Action Groups 28 def call_sub_agent( role: str, goal: str, backstory:

    str, task_description_and_expected_output: str, input_text: str ): '''与えられたタスクを実行するAIエージェントです。以下のInstructionでエージェントを呼び出します。 ```python instruction = f"""あなたのロール: {role} {backstory} あなたのタスクと期待するアウトプット: {task_description_and_expected_output} あなたのゴール: {goal}""" input_text = "{input_text}" client.invoke_inline_agent( sessionId=session_id, foundationModel=foundation_model, actionGroups=[generate_function_schema(action) for action in action_groups], instruction=instruction, inputText=input_text, enableTrace=enableTrace, ) ''' random_int = random.randint(1, 100000) session_id = f"session-id-{random_int}" foundation_model = "us.amazon.nova-lite-v1:0" action_groups = [web_search] instruction = instruction = f"""あなたのロール: {role} {backstory} あなたのタスクと期待するアウトプット: {task_description_and_expected_output} あなたのゴール: {goal} """ answer = invoke( session_id, foundation_model, action_groups, instruction, input_text, enableTrace, ) return answer ロールなどをパラメー ターで受け取る Instructionは先程 紹介したもの Action Groupの説明として 「この関数で呼ぶよ」と宣言して みた
  12. Bedrockエージェントを作るBedrockエージェント を実行 31 3月に2泊2日 で旅行に行く ならどこがい いかな? role: 季節に詳しい旅行アドバイザー backstory: あなたは日本の気候や季節の特徴を熟知している旅行アドバイザーです。各地域の3

    月の気候や見どころについて詳しい知識を持っています。 goal: 3月の気候や季節性を考慮した、最適な旅行先を提案すること task_description_and_expected_output: 3月の日本国内の旅行先として適している場所 を、気候や季節の特徴を踏まえて3つ程度提案してください。各提案には、その時期に選ぶべき理由 も含めてください。 input_text: 3月の2泊3日の旅行先を探しています。気候や季節を考慮して、おすすめの場所を教 えてください。 role: 旅行プランナー backstory: あなたは旅行プランナーとして、予算や時間を考慮した効率的な旅程作成のエキス パートです。2泊3日の旅行プランを立てることを得意としています。 goal: 2泊3日で効率よく観光できる旅行先を提案すること task_description_and_expected_output: 2泊3日で効率的に観光できる場所を、交通アク セスや観光スポットの配置を考慮して提案してください。具体的な移動時間や観光スポットの組み合 わせも含めて説明してください。 input_text: 2泊3日の旅行先を探しています。効率的に観光できる場所を教えてください。 role: ローカルガイド backstory: あなたは各地域の観光名所や穴場スポット、グルメ情報に詳しいローカルガイドです。 現地でしか味わえない体験や、その時期ならではの楽しみ方を知っています。 goal: 3月に訪れるべき観光スポットや体験を提案すること task_description_and_expected_output: 3月に訪れるべき観光スポットや体験を、地域の 特色や季節性を考慮して提案してください。観光名所だけでなく、地元の人しか知らないような穴 場スポットも含めて紹介してください。 input_text: 3月の2泊3日旅行で、おすすめの観光スポットや体験を教えてください。 ① ② ③ サブエージェントが3回呼び出された!
  13. Bedrockエージェントを作るBedrockエージェント を実行 32 3月に2泊2日 で旅行に行く ならどこがい いかな? 3月の2泊3日旅行には、以下の3つの目的地がおすすめです: 1. 京都 -

    桜の開花時期と重なり、観光名所と春の風情を同時に楽しめます - 市内の観光地が比較的まとまっているため、2泊3日で効率的に観光可能 - 清水寺、哲学の道など、春の訪れを感じられる名所が充実 2. 長崎 - 3月は気候が安定しており、快適に観光できます - コンパクトな街なので、主要観光地を効率的に巡れます - グラバー園や出島など、歴史的建造物と春の花々を同時に楽しめます 3. 沖縄本島 - 3月は気温が20度前後で過ごしやすい - 美ら海水族館や首里城など、雨天でも楽しめるスポットが充実 - マリンアクティビティやビーチなど、春先から楽しめる南国リゾート ※予算や好みの観光スタイルに応じて、より詳細なプランをご提案できます。
  14. まとめ 34 • BedrockのインラインエージェントとReturn Controlを組み合わせるとマ ネコンを使わずにBedrockエージェントが利用可能 ◦ デプロイ作業が不要なので試行錯誤がとてもしやすい • エージェントのInstructionはCrewAIの実装が参考になる

    ◦ 「処理のフロー(ワークフロー)」を設計するのではなく、「誰に何をさせるか」を設計する • LLMの選択でエージェントの動作がかなり変わる ◦ やはり3.5 Sonnetがいい感じ。 (3.7 Sonnetはまだ未対応かも?Novaはもう一歩という感覚)