Closed14

LLMエージェント&ワークフロー向けフレームワーク「griptape」を試す

kun432kun432

公式

https://www.griptape.ai/

GitHub

https://github.com/griptape-ai/griptape

griptape

Griptapeは、企業のデータやAPIに安全に接続するAI搭載アプリケーションを構築するためのモジュール式Pythonフレームワークである。Griptapeは、開発者がすべてのステップでコントロールと柔軟性を維持する能力を提供する。

🛠️ コアコンポーネント

🏗️構造

  • 🤖エージェントは、単一のタスクで構成される。
  • 🔄パイプラインは、あるタスクからの出力が次のタスクに流れるように、一連のタスクを編成する。
  • 🌐ワークフローは、タスクが並行して動作するように構成する。

📝タスク

タスクは、構造の中核となる構成要素で、エンジン、ツール、その他のGriptapeコンポーネントとの相互作用を可能にする。

🔧ツール

ツールはLLMがデータやサービスと相互作用するための機能を提供する。Griptapeには様々なビルトインツールがあり、カスタムツールも簡単に作成できる。

🧠メモリー

  • 💬会話メモリは、LLMがインタラクションを越えて情報を保持し、取り出すことを可能にする。
  • 🗃️タスクメモリは、LLM に送信されるプロンプトから、大きな、あるいは機密性の高 いタスク出力を除外する。
  • 📊メタメモリは、LLMに追加のメタデータを渡すことを可能にし、インタラクションのコンテキストと関連性を高める。

🚗ドライバー

ドライバーは外部のリソースやサービスとのやりとりを容易にする:

  • 🗣️プロンプトドライバーは、LLMとのテキストインタラクションを管理する。
  • 🔢埋め込みドライバーは、テキスト入力からベクトル埋め込みを生成する。
  • 💾ベクトルストアドライバーは、埋め込み値の保存と検索を管理する。
  • 🎨画像生成 ドライバーは、テキスト記述から画像を生成する。
  • 画像クエリドライバーは、テキストクエリから画像をクエリする。
  • 💼SQLドライバーは、SQLデータベースと対話する。
  • 🌐ウェブスクレーパードライバーは、ウェブページから情報を抽出する。
  • 🧠会話記憶ドライバーは、会話データの記憶と検索を管理する。

🚂エンジン

エンジンはドライバーをラップし、ユースケースに特化した機能を提供する:

  • 📊クエリエンジンは、RAG(Retrieval Augmented Generation)クエリを実行する。
  • 🛠️抽出エンジンは、 構造化されていないテキストからJSONまたはCSVデータを抽出する。
  • 📝要約エンジンは、テキストコンテンツから要約を生成する。
  • 🖼️** 画像生成 エンジン**は、テキスト記述から画像を生成する。
  • 画像クエリエンジンは、テキストプロンプトに基づいて画像をクエリする。

📦追加コンポーネント

  • 📐ルールセットは、最小限のプロンプトエンジニアリングでLLMの動作を制御する。
  • 🔄ローダーは、様々なソースからデータをロードする。
  • 🏺アーティファクトは、Griptapeコンポーネント間で異なるタイプのデータを渡すことができる。
  • ✂️チャンカーは、多様なテキストタイプに合わせてテキストを管理しやすい断片に分割する。
  • 🔢トークナイザーは、LLMのトークン制限を超えないようにテキスト内のトークン数をカウントする。

Star History Chart

ドキュメント

https://docs.griptape.ai/stable/

kun432kun432

https://docs.griptape.ai/stable/griptape-framework/

概要

Griptapeフレームワークは、予測可能性創造性という2つの次元で動作するAIシステムを開発する能力を開発者に提供する。

予測可能性を高めるため、Griptapeはシーケンシャルなパイプライン、DAGベースのワークフロー、長期記憶といった構造を強制する。創造性を促進するために、GriptapeはLLMにツールや外部APIやデータストアに接続する短期記憶を安全に促す。このフレームワークにより、開発者はユースケースに応じてこれら2つの次元を容易に行き来することができる。

Griptapeは開発者がLLMの潜在能力を活用するのを助けるだけでなく、信頼境界、スキーマ検証、ツールのアクティビティレベルのパーミッションを強制する。そうすることで、GriptapeはLLMの能力に関する厳格なポリシーを守りながら、LLMの推論を最大限に引き出す。

Griptapeの設計思想は以下の信条に基づいている:

  • モジュール性とコンポーザビリティ: すべてのフレームワークのプリミティブは、それ自体で有用で使用可能であり、さらに互いに簡単にプラグインできる。
  • テクノロジーにとらわれない: Griptapeはドライバを抽象化することで、どのようなLLM、データストア、バックエンドでも動作するように設計されている。
  • デフォルトでデータをプロンプトから外す: ローダーやツールを使ってデータを扱う際、Griptapeはデフォルトでプロンプトを表示しないようにすることで、ビッグデータを安全かつ低レイテンシーで扱うことを容易にしている。
  • 最小限のプロンプト・エンジニアリング: 自然言語ではなくPythonで書かれたコードを推論する方がはるかに簡単だ。Griptapeは、どうしても必要な場合を除き、ほとんどの場合Pythonをデフォルトにすることを目指している。

ということでQuickstartをやってみる。Colaboratoryで。

パッケージインストール。今回extrasは全てを選択しているが、実運用においては必要なものをチョイスするほうが良いと思う。

!pip install "griptape[all]"

OpenAIのAPIキーをセット

import os
from google.colab import userdata

os.environ["OPENAI_API_KEY"] = userdata.get('OPENAI_API_KEY')

ではgriptapeでコードを書いていく。griptapeではstructure(構造化コンポーネントといえばいいのかな)を作って、これを実行する。structureにはAgentPipelineWorkflowなどがあり、それぞれ異なる種類のタスクにより構成される。

まずシンプルなエージェントを作成してみる。エージェントは1つのタスクしか実行できないという制約があるらしい。

from griptape.structures import Agent
from griptape.utils import Chat

agent = Agent()
Chat(agent).start()

これを実行すると、セル内でチャットができる。どうでもいいけど、日本語の場合IMEの変換が送信になってしまうのよな・・・・

こんな感じでやり取りできる。

User: 日本の総理大臣は誰?
Thinking...
[06/12/24 14:36:33] INFO     PromptTask 45187c0cb8234fc899e1db6408713003                                           
                             Input: 日本の総理大臣は誰?                                                           
[06/12/24 14:36:40] INFO     PromptTask 45187c0cb8234fc899e1db6408713003                                           
                             Output:                                                                               
                             私の知識は2023年10月までの情報に基づいていますが、その時点での日本の総理大臣は岸田文雄
                             (きしだ                                                                              
                             ふみお)です。最新の情報については、ニュースや公式の政府ウェブサイトなどで確認してくだ
                             さい。                                                                                
Assistant: 私の知識は2023年10月までの情報に基づいていますが、その時点での日本の総理大臣は岸田文雄(きしだ ふみお)です。最新の情報については、ニュースや公式の政府ウェブサイトなどで確認してください。

チャットインタフェースを使用せずに、プロンプトを与えて実行することもできる。

from griptape.structures import Agent

agent = Agent()
agent.run("大規模言語モデルについての俳句を一句生成してください。")
[06/12/24 14:47:05] INFO     PromptTask ae73c140dd7f4267bab6b01a861b5607                                           
                             Input: 大規模言語モデルについての俳句を一句生成してください。                         
[06/12/24 14:47:06] INFO     PromptTask ae73c140dd7f4267bab6b01a861b5607                                           
                             Output: 無限の語                                                                      
                             知恵の海原                                                                            
                             言葉咲く

なおこの場合レスポンスの中身が結構な量で出力される。回答となる文字列だけ取り出したいのだけど、どうすればいいのかなー。まあとりあえず進める。
あと、出力を見ている感じ、LLMはgpt-4oがデフォルト、まだ使ってはいないけどembeddingはtext-embedding-3-smallがデフォルトっぽい。

エージェントにツールを与える。griptapeではあらかじめいくつかのツールが用意されている様子。今回はCalculatorという計算を行うツールを与えてみる。

from griptape.structures import Agent
from griptape.tools import Calculator

calculator = Calculator(off_prompt=False)

agent = Agent(
   tools=[calculator]
)

agent.run(
    "(44232 + 13312 / (232 - 32)) * 5 は?"
)
[06/12/24 15:00:08] INFO     ToolkitTask 3722104a5ccc41268fe62398e8fee9dd                                          
                             Input: (44232 + 13312 / (232 - 32)) * 5 は?                                          
[06/12/24 15:00:11] INFO     Subtask 93fe85dad8864a42803ba6868e177587                                              
                             Thought: I need to calculate the expression step-by-step. First, I will evaluate the  
                             division inside the parentheses, then the addition, and finally the multiplication.   
                                                                                                                   
                             Actions:                                                                              
                             ```json                                                                               
                             [                                                                                     
                                 {                                                                                 
                                     "name": "Calculator",                                                         
                                     "path": "calculate",                                                          
                                     "input": {                                                                    
                                         "values": {                                                               
                                             "expression": "13312 / (232 - 32)"                                    
                                         }                                                                         
                                     },                                                                            
                                     "tag": "division"                                                             
                                 }                                                                                 
                             ]                                                                                     
                             ```                                                                                   
                    INFO     Subtask 93fe85dad8864a42803ba6868e177587                                              
                             Response: 66.56                                                                       
[06/12/24 15:00:13] INFO     Subtask 1be5abac3e8e4458a2177030c5712d56                                              
                             Thought: Now that I have the result of the division, I will add it to 44232 and then  
                             multiply the result by 5.                                                             
                             Actions: [{"tag": "addition", "name": "Calculator", "path": "calculate", "input":     
                             {"values": {"expression": "44232 + 66.56"}}}]                                         
                    INFO     Subtask 1be5abac3e8e4458a2177030c5712d56                                              
                             Response: 44298.56                                                                    
[06/12/24 15:00:15] INFO     Subtask b3448462c0fc489d8c49a449cb6c23d2                                              
                             Thought: Now, I will multiply the result of the addition by 5 to get the final answer.
                             Actions: [{"tag": "multiplication", "name": "Calculator", "path": "calculate",        
                             "input": {"values": {"expression": "44298.56 * 5"}}}]                                 
                    INFO     Subtask b3448462c0fc489d8c49a449cb6c23d2                                              
                             Response: 221492.8                                                                    
