Momento は AI エージェントの DNA

企業で使える AI エージェントが脆い試作品の段階を超えるには、強力な通信、信頼できるメモリ、スケーラブルなコード実行が必要です。

Allen Helton Allen Helton
Momento が AI の DNA であることを表したイラスト

この 3 年間、技術業界は目まぐるしく変化しました。2022 年 11 月に ChatGPT が登場して以来、私たちは生成 AI を積極的に取り入れ、日常に組み込んできました。エンジニアは IDE のペアプログラマーとして使い、企業は専門的なチャット自動化のために RAG パイプラインを構築しています。多くの人にとって、的を絞った質問に数秒で答える CLI ツールが、実質的に Stack Overflow に取って代わったともいえるでしょう。

2025 年初めに Model Context Protocol が注目され始めると、業界は AI エージェントへ大きく方向転換しました。新たな進歩、概念実証、高度な AI のユースケースが毎日のように登場し、生成 AI の活用はさらに進みました。しかし、まだ初期段階でした。構成要素が多く、概念の主導権を巡る競争も激しい AI エージェントの分野では、多くの人がタスクをこなすエージェントを作っていたものの、その実装は洗練されたものではありませんでした。

スケールせず、分断された場当たり的な実装が、AI エージェント開発の出発点を支えました。しかし、その手法は企業規模には拡張できません。場当たり的な実装は、障害、コストの膨張、セキュリティの盲点につながります。本番対応のシステムには、本番で問題になる前にこうしたリスクを取り除くことが求められます。

幸い、エコシステムは進歩しています。MCP や Agent-to-Agent(A2A)などのプロトコルが登場し、エージェントの動作、通信、協働の方法を定義するようになりました。本番で使えるエージェントの基礎が整いつつあり、Momento も数か月にわたって取り組んできました。

ただし、プロトコルだけでは十分ではありません。本番で使える AI エージェントとは何かを改めて考えると、迅速な通信の仕組み、信頼できるメモリ、スケーラブルなコード実行という 3 つが浮かびます。

通信

エージェントを孤立して動かすべきではありません。すべてを担う単一のエージェントを作ると、権限を与えすぎて、問題が起きたときの影響範囲が大きくなりがちです。一方、単一責任のエージェントなら、それぞれの対象領域を限定し、より良い応答に適したモデルを選び、タスクに不要なコンテキストを減らし、障害が発生する余地を最小限にできます。これは影響範囲の縮小、ガバナンスの改善、運用リスクの低下につながります。

各エージェントの役割を絞ると、タスクの達成には複数のエージェントが必要になります。効率よく、費用対効果を保ってタスクを完了するには、強力な通信の仕組みが欠かせません。A2A プロトコル は、同期通信と非同期通信の両方を定義しています。

イベント駆動のワークフロー

イベント駆動のワークフローでは、監督役のエージェントがタスクを複数に振り分け、更新を購読します。各エージェントは自分の担当を終えると、安全なトピックを介して結果を公開し、終了します。

イベント駆動ワークフローの例

このパターンは A2A で簡単に実装できます。

async function subscribeToAgentUpdates(taskId, a2aClient){
  const taskScope = {
    permissions: [{
      role: TopicRole.PublishOnly,
      cache: CACHE_NAME,
      topic: taskId
    }]
  };

  // generate a disposable token the agent can use to publish
  const token = await momentoAuth.generateDisposableToken(taskScope, ExpiresIn.hours(1));

  await a2aClient.setTaskPushNotificationConfig({
    taskId,
    pushNotificationConfig: {
      url: `${MOMENTO_REGION_ENDPOINT_URL}/topics/${CACHE_NAME}/${taskId}`,
      authentication: { credentials: token }
    }
  });

  // supervisor subscribes to agent updates
  await topicsClient.subscribe(cacheName, taskId, {
    onItem: handleAgentUpdate
  });
}

Momento のベストプラクティスに従うことで、下流のエージェントにはタスクに関係するリソースだけへの限定的なアクセスを安全に付与できます。進捗に応じて、タスク専用のトピックから監督役へイベントを送ります。このパターンはすべてのやり取りに監査証跡を残すため、コンプライアンス対応やトラブルシューティングを、LLM を呼び出すように簡単に行えるようにします。

