Share
Embed
Transcript
21 slides
-
自己紹介 Ryoma Aoki (@dogggggo, @dogggggo11) STRACT で開発全般を担当 (フルタイムのエンジニアがまだ2名なもので) 最近は主に PLUG
ショッピングの立ち上げや クラウドインフラのおもり STRACT 入社前は、EC や金融・決済周りの 新規開発やシステムリプレイスなど 最近の流行りは懸垂 (伸び悩み中) 2 -
キャッシュバックについて 配信開始・変更・終了依頼 提携企業 仲介業者 弊社 メールで連絡が届き、メールの情報を元に人手でデータを修正 毎日大量に届くので対応が大変 この作業を自動化しようというのが今回のお話 メールの文面はさまざまなので、LLM で楽にハンドリングしたい
弊社はほぼ全てで TypeScript を採用しているので、TypeScript で実装できると◯ 8 -
Mastra の主な機能 Agents Tools & MCP Memory Workflows RAG Deployment
Observability Evals 11 -
Mastra の主な機能 (今回利用したもの) Agents Tools & MCP Memory Workflows RAG
Deployment Observability Evals 12 -
Mastra の主な機能 (Agents) Agents Tools & MCP Memory Workflows RAG
Deployment Observability Evals const myAgent = new Agent({ name: "myAgent", instructions: "You are a helpful assistant.", model: openai("gpt-4o-mini"), }); const response = await myAgent.generate("..."); const stream = await myAgent.stream("..."); Vercel の AI SDK をベースに、どのプロバイダのどのモデルであっても 統一的なインタフェースで扱える。 13 -
Mastra の主な機能 (Workflows) Agents Tools & MCP Memory Workflows RAG
Deployment Observability Evals const myWorkflow = createWorkflow({ id: "myWorkflow", inputSchema: z.object({ in: z.string() }), outputSchema: z.object({ out: z.string() }), steps: [step1, step2a, step2b, step3] }) .then(step1) .branch([ [async ({ inputData }) => inputData.foo, step2a], [async ({ inputData }) => !inputData.foo, step2b] ]) .then(step3) .commit(); 他に parallel, loop, foreach があったり、workflow を入れ子にできたり。 (※ 上記は最近新しく出た vNext Workflows の話) 14 -
今回作成してみたフロー 1. メール転送 2. メールの内容認識・ 必要な情報抽出 3. 下書きデータ作成 4. 通知
5. 下書き確認 + 承認 Slack Mastra LLM backend API ⼈ 管理画⾯ 15 -
実装例 (agent) const myAgent = new Agent({ name: "myAgent", instructions:
` メールの内容が以下のいずれにあてはまるかを判定してください。 - キャッシュバック案件の掲載開始依頼 - キャッシュバック案件の掲載内容変更依頼 - キャッシュバック案件の掲載終了依頼 いずれかにあてはまる場合には、次の情報を抽出してください。 ... xxx にあてはまる場合は、次の JSON 形式でレスポンスを返してください。 { ... } `, model: google("gemini-2.0-flash"), }); LLM にメールの内容がどういった 内容かを判定してもらい、それぞ れの内容に応じて必要な情報を抽 出して、指定した形式で出力する ように指示。 16 -
実装例 (workflow) const myWorkflow = createWorkflow({ id: "myWorkflow", inputSchema: z.object({
... }), outputSchema: z.object({ ... }), steps: [filter, extract, skip, createDraft], }) .then(filter) .branch([ [async ({ inputData }) => inputData.isTarget, extract], [async ({ inputData }) => !inputData.isTarget, skip], ]) .then(createDraft) .commit(); 無関係なメールが流れてくることも あるので、あらかじめルールベース で処理不要と判断できるものは除外 して、LLM のコストを節約。 処理対象と判断されたら、先ほどの agent を使って処理。 17 -
実装例 (workflow の呼び出し) const mastra = new Mastra({ server: {
apiRoutes: [ registerApiRoute("/xxx", { method: "POST", handler: async (c) => { // authentication, validation const { start } = myWorkflow.createRun(); const res = await start({ inputData: { ... }, }); return c.json(res); }, }) ] } }); Mastra インスタンスに workflow や agent を登録すると、自動で各種 API エンドポイン トが生やされるが、今回は custom API route を作成して、そちらでリクエストを受け取る (Mastra を起動すると Hono ベースの HTTP サーバが立ち上がる)。 {workflow インスタンス}.createRun() で作成 された run インスタンスを start() すると workflow を起動できる。 18 -
所感 今回ぐらいの用途であれば、Mastra を使わずとも、Vercel の AI SDK を使うぐらいでち ょうどよかった RAG とかやるのであれば、Mastra
使うと楽にサクッとできそう 評価や observability 周りも all in one なのはとっつきやすくて Good これからどんどん発展していくと思うので、今後の開発に期待 19