😽

Mastraで実装するマルチエージェントAIワークフロー ─ ブログ生成プロセスを3ステップで自動化🚀

に公開

はじめに:生成AIで「品質の高い文章」を作るには?

AIライティングが一瞬で文章を生成してくれる時代になりました。しかし、「すぐ書けること」と「良い文章ができること」は別物です。
一発のプロンプトで仕上げた記事に、読みづらさや文脈の飛び、情報の抜けを感じたことはないでしょうか?

そこで本記事では、複数のAIエージェントを連携させて高品質な記事を生成する 「マルチエージェントAIワークフロー」 を、Mastraというフレームワークを使って構築してみます。

テーマは「ブログ記事の自動生成」。Copywriter → Editor → SEO Optimizerという3つの役割を持つエージェントが、それぞれの知的作業を分担しながら、1本の完成度の高い記事を作り上げます。

生成AIを本格的に業務に活用したい方、プロンプトだけでは限界を感じている方にとって、実用性の高い内容となっています。


なぜマルチエージェントなのか?

1つのLLM(大規模言語モデル)に「いい感じのブログを書いて」と頼むだけでは、構成が甘かったり、トンマナが不安定だったりすることがあります。
これは、人間のライティングと同じように、複数のフェーズ(執筆・編集・最適化)を踏むべきだからです。

そこで、AIに対しても役割を明確に分担し、段階的に意味を積み上げていく構成が必要になります。

エージェント 役割
Copywriter トピックに基づいて初稿を作成
Editor 構成や文体を調整
SEO Optimizer SEO向けにキーワードや構造を最適化

Mastraは、このような思考と行動の分業フローを、型安全かつ直感的に設計・実行できるフレームワークです。


Mastraをインストールする

Mastraの公式で紹介されているインストール手順をもとに進めます
https://mastra.ai/docs/getting-started/installation

使うコマンドはこちら↓

npx create-mastra@latest

以下のような画面になったら完了です

Cursorで開く

Mastraでは公式ドキュメントに参照するためのMCPサーバーが用意されているので、こちらをEnableにしておきましょう。

エージェントを動かすためにはAPIキーが必要となりますので、OpenAIやAnthropicから取得したAPIキーを.envファイルに入力します。

Mastraでワークフローを定義する

まずは、Mastraの基本的な構成要素であるWorkflowを定義します。

import { Workflow, Step } from "@mastra/core/workflows";
import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
import { anthropic } from "@ai-sdk/anthropic";
import { z } from "zod";

const myWorkflow = new Workflow({
  name: "blog-generation-workflow",
  triggerSchema: z.object({
    topic: z.string().describe("The topic for the blog post"),
  }),
});

Step 1:Copywriterで初稿を生成する

Claude 3.5を使って、与えられたトピックに対する初稿を作成します。

const copywriterAgent = new Agent({
  name: "Copywriter",
  instructions: "You are a professional copywriter. Write an original blog post based on the topic.",
  model: anthropic("claude-3-5-sonnet-20241022"),
});

const copywriterStep = new Step({
  id: "copywriterStep",
  execute: async ({ context }) => {
    const topic = context.triggerData.topic;
    const result = await copywriterAgent.generate(`Write a blog post about: ${topic}`);
    return { copy: result.text };
  },
});

Step 2:Editorで文章を整える

次に、OpenAI GPT-4o miniを使って、文章を読みやすく整えます。

const editorAgent = new Agent({
  name: "Editor",
  instructions: "You are an editor. Improve clarity, tone, and structure.",
  model: openai("gpt-4o-mini"),
});

const editorStep = new Step({
  id: "editorStep",
  execute: async ({ context }) => {
    const copy = context.getStepResult("copywriterStep")?.copy;
    const result = await editorAgent.generate(`Edit this blog post for clarity: ${copy}`);
    return { copy: result.text };
  },
});

Step 3:SEO Optimizerで検索対策を行う

最後に、SEOエキスパートエージェントで記事を最適化します。

const seoAgent = new Agent({
  name: "SEOOptimizer",
  instructions: "You are an SEO expert. Add relevant keywords and optimize structure for SEO.",
  model: openai("gpt-4o-mini"),
});

const seoStep = new Step({
  id: "seoStep",
  execute: async ({ context }) => {
    const copy = context.getStepResult("editorStep")?.copy;
    const result = await seoAgent.generate(`Optimize this blog post for SEO: ${copy}`);
    return { optimized: result.text };
  },
});

ワークフローの実行と出力

3つのステップを順番に実行するよう設定します。

myWorkflow
  .step(copywriterStep)
  .then(editorStep)
  .then(seoStep)
  .commit();

最後にsrc/mastra/index.tsにworkflowsを追加します


実行確認

以下のコマンドを使用して、Mastra プレイグラウンドを起動します

npx mastra dev

http://localhost:4111/workflows にアクセスすると、blog-workflowsが出来上がっています。

例えば、「ChatGPT」というテーマを入力すると、

このように記事の生成が開始されます。

ワークフローは1つ1つ順を追ってステップが実行されていくので、以下のように実行中は黄色の丸マーク、実行完了は緑の丸マークで表示されます。

ワークフローができたら

このワークフローの質を高めるためには、プロンプトエンジニアリングが必要となります。

例えば、コピーライターエージェントだけをプロンプトチューニングしたい場合には、以下のようにsrc/mastra/index.tsでcopywriterAgentを呼び出しましょう。

src/agents/index.tsにもエージェントとして定義する必要があります。

こちらを行うことで、Mastraのワークフローにエージェントが追加されます

Mastraプレイグラウンドでは、プロンプトを画面上でチューニングすることができます。以下では、語調をずんだもんのように「なのだ」にするために、右側のプロンプトエンハンス機能を使った例です。

おわりに:AIが書く、ではなく“AIと書く”時代へ

生成AIの強みは、「大量の情報を高速にまとめられる」ことにあります。しかし、そこに文脈・目的・品質といった視点を加えるには、人間が設計するワークフローの力が不可欠です。

Mastraは、エージェントたちを段階的に動かし、「意味のある知的流れ」を形にするためのツールです。
本記事のようなマルチエージェント構成を活用することで、業務に即した高品質なアウトプットを、再現性を持って自動化できます。

Discussion