私はAIエージェントでDraftKingsのラインナップを作っていました。するとエージェントが「月曜日だよ」と言ってきたのです。実際は火曜日でした。
これは、$0のバグが、AIインフラの10億ドル規模のギャップをあぶり出したという話です。
マスターズウィークでした。私は、長期稼働のセッションで動くAIエージェント――Hermes――に手伝ってもらい、最適なDraftKingsのゴルフ・ラインナップを組んでいました。しばらく行ったり来たりしていました。選手の成績データを取り込み、オーガスタのコース履歴を分析し、サラリーキャップの配分を最適化するのです。
そして私は、現在の午後の更新情報を織り込むように頼みました。自信満々に「4月6日(月曜日)だよ」と言ってきたのです。練習ラウンド。急ぐ必要はない。
実際は火曜日、4月7日でした。組み合わせ(ペアリング)が発表され、さらに選手が選手プールに追加されていました。
そのエージェントは、従来の意味でのハルシネーションをしていたわけではありません。ゴルフについて事実をでっち上げていたわけでもありません。セッション開始時に――月曜日に――タイムスタンプを渡されていて、その後ずっと、その凍結した1つの時点に乗り続けていました。時間は過ぎました。1日が変わりました。でも、エージェントは知りません。
私はお金を失いませんでした。ですが失っていた可能性は十分にありました。そして、その寸前で回避できた経験が私を深い迷路に連れていき、最終的にオープンソースのライブラリを作るところまで行きました――なぜなら、問題は私のエージェントだけではないからです。問題はすべてのエージェントにあるのです。
問題:時間(テンポラル)盲目
LLMを使っている多くの人が、痛い目に遭うまで考えないことがあります。あなたのエージェントは、いま何時か分かっていないということです。
まあ、本当に。意味のある継続的な意味では。
Claude、GPT-4、その他の任意のモデルでセッションを開始するとき、システムプロンプトには通常、タイムスタンプが含まれます。たとえば次のように:現在の日付は「月曜日、2026年4月6日」です。このタイムスタンプは1度だけ設定されます。更新されません。セッションが6時間続こうが、次の日に会話を再開しようが、モデルは依然として「月曜の朝だ」と思っています。
これは、特定のどれか1つのモデルのバグではありません。LLMが動く仕組みとしての構造的な性質です。LLMはステートレスなテキスト補完エンジンです。時間の経過を体験しません。コンテキストウィンドウを読み取り、レスポンスを生成します。「現在時刻」はプロンプト内の単なる別の文字列にすぎません。そして、誰もその文字列を更新しないなら、劣化していきます。
ツールアクセスを備えたエージェントでも解決しません。エージェントにWeb検索ツール、天気API、カレンダー連携を渡しても、それでも自発的に時刻を確認することはありません。ツールはリアクティブです。エージェントがそれを使うかどうかを決める必要があります。プロンプトが「月曜日だ」と言っているのなら、なぜエージェントはそれを疑うのでしょうか。疑いの感覚は生まれません。内部で時計が刻み続けて認知的不協和を作るような仕組みがないからです。
私はこれを「コンテキスト・ドリフト」と呼びます。エージェントが世界について信じていることと、実際に起きていることとの間で静かにズレる現象です。これはハルシネーション(誤った情報を生成すること)ではありません。より微妙で、しかもおそらくより危険です。つまり、古い真実でありながら、それを完璧な確信とともに運用してしまうことです。
学術文献もこれを裏付けています。LLMにおける時間的推論に関する研究(ThoppilanらやDhingraらの研究を参照)では一貫して、時間に依存した推論でモデルが苦戦し、特に時間的コンテキストが明示的に更新されない場合に、その傾向が強まることが示されています。モデルは時制を混同し、出来事の順序を誤り、そして重要な点として「学習が終わった時点で本当だったこと」と「今この瞬間に本当なこと」を区別できません。
Andrej Karpathyは最近、プロンプトエンジニアリングを「コンテキスト・エンジニアリング」として組み替えました――つまり、モデルのコンテキストウィンドウに、適切なタイミングで適切な情報を取り込む技術です。彼の言うことはまさにその通りだと思います。そして、私たちがエンジニアリングに失敗している最も根本的なコンテキスト要素が「時間への意識」です。現実世界のことをエージェントが推論する前に、エージェントは現実世界での「いつ」を知らなければなりません。
業界はこれを(扱っていない)
AIインフラのエコシステムは盛り上がっています。資金は数十億。スタートアップは数百。にもかかわらず、ほぼ誰もこの特定の問題に取り組んでいません。私の見立てでは、状況はこうです。
陣営1:より大きなコンテキストウィンドウ。GoogleのGeminiは今や200万トークンに対応しています。AnthropicはClaudeのウィンドウをさらに大きくし続けています。理屈はこうです。もっと情報を入れれば、モデルが理解するはずだ、と。しかし大きなウィンドウでは「鮮度」は解決できません。百科事典を丸ごとコンテキストに入れても、モデルはそれでも「外で雨が降っている」ことを知りません。
陣営2:ツール利用と関数呼び出し。MCP(Model Context Protocol)、OpenAIの関数呼び出し、ツール利用フレームワーク――これらはエージェントにできることを与えます。Webを検索する。APIを呼ぶ。天気を確認する。でも本質的にはリアクティブです。エージェントはツールを取りに行く(呼ぶ)べきかどうかを判断しなければなりません。いま手元のコンテキストが十分そうだと感じてしまえば(古くても)、そうしません。モデルに「知らないことを自分で知る」能力を頼っているのです。これはまさにLLMが欠いているメタ認知スキルです。
Mem0、Zep、Lettaのようなメモリ企業は、永続化レイヤー――エージェントが過去の会話やユーザーの好みを覚えられるようにする層――を作っています。これは価値ある取り組みです。でも方向は後ろ向きです。メモリは「何があったか」を教えてくれます。「何がいま起きているか」は教えてくれません。
ComposioやToolhouseのようなツール・プラットフォームは、APIを集約して、エージェントがアクションを起こせるようにします。これもまた価値があります。しかし同様に、行動志向であって常時駆動ではありません。手足はあるが、感覚がない。
埋まっていないギャップ:知覚レイヤーが誰も作っていないことです。つまり、記憶(過去)とツール(アクション)の間に常駐する、常に最新の「アンビエント(環境常時)な認識」です。「尋ねなくても」エージェントに知らせるものです。たとえば「火曜日の17時だ。気温は74°Fで晴れ。ビットコインが直近で2%動いた。ニュースでは何が起きているかはこれだ」と。
人間にはそれがあります。時計をちらっと見る、天気を感じる、見出しを耳にする。私たちはそれを意識的に決めているわけではありません。アンビエントなのです。エージェントにも同等のものが必要です。
Sensaの紹介
Sensaは、AIエージェントにアンビエントな世界認識を与える軽量なPythonライブラリです。関数呼び出し1回。鮮度の高いコンテキスト。毎回。
pip install sensa
from sensa import get_context
context = get_context()
print(context)
出力:
[SENSA — Tue Apr 7, 2026 5:00 PM CDT]
⏱ セッション:<1m | 最終呼び出し:<1m
オースティン、TX:74°F、晴れ、風9mph
BTC:$69,905 (+0.6%) | ETH:$2,145 (+0.2%) | SOL:$82.90 (+1.7%)
イラン人が人間の鎖を作る... | Wireless Festival中止...
以上です。この文章ブロック――およそ87トークン――が、エージェントに世界のリアルタイムなスナップショットを提供します。どんなシステムプロンプトにも注入すれば、エージェントは突然こう分かります:
いま何時か(日時、タイムゾーン、セッション時間、最終やり取りからの経過時間)
天気がどうか(気温、状況、風――位置情報に基づき自動で取得)
マーケットがどうなっているか(BTC、ETH、SOLの価格と24時間の変化)
何が起きているか(主要見出しを圧縮して提示)
4つのチャネル。すべて任意。すべて設定可能。基本的な利用にはAPIキー不要。
中でもセッショントラッキングが特に便利です。
「セッション:<1m | 最終呼び出し:<1m」という行によって、エージェントは、会話が早打ちなのか、ユーザーが3時間いなくなって戻ってきたのかを知れます。これは、エージェントがどう応答すべきかを根本から変えるコンテキストです。
統合パターン
パターン1:基本の注入(5行)
from sensa import get_context
def build_system_prompt():
base = "You are a helpful assistant."
world = get_context()
return f"{base}
{world}"
パターン2:OpenAI / Anthropicのシステムプロンプト
from openai import OpenAI
from sensa import get_context
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": f"You are a helpful assistant.
{get_context()}"
},
{
"role": "user",
"content": "今すぐジョギングに行くべき?"
}
]
)
エージェントは今、気温74°Fで晴れていると知っています――だから実際にこの質問に答えられます。
返却形式: {"translated": "翻訳されたHTML"}パターン3:カスタムチャンネル
from sensa import Sensa, Channel
class PortfolioChannel(Channel):
name = "portfolio"
default_enabled = True
def render(self, config):
# 自分のデータソースから取得する
positions = get_my_positions()
total = sum(p.value for p in positions)
return f" Portfolio: ${total:,.0f} | {len(positions)} positions"
sensa = Sensa(channels=["time", "weather", PortfolioChannel()])
context = sensa.get_context()
チャンネルシステムは拡張されることを前提に設計されています。各チャンネルは、世界の状態の1つのスライスを取得してレンダリングする方法を知っている、自己完結型のユニットです。好きなように組み合わせてください。
設計思想
いくつか、あえて挙げておきたい判断があります:
トークン効率は重要です。あらゆるAPI呼び出しにコンテキストを注入するとき、すべてのトークンが効いてきます。Sensaの出力全体は約87トークンです。これはほとんどのシステムプロンプトよりも少ないです。圧縮にこだわりました――略語、記号、情報密度――その結果、トークンあたり最大の認識を得られるようになっています。
デフォルトは設定不要、必要なときは完全にコントロール。get_context() はそのまま動きます。しかし、チャンネルを設定したり、場所を手動で指定したり、追跡する暗号資産を選んだり、陳腐化(staleness)の閾値を設定したり――そのすべてが可能です。
反応的ではなく、常駐的に。Sensaは、エージェントが呼び出すためのツールではありません。エージェントが常に持っているコンテキストです。これが重要な哲学的な違いです。エージェントに「時間を確認しよう」と判断させたいわけではありません。すでに知っていてほしいのです。
オープンソースでMITライセンス。これはインフラです。無料で、フォーク可能であるべきです。
次に何が来るか
Sensaは本日4つのチャンネル――time、weather、crypto、news――を同梱して出荷します。これから私たちは:
より多くのチャンネル:スポーツのスコアやスケジュール(例:あなたのエージェントがマスターズの順位表を知っている)。カレンダーの認識。インフラの状態(たとえばAWSのus-east-1で問題が起きている?)。市場の営業時間と取引セッション。天文学データ(日の出・日の入り)。空気の質。
フレームワーク向けミドルウェア:LangChain、CrewAI、AutoGen、その他のエージェントフレームワークとのネイティブ統合。手作業で配線しなくても、コンテキストを自動で注入するミドルウェアとしてのSensa。
チャンネルマーケットプレイス:誰でもコンテキストチャンネルを公開し、共有できるレジストリ。自分のドメイン用のチャンネルを作って公開し、他の人にpipでインストールしてもらい、それを自分たちのSensa設定に追加してもらえるようにする。
陳腐化検知:コンテキストが古くなって更新されるべきタイミングを、より賢く追跡する。会話がどれだけ時間に敏感かに応じて、更新頻度を適応的に調整する。
より大きな全体像
私たちは、巨大な変化の初期段階にいます。AIエージェントは、チャットボットから、お金の管理、手術のスケジュール調整、インフラ制御、そして現実世界の意思決定を行う自律システムへと移行しています。重要度(賭け金)は指数関数的に上がっていきます。
そして今のところ、これらのエージェントのほとんどは「今日が何日か」を知りません。
それは可愛い制限ではありません。スタックにおける構造的な失敗です。メモリシステム、ツールのフレームワーク、評価用ハーネス――すべてが重要で、すべてが資金提供され、作られています。ですが、知覚レイヤー――今この瞬間に対する、常駐的でリアルタイムな認識――は見過ごされてきました。
Sensaは、この問題の1つのピースを解決する小さなライブラリです。しかし、構想はどの単一パッケージよりも大きいものです。エージェントには、スキルだけでなく「感覚」が必要です。
さあ始めよう
pip install sensa
GitHub: github.com/terrapin88/sensa
リポジトリにスターを付けてください。イシューを開いてください。どんなチャンネルが欲しいか教えてください。自分で作って、それをまた貢献してください。
もし、「時間を知らない」「天気を知らない」「世界で何が起きているかを知らない」エージェントに痛い目を見たことがあるなら、これがなぜ重要か分かるはずです。
あなたのエージェントには、今なにが起きているかを知るべきです。
SensaはオープンソースでMITライセンスです。私のエージェントが月曜だと思っていた火曜の、田舎の奥で作り込みました。

