🦔

MastraでGAのログを分析するAgentを実装する

2025/03/06に公開

本記事は、AIエージェントフレームワーク「Mastra」を使用して、GAのログデータを分析するエージェントを実装した記録です。
GAログは BigQuery に直接接続せずに CSV + DuckDB を使用する簡単な実装になっています。

Mastraとは

Mastraは、LLM(大規模言語モデル)を活用したエージェント開発フレームワークです。
内部的には AI SDK by Vercel が使用されています。
https://mastra.ai/

実装手順

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