![見出し画像](https://assets.st-note.com/production/uploads/images/106753675/rectangle_large_type_2_66ace48b2f6ce549a2a8c9cb1b2b1d24.png?width=1200)
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)")
1: document_qa (PreTool)
2: image_captioner (PreTool)
3: image_qa (PreTool)
4: image_segmenter (PreTool)
5: transcriber (PreTool)
6: summarizer (PreTool)
7: text_classifier (PreTool)
8: text_qa (PreTool)
9: text_reader (PreTool)
10: translator (PreTool)
11: image_transformer (PreTool)
12: text_downloader (PreTool)
13: image_generator (PreTool)
14: video_generator (PreTool)
これらのツールは、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("人生、宇宙、すべての答えは?")
==Explanation from the agent==
I will use the following tool: `meaning_of_life` to find the answer to the ultimate question.
==Code generated by the agent==
answer = meaning_of_life(query="What is the answer to the ultimate question of life, the universe, and everything?")
print(f"The answer is {answer}.") # The answer is 42.
==Result==
The answer is 42.
'42'
agent.run("明日、月曜日に会社に行く意味は?")
==Result==
The ultimate answer is 42.
'42'
元ネタを読んだことある人ってどの位いるんだろう?
おしまい。お読みいただき、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?