🦔
MastraでGAのログを分析するAgentを実装する
本記事は、AIエージェントフレームワーク「Mastra」を使用して、GAのログデータを分析するエージェントを実装した記録です。
GAログは BigQuery に直接接続せずに CSV + DuckDB を使用する簡単な実装になっています。
Mastraとは
Mastraは、LLM(大規模言語モデル)を活用したエージェント開発フレームワークです。
内部的には AI SDK by Vercel が使用されています。
実装手順
1. 環境構築
まずは必要なパッケージをインストールします。
npx create-mastra@latest
でアプリを作成したあとに duckdb だけ追加でも大丈夫です。
npm install @mastra/core @ai-sdk/anthropic duckdb
2. ツールの実装
CSV形式のGAのログデータを扱うためのツールを実装します。
インタフェースはSQLを生成してもらってデータを取得する形なので将来的に BigQuery 向けに書き換えることも可能と思います。
// src/mastra/tools/csvTool.ts
import { z } from "zod";
import { createTool } from "@mastra/core/tools";
import { DuckDBInstance, DuckDBValue } from "@duckdb/node-api";
const instance = await DuckDBInstance.create(":memory:");
const transformBigInt = (data: DuckDBValue[][]) => {
return JSON.parse(
JSON.stringify(data, (_, value) =>
typeof value === "bigint" ? value.toString() : value
)
);
};
export const csvTool = createTool({
id: "query-csv",
description: `execute a sql query to get data from a duckdb database
csv file:
FROM read_csv_auto('src/data/page_view.csv')
column names:
- event_name TEXT
- event_timestamp TIMESTAMP
- user_id TEXT
- ga_session_id BIGINT
- page_location TEXT
- page_title TEXT
- page_referrer TEXT
`,
inputSchema: z.object({
query: z.string(),
}),
outputSchema: z.object({
result: z.array(z.any()),
}),
execute: async ({ context }) => {
const connection = await instance.connect();
try {
const reader = await connection.runAndReadAll(context.query);
const rows = reader.getRows();
const result = transformBigInt(rows);
return result;
} catch (error) {
console.error(error);
return { result: [] };
} finally {
connection.close();
}
},
});
3. エージェントの実装
// src/mastra/agents/gaAnalysisAgent.ts
import { anthropic } from "@ai-sdk/anthropic";
import { Agent } from "@mastra/core/agent";
import { csvTool } from "../tools/csvTool";
export const gaAnalysisAgent = new Agent({
name: "GA Analysis Agent",
instructions: `
You are a helpful log analysis assistant that provides accurate log analysis.
`,
model: anthropic("claude-3-5-sonnet-20241022"),
tools: { csvTool },
});
4. エージェントの利用例
UIから呼び出してみた結果は以下です。
クエリに失敗したらやり直したり目的に対して複数回に分けてツールを呼び出したりしてくれます。
いろいろ調整は必要そうですが、手軽にAgentの実装ができて試行錯誤しやすいのはありがたいと思いました。
まとめ
MastraとDuckDBを組み合わせることで、GAのログデータを分析してくれるエージェントを実装してみました。Agent開発に今まで LangChain/LangGraph を使用していましたが、確かに特定用途以外ではPythonを使わなくてもよくなるのかもというのも感じられました。
Discussion