[06/12/24 15:00:18] INFO     ToolkitTask 3722104a5ccc41268fe62398e8fee9dd                                          
                             Output: (44232 + 13312 / (232 - 32)) * 5 = 221492.8
kun432kun432

1つのタスクしか実行できないエージェントに対し、複数のタスクをシーケンシャルに処理できるのがパイプライン。

from griptape.memory.structure import ConversationMemory
from griptape.structures import Pipeline
from griptape.tasks import ToolkitTask, PromptTask
from griptape.tools import WebScraper, FileManager, TaskMemoryClient


pipeline = Pipeline(
    conversation_memory=ConversationMemory()
)

pipeline.add_tasks(
    # `pipeline.run`の1つ目の引数を受け取って処理するタスク
    ToolkitTask(
        "{{ args[0] }}",
        # Webスクレイピングとファイル操作のツールを与える
        tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)]
    ),
    # 前段のタスクの出力を、入力引数として受け取って処理する
    PromptTask(
        "次の文章を大阪弁で書き直してください: {{ parent_output }}"
    )
)

pipeline.run(
    "https://zenn.dev/kun432/books/ea7f9f2546e57811d263 の内容を読み込んで、要約を行い、その内容をsummarize.txtに保存してください。"
)
[06/12/24 15:22:30] INFO     ToolkitTask 01e01356bcf64b5b98540b333e67cfb7                                          
                             Input: https://zenn.dev/kun432/books/ea7f9f2546e57811d263                             
                             の内容を読み込んで、要約を行い、その内容をsummarize.txtに保存してください。           
[06/12/24 15:22:35] INFO     Subtask ba83ca6916a3487d836c14635e445239                                              
                             Thought: I need to load the content of the URL provided, summarize it, and then save  
                             the summary to a file named `summarize.txt`.                                          
                                                                                                                   
                             Actions:                                                                              
                             1. Use the WebScraper to get the content of the URL.                                  
                             2. Use the TaskMemoryClient to summarize the content.                                 
                             3. Use the FileManager to save the summary to `summarize.txt`.                        
                                                                                                                   
                             ```json                                                                               
                             [                                                                                     
                                 {                                                                                 
                                     "name": "WebScraper",                                                         
                                     "path": "get_content",                                                        
                                     "input": {                                                                    
                                         "values": {                                                               
                                             "url": "https://zenn.dev/kun432/books/ea7f9f2546e57811d263"           
                                         }                                                                         
                                     },                                                                            
                                     "tag": "scrape_content"                                                       
                                 }                                                                                 
                             ]                                                                                     
                             ```                                                                                   
                    INFO     Subtask ba83ca6916a3487d836c14635e445239                                              
                             Response: Vagrantでお手軽にKubernetesに触れてみよう                                   
                             無料で読める本                                                                        
                             Vagrantを使ってKubernetesを体験してみるためのハンズオンです。                         
                             Kubernetes自体の構築ではなく、Kubernetes上でアプリケーションを作成・公開するために、Ku
                             bernetesの主要なリソースおよびkubectlコマンドの使い方について説明しています。         
                             Chapters                                                                              
                             はじめに                                                                              
                             必要なもの                                                                            
                             Vagrantを使ったKubernetes環境の構築                                                   
                             Kubernetesに触れてみよう                                                              
                             Podを立ててみよう                                                                     
                             Podを公開してみよう                                                                   
                             Podを冗長化してみよう                                                                 
                             全部を組み合わせたアプリケーションを作ってみよう                                      
                             Author                                                                                
                             Topics                                                                                
[06/12/24 15:22:39] INFO     Subtask dc92ad483fe04ef790dc561b7226acbb                                              
                             Thought: The content of the URL has been successfully loaded. Now, I need to summarize
                             this content and save the summary to a file named `summarize.txt`.                    
                                                                                                                   
                             Actions:                                                                              
                             1. Summarize the content using the TaskMemoryClient.                                  
                             2. Save the summary to a file using the FileManager.                                  
                                                                                                                   
                             ```json                                                                               
                             [                                                                                     
                                 {                                                                                 
                                     "tag": "summarize_content",                                                   
                                     "name": "TaskMemoryClient",                                                   
                                     "path": "summarize",                                                          
                                     "input": {                                                                    
                                         "values": {                                                               
                                             "memory_name": "scrape_content",                                      
                                             "artifact_namespace": "default"                                       
                                         }                                                                         
                                     }                                                                             
                                 }                                                                                 
                             ]                                                                                     
                             ```                                                                                   
                    INFO     Subtask dc92ad483fe04ef790dc561b7226acbb                                              
                             Response: memory not found                                                            
