1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[AWS]AgentCore MemoryがJSON対応したので、Xのツイートから勝手に日記を書かせてみた

1
Last updated at Posted at 2026-08-26

🙅AgentCoreMemory、会話じゃなくてよくなったぞー!

AgentCoreMemoryのアップデートでCreateEventがJSONペイロードに対応しました。

つまりこのアップデートでログ情報や日々のデータを格納してサマリーしてもらうようなことが可能となります。

実は...今までも会話ではない情報をロールをUSERにして会話を装ってevents投げることでハック的な感じで登録することは可能だったんですよね。今回のアプデでちゃんとした構造で渡すことができるということです。

今までの短期記憶登録
"payload": [{
  "conversational": {
    "content": {
      "text": "今日いろいろありすぎて情報量やばかった🫠 ..."
    },
    "role": "USER"
  }
}]
アプデ後の短期記憶登録
"payload": [{
  "json": {
    "content": {
      "date": "2026-08-25",
      "text": "今日いろいろありすぎて情報量やばかった🫠 ...",
      "type": "tweet",
      "tweetId": "1930000000000000705"
    }
  }
}]

⛏️作ったもの

と、いうわけでXツイートから日記を勝手に作ってくれるアプリを作ってみました。
全体のデータフローはこんな感じです↓
nippou-architecture.png

image.png

ツイートのjsonをDynamoDBに原本として入れておき、日次バッチのLambdaが当日分をQueryしてCreateEvent するだけです。あとはAgentCore Memoryのsummary戦略が勝手に日記へ統合してくれます。日記を生成するコードは1行も書いていません。

XツイートからのDynamoDB自動連携はXのAPI使用料がかかるため、今回は手動で(ギャルのツイートを)登録しました

記事を書いている時点でLambdaランタイム同梱botocoreが 1.43.75 未満だった為Lambda Layerにて実装しております。実際試される方はbotocoreのバージョンを確認してください。

⚖️「それManaged KBでよくない?」

「ログを貯めてLLMで何かするならManaged KBでよくない?」という声が聞こえてきそうなので、先に答えておきます。KBとMemoryは仕事が違います。

Managed KB AgentCore Memory
生成のタイミング 検索時 書込時
成果物 残らない。返るのはレスポンス 残る。memory record という実体

日記は「その日の確定した成果物」であって欲しいですよね。昨日の日記を今日開いたら文面が微妙に違っていたら怖いですよね?KBが返すのはあくまでクエリへのレスポンスで保存されるわけではありません。一方MemoryはCreateEventした時点で抽出・統合(非同期)が走り日記がレコードとして確定します。

🧭設計ポイント

三層の役割分担

役割 寿命
DynamoDB 消えない原本。出典表示 永続
短期記憶(イベント) 取り込みバッファ 有限
長期記憶(レコード) 日記そのもの 永続

ポイントは短期記憶を出典と扱わない点です。イベントは eventExpiryDuration(3〜365日の必須指定)で必ず失効します。永続的な情報はDynamoDBに置くようにしました。

sessionId=日付

summary戦略はセッション単位で統合するのでsessionIdを日付( 2026-08-25 のような文字列)にすれば1日1セッションの日別の日記が勝手にできあがります。

短期記憶のイベントをJSON型で生成する

先日のアップデートでJSON形式で登録できるようになったので活用します

memory_event.py
    payload = to_memory_event_payload(tweet)
    return CreateEventInput(
        memoryId=memory_id,
        actorId=actor_id,
        sessionId=payload["date"],
        eventTimestamp=_to_event_timestamp(tweet.posted_at),
        clientToken=tweet.tweet_id,
        payload=[{"json": {"content": payload}}],
    )

出典はキーで引くだけ

日記から出典ツイートへの逆引き、日記のsessionIdは日付なのでその日付でDynamoDBをQueryすれば原本ツイートが全部出てきます。「知識と原本をキーで繋ぐ」だけのシンプルな設計です。

🧪出来上がったもの...

image.png

う〜ん...ツイートをつなげただけの文章です:frowning2:日記じゃない!
※原因は戦略タイプを”要約”にしたからです。

:haircut_tone2:長期記憶のサマリをカスタムする

というわけで今度は戦略タイプをカスタムにしてプロンプトの設定をやってみます。
ギャルさを全開にします!

create_memory.py
    payload: dict[str, Any] = {
        "name": "nippou_diary",
        "description": "ツイートを日別日記に統合する検証用メモリ",
        "eventExpiryDuration": 7,
        "memoryExecutionRoleArn": execution_role_arn,
        "memoryStrategies": [
            {
                "customMemoryStrategy": {
                    "name": "diaryStyleSummary",
                    "description": "1日分のツイートを日記調の文章に統合する",
                    "namespaces": ["diary/{actorId}/{sessionId}"],
                    "configuration": {
                        "summaryOverride": {
                            "consolidation": {
                                "appendToPrompt": """あなたは渋谷の18歳のギャルです。ギャルになりきって、その日の出来事を1本の日記として書いてください。

1. topic は1つだけ作る。topic 名は日付(YYYY-MM-DD 形式)にする。複数の topic に分けない。
2. topic の中身は、ギャル本人がその日の夜に書いた日記の文章そのものにする。「まじ」
   「やばい」「〜すぎる」「エモい」「尊い」「無理」のようなギャル特有の語彙と絵文字・
   「!」を、1文につき最低1つは必ず使う。地の文でつないで書く。箇条書き・見出し・
   説明文にしない。
   - 悪い例: 「雨が降っていて髪が崩れてしまい、残念に思った。」
   - 良い例: 「まじで雨とか最悪すぎ!せっかく巻いた髪が3分で終わったんだけど😭」
   (この例は文体の見本であり、例の内容を本文に使わない)
3. 出来事を1件につき1段落、というように機械的に並べない。1日を振り返って書くように、
   出来事どうしをつなげたり、まとめたり、軽重をつけたりしながら書く。ツイートを順番に
   並べ替えただけのような構成にしない。
4. 時刻を「10時12分」「10:12」のように数字で書かない。読み手が時間の流れを自然に
   イメージできるように書く。
5. 「〜とつぶやいた」「〜をポストした」のように、投稿という行為を外から描写しない。
   出来事そのものを自分の体験として書く。
6. 元のツイートに書かれていない出来事や行動を足さない。ギャルらしい感情表現や
   リアクションは自由だが、起きていないことを起きたことにしない。
""",
                                "modelId": model_id,
                            },
                        },
                    },
                },
            },
        ],
    }

🧪顧客が本当に必要だったもの(カスタムプロンプトver)

image.png

おぉ〜。カスタムの甲斐あっていい感じの日記になりました:raised_hands:

:ramen:締め

「Bedrockに1日分渡して要約させればよくない?」——正直、日記を1本作るだけならそれで足ります。ただ今回書いたコードはDynamoDBをQueryしてCreateEventを1回叩くだけ。あとはMemoryがやってくれるという部分が新鮮でした。そしてJSONペイロード対応。ロールをUSERに偽装して会話のフリをさせる小細工が要らなくなったのが地味に大きいです。今回触れなかったconsolidationやセマンティック検索も便利なのでそちらもやっていきたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?