Slide 1

Slide 1 text

OSSの実装を参考にBedrockエージェントを作る Bedrockエージェントを作る 3/10 Bedrock Night オンライン 〜AWSで生成AIアプリ開発! 最新ナレッジ共有〜 @moritalous

Slide 2

Slide 2 text

自己紹介 森田 和明 富士ソフト株式会社 主任 / フェロー(アーキテクト・エバンジェリスト) 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で作成

Slide 3

Slide 3 text

3 Bedrockの入門書を執筆しました!!

Slide 4

Slide 4 text

Bedrockエージェントとは 4

Slide 5

Slide 5 text

Bedrockエージェントとは 5 七つ五つ道具 私はエージェント 犯罪以外は何でもするぜ なぜか子どもに好かれるぜ カブトムシ つかまえて~~

Slide 6

Slide 6 text

Bedrockエージェントとは 6 七つ五つ道具 私はエージェント 犯罪以外は何でもするぜ なぜか子どもに好かれるぜ カブトムシ つかまえて~~ Bedrockエージェント Action Groups Instruction Input Text

Slide 7

Slide 7 text

Bedrockエージェントの2つのタイプ 7 ビルド済みエージェント(※) インラインエージェント ※正式名称がわからなかったので勝手に命名しました ビルド時 ● マネージメントコンソールやAPIで実行 前に構築 ● Action GroupsとInstructionを登 録 実行時 ● Input Textだけを渡す ビルド時 ● ビルド不要 実行時 ● Action Groups、Instruction、 Input Textをパラメーターで渡して実 行

Slide 8

Slide 8 text

Action Groupsの2つのタイプ 8 Lambda Return Control ● Action Groupsの実行が必要なタイミン グでLambdaが呼び出される ● Action Groupsの実行が必要なタイミン グでAPI呼び出し元に制御が返却される function: 虫取り網 param: カブトムシ function: 虫取り網 param: カブトムシ 使い道  処理時間が長い、GPUが必要  オンプレのデータにアクセス などなど

Slide 9

Slide 9 text

インラインエージェントとReturn Controlを組み 合わせる 9 ● エージェントの事前定義なし ● Lambdaのデプロイ不要 ローカル環境でBedrockエージェントの開発ができる

Slide 10

Slide 10 text

インラインエージェント呼び出し 10

Slide 11

Slide 11 text

インラインエージェント呼び出し(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

Slide 12

Slide 12 text

インラインエージェント呼び出し(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

Slide 13

Slide 13 text

インラインエージェント呼び出し(Action Groupあり) 13 4. Return Controlの制御を行う →詳細なフローとコピペして使えるコードを解説 しています いまから始めるBedrockエージェント:インライン実 行とReturn Controlで爆速ローカル開発 https://qiita.com/moritalous/items/5c12ca179fac7 ca416c3

Slide 14

Slide 14 text

さて、 14

Slide 15

Slide 15 text

Instruction考えるのむずない? 15

Slide 16

Slide 16 text

オープンソースを参考にする 16

Slide 17

Slide 17 text

オープンソースを参考にしてみよう 17 CrewAI https://github.com/crewAIInc/crewAI コンポーネント 主な特徴 クルー トップレベルの 組織 ● AIエージェントチームを管理 ● ワークフローを監督 ● コラボレーションを確保 ● 成果を提供 AIエージェント 専門的な チームメンバー ● 特定の役割を持つ (リサーチャー、ライター) ● 指定されたツールを使用 ● タスクを委任可能 ● 自律的な意思決定が可能 プロセス ワークフロー 管理システム ● コラボレーションパターンを定義 ● タスクの割り当てを制御 ● インタラクションを管理 ● 効率的な実行を確保 タスク 個々の作業 ● 明確な目標を持つ ● 特定のツールを使用 ● より大きなプロセスに統合 ● 実行可能な結果を生み出す

Slide 18

Slide 18 text

タスク プロセス クルーといえば 18 船長エージェント 剣士エージェント 航海士エージェント コックエージェント 嘘つきエージェント 船医エージェント 砂のやつをぶっ飛ばす 雷のやつをぶっ飛ばす 船長が砂を担当 コックがオカマを担当 Outcome 海賊王になる クルー

Slide 19

Slide 19 text

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 エージェント タスク ・ロール ・ゴール ・バックストーリー ・タスク説明 ・期待するアウトプット

Slide 20

Slide 20 text

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: システムプロンプト ユーザープロンプト ロール バックストーリー ゴール タスク説明 期待するアウトプット ・ロール ・ゴール ・バックストーリー ・タスク説明 ・期待するアウトプット

Slide 21

Slide 21 text

CrewAIを参考にBedrockエージェ ントを作る 21

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

以上。。。 ?? 23

Slide 24

Slide 24 text

ロールとかバックストー リーとか考えるのめんど くさい

Slide 25

Slide 25 text

ということで、 25

Slide 26

Slide 26 text

OSSの実装を参考にBedrockエージェントを作る Bedrockエージェントを作る 3/10 Bedrock Night オンライン 〜AWSで生成AIアプリ開発! 最新ナレッジ共有〜 @moritalous

Slide 27

Slide 27 text

サブエージェント input_textから必要なInstructionを構築するエージェントが、サブエージェントを生成 27 XXXX~ ロール バックストーリー タスク説明 ゴール 期待するアウトプット

Slide 28

Slide 28 text

「サブエージェント」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の説明として 「この関数で呼ぶよ」と宣言して みた

Slide 29

Slide 29 text

親エージェントのInstruction 29 サブエージェントを呼び出し、ユーザーの要求に回答し てください。多角的に検討した結果を返答するため、サ ブエージェントは2回以上呼び出してください。

Slide 30

Slide 30 text

動かしてみた 30

Slide 31

Slide 31 text

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回呼び出された!

Slide 32

Slide 32 text

Bedrockエージェントを作るBedrockエージェント を実行 32 3月に2泊2日 で旅行に行く ならどこがい いかな? 3月の2泊3日旅行には、以下の3つの目的地がおすすめです: 1. 京都 - 桜の開花時期と重なり、観光名所と春の風情を同時に楽しめます - 市内の観光地が比較的まとまっているため、2泊3日で効率的に観光可能 - 清水寺、哲学の道など、春の訪れを感じられる名所が充実 2. 長崎 - 3月は気候が安定しており、快適に観光できます - コンパクトな街なので、主要観光地を効率的に巡れます - グラバー園や出島など、歴史的建造物と春の花々を同時に楽しめます 3. 沖縄本島 - 3月は気温が20度前後で過ごしやすい - 美ら海水族館や首里城など、雨天でも楽しめるスポットが充実 - マリンアクティビティやビーチなど、春先から楽しめる南国リゾート ※予算や好みの観光スタイルに応じて、より詳細なプランをご提案できます。

Slide 33

Slide 33 text

まとめ 33

Slide 34

Slide 34 text

まとめ 34 ● BedrockのインラインエージェントとReturn Controlを組み合わせるとマ ネコンを使わずにBedrockエージェントが利用可能 ○ デプロイ作業が不要なので試行錯誤がとてもしやすい ● エージェントのInstructionはCrewAIの実装が参考になる ○ 「処理のフロー(ワークフロー)」を設計するのではなく、「誰に何をさせるか」を設計する ● LLMの選択でエージェントの動作がかなり変わる ○ やはり3.5 Sonnetがいい感じ。 (3.7 Sonnetはまだ未対応かも?Novaはもう一歩という感覚)