オーケストレーションされたワークフロー

オーケストレーションされたワークフローでは、監督役のエージェントがワーカーを特定の順序で呼び出します。同期処理の段階ではツールを使い、監査や人による確認のために非同期のワークフローイベントも発行します。

オーケストレーションされたワークフローの例

このワークフローでは、LLM は下流のエージェントを呼び出すツールを利用します。多くの場合、このツールは A2A プロトコルによる呼び出しを包むだけのものです。

async function invokeAgent({ agentUrl, message, contextId, taskId }) {
  const client = new A2AClient(agentUrl);
  const response = await client.sendMessage({
    message: {
      messageId: uuidv4(),
      kind: 'message',
      parts: [{ kind: 'text', text: message }],
      role: 'user',
      contextId,      taskId
    }
  });

  return response.result; 
}

ツールの結果は、下流のエージェントからの同期応答です。監督役はそれを受け取り、ワークフロー内で必要となる他の呼び出しのコンテキストとして使います。

どちらのワークフローでも、Momento Topics はエージェントが必要とする安全でスケーラブルな通信基盤を提供します。メモリとコード実行を組み合わせることで、プロトコルを本番対応のシステムへと変えます。

メモリ

時間とともに改善する信頼性の高い AI エージェントを作るうえで、特に難しいのは、互いに通信する方法よりも、記憶する方法です。企業のワークフローは one-shot プロンプトだけでは完結しません。先ほど見たように、多くの段階にまたがり、複数のエージェントや参加者が関与し、数分から数時間に及ぶこともあります。

企業向けのメモリには、直近のコンテキスト、一時作業領域、長期記憶という 3 つの主要な要素があります。それぞれ機能が異なり、実装も異なります。

企業向けワークフローの図

直近のコンテキスト

エージェントが適切に推論するには、指示に加えて、作業に必要な事実が必要です。開発者がスタックトレースを、サポート担当者がチャット履歴を必要とするのと同じです。このコンテキストは取得または計算され、エージェントの複数の呼び出しで再利用されることがよくあります。Momento Cache はコンテキストを集約し、再試行を冪等にし、重複した作業を避けられるため、この用途によく適しています。

一時作業領域

複数段階のワークフローには、処理中のデータを保存して参照する場所が必要です。ステータス、ワークフローの段階、成果物、実行計画はいずれも、個々のタスクの存続期間に限定された一時データです。関わるすべてのエージェントがアクセスでき、タスク完了時に片付けられる必要があります。

ここでも Momento Cache が適しています。生成した成果物をキャッシュに保存すれば、エージェント間ではキャッシュキーをやり取りするだけでよくなり、通信レイテンシとデータ転送費用を抑えられます。リストなどのキャッシュのデータ型では、監査や監督役の確認に向けてイベントを順に記録できます。これにより意思決定の追跡可能性を確保できます。金融、医療、行政など、コンプライアンスが重視される分野で特に重要です。

長期記憶

長期記憶は、過去の出来事から学び、その知識を行動の改善に役立てる能力です。実行のたびに学習の循環が生まれ、システムは動くほど賢くなります。状態を持たないチャットボットと、堅牢で改善し続ける企業向けシステムを分ける重要な要素です。

この種のメモリでは、重要な情報を耐久性のあるストアに保存し、セッションをまたいで保持する必要があります。RDBMS の構造化レコード、ベクトルストアの意味埋め込み、オブジェクトストレージの成果物など、形はさまざまです。企業向けシステムは時間をかけて知識ベースを蓄積し、エージェントは呼び出されたときにそれを参照します。

Momento Functions は、長期記憶の構築と利用を容易にします。DynamoDB、Redis、ベクトルデータベースなどの永続ストアと直接通信する低レイテンシのインターフェースにより、一時的なデータを解析し、最小限のオーバーヘッドで永続的な記憶として保存できます。統合されたキャッシュと組み合わせれば、追加の運用負担なしに、冪等な書き込みと一貫した読み取りを実現できます。

コード実行