[06/12/24 15:22:50] INFO     Subtask f03740e8f9244a9881dba6e58b6a9f8a                                              
                             Thought: It seems the content was not stored in memory. I will manually summarize the 
                             content and then save it to a file named `summarize.txt`.                             
                                                                                                                   
                             Summary:                                                                              
                             This book provides a hands-on guide to experiencing Kubernetes using Vagrant. It      
                             focuses on creating and deploying applications on Kubernetes rather than building     
                             Kubernetes itself. Key topics include the main Kubernetes resources and the use of    
                             kubectl commands. The chapters cover the following:                                   
                             1. Introduction                                                                       
                             2. Requirements                                                                       
                             3. Setting up a Kubernetes environment with Vagrant                                   
                             4. Exploring Kubernetes                                                               
                             5. Creating a Pod                                                                     
                             6. Exposing a Pod                                                                     
                             7. Making a Pod redundant                                                             
                             8. Building an application combining all components                                   
                                                                                                                   
                             Actions: [{"tag": "save_summary", "name": "FileManager", "path":                      
                             "save_content_to_file", "input": {"values": {"path": "summarize.txt", "content": "This
                             book provides a hands-on guide to experiencing Kubernetes using Vagrant. It focuses on
                             creating and deploying applications on Kubernetes rather than building Kubernetes     
                             itself. Key topics include the main Kubernetes resources and the use of kubectl       
                             commands. The chapters cover the following:\n1. Introduction\n2. Requirements\n3.     
                             Setting up a Kubernetes environment with Vagrant\n4. Exploring Kubernetes\n5. Creating
                             a Pod\n6. Exposing a Pod\n7. Making a Pod redundant\n8. Building an application       
                             combining all components."}}}]                                                        
                    INFO     Subtask f03740e8f9244a9881dba6e58b6a9f8a                                              
                             Response: Successfully saved file                                                     
[06/12/24 15:22:53] INFO     ToolkitTask 01e01356bcf64b5b98540b333e67cfb7                                          
                             Output: The content from the provided URL has been summarized and saved to a file     
                             named `summarize.txt`. The summary is as follows:                                     
                                                                                                                   
                             "This book provides a hands-on guide to experiencing Kubernetes using Vagrant. It     
                             focuses on creating and deploying applications on Kubernetes rather than building     
                             Kubernetes itself. Key topics include the main Kubernetes resources and the use of    
                             kubectl commands. The chapters cover the following:                                   
                             1. Introduction                                                                       
                             2. Requirements                                                                       
                             3. Setting up a Kubernetes environment with Vagrant                                   
                             4. Exploring Kubernetes                                                               
                             5. Creating a Pod                                                                     
                             6. Exposing a Pod                                                                     
                             7. Making a Pod redundant                                                             
                             8. Building an application combining all components."                                 
                    INFO     PromptTask 4e8b565eba1d49eb8cd8087acfdb5e90                                           
                             Input: 次の文章を大阪弁で書き直してください: The content from the provided URL has    
                             been summarized and saved to a file named `summarize.txt`. The summary is as follows: 
                                                                                                                   
                             "This book provides a hands-on guide to experiencing Kubernetes using Vagrant. It     
                             focuses on creating and deploying applications on Kubernetes rather than building     
                             Kubernetes itself. Key topics include the main Kubernetes resources and the use of    
                             kubectl commands. The chapters cover the following:                                   
                             1. Introduction                                                                       
                             2. Requirements                                                                       
                             3. Setting up a Kubernetes environment with Vagrant                                   
                             4. Exploring Kubernetes                                                               
                             5. Creating a Pod                                                                     
                             6. Exposing a Pod                                                                     
                             7. Making a Pod redundant                                                             
                             8. Building an application combining all components."                                 
[06/12/24 15:23:05] INFO     PromptTask 4e8b565eba1d49eb8cd8087acfdb5e90                                           
                             Output:                                                                               
                             提供されたURLの内容を要約して、`summarize.txt`というファイルに保存したで。要約は以下の
                             通りや:                                                                               
                                                                                                                   
                             「この本は、Vagrantを使ってKubernetesを体験するための実践ガイドやで。Kubernetes自体を 
                             構築するんやなくて、Kubernetes上でアプリケーションを作成してデプロイすることに焦点を当
                             てとる。主なトピックには、主要なKubernetesリソースとkubectlコマンドの使用が含まれとる 
                             。章は以下の内容をカバーしとるで:                                                     
                             1. はじめに                                                                           
                             2. 要件                                                                               
                             3. Vagrantを使ったKubernetes環境のセットアップ                                        
                             4. Kubernetesの探求                                                                   
                             5. Podの作成                                                                          
                             6. Podの公開                                                                          
                             7. Podの冗長化                                                                        
                             8. すべてのコンポーネントを組み合わせたアプリケーションの構築」  

ファイルにもちゃんと保存されていた。

kun432kun432

とりあえずQuick Startをやってみた感じ、とてもシンプル。コンポーネントの名前空間見ててもわかりやすいように思える。ただちょっとまだわからないところも多々ある。

とりあえずもう少し進めてみる。Structuresのところを順に見ていく。

Structures: Agents

https://docs.griptape.ai/stable/griptape-framework/structures/agents/

Agentsはgriptapeで最も手っ取り早い方法。

Agentはtoolsinput_templateを直接受けて、ToolKitTaskPromptTaskのどちらを使うかを判断する。toolsの場合はToolKitTaskを、toolsが提示されない場合は場合はPromptTask`を使う。

ToolKit Task Agent

from griptape.tools import Calculator
from griptape.structures import Agent


agent = Agent(
    input_template="次の文章を計算してください: {{ args[0] }}",
    tools=[Calculator()]
)

agent.run("2^10?")
[06/12/24 15:52:00] INFO     ToolkitTask feac9354e9894330863deb2ae953bd6e                                          
                             Input: 次の文章を計算してください: 2^10は?                                           
[06/12/24 15:52:01] INFO     Subtask 5b759aa3211445d2b4daccd52310ea62                                              
                             Thought: 2^10の計算を行います。これは2を10回掛け合わせることを意味します。            
                             Actions:                                                                              
                             [{"name":"Calculator","path":"calculate","input":{"values":{"expression":"2**10"}},"ta
                             g":"calculate_power"}]                                                                
                    INFO     Subtask 5b759aa3211445d2b4daccd52310ea62                                              
                             Response: 1024                                                                        
[06/12/24 15:52:02] INFO     ToolkitTask feac9354e9894330863deb2ae953bd6e                                          
                             Output: 2^10は1024です。

Prompt Task Agent

from griptape.structures import Agent
from griptape.tasks import PromptTask


agent = Agent()
agent.add_task(
    PromptTask(
        "{{ args[0] }} と {{ args[1] }} についての {{ creative_medium }} を生成してください。",
        context={
            'creative_medium': '俳句'
        }
    )
)

agent.run("スケートボード", "プログラミング")
[06/12/24 15:54:18] INFO     PromptTask 44767e089ca04a90b8966d7ecbfe0d44                                           
                             Input: スケートボード と プログラミング についての 俳句 を生成してください。          
                    INFO     PromptTask 44767e089ca04a90b8966d7ecbfe0d44                                           
                             Output: スケートボード                                                                
                             風切る音に乗り                                                                        
                             コード舞う        
kun432kun432

Structures: Pipeline

https://docs.griptape.ai/stable/griptape-framework/structures/pipelines/

上の方でも記載した通り、Agentは単一タスクのみ、Pipelineは複数タスクのシーケンシャルな実行になる。シーケンシャルな実行ということで先行タスクから後続タスクにはContextを通じて情報が共有される。

Contextにはbase contextという基本的なContextがまずある。これについては後ほどTaskのところで詳しく見るとして、ざっくりこんな感じ。

  • args: .run()メソッドで渡された引数のリスト。
  • structure: タスクが属しているstructureの名前?
  • ユーザ定義のcontext変数: 別途設定できるらしい。

上記に加えて、Pipelineの場合は以下が引き継がれる

  • parent_output: 先行するタスク(親タスクというらしい)の出力
  • parent: 先行するタスク(の名前?)
  • child: 後続のタスク(子タスクというらしい)(の名前?)

以下の例では、.runメソッドで渡されたbase contextであるargsを使ってそのまま文章を静止して、その出力結果をparent_outputというcontextとして、次のタスクに引き継いで、指示に対する入力として文章を生成している。

from griptape.tasks import PromptTask
from griptape.structures import Pipeline


pipeline = Pipeline()

pipeline.add_tasks(
    PromptTask("{{ args[0] }}"),
    PromptTask("次の文章を日本語のラップにして歌ってみてください: {{ parent_output }}")
)

pipeline.run("関西人になりきって、たこ焼きの素晴らしさを簡潔に語ってください。")
[06/12/24 16:14:11] INFO     PromptTask 42c5e476b87447b5a1fbb7f1e4a11cf8                                           
                             Input: 関西人になりきって、たこ焼きの素晴らしさを簡潔に語ってください。               
[06/12/24 16:14:13] INFO     PromptTask 42c5e476b87447b5a1fbb7f1e4a11cf8                                           
                             Output:                                                                               
                             おおきに!たこ焼きはな、関西のソウルフードやで。外はカリッ、中はトロッとした食感がたま
                             らんねん。ソースとマヨネーズ、青のりと鰹節が絶妙に絡み合って、口の中で幸せが広がるんや
                             。家族や友達と一緒に作って食べると、もっと美味しさが増すんやで。ほんま、たこ焼きは最高
                             や!                                                                                  
                    INFO     PromptTask 8564071aee5d49d3afaa5cc8cd4a34cb                                           
                             Input: 次の文章を日本語のラップにして歌ってみてください:                              
                             おおきに!たこ焼きはな、関西のソウルフードやで。外はカリッ、中はトロッとした食感がたま
                             らんねん。ソースとマヨネーズ、青のりと鰹節が絶妙に絡み合って、口の中で幸せが広がるんや
                             。家族や友達と一緒に作って食べると、もっと美味しさが増すんやで。ほんま、たこ焼きは最高
                             や!                                                                                  
[06/12/24 16:14:20] INFO     PromptTask 8564071aee5d49d3afaa5cc8cd4a34cb                                           
                             Output: Yo yo yo, おおきに!たこ焼きやで、関西のソウルフード、知ってるかい?          
                             外はカリッ、中はトロッ、食感がたまらん、ほんまに最高や!                              
                                                                                                                   
                             ソースとマヨネーズ、青のりと鰹節、                                                    
                             絶妙に絡み合って、口の中で広がる幸せ、感じてみ?                                      
                                                                                                                   
                             家族や友達と一緒に作って食べると、                                                    
                             もっと美味しさが増すんやで、ほんまにそうやで!                                        
                                                                                                                   
                             たこ焼き、たこ焼き、みんなでワイワイ、                                                
                             関西の味、みんなで楽しもうや!                                                        
                                                                                                                   
                             Yo, たこ焼きは最高や、ほんまに最高や!                                                
                             関西のソウルフード、みんなで食べようや! 
kun432kun432

レスポンス毎回でかいオブジェクト返ってくるのでシンプルに出力だけみたいなと思って調べてた。

from griptape.structures import Agent

agent = Agent()
response = agent.run("大規模言語モデルについての俳句を一句生成してください。")
print(type(response))
print(response.tasks[0].output)
[06/13/24 02:08:03] INFO     PromptTask b4cbf02f08cf498a8902a29ec857f650                                           
                             Input: 大規模言語モデルについての俳句を一句生成してください。                         
[06/13/24 02:08:04] INFO     PromptTask b4cbf02f08cf498a8902a29ec857f650                                           
                             Output: データの海                                                                    
                             知恵の波立つ                                                                          
                             言葉の花                                                                              
<class 'griptape.structures.agent.Agent'>
データの海  
知恵の波立つ  
言葉の花

なるほど、.run()の実行結果で返ってくるのは実行したstructureそのもので、その中に割り当てられたタスクが含まれていて、それを参照すればいいみたい。

上のはエージェントの例。パイプラインも同じ。

from griptape.tasks import PromptTask
from griptape.structures import Pipeline


pipeline = Pipeline()

pipeline.add_tasks(
    PromptTask("{{ args[0] }}"),
    PromptTask("次の文章を日本語のラップにして歌ってみてください: {{ parent_output }}")
)

response = pipeline.run("関西人になりきって、たこ焼きの素晴らしさを簡潔に語ってください。")
print(type(response))
print(response.tasks[0])
print(response.tasks[1])
[06/13/24 02:14:31] INFO     PromptTask f81da05da4594de88f86f06aee2c2ad9                                           
                             Input: 関西人になりきって、たこ焼きの素晴らしさを簡潔に語ってください。               
[06/13/24 02:14:34] INFO     PromptTask f81da05da4594de88f86f06aee2c2ad9                                           
                             Output:                                                                               
                             おおきに!たこ焼きっちゅうのは、ほんまに関西のソウルフードやで。外はカリッ、中はトロッ
                             とした食感がたまらんし、タコのプリプリ感が最高や。ソースとマヨネーズのハーモニーも絶妙
                             やし、青のりと鰹節が踊る姿も見てて楽しいわ。どこで食べても美味しいけど、やっぱり地元の
                             屋台が一番やな。ほんま、一度食べたらやみつきになるで!                                
                    INFO     PromptTask f648f61ec57646babca6298a2ae1885d                                           
                             Input: 次の文章を日本語のラップにして歌ってみてください:                              
                             おおきに!たこ焼きっちゅうのは、ほんまに関西のソウルフードやで。外はカリッ、中はトロッ
                             とした食感がたまらんし、タコのプリプリ感が最高や。ソースとマヨネーズのハーモニーも絶妙
                             やし、青のりと鰹節が踊る姿も見てて楽しいわ。どこで食べても美味しいけど、やっぱり地元の
                             屋台が一番やな。ほんま、一度食べたらやみつきになるで!                                
[06/13/24 02:14:39] INFO     PromptTask f648f61ec57646babca6298a2ae1885d                                           
                             Output: Yo yo yo, おおきに!たこ焼きっちゅうのは、                                    
                             ほんまに関西のソウルフードやで、わかるか?                                            
                             外はカリッ、中はトロッ、たまらん食感、                                                
                             タコのプリプリ感、最高や、ほんまやばい!                                              
                                                                                                                   
                             ソースとマヨネーズ、ハーモニー絶妙、                                                  
                             青のりと鰹節、踊る姿も見てて楽しいやろ?                                              
                             どこで食べても美味しいけど、地元の屋台、                                              
                             やっぱり一番やな、ほんまに間違いない!                                                
                                                                                                                   
                             一度食べたら、やみつきになるで、                                                      
                             たこ焼きの魔法、君も感じてみて!                                                      
                             関西の味、心に刻んで、                                                                
                             おおきに!たこ焼き、みんなで楽しもうぜ!                                              
                                                                                                                   
                             Yo yo, たこ焼き、たこ焼き、関西のプライド、                                           
                             みんなで食べて、笑顔でいっぱい!                                                      
                             おおきに!たこ焼き、ほんまに最高や、                                                  
                             一度食べたら、もう止まらんで、yeah!                                                   
<class 'griptape.structures.pipeline.Pipeline'>
おおきに!たこ焼きっちゅうのは、ほんまに関西のソウルフードやで。外はカリッ、中はトロッとした食感がたまらんし、タコのプリプリ感が最高や。ソースとマヨネーズのハーモニーも絶妙やし、青のりと鰹節が踊る姿も見てて楽しいわ。どこで食べても美味しいけど、やっぱり地元の屋台が一番やな。ほんま、一度食べたらやみつきになるで!
Yo yo yo, おおきに!たこ焼きっちゅうのは、
ほんまに関西のソウルフードやで、わかるか?
外はカリッ、中はトロッ、たまらん食感、
タコのプリプリ感、最高や、ほんまやばい!

ソースとマヨネーズ、ハーモニー絶妙、
青のりと鰹節、踊る姿も見てて楽しいやろ?
どこで食べても美味しいけど、地元の屋台、
やっぱり一番やな、ほんまに間違いない!

一度食べたら、やみつきになるで、
たこ焼きの魔法、君も感じてみて!
関西の味、心に刻んで、
おおきに!たこ焼き、みんなで楽しもうぜ!

Yo yo, たこ焼き、たこ焼き、関西のプライド、
みんなで食べて、笑顔でいっぱい!
おおきに!たこ焼き、ほんまに最高や、
一度食べたら、もう止まらんで、yeah!
kun432kun432

Structures: Workflows

https://docs.griptape.ai/stable/griptape-framework/structures/workflows/

Pipelineはタスクをシーケンシャルに処理するだけだったのに対して、Workflowはグラフ(DAG)を使ってタスクの実行順序を制御できる。

Contextは、Pipelineと同じように、base contextにプラスして、workflow固有の以下のコンテキストが引き継がれる。

  • parent_output: 親タスクの出力。タスクIDで参照可能。
  • parent: 親タスク、タスクIDで参照可能。
  • child: 子タスク、タスクIDで参照可能。

Pipelineよりも複雑になるので、タスクの識別にIDが必要になるということらしい。

ということでワークフローの例。以下のような処理を行う。

  • 物語の架空世界の設定を生成させる
  • 上記の世界設定を元に、登場する2人のキャラクターの設定を生成させる
  • 上記の世界設定とキャラクター設定を元に、ストーリーを生成させる

3番目のタスクは、1番目のタスク、2番目のタスクの両方の出力が必要ということになる。

from griptape.tasks import PromptTask
from griptape.structures import Workflow

workflow = Workflow()

# 世界の設定を生成するタスク
world_task = PromptTask(
    "次のキーワードから、架空の世界の設定を簡潔に作成してください: {{ keywords|join(', ') }}",
    context={
        "keywords": ["異世界", "競馬", "魔王"]
    },
    id="world"
)

# キャラクターの設定を生成するタスク、複数のキャラクターを生成するので関数でラップ
def character_task(task_id, character_name) -> PromptTask:
    return PromptTask(
        "次の架空世界の説明を元に、{{ name }}というキャラクターの設定を簡潔に作成してください:\n{{ parent_outputs['world'] }}",
        context={
            "name": character_name
        },
        id=task_id
    )

# ストーリーを生成するタスク
story_task = PromptTask(
    "次の世界とキャラクターの説明を元に、短いストーリーを作成してください。キャラクターは物語のキーとなるようにしてください。:\n{{ parent_outputs['world'] }}\n{{ parent_outputs['taro'] }}\n{{ parent_outputs['hanako'] }}",
    id="story"
)

# ワークフローに世界設定生成タスク、ストーリー生成タスクを登録
workflow.add_task(world_task)
workflow.add_task(story_task)

# キャラクター生成タスクを作成
character_task_1 = character_task("taro", "太郎")
character_task_2 = character_task("hanako", "花子")


# preserve_relationshipフラグに注意。これにより、world_taskはstory_taskの親のままであり、
# その出力はstory_taskのプロンプトで参照できる。
workflow.insert_tasks(world_task, [character_task_1, character_task_2], story_task, preserve_relationship=True)
workflow.run()

タスクの登録・配置は、add_taskinset_taskinsert_tasksで行う

  • add_task: 1つのタスクをワークフローに追加
  • inset_task: 1つのタスクをワークフローの途中に追加。親タスク、小タスクの指定が必要。
  • insert_tasks: 複数のタスクをワークフローの途中に追加。親タスク、小タスクの指定が必要。

見た感じ、add_taskで追加した順に実行されるのが基本で、親タスク・小タスクの間にタスクを差し込むのがinset_taskinset_tasksになる。 タスクを差し込むと親子関係が変わってしまい引き継がれれうcontextも変わってしまうので、preserve_relationship=Trueをつけてこれを維持する。

図にするとこう。

普通にタスク追加した場合は親タスクの出力をタスクIDで参照できる。

insert_task(s)を使うと、途中にタスクを挿入できるが、親子関係とあわせて引き継げるコンテキストも変わってしまう。

そこで、タスク挿入時にpreserve_relationship=Trueをつけることで親子関係を維持できて、複数の出力結果を受け取ることができるようになる。

うーん、直感的ではない感がある。挿入時に設定するってのがまたこう。。。とはいえ親子関係を崩すのは挿入なので、その際に設定するってのはまあわからんではない。ただこの仕組みだと複雑なタスクフローとか書きにくいし書いても理解しにくくなりそうではある。

なお、insert_tasksで複数のタスクを「並列」っぽく挿入できる。出力を見る限りは「並列」でできるタスクは並列で行われているのかなーという感はある。

kun432kun432

とりま実行結果(出力結果がzennのコメントに収まらないので別コメントに分かれる)

世界設定の生成

[06/13/24 02:26:25] INFO     PromptTask world                                                                      
                             Input: 次のキーワードから、架空の世界の設定を簡潔に作成してください: 異世界, 競馬,    
                             魔王                                                                                  
[06/13/24 02:26:42] INFO     PromptTask world                                                                      
                             Output: **タイトル: 魔法競馬の異世界「エクウィノクス」**                              
                                                                                                                   
                             **世界設定:**                                                                         
                                                                                                                   
                             エクウィノクスは、魔法と競馬が融合した異世界です。この世界では、競馬は単なるスポーツで
                             はなく、国の運命を左右する重要なイベントです。各国は魔法の力を持つ騎士と魔法生物である
                             「エクウィン」と呼ばれる特別な馬を育成し、競馬大会で競い合います。                    
                                                                                                                   
                             **主要な要素:**                                                                       
                                                                                                                   
                             1. **魔法競馬大会**:                                                                  
                                -                                                                                  
                             毎年一度、エクウィノクス全土で「グランドエクウィノクス競馬大会」が開催されます。この大
                             会で優勝した国は、次の一年間、他国に対して優位な立場を得ることができます。            
                                                                                                                   
                             2. **エクウィン**:                                                                    
                                -                                                                                  
                             エクウィンは魔法の力を持つ特別な馬で、各国の魔法使いが育成します。エクウィンは風のよう
                             に速く走ることができ、火を吹いたり、水を操ったりする能力を持つものもいます。          
                                                                                                                   
                             3. **魔王の存在**:                                                                    
                                -                                                                                  
                             エクウィノクスには「魔王」と呼ばれる強大な存在がいます。魔王はかつてこの世界を支配して
                             いましたが、現在は封印されています。しかし、魔王の力を利用しようとする者たちが暗躍して
                             おり、競馬大会の裏で陰謀が渦巻いています。                                            
                                                                                                                   
                             4. **主人公**:                                                                        
                                -                                                                                  
                             主人公は、かつて魔王に仕えていたが、現在は改心し、エクウィンと共に競馬大会で優勝を目指
                             す若き騎士です。彼は魔王の復活を阻止するため、そして自国を守るために戦います。        
                                                                                                                   
                             5. **競馬のルール**:                                                                  
                                -                                                                                  
                             競馬は単なる速さだけでなく、魔法の技術や戦略も重要です。騎士たちはエクウィンの能力を駆
                             使し、障害物や敵の妨害を乗り越えながらゴールを目指します。                            
                                                                                                                   
                             **物語の展開:**                                                                       
                                                                                                                   
                             主人公は、競馬大会で優勝を目指しながら、魔王の復活を企む陰謀を暴いていきます。彼は仲間
                             たちと共に、エクウィノクスの平和を守るために戦い、最終的には魔王との決戦に挑むことにな
                             ります。                                                                              
                                                                                                                   
                             この設定を基に、エクウィノクスの壮大な冒険と競馬の熱い戦いが繰り広げられる物語が展開さ
                             れます。                                                                              
kun432kun432

キャラクター設定の生成

                    INFO     PromptTask hanako                                                                     
                             Input: 次の架空世界の説明を元に、花子というキャラクターの設定を簡潔に作成してください:
                             **タイトル: 魔法競馬の異世界「エクウィノクス」**                                      
                                                                                                                   
                             **世界設定:**                                                                         
                                                                                                                   
                             エクウィノクスは、魔法と競馬が融合した異世界です。この世界では、競馬は単なるスポーツで
                             はなく、国の運命を左右する重要なイベントです。各国は魔法の力を持つ騎士と魔法生物である
                             「エクウィン」と呼ばれる特別な馬を育成し、競馬大会で競い合います。                    
                                                                                                                   
                             **主要な要素:**                                                                       
                                                                                                                   
                             1. **魔法競馬大会**:                                                                  
                                -                                                                                  
                             毎年一度、エクウィノクス全土で「グランドエクウィノクス競馬大会」が開催されます。この大
                             会で優勝した国は、次の一年間、他国に対して優位な立場を得ることができます。            
                                                                                                                   
                             2. **エクウィン**:                                                                    
                                -                                                                                  
                             エクウィンは魔法の力を持つ特別な馬で、各国の魔法使いが育成します。エクウィンは風のよう
                             に速く走ることができ、火を吹いたり、水を操ったりする能力を持つものもいます。          
                                                                                                                   
                             3. **魔王の存在**:                                                                    
                                -                                                                                  
                             エクウィノクスには「魔王」と呼ばれる強大な存在がいます。魔王はかつてこの世界を支配して
                             いましたが、現在は封印されています。しかし、魔王の力を利用しようとする者たちが暗躍して
                             おり、競馬大会の裏で陰謀が渦巻いています。                                            
                                                                                                                   
                             4. **主人公**:                                                                        
                                -                                                                                  
                             主人公は、かつて魔王に仕えていたが、現在は改心し、エクウィンと共に競馬大会で優勝を目指
                             す若き騎士です。彼は魔王の復活を阻止するため、そして自国を守るために戦います。        
                                                                                                                   
                             5. **競馬のルール**:                                                                  
                                -                                                                                  
                             競馬は単なる速さだけでなく、魔法の技術や戦略も重要です。騎士たちはエクウィンの能力を駆
                             使し、障害物や敵の妨害を乗り越えながらゴールを目指します。                            
                                                                                                                   
                             **物語の展開:**                                                                       
                                                                                                                   
                             主人公は、競馬大会で優勝を目指しながら、魔王の復活を企む陰謀を暴いていきます。彼は仲間
                             たちと共に、エクウィノクスの平和を守るために戦い、最終的には魔王との決戦に挑むことにな
                             ります。                                                                              
                                                                                                                   
                             この設定を基に、エクウィノクスの壮大な冒険と競馬の熱い戦いが繰り広げられる物語が展開さ
                             れます。                                                                              
                    INFO     PromptTask taro                                                                       
                             Input: 次の架空世界の説明を元に、太郎というキャラクターの設定を簡潔に作成してください:
                             **タイトル: 魔法競馬の異世界「エクウィノクス」**                                      
                                                                                                                   
                             **世界設定:**                                                                         
                                                                                                                   
                             エクウィノクスは、魔法と競馬が融合した異世界です。この世界では、競馬は単なるスポーツで
                             はなく、国の運命を左右する重要なイベントです。各国は魔法の力を持つ騎士と魔法生物である
                             「エクウィン」と呼ばれる特別な馬を育成し、競馬大会で競い合います。                    
                                                                                                                   
                             **主要な要素:**                                                                       
                                                                                                                   
                             1. **魔法競馬大会**:                                                                  
                                -                                                                                  
                             毎年一度、エクウィノクス全土で「グランドエクウィノクス競馬大会」が開催されます。この大
                             会で優勝した国は、次の一年間、他国に対して優位な立場を得ることができます。            
                                                                                                                   
                             2. **エクウィン**:                                                                    
                                -                                                                                  
                             エクウィンは魔法の力を持つ特別な馬で、各国の魔法使いが育成します。エクウィンは風のよう
                             に速く走ることができ、火を吹いたり、水を操ったりする能力を持つものもいます。          
                                                                                                                   
                             3. **魔王の存在**:                                                                    
                                -                                                                                  
                             エクウィノクスには「魔王」と呼ばれる強大な存在がいます。魔王はかつてこの世界を支配して
                             いましたが、現在は封印されています。しかし、魔王の力を利用しようとする者たちが暗躍して
                             おり、競馬大会の裏で陰謀が渦巻いています。                                            
                                                                                                                   
                             4. **主人公**:                                                                        
                                -                                                                                  
                             主人公は、かつて魔王に仕えていたが、現在は改心し、エクウィンと共に競馬大会で優勝を目指
                             す若き騎士です。彼は魔王の復活を阻止するため、そして自国を守るために戦います。        
                                                                                                                   
                             5. **競馬のルール**:                                                                  
                                -                                                                                  
                             競馬は単なる速さだけでなく、魔法の技術や戦略も重要です。騎士たちはエクウィンの能力を駆
                             使し、障害物や敵の妨害を乗り越えながらゴールを目指します。                            
                                                                                                                   
                             **物語の展開:**                                                                       
                                                                                                                   
                             主人公は、競馬大会で優勝を目指しながら、魔王の復活を企む陰謀を暴いていきます。彼は仲間
                             たちと共に、エクウィノクスの平和を守るために戦い、最終的には魔王との決戦に挑むことにな
                             ります。                                                                              
                                                                                                                   
                             この設定を基に、エクウィノクスの壮大な冒険と競馬の熱い戦いが繰り広げられる物語が展開さ
                             れます。                                                                              
[06/13/24 02:26:51] INFO     PromptTask taro                                                                       
                             Output: **キャラクター設定: 太郎**                                                    
                                                                                                                   
                             **名前**: 太郎                                                                        
                                                                                                                   
                             **年齢**: 18歳                                                                        
                                                                                                                   
                             **性別**: 男性                                                                        
                                                                                                                   
                             **職業**: 騎士見習い                                                                  
                                                                                                                   
                             **出身国**: リュミエール王国                                                          
                                                                                                                   
                             **エクウィン**: 「ライトニング」 -                                                    
                             風の魔法を操るエクウィン。稲妻のような速さで走り、風を操る能力を持つ。                
                                                                                                                   
                             **外見**:                                                                             
                             - 身長: 175cm                                                                         
                             - 体型: 筋肉質で引き締まった体                                                        
                             - 髪色: 黒                                                                            
                             - 目の色: 青                                                                          
                             - 特徴: 額に小さな傷跡があり、これは幼少期にエクウィンと初めて出会った際のもの。      
                                                                                                                   
                             **性格**:                                                                             
                             - 勇敢で正義感が強い                                                                  
                             - 仲間思いで、困っている人を見過ごせない                                              
                             - 少しおっちょこちょいな一面もあるが、真面目で努力家                                  
                                                                                                                   
                             **背景**:                                                                             
                             太郎はリュミエール王国の小さな村で生まれ育ちました。幼少期に両親を失い、村の人々に育て
                             られました。ある日、村の近くで傷ついたエクウィン「ライトニング」を見つけ、助けたことが
                             きっかけで騎士を目指すようになります。ライトニングと共に成長し、現在はリュミエール王国
                             の騎士見習いとして、グランドエクウィノクス競馬大会での優勝を目指しています。          
                                                                                                                   
                             **能力**:                                                                             
                             - 風の魔法を使いこなすことができ、特にスピードと敏捷性に優れています。                
                             - 剣術も得意で、エクウィンと共に戦う際には剣を駆使して敵を倒します。                  
                                                                                                                   
                             **目標**:                                                                             
                             - グランドエクウィノクス競馬大会で優勝し、リュミエール王国を栄光に導くこと。          
                             - 魔王の復活を阻止し、エクウィノクスの平和を守ること。                                
                                                                                                                   
                             **関係**:                                                                             
                             - 主人公とは幼馴染であり、共に競馬大会での優勝を目指す仲間。                          
                             - ライトニングとは深い絆で結ばれており、互いに信頼し合っている。                      
                                                                                                                   
                             **物語での役割**:                                                                     
                             太郎は主人公の親友であり、共に競馬大会に挑む重要な仲間です。彼の勇敢さと正義感は、物語
                             の中で多くの困難を乗り越える助けとなります。また、彼の存在は主人公にとって大きな支えと
                             なり、魔王の陰謀を暴くための重要な鍵となります。                                      
[06/13/24 02:26:53] INFO     PromptTask hanako                                                                     
                             Output: **キャラクター設定: 花子**                                                    
                                                                                                                   
                             **名前**: 花子 (Hanako)                                                               
                                                                                                                   
                             **年齢**: 18歳                                                                        
                                                                                                                   
                             **性別**: 女性                                                                        
                                                                                                                   
                             **職業**: 騎士見習い                                                                  
                                                                                                                   
                             **出身国**: フローラリア王国                                                          
                                                                                                                   
                             **外見**:                                                                             
                             - 身長: 160cm                                                                         
                             - 髪色: 黒髪で、肩までの長さ。普段はポニーテールにしている。                          
                             - 目の色: 深い緑色                                                                    
                             - 服装:                                                                               
                             フローラリア王国の伝統的な騎士見習いの制服を着用。軽装の鎧と動きやすいブーツを履いてい
                             る。                                                                                  
                                                                                                                   
                             **性格**:                                                                             
                             - 勇敢で正義感が強い                                                                  
                             - 仲間思いで、困っている人を放っておけない                                            
                             - 少しおっちょこちょいな一面もあるが、努力家で諦めない                                
                                                                                                                   
                             **背景**:                                                                             
                             花子はフローラリア王国の小さな村で育ちました。幼い頃からエクウィンに憧れ、騎士になるこ
                             とを夢見ていました。彼女の家族は農家で、特に裕福ではありませんが、花子の夢を応援してく
                             れました。彼女は村の魔法使いから基礎的な魔法を学び、騎士見習いとして王国に仕えることに
                             なりました。                                                                          
                                                                                                                   
                             **エクウィン**:                                                                       
                             - 名前: ブロッサム                                                                    
                             - 特徴:                                                                               
                             白い毛並みとピンクのたてがみを持つ美しいエクウィン。花を咲かせる魔法を使うことができ、
                             特に治癒の力に優れている。                                                            
                             - 性格: 穏やかで優しいが、競馬では驚異的なスピードを発揮する。                        
                                                                                                                   
                             **能力**:                                                                             
                             - 花子は風の魔法を得意とし、ブロッサムの治癒魔法と組み合わせて戦うことができる。      
                             - 競馬では、風の魔法を使ってブロッサムのスピードをさらに引き出し、障害物を乗り越える。
                                                                                                                   
                             **物語での役割**:                                                                     
                             花子は主人公の仲間として、共にグランドエクウィノクス競馬大会で優勝を目指します。彼女の
                             治癒魔法と風の魔法は、チームにとって重要な戦力となります。また、彼女の正義感と仲間思い
                             の性格が、魔王の復活を阻止するための陰謀を暴く手助けとなります。花子は物語を通じて成長
                             し、真の騎士としての姿を見せることになります。                                        

kun432kun432

世界設定とキャラクター設定からストーリー生成

                    INFO     PromptTask story                                                                      
                             Input:                                                                                
                             次の世界とキャラクターの説明を元に、短いストーリーを作成してください。キャラクターは物
                             語のキーとなるようにしてください。:                                                   
                             **タイトル: 魔法競馬の異世界「エクウィノクス」**                                      
                                                                                                                   
                             **世界設定:**                                                                         
                                                                                                                   
                             エクウィノクスは、魔法と競馬が融合した異世界です。この世界では、競馬は単なるスポーツで
                             はなく、国の運命を左右する重要なイベントです。各国は魔法の力を持つ騎士と魔法生物である
                             「エクウィン」と呼ばれる特別な馬を育成し、競馬大会で競い合います。                    
                                                                                                                   
                             **主要な要素:**                                                                       
                                                                                                                   
                             1. **魔法競馬大会**:                                                                  
                                -                                                                                  
                             毎年一度、エクウィノクス全土で「グランドエクウィノクス競馬大会」が開催されます。この大
                             会で優勝した国は、次の一年間、他国に対して優位な立場を得ることができます。            
                                                                                                                   
                             2. **エクウィン**:                                                                    
                                -                                                                                  
                             エクウィンは魔法の力を持つ特別な馬で、各国の魔法使いが育成します。エクウィンは風のよう
                             に速く走ることができ、火を吹いたり、水を操ったりする能力を持つものもいます。          
                                                                                                                   
                             3. **魔王の存在**:                                                                    
                                -                                                                                  
                             エクウィノクスには「魔王」と呼ばれる強大な存在がいます。魔王はかつてこの世界を支配して
                             いましたが、現在は封印されています。しかし、魔王の力を利用しようとする者たちが暗躍して
                             おり、競馬大会の裏で陰謀が渦巻いています。                                            
                                                                                                                   
                             4. **主人公**:                                                                        
                                -                                                                                  
                             主人公は、かつて魔王に仕えていたが、現在は改心し、エクウィンと共に競馬大会で優勝を目指
                             す若き騎士です。彼は魔王の復活を阻止するため、そして自国を守るために戦います。        
                                                                                                                   
                             5. **競馬のルール**:                                                                  
                                -                                                                                  
                             競馬は単なる速さだけでなく、魔法の技術や戦略も重要です。騎士たちはエクウィンの能力を駆
                             使し、障害物や敵の妨害を乗り越えながらゴールを目指します。                            
                                                                                                                   
                             **物語の展開:**                                                                       
                                                                                                                   
                             主人公は、競馬大会で優勝を目指しながら、魔王の復活を企む陰謀を暴いていきます。彼は仲間
                             たちと共に、エクウィノクスの平和を守るために戦い、最終的には魔王との決戦に挑むことにな
                             ります。                                                                              
                                                                                                                   
                             この設定を基に、エクウィノクスの壮大な冒険と競馬の熱い戦いが繰り広げられる物語が展開さ
                             れます。                                                                              
                             **キャラクター設定: 太郎**                                                            
                                                                                                                   
                             **名前**: 太郎                                                                        
                                                                                                                   
                             **年齢**: 18歳                                                                        
                                                                                                                   
                             **性別**: 男性                                                                        
                                                                                                                   
                             **職業**: 騎士見習い                                                                  
                                                                                                                   
                             **出身国**: リュミエール王国                                                          
                                                                                                                   
                             **エクウィン**: 「ライトニング」 -                                                    
                             風の魔法を操るエクウィン。稲妻のような速さで走り、風を操る能力を持つ。                
                                                                                                                   
                             **外見**:                                                                             
                             - 身長: 175cm                                                                         
                             - 体型: 筋肉質で引き締まった体                                                        
                             - 髪色: 黒                                                                            
                             - 目の色: 青                                                                          
                             - 特徴: 額に小さな傷跡があり、これは幼少期にエクウィンと初めて出会った際のもの。      
                                                                                                                   
                             **性格**:                                                                             
                             - 勇敢で正義感が強い                                                                  
                             - 仲間思いで、困っている人を見過ごせない                                              
                             - 少しおっちょこちょいな一面もあるが、真面目で努力家                                  
                                                                                                                   
                             **背景**:                                                                             
                             太郎はリュミエール王国の小さな村で生まれ育ちました。幼少期に両親を失い、村の人々に育て
                             られました。ある日、村の近くで傷ついたエクウィン「ライトニング」を見つけ、助けたことが
                             きっかけで騎士を目指すようになります。ライトニングと共に成長し、現在はリュミエール王国
                             の騎士見習いとして、グランドエクウィノクス競馬大会での優勝を目指しています。          
                                                                                                                   
                             **能力**:                                                                             
                             - 風の魔法を使いこなすことができ、特にスピードと敏捷性に優れています。                
                             - 剣術も得意で、エクウィンと共に戦う際には剣を駆使して敵を倒します。                  
                                                                                                                   
                             **目標**:                                                                             
                             - グランドエクウィノクス競馬大会で優勝し、リュミエール王国を栄光に導くこと。          
                             - 魔王の復活を阻止し、エクウィノクスの平和を守ること。                                
                                                                                                                   
                             **関係**:                                                                             
                             - 主人公とは幼馴染であり、共に競馬大会での優勝を目指す仲間。                          
                             - ライトニングとは深い絆で結ばれており、互いに信頼し合っている。                      
                                                                                                                   
                             **物語での役割**:                                                                     
                             太郎は主人公の親友であり、共に競馬大会に挑む重要な仲間です。彼の勇敢さと正義感は、物語
                             の中で多くの困難を乗り越える助けとなります。また、彼の存在は主人公にとって大きな支えと
                             なり、魔王の陰謀を暴くための重要な鍵となります。                                      
                             **キャラクター設定: 花子**                                                            
                                                                                                                   
                             **名前**: 花子 (Hanako)                                                               
                                                                                                                   
                             **年齢**: 18歳                                                                        
                                                                                                                   
                             **性別**: 女性                                                                        
                                                                                                                   
                             **職業**: 騎士見習い                                                                  
                                                                                                                   
                             **出身国**: フローラリア王国                                                          
                                                                                                                   
                             **外見**:                                                                             
                             - 身長: 160cm                                                                         
                             - 髪色: 黒髪で、肩までの長さ。普段はポニーテールにしている。                          
                             - 目の色: 深い緑色                                                                    
                             - 服装:                                                                               
                             フローラリア王国の伝統的な騎士見習いの制服を着用。軽装の鎧と動きやすいブーツを履いてい
                             る。                                                                                  
                                                                                                                   
                             **性格**:                                                                             
                             - 勇敢で正義感が強い                                                                  
                             - 仲間思いで、困っている人を放っておけない                                            
                             - 少しおっちょこちょいな一面もあるが、努力家で諦めない                                
                                                                                                                   
                             **背景**:                                                                             
                             花子はフローラリア王国の小さな村で育ちました。幼い頃からエクウィンに憧れ、騎士になるこ
                             とを夢見ていました。彼女の家族は農家で、特に裕福ではありませんが、花子の夢を応援してく
                             れました。彼女は村の魔法使いから基礎的な魔法を学び、騎士見習いとして王国に仕えることに
                             なりました。                                                                          
                                                                                                                   
                             **エクウィン**:                                                                       
                             - 名前: ブロッサム                                                                    
                             - 特徴:                                                                               
                             白い毛並みとピンクのたてがみを持つ美しいエクウィン。花を咲かせる魔法を使うことができ、
                             特に治癒の力に優れている。                                                            
                             - 性格: 穏やかで優しいが、競馬では驚異的なスピードを発揮する。                        
                                                                                                                   
                             **能力**:                                                                             
                             - 花子は風の魔法を得意とし、ブロッサムの治癒魔法と組み合わせて戦うことができる。      
                             - 競馬では、風の魔法を使ってブロッサムのスピードをさらに引き出し、障害物を乗り越える。
                                                                                                                   
                             **物語での役割**:                                                                     
                             花子は主人公の仲間として、共にグランドエクウィノクス競馬大会で優勝を目指します。彼女の
                             治癒魔法と風の魔法は、チームにとって重要な戦力となります。また、彼女の正義感と仲間思い
                             の性格が、魔王の復活を阻止するための陰謀を暴く手助けとなります。花子は物語を通じて成長
                             し、真の騎士としての姿を見せることになります。                                        
[06/13/24 02:27:09] INFO     PromptTask story                                                                      
                             Output: **タイトル: 魔法競馬の異世界「エクウィノクス」**                              
                                                                                                                   
                             **プロローグ**                                                                        
                                                                                                                   
                             エクウィノクスの空は、毎年一度の「グランドエクウィノクス競馬大会」を迎えるために、色と
                             りどりの魔法の光で彩られていた。リュミエール王国の騎士見習い、太郎はエクウィン「ライト
                             ニング」と共に、競馬場のスタートラインに立っていた。彼の隣には、フローラリア王国の騎士
                             見習い、花子とそのエクウィン「ブロッサム」がいた。                                    
                                                                                                                   
                             **第一章: 出会いと絆**                                                                
                                                                                                                   
                             太郎と花子は幼馴染であり、共に競馬大会での優勝を目指していた。太郎は幼少期に両親を失い
                             、村の人々に育てられた。ある日、村の近くで傷ついたエクウィン「ライトニング」を見つけ、
                             助けたことがきっかけで騎士を目指すようになった。一方、花子は農家の家族に育てられ、幼い
                             頃からエクウィンに憧れていた。彼女の家族は裕福ではなかったが、彼女の夢を応援してくれた
                             。                                                                                    
                                                                                                                   
                             **第二章: 競馬大会の幕開け**                                                          
                                                                                                                   
                             グランドエクウィノクス競馬大会が始まり、太郎と花子はそれぞれのエクウィンと共に競技に挑
                             んだ。競馬は単なる速さだけでなく、魔法の技術や戦略も重要だった。太郎はライトニングの風
                             の魔法を駆使し、花子はブロッサムの治癒魔法と風の魔法を組み合わせて戦った。            
                                                                                                                   
                             **第三章: 陰謀の影**                                                                  
                                                                                                                   
                             競馬大会の裏では、魔王の復活を企む陰謀が進行していた。太郎と花子は、競技の合間にその陰
                             謀を暴くための手がかりを探し始めた。彼らは、魔王の力を利用しようとする者たちが大会に紛
                             れ込んでいることを知り、警戒を強めた。                                                
                                                                                                                   
                             **第四章: 仲間との協力**                                                              
                                                                                                                   
                             太郎と花子は、他の騎士見習いやエクウィンたちと協力し、魔王の陰謀を阻止するための計画を
                             立てた。彼らは、競馬大会の最終レースで魔王の力を封じるための魔法の儀式を行うことを決意
                             した。                                                                                
                                                                                                                   
                             **第五章: 最終レースと決戦**                                                          
                                                                                                                   
                             最終レースが始まり、太郎と花子は全力で競技に挑んだ。ライトニングの風の魔法とブロッサム
                             の治癒魔法が光り輝き、彼らは障害物や敵の妨害を乗り越えていった。しかし、魔王の力を利用
                             しようとする者たちが現れ、激しい戦いが繰り広げられた。                                
                                                                                                                   
                             **第六章: 勝利と平和**                                                                
                                                                                                                   
                             太郎と花子は、仲間たちと共に魔王の陰謀を阻止し、最終レースで優勝を果たした。リュミエー
                             ル王国とフローラリア王国は、次の一年間、他国に対して優位な立場を得ることができた。エク
                             ウィノクスの平和は守られ、太郎と花子は真の騎士として成長した。                        
                                                                                                                   
                             **エピローグ**                                                                        
                                                                                                                   
                             太郎と花子は、エクウィノクスの未来を守るために、これからも共に戦い続けることを誓った。
                             彼らの冒険はまだ始まったばかりであり、新たな挑戦が待ち受けていることを知っていた。しか
                             し、彼らは仲間と共に、どんな困難も乗り越えていくことを信じていた。                    
                                                                                                                   
                             **終わり**
kun432kun432

レスポンスから取り出すにはこう。

for idx, task in enumerate(response.tasks):
    print("{}: {}\n{}...".format(idx, task.id, str(task.output).replace("\n","")[:50]))
0: world
**タイトル: 魔法競馬の異世界「エクウィノクス」****世界設定:**エクウィノクスは、魔法と競馬...
1: hanako
**キャラクター設定: 花子****名前**: 花子 (Hanako)**年齢**: 18歳**性別...
2: taro
**キャラクター設定: 太郎****名前**: 太郎**年齢**: 18歳**性別**: 男性**職...
3: story
**タイトル: 魔法競馬の異世界「エクウィノクス」****プロローグ**エクウィノクスの空は、毎年一...

レスポンスに入っている結果は、ワークフロー内のタスクの構造は維持されずにおそらく実行された順に結果が入っている。で、ワークフローの構造は以下のようにして参照できる。

workflow.to_graph()
{'world': set(),
 'hanako': {'world'},
 'taro': {'world'},
 'story': {'hanako', 'taro', 'world'}}

この辺と組み合わせて取り出せばいいのかなーという気はする。まあ一番最後の結果だけあればいいっちゃいいのかもしれないけども。

あと、v0.26.0ではまだ対応されていないのだけども、StructureVisualizerというユーティリティが追加されていて、Mermaid記法でワークフローの構造を出力できるようになるみたい?

https://github.com/griptape-ai/griptape/blob/dev/griptape/utils/structure_visualizer.py

devブランチで試してみた。

from griptape.utils import StructureVisualizer

print(StructureVisualizer(workflow).to_url())

https://mermaid.ink/svg/XXXXXXXXXXX

URLにアクセスするとこんな感じで表示される。

kun432kun432

Tasks

Taskはその名の通りタスクで、LLMを使ってなにかの結果を得るもの。タスクには複数の種類があるのだけど、まずはContextから。

Context

Contextはタスクへの入力。

  • args: .run()メソッドで渡された引数のリスト。
  • structure: タスクが属しているstructure(の名前?)
  • ユーザ定義のcontext変数: 別途設定できるらしい。

これに加えて、既に説明した通り、structureごとに引き継がれるContextがある。

以下は、argsとユーザ定義のcontextを指定した例。

from griptape.structures import Agent
from griptape.tasks import PromptTask


agent = Agent()
agent.add_task(
    PromptTask(
        "次の質問に対して、言語は {{preferred_language}} で、{{tone}} トーンで、回答してください: '{{ args[0] }}",
        context={"preferred_language": "フランス語", "tone": "陽気な"},
    )
)

agent.run("ケーキの作り方を教えて")
[06/13/24 04:07:34] INFO     PromptTask 4a1f81317dd64e35ad25f95eba69e2af                                           
                             Input: 次の質問に対して、言語は フランス語 で、陽気な トーンで、回答してください:     
                             'ケーキの作り方を教えて                                                               
[06/13/24 04:07:41] INFO     PromptTask 4a1f81317dd64e35ad25f95eba69e2af                                           
                             Output: Bien sûr, avec grand plaisir! Préparons ensemble un délicieux gâteau, ça va   
                             être amusant! 🎂                                                                      
                                                                                                                   
                             **Ingrédients:**                                                                      
                             - 200g de farine                                                                      
                             - 200g de sucre                                                                       
                             - 200g de beurre                                                                      
                             - 4 œufs                                                                              
                             - 1 sachet de levure chimique                                                         
                             - 1 pincée de sel                                                                     
                             - 1 cuillère à café d'extrait de vanille (ou tout autre arôme de votre choix)         
                                                                                                                   
                             **Instructions:**                                                                     
                                                                                                                   
                             1. **Préchauffez le four** à 180°C (thermostat 6). On veut que notre four soit bien   
                             chaud pour accueillir notre gâteau!                                                   
                                                                                                                   
                             2. **Mélangez le beurre et le sucre** dans un grand bol. Utilisez un batteur          
                             électrique si vous en avez un, sinon, un peu d'huile de coude fera l'affaire! Le      
                             mélange doit devenir crémeux et léger.                                                
                                                                                                                   
                             3. **Ajoutez les œufs** un par un, en battant bien après chaque ajout. Ça commence à  
                             prendre forme, n'est-ce pas?                                                          
                                                                                                                   
                             4. **Incorporez la farine, la levure et le sel**. Tamisez-les ensemble pour éviter les
                             grumeaux, puis ajoutez-les progressivement au mélange. Mélangez doucement pour obtenir
                             une pâte homogène.                                                                    
                                                                                                                   
                             5. **Ajoutez l'extrait de vanille**. Mmm, ça sent déjà bon!                           
                                                                                                                   
                             6. **Versez la pâte** dans un moule à gâteau préalablement beurré et fariné. Lissez le
                             dessus avec une spatule.                                                              
                                                                                                                   
                             7. **Enfournez** pendant environ 30 à 35 minutes. Pour vérifier la cuisson, plantez un
                             couteau au centre du gâteau; s'il ressort propre, c'est prêt!                         
                                                                                                                   
                             8. **Laissez refroidir** avant de démouler. Patience, patience...                     
                                                                                                                   
                             Et voilà, votre gâteau est prêt à être dégusté! Vous pouvez le décorer avec un peu de 
                             sucre glace, des fruits frais ou même un glaçage si vous vous sentez créatif. Bon     
                             appétit et amusez-vous bien! 🍰🎉       

Prompt Task

PromptTaskは汎用的なタスク。シンプルにプロンプトに従って生成する。

from griptape.tasks import PromptTask
from griptape.structures import Agent


agent = Agent()
agent.add_task(
    PromptTask("次の指示にしたがって回答してください: {{ args[0] }}"),
)

agent.run("俳句を一句詠んで")
[06/13/24 04:09:14] INFO     PromptTask 785be62751444b609461826c8ba81b36                                           
                             Input: 次の指示にしたがって回答してください: 俳句を一句詠んで                         
[06/13/24 04:09:15] INFO     PromptTask 785be62751444b609461826c8ba81b36                                           
                             Output: 秋風や                                                                        
                             紅葉舞い散る                                                                          
                             静寂の道

ToolkitTask

ToolkitTaskはツールを使って回答を生成するタスク。ツールは複数与えることもできる。どのツールを取捨選択するかはCoTで判断する。CoTを使う前提になるので基本的なモデル性能が必要になる。

~~ドキュメントにあるサンプルは、Webのスクレイピング、ファイル操作、会話メモリ操作に関するツールを指定している。ちなみに、ドキュメントのコードではうまく動かず、Agent初期化時にメモリを用意していないためだと思う。 →再度実行してみたら不要だった。Pipelineのときは必要だったのでstructureによってメモリの受け渡し方が違うってことなのかも。

from griptape.tasks import ToolkitTask
from griptape.structures import Agent
from griptape.tools import WebScraper, FileManager, TaskMemoryClient
# 以下が必要と思ったけど、不要だった
#from griptape.memory.structure import ConversationMemory


agent = Agent(
    # 以下が必要と思ったけど不要だった
    #conversation_memory=ConversationMemory()
)
agent.add_task(
    ToolkitTask(
        "https://zenn.dev/kun432/books/ea7f9f2546e57811d263 の内容を読み込んで、要約を行い、その内容をsummarize.txtに保存してください。",
        tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)]
    ),
)

agent.run()
(snip)

The content from the provided URL has been summarized and saved to `summarize.txt`. The summary is as follows:

```
This book provides a hands-on guide to experiencing Kubernetes using Vagrant. It focuses on creating and publishing applications on Kubernetes rather than building Kubernetes itself. The book explains the main Kubernetes resources and how to use the `kubectl` command. The chapters include an introduction, prerequisites, setting up a Kubernetes environment with Vagrant, interacting with Kubernetes, creating and exposing Pods, making Pods redundant, and combining everything to create an application.
```

なんかちらほら

                             Response: memory not found                                                            

でやり直ししてるような形跡がある。どうもメモリの内容もFunction Callingで引っ張ってきているようなんだけど、なんか毎回キーエラーみたいになっているように思える。これはなんなんだろうか。。。

ToolTask

ToolkitTaskは複数のツールを使えるが、ToolTaskは単一のタスクを使う場合。CoTを使わないので性能が低いモデルでも使用可能ということらしい。

from griptape.structures import Agent
from griptape.tasks import ToolTask
from griptape.tools import Calculator

agent = Agent()
agent.add_task(ToolTask(tool=Calculator()))

agent.run("5 * 4 の答えは?")
[06/13/24 04:25:31] INFO     ToolTask b32bebe91bca4875a3c779a8034b71df                                             
                             Input: 5 * 4 の答えは?                                                               
[06/13/24 04:25:32] INFO     Subtask 59f8d6b351644a78bf66b5f5cbab33eb                                              
                             Actions: [{"name": "Calculator", "path": "calculate", "input": {"values":             
                             {"expression": "5 * 4"}}, "tag": "Calculator"}]                                       
                    INFO     Subtask 59f8d6b351644a78bf66b5f5cbab33eb                                              
                             Response: 20                                                                          
                    INFO     ToolTask b32bebe91bca4875a3c779a8034b71df                                             
                             Output: 20

ExtractionTask

ExtractionTaskはテキストから情報を抽出するタスク。抽出に使うエンジンとそのパラメータを指定する必要がある。

以下はCSVの例。

from griptape.drivers import OpenAiChatPromptDriver
from griptape.tasks import ExtractionTask
from griptape.structures import Agent
from griptape.engines import CsvExtractionEngine

# CSV extraction engineを初期化
csv_extraction_engine = CsvExtractionEngine(
    prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo")
)

# CSVデータ
csv_data = """
アリス, 28, ニューヨーク
ボブ, 35歳でカリフォルニアに住んでいる
チャーリーは40歳でテキサスに住んでいる
"""

columns = ["Name", "Age", "Address"]


# エージェントにExtractionTaskを与える
agent = Agent()
agent.add_task(
    ExtractionTask(
        extraction_engine=csv_extraction_engine,
        args={"column_names": columns},
    )
)

agent.run(csv_data)
[06/13/24 04:30:07] INFO     ExtractionTask 6d6a42b133fd41f9bfd864215c74b341                                       
                             Input:                                                                                
                             アリス, 28, ニューヨーク                                                              
                             ボブ, 35歳でカリフォルニアに住んでいる                                                
                             チャーリーは40歳でテキサスに住んでいる                                                
                                                                                                                   
[06/13/24 04:30:08] INFO     ExtractionTask 6d6a42b133fd41f9bfd864215c74b341                                       
                             Output: Name,Age,Address                                                              
                             アリス,28,ニューヨーク                                                                
                             ボブ,35,カリフォルニア                                                                
                             チャーリー,40,テキサス

同様にJSONなども可能

from schema import Schema 

from griptape.drivers import OpenAiChatPromptDriver
from griptape.tasks import ExtractionTask
from griptape.structures import Agent
from griptape.engines import JsonExtractionEngine

json_extraction_engine = JsonExtractionEngine(
    prompt_driver=OpenAiChatPromptDriver(model="gpt-3.5-turbo"),
)

data = """
アリス(28歳)はニューヨーク在住です。
Bob (35歳)はカリフォルニアに住んでいます。
"""
user_schema = Schema(
    {"users": [{"name": str, "age": int, "location": str}]}
).json_schema("UserSchema")

agent = Agent()
agent.add_task(
    ExtractionTask(
        extraction_engine=json_extraction_engine,
        args={"template_schema": user_schema},
    )
)

agent.run(data)
[06/13/24 04:37:54] INFO     ExtractionTask af04bd1af377410f91455607c48e78b5                                       
                             Input:                                                                                
                             アリス(28歳)はニューヨーク在住です。                                                
                             Bob (35歳)はカリフォルニアに住んでいます。                                          
                                                                                                                   
[06/13/24 04:37:56] INFO     ExtractionTask af04bd1af377410f91455607c48e78b5                                       
                             Output: {"name": "\u30a2\u30ea\u30b9", "age": 28, "location":                         
                             "\u30cb\u30e5\u30fc\u30e8\u30fc\u30af"}                                               
                             {"name": "Bob", "age": 35, "location": "\u30ab\u30ea\u30d5\u30a9\u30eb\u30cb\u30a2"} 

うーん、ensure_ascii=Falseを渡したいのだけども、無理めな感じぽい。受け取ってから処理するしかないかなぁ。


といった感じで他にも色々なタスクがあるので、ユースケースに合わせて選択すれば良い。

kun432kun432

Task Memory

https://docs.griptape.ai/stable/griptape-framework/structures/task-memory/

Task Memoryはツール間の入出力を共有するためのメモリ。デフォルトで全てのツールの出力はTaskMemoryに保存されている。

from griptape.structures import Agent
from griptape.tools import WebScraper, FileManager, TaskMemoryClient


agent = Agent(
    tools=[WebScraper(), FileManager(), TaskMemoryClient(off_prompt=False)]
)

agent.run(
    "https://zenn.dev/kun432/books/ea7f9f2546e57811d263 の内容を読み込んで、"
    "要約を行い、その内容をsummarize.txtに保存してください。",
)
[06/13/24 05:15:58] INFO     ToolkitTask 3a81f88cd5694acca6a3381fdfb79ee1                                          
                             Input: https://zenn.dev/kun432/books/ea7f9f2546e57811d263                             
                             の内容を読み込んで、要約を行い、その内容をsummarize.txtに保存してください。           
[06/13/24 05:16:02] INFO     Subtask f3abb92a81924459aa787cbc6c2d8fb7                                              
                             Thought: The task requires reading the content of the specified URL, summarizing it,  
                             and saving the summary to a file named `summarize.txt`. I will start by loading the   
                             content of the URL.                                                                   
                                                                                                                   
                             Actions:                                                                              
                             ```json                                                                               
                             [                                                                                     
                                 {                                                                                 
                                     "name": "WebScraper",                                                         
                                     "path": "get_content",                                                        
                                     "input": {                                                                    
                                         "values": {                                                               
                                             "url": "https://zenn.dev/kun432/books/ea7f9f2546e57811d263"           
                                         }                                                                         
                                     },                                                                            
                                     "tag": "load_web_content"                                                     
                                 }                                                                                 
                             ]                                                                                     
                             ```                                                                                   
[06/13/24 05:16:03] INFO     Subtask f3abb92a81924459aa787cbc6c2d8fb7                                              
                             Response: Vagrantでお手軽にKubernetesに触れてみよう                                   
                             無料で読める本                                                                        
                             Vagrantを使ってKubernetesを体験してみるためのハンズオンです。                         
                             Kubernetes自体の構築ではなく、Kubernetes上でアプリケーションを作成・公開するために、Ku
                             bernetesの主要なリソースおよびkubectlコマンドの使い方について説明しています。         
                             Chapters                                                                              
                             はじめに                                                                              
                             必要なもの                                                                            
                             Vagrantを使ったKubernetes環境の構築                                                   
                             Kubernetesに触れてみよう                                                              
                             Podを立ててみよう                                                                     
                             Podを公開してみよう                                                                   
                             Podを冗長化してみよう                                                                 
                             全部を組み合わせたアプリケーションを作ってみよう                                      
                             Author                                                                                
                             Topics                                                                                
[06/13/24 05:16:09] INFO     Subtask 50016108d48d46d982a27fbfa5133a89                                              
                             Thought: The content of the URL has been successfully loaded. Now, I will summarize   
                             the content and save the summary to a file named `summarize.txt`.                     
                                                                                                                   
                             Summary:                                                                              
                             The book titled "Vagrantでお手軽にKubernetesに触れてみよう" is a hands-on guide to    
                             experiencing Kubernetes using Vagrant. It focuses on creating and publishing          
                             applications on Kubernetes, explaining the main resources and the usage of the        
                             `kubectl` command. The chapters include:                                              
                             1. Introduction                                                                       
                             2. Requirements                                                                       
                             3. Setting up a Kubernetes environment with Vagrant                                   
                             4. Exploring Kubernetes                                                               
                             5. Creating a Pod                                                                     
                             6. Publishing a Pod                                                                   
                             7. Making a Pod redundant                                                             
                             8. Creating an application combining all elements                                     
                                                                                                                   
                             Actions: [                                                                            
                                 {                                                                                 
                                     "tag": "save_summary_to_file",                                                
                                     "name": "FileManager",                                                        
                                     "path": "save_content_to_file",                                               
                                     "input": {                                                                    
                                         "values": {                                                               
                                             "path": "summarize.txt",                                              
                                             "content": "The book titled                                           
                             'Vagrantでお手軽にKubernetesに触れてみよう' is a hands-on guide to experiencing       
                             Kubernetes using Vagrant. It focuses on creating and publishing applications on       
                             Kubernetes, explaining the main resources and the usage of the `kubectl` command. The 
                             chapters include:\n1. Introduction\n2. Requirements\n3. Setting up a Kubernetes       
                             environment with Vagrant\n4. Exploring Kubernetes\n5. Creating a Pod\n6. Publishing a 
                             Pod\n7. Making a Pod redundant\n8. Creating an application combining all elements"    
                                         }                                                                         
                                     }                                                                             
                                 }                                                                                 
                             ]                                                                                     
                    INFO     Subtask 50016108d48d46d982a27fbfa5133a89                                              
                             Response: Successfully saved file                                                     
[06/13/24 05:16:11] INFO     ToolkitTask 3a81f88cd5694acca6a3381fdfb79ee1                                          
                             Output: The content from the URL has been summarized and saved to `summarize.txt`. The
                             summary is as follows:                                                                
                                                                                                                   
                             The book titled 'Vagrantでお手軽にKubernetesに触れてみよう' is a hands-on guide to    
                             experiencing Kubernetes using Vagrant. It focuses on creating and publishing          
                             applications on Kubernetes, explaining the main resources and the usage of the        
                             `kubectl` command. The chapters include:                                              
                             1. Introduction                                                                       
                             2. Requirements                                                                       
                             3. Setting up a Kubernetes environment with Vagrant                                   
                             4. Exploring Kubernetes                                                               
                             5. Creating a Pod                                                                     
                             6. Publishing a Pod                                                                   
                             7. Making a Pod redundant                                                             
                             8. Creating an application combining all elements

上の例はうまく行ったけど、何度か実行してるとやはりResponse: memory not foundが出るし、場合によっては何度も繰り返したりする。。。

んー、ちょっとメモリ周りが不安定なように思える。

kun432kun432

他にもいろいろあるのだけども、ややメモリ周りの動きが不安定なのが気になる。エージェントにおいて情報の受け渡しはマルチタスク、マルチエージェントを実現するためには重要なポイントで、ここが安定して動かないってのは結構致命的ではないかという気がする。

な~んとなく思ったのは、メモリの共有もツールで行っていて、Function Callingで引数作成して参照してるように思えるのだけど、メモリを参照するときのキーが間違って生成されている(そして見つからない)ように見受けられるのだよなぁ。。。。ここもっとシンプルにContextなりStateなりみたいなので管理したほうがいいんじゃなかろうか。

以下の記事で複数の箇所でメンションされていたのでちょっと期待してたのだけども、シンプルで良さげな面はあるとしても、現状は少し不安定に思える。プロンプトを英語で使うならもうちょっと安定するのかも、と思いつつも、一旦ペンディングかな。。。

https://www.madrona.com/the-rise-of-ai-agent-infrastructure/

このスクラップは5ヶ月前にクローズされました