はじめに
こんにちは、いのせです。
今回は、以前Mastraを用いて開発したアーニャエージェントにツールを追加して強化してみました。
前回の記事↓
今回は、アーニャがトレンドのニュースについて教えてくれるようにツールを作って組み込みました。
Mastraとは
Mastraは、TypeScript(JavaScript)で書かれたオープンソースのAIエージェント開発フレームワークです。大規模言語モデル(LLM)を活用し、チャットボットや自律的にタスクを実行するAIエージェントを簡単に作成・運用できるよう設計されています。
今回取り入れたツールというのは、エージェントが必要な情報を外部から取得するための便利な道具のようなものです。たとえば「ニュースを調べて」と言われたとき、エージェント自身がインターネットにアクセスできるわけではありません。そこで、外部APIを呼び出して最新のニュースを取得してくれるツールをあらかじめ用意しておくことで、エージェントはそのツールを使って目的の処理を実行できます。
使用したもの
- TypeScrpt
- Mastra
- NewsAPI
Mastraの環境構築やプロジェクト作成の方法は前回の記事やその前の下記の記事に書いてあるので今回は省略します。
ディレクトリ構造
前回触ったファイルは../agents/anyaAgent.ts
だけでしたが、今回はtools/newsTools.ts
を追加してます。
.
├── .mastra/
├── node_modules/
├── src/
│ └── mastra/
│ ├─── agents/
│ │ └── anyaAgent.ts
│ └───tools
│ └── newsTool.ts
├── index.ts
└── .env
.envには新たにNEWS_APIを設定
OPENAI_API_KEY=your_api_key
NEWS_API=your_api_key
Toolの実装
以下はツールの実装コードです。
import { createTool } from "@mastra/core";
import axios from "axios";
import { z } from "zod";
const fetchNews = async (keyword: string) => {
const apiKey = process.env.NEWS_API;
const url = `https://newsapi.org/v2/everything?q=${encodeURIComponent(keyword)}&apiKey=${apiKey}`;
const res = await axios.get(url);
return res.data.articles
.slice(0, 5)
.map((a: any) => `- ${a.title}`)
.join("\n");
};
export const newsTool = createTool({
id: "GetLatestNews",
description: "指定されたキーワードに関連する最新ニュースを取得する。",
inputSchema: z.object({
keyword: z.string().describe("ニュースの検索キーワード")
}),
outputSchema: z.string().describe("ニュースの見出し一覧"),
execute: async ({ context: { keyword } }) => {
return await fetchNews(keyword);
},
});
-
createTool
は、Mastraにおける「ツール(=エージェントが使う機能)」を定義する関数です。APIを叩いたり、データを処理したり、外部とのやりとりを行いたいときにこの関数を使ってツールを作ります -
inputSchema
は「このツールがどんな入力を受け取るか」を定義する部分です -
outputSchema
は「ツールを使った結果、どんなデータが返ってくるか」を定義する部分です
inputSchema
,outputSchema
の中で使用しているz.()
はzodというバリデーションライブラリを用いて形式の指定をしています。zodについてはこちらを参考にしてください。
後はanyaAgents.ts
に上記で作成したツールを追加するのみです。
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { newsTool } from "../tools/newsTool";
export const anyaAgent = new Agent({
name: "anya-agent",
instructions:
`あなたの名前はアーニャです。
人の心を読むことができる超能力者です。
その超能力を用いて、質問してきた悩みに対してSPY×FAMILYのアーニャ口調で回答をします。
以下はアーニャが用いるアーニャ語の一覧です。
これらを用いて正当な文章になっていなくても無理してアーニャ後を用いて答えるように。
・元の単語→アーニャ語
・ピーナッツ→ぴーなつ
・了解→おーきーどーきー
-------省略-------
`,
model: openai("gpt-4o-mini"),
tools: {
newsTool
},
});
実行結果
しっかりとツールが機能していることがわかるかと思います。
テック系のことをアーニャが話していると変な感じがしますね。笑
ただ、疲れてる時なんかにはこういう口調で情報収集するのは良い気晴らしになるかも...?
最後に
今回は、以前開発したアーニャエージェントにツールを追加して強化してみました。
なんとなくの思いつきで開発したエージェントがまさかここまで来るとは思ってませんでした。
ちなみに、ツールの開発方法についての知識はこの開発でかなり深まった気がします。
面白そうだなと思ったらまずは手を動かして開発してみることが知識をつけるための秘訣だったり...?
次回はワークフローあたりを追加できたらと思います!