通信とメモリはエージェントの作業環境を支えますが、実際に仕事を行うのはコード実行です。本番環境では、決定的で高速、かつ安全な実行経路が必要です。企業向け AI エージェントの開発には、多くの人が想像する以上にコードが関わります。モデル呼び出し前後の ETL データ処理、ツール実行、エージェント全体の実行まで、一貫性と品質、費用対効果を備えた応答のために、コードを実行する場面は数多くあります。

モデル呼び出し前後の ETL

ETL は抽出、変換、読み込みを意味し、複数システムのデータを単一のリソースにまとめる標準的な方法です。LLM に入力するデータと出力されるデータには、とりわけ重要です。企業は LLM に提供するデータを厳密に管理する必要があり、個人識別情報(PII)の除去や最小権限でのアクセスがデータ準備の重要な要件になります。実行速度を落とさずにデータを安全に保つ、決定的なガードレールが求められます。

モデル呼び出しの後にも、エージェントの利用に一定の決定性を求めるなら、後処理関数、スキーマ検証、データ正規化が欠かせません。キャッシュを統合した、拡張性が高くメモリ効率のよい関数を構築することが、レイテンシを大きく増やさずにコードの安全性を確保する鍵です。

Momento Functions は認証を統合した HTTP エンドポイントを提供し、実行環境で追加の依存関係を必要とせずに利用できます。AI エージェントのコードは HTTP を呼び出してモデル用のデータを準備し、LLM が応答した後にもう一度呼び出して結果の妥当性と正しさを検証できます。

以下では、最小限の Python エージェントが前処理関数を呼び、Claude を実行し、後処理関数で結果を検証・整形します。

import os, requests, anthropic

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

def handler(event):
    rid = event["id"]
    op  = event.get("operation", "summarize")

    # 1) Load the source record by ID
    record = requests.get(f"{DATA_URL}/{rid}", headers=AUTH).json()

    # 2) Pre-process (sanitize, normalize)
    cleaned = requests.post(MOMENTO_PRE_URL, json={"record": record}, headers=AUTH).json()["cleaned"]

    prompt = f"Operation: {op}\n\nData:\n{cleaned}"
    resp = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=400,
        messages=[{"role": "user", "content": prompt}]
    )
    text = resp.content[0].text

    # 3) Post-process (validate schema / coerce enums / add provenance)
    shaped = requests.post(MOMENTO_POST_URL, json={"raw": text, "operation": op, "id": rid}, headers=AUTH).json()

    return {"id": rid, "operation": op, "result": shaped}

呼び出し前後の検証を Functions に任せることで、コードを簡潔に保てます。エージェントは識別子からデータを読み込み、モデルを呼び出し、検証済みの結果を返します。本番での想定外の挙動やスキーマのずれを防げます。

ツール実行

エージェントシステムでコードを動的かつ強力に実行する方法が、ツールです。ツールはエージェントの能力を会話の先へ広げ、LLM にデータの取得、システムの操作、外部 API との連携を可能にします。ツールがなければエージェントは会話をする存在ですが、ツールがあれば行動する存在になります。

Model Context Protocol(MCP) は、エージェントがツールに接続して利用するための業界標準の方法です。エージェントは MCP サーバーで認証し、利用可能なツールとその説明の一覧を受け取ります。LLM が行動のためにツールを使う必要があると判断すると、MCP サーバーを呼び出し、応答を待ちます。

多くの MCP サーバーは API のラッパーとして機能します。ログイン後に LLM がツールを呼ぶと、MCP サーバーは API エンドポイントへ呼び出しを中継します。このパターンは、関数ごとに専用エンドポイントを提供する Momento Functions とよく合います。MCP サーバーへのログイン時に Momento の認証トークンを検証し、そのトークンを使ってツール呼び出しを関数へ中継します。AI エージェントから関数を安全に発見・利用でき、移植性も得られます。

ただし、AI エージェントのツール呼び出しに Momento Functions を使うために、MCP サーバーは必須ではありません。多くの LLM やエージェントフレームワークでは、開発者がツール名、説明、スキーマを定義し、LLM にコンテキストとして提供できます。LLM がツールを必要とすると、呼び出したいツールを示す応答を返し、開発者が LLM に代わって呼び出します。企業システムでは対象をより狭く限定し、制御しやすい環境を実現できます。セキュリティチームがエージェントのアクセス対象を細かく管理でき、攻撃対象領域も減らせます。

