Transformers Agent用のカスタムツールの作成
個人的に割とイケてるという感想のHuggingfaceのTransformers Agentのカスタムツールの作成を試してみます。
pineconeが公開してくれている例を参考にさせてもらいました。
Huggingface の Transformers Agentについては以下をご参照ください。
このAgentは、あまり注目されていない印象がありますが、実行時にエージェントがpythonの簡易コードを書いてから、具体的な処理に移ることや、外部ツール、プラグインとの連携が容易なことから、用途によってはlangchain 標準のzeroshot系のエージェントよりも有効な場面も多くありそうです。
0.前準備
!pip install langchain > /dev/null
!pip install openai > /dev/null
!pip install transformers > /dev/null
from transformers.tools import OpenAiAgent
pswd = 'OpenAI API key'
agent = OpenAiAgent(model="gpt-3.5-turbo", api_key=pswd)
1.Transformers Agentが参照するツール
transformers agentが参照するツールは toolboxに設定されています。
初期状態で読み込まれるツールを表示します。
from transformers.tools.agents import PreTool
for i, (name, tool) in enumerate(agent.toolbox.items()):
if type(tool) is PreTool:
print(f"{i+1}: {name} (PreTool)")
else:
print(f"{i+1}: {name} (Tool)")
これらのツールは、agent呼び出し時に、各々どのようなツールの説明文(description)などがプロンプト追加されるので、入力トークンが増大したり、ツールの数が多すぎるとagentがどのツールを使うか迷ったり、誤動作してしまう可能性もありそうです。
このため、目的に合わせて適宜、整理するのがよさそうです。
2.toolboxを空にする
今回は簡単のためにtoolboxのPreToolを全部空にします 。
# 削除リスト
del_list = []
for name, tool in agent.toolbox.items():
if type(tool) is PreTool:
del_list.append(name)
for name in del_list:
del agent.toolbox[name]
すっきり空になりました。
agent.toolbox
3.カスタムツールの定義
from transformers import Tool
class MeaningOfLifeTool(Tool):
name = 'meaning_of_life'
description = (
"""このツールは、万物の本質の答えを見つけるために使うものです、
このツールは、人生、宇宙、すべての答えを見つけるために使用されます。
ユーザーの入力'query'を受けて、彼らが探している究極の答えを返します。"""
)
inputs = ['text']
outputs = ['text']
def __call__(self, query: str):
return "42"
meaning_of_life_tool = MeaningOfLifeTool()
agent = OpenAiAgent(
model='gpt-3.5-turbo',
api_key=pswd,
additional_tools=[meaning_of_life_tool]
)
4.実行!
agent.run("人生、宇宙、すべての答えは?")
agent.run("明日、月曜日に会社に行く意味は?")
元ネタを読んだことある人ってどの位いるんだろう?
おしまい。お読みいただき、ありがとうございました。