以下は、MCP サーバーを介した自動呼び出しではなく、プログラムからツールを呼び出す Amazon Bedrock 対応の TypeScript エージェントの例です。

try {
  const command = buildConverseCommand(agentCards, messages, contextId);
  const response = await bedrock.send(command);

  if (!response.output?.message?.content) {
    const messageContent = response.output.message.content;
    messages.push({ role: 'assistant', content: messageContent });

    const toolUseItem = messageContent.find((item): item is ContentBlock & { toolUse: ToolUseBlock; } => 'toolUse' in item && !!item.toolUse );

    if (toolUseItem) {
      const { toolUse } = toolUseItem;
      const { name: toolName, input: toolInput, toolUseId } = toolUse;

      let toolResult: any;
      try {
        const tool = tools.find(t => t.spec.name === toolName);
        toolResult = await tool.handler(toolInput);
      } catch (toolError: any) {
         console.error(`Tool ${toolName} failed:`, toolError);
         toolResult = { error: toolError.message };
      }

      const block: ToolResultBlock = {
        toolUseId,
        content: [{ text: JSON.stringify(toolResult) }]
      };

      messages.push({ role: 'user', content: [{ toolResult: block}]});
   }
}

この例では、Momento Function を呼び出すハンドラーを含め、すべてのツール定義を tools 配列に保持しています。

エージェントの実行

エージェントには実行環境が必要です。用途に応じて、高い拡張性、耐障害性、低レイテンシが求められます。Momento Functions はエージェントのループを動かすのに適した環境です。

Functions は、エージェントをすばやく安全に開発するためのホスト操作を公開しています。エージェントは、メモリと通信のために Cache と Topics を読み書きし、Amazon Bedrock でモデルを呼び出し、外部 API と連携できます。すべて、厳格なガードレールを備えたマネージドランタイム内で実行できます。

その結果、企業向けのエージェント実行環境が得られます。サーバー管理は不要で、予測できない負荷にも自動でスケールし、IDE から CI/CD まで一貫した開発フローを利用できます。

すべてを組み合わせる

企業向け AI エージェントは、LLM の呼び出しをいくつかつなぐだけでは作れません。エージェント間の通信、メモリの扱い、コードの実行方法と実行場所といった複雑な部分を、大規模に処理する基盤が必要です。

通信はエージェントの分断を防ぎ、協働を可能にします。Momento Topics は、イベント駆動のファンアウトとオーケストレーションされたワークフローの両方を支えます。エージェントの計画やツール利用、さらにコスト管理まで可視化できます。

メモリはエージェントの判断を事実に基づかせ、ハルシネーションの防止に役立ちます。共有コンテキスト、共同の一時作業領域、成果物を Momento Cache に保存すると、安全性だけでなく高いアクセス性も保ち、必要な期間だけデータを利用可能にできます。

コード実行は、LLM による考えを現実の行動に変えます。ツール利用、前後のデータ処理、エージェントのループ自体の実行まで、Momento Functions はエージェントに適した、安全でスケーラブルなマネージドランタイムを提供します。

Momento はこれらの柱を一つのマネージドプラットフォームに統合します。Cache、Topics、Functions により、インフラ管理の複雑さを抱えることなく、信頼性、拡張性、安全性を備えたエージェントの基盤を構築できます。市場投入が速まり、運用負担が減り、高額な再設計をせずに予測可能な形でスケールできるという安心感が得られます。

これが、Momento は AI エージェントの DNA だという意味です。単なる比喩ではありません。Momento は、エージェントが通信し、事実に基づいて判断し、能力を発揮し、障害に耐えるための基本的な指示とシステムを提供します。企業にとっては、リスクの低減、開発の反復の高速化、初日から信頼できるインフラを意味します。Momento は現在のエージェントを可能にするだけでなく、次世代の企業向け AI の基盤です。

場当たり的な実装や障害、コストの膨張を避けながら、AI エージェントの試作品を実用化したいとお考えですか。ご相談ください。

あわせて読みたい