LangChainの限界を超え、AIキャラクターに「心」を実装する。この記事では、感情駆動型AIエージェントの設計フレームワーク『EIDBO』の技術的な核心に迫ります。
EIDBO 構成原理フレームワーク
Intention(意図)は「何を・なぜ」を定義。
Deployment(展開)はツールと順序の計画。
Behavior(行動)は計画の実行。
Outcome(結果)は変化と評価で、次のEmotion/Intentionに重み付けとして循環します。
LangChainだけでは描けない「心の動き」という課題
LangChainを用いて高度なAIエージェントやNPC(Non-Player Character)を開発している皆さんなら、一度はこのような壁に突き当たったことがあるのではないでしょうか。
「LangChainはプロンプト、ツール、メモリを連携させる強力な『器』にはなる。しかし、キャラクターに真の自律性、つまり内面から湧き出る感情や意図に基づいた行動を設計するには、何かが足りない。」
既存の機能だけでは、キャラクターはどうしても外部からの入力に反応するだけの、受動的な存在になりがちです。私たちが目指すのは、喜びや恐怖、好奇心といった感情をきっかけに、自らの意思で目標を立て、世界に働きかけていく、能動的なエージェントです。この「心の流れ」をいかにして設計するか。それが、私たちの挑戦の核心です。
この課題を解決するため、私たちがStable Versyneの基盤技術を用いて開発したのが、感情駆動型AIエージェント設計フレームワーク『EIDBO』です。EIDBOは、キャラクターの内的状態をモデル化し、LangChainの機能を拡張することで、より人間らしい自律的行動を実現するための設計思想であり、具体的な実装指針でもあります。
EIDBOとは:感情から行動への5層モデル
EIDBOは、AIエージェントの意思決定プロセスを、以下の5つの層でモデル化します。
- Emotion(感情): 状況に対する根源的な反応。喜び、怒り、悲しみ、恐怖など。
- Intention(意図): 感情に動機づけられて形成される具体的な目標。「何を」「なぜ」行うのかを定義します。
- Deployment(展開): 意図を達成するための具体的な行動計画。どのツールをどの順序で使うかを決定します。
- Behavior(行動): 計画の実行。実際にツールを使い、外部世界(ゲーム環境など)に働きかけます。
- Outcome(結果): 行動がもたらした変化と、それに対する評価。
このE→I→D→B→Oという一連の流れこそが、キャラクターの「心の回路」となります。LangChainはあくまでこの回路を実装するための強力なツールキット、つまり「器」であり、EIDBOがその「流れ」そのものを定義するのです。
LangChainの機能をEIDBOフレームワークにマッピングする
では、具体的にLangChainのどの要素がEIDBOの各層に対応するのでしょうか。既存の知識を活かせるよう、両者の関係性を整理してみましょう。
| LangChain要素 | 役割 | EIDBO対応 | メモ |
|---|---|---|---|
LLMChain / Agent |
推論と意思決定 | Intention/Behavior | プロンプトが意図の定義と行動のトリガーを担います。 |
Memory(Buffer/Vector) |
文脈保持 | Emotion/Outcome履歴 | 感情や行動結果を記録・保持する役割を担います。 |
Tool |
外部行動 | Deployment | Move/Trade/Askといった具体的な行為APIと連携します。 |
Callback / Tracer |
ログ監査 | Chronicle(記録) | EIDBOサイクル全体のログを追跡可能にします。 |
RunnableSequence |
処理合成 | EIDBOパイプライン | 5層の処理を連結させ、一連の思考プロセスを構築します。 |
このように、LangChainのコンポーネントをEIDBOの概念に沿って再配置することで、単なる機能の連結ではなく、目的志向の、感情駆動型のアーキテクチャを設計することが可能になります。
EIDBOのデータモデル:思考の最小単位を定義する
EIDBOフレームワークにおける思考と行動のサイクルは、以下のようなJSONデータモデルで表現できます。これは、AIエージェントの「心」の状態を記述する、いわば設計図のようなものです。
eid: 現在の支配的な感情(Emotion)を示します。単語だけでなく、Joy@0.8のように強度を持たせることも可能です。intention: 感情から生まれた意図。具体的な目標(goal)と理由(why)、そして優先度(priority)で構成されます。deployment: 意図を実行するための行動計画。どのツール(tool)をどのような引数(args)で使うかを定義します。behavior: 実際に実行された行動のログ。これにはAPI呼び出しだけでなく、発話(say)なども含まれます。outcome: 行動の結果。具体的な指標(metric)と、その結果が意図達成にどれだけ貢献したかを示すスコア(score)で評価されます。このscoreは、次のintentionを更新する際の重要な重み付けとして機能し、学習と適応のサイクルを生み出します。
実装解説:LangChain (Python) でEIDBOサイクルを構築する
ここからは、PythonとLangChainライブラリを使ってEIDBOのサイクルを実装する具体的なコードを見ていきましょう。
ChainからFlowへ──EIDBO構文の再構築
ステップ1:感情から意図を生成する (Emotion → Intention)
まず、現在の状況(context)から感情(Emotion)を抽出し、その感情と世界の状況(world)に基づいて意図(Intention)を生成します。
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")
# コンテキストから感情を分類するプロンプト
EMOTION_PROMPT = PromptTemplate.from_template("""
You are an affect classifier. Label the user's context with one emotion and 0-1 intensity.
Return JSON: {{"eid":"<label>","intensity":<0-1>}}.
Context: {context}
""")
# 感情と世界の状態から意図を導き出すプロンプト
INTENTION_PROMPT = PromptTemplate.from_template("""
Given emotion {eid} (intensity {intensity}) and world_state {world},
derive a concrete goal (what/why) and a priority [0..1].
Return JSON: {{"goal":"", "why":"", "priority":0-1}}
""")
def infer_eid(context):
# LLMを呼び出して感情を推論
return llm.invoke(EMOTION_PROMPT.format(context=context)).content
def infer_intention(eid, intensity, world):
# LLMを呼び出して意図を推論
return llm.invoke(INTENTION_PROMPT.format(eid=eid, intensity=intensity, world=world)).content
このステップでは、LLMの能力を利用して、非構造的なコンテキストから構造化された「感情」と「意図」を生成しているのがポイントです。
ステップ2:意図を行動計画に展開する (Intention → Deployment)
次に、生成された意図を達成するために、利用可能なツール群から最適な行動シーケンスを選択させます。
# エージェントが利用可能なツールリスト
TOOLS = [
{"name":"Move", "sig":{"to":"str"}},
{"name":"Say", "sig":{"text":"str"}},
{"name":"Gather", "sig":{"item":"str","qty":"int"}},
{"name":"Trade", "sig":{"give":"str","take":"str","qty":"int"}}
]
# 意図に基づいてツールシーケンスを選択するプロンプト
SELECT_PROMPT = PromptTemplate.from_template("""
Goal: {goal} / Why: {why} / Priority: {priority}
Available tools: {tools}
Choose minimal tool sequence to advance the goal.
Return JSON list: [{{"tool":"","args":{{}}}}]
""")
def plan_deployment(goal, why, priority):
# LLMを呼び出して行動計画を立案
return llm.invoke(SELECT_PROMPT.format(goal=goal, why=why, priority=priority, tools=TOOLS)).content
ここでもLLMがプランナーとしての役割を果たしており、複雑な意思決定を抽象化しています。
ステップ3:計画を実行し、結果を評価する (Deployment → Behavior → Outcome)
計画された行動シーケンスを外部世界のAPIに適用し、その結果を評価して記録します。
from datetime import datetime as dt
# Deploymentシーケンスを実行する関数
def exec_behavior(seq, world_api):
events=[]
for step in seq:
tool = step["tool"]
args = step["args"]
# 外部世界のAPIを呼び出す
res = world_api.call(tool, **args)
events.append({"tool":tool, "args":args, "result":res})
return events
# 行動の結果をスコアリングする関数
def score_outcome(events):
s = 0.0
for e in events:
if e["tool"] == "Gather": s += 0.02 * e["result"].get("gained",0)
if e["tool"] == "Trade": s += 0.1 * e["result"].get("success",0)
if e["tool"] == "Say": s += 0.05 * e["result"].get("helpOffers",0)
return min(1.0, s)
# EIDBOサイクル全体をChronicleDBに記録する関数
def chronicle_write(npc_id, eid, intention, deployment, events, score, db):
record = {
"ts": dt.utcnow().isoformat(),
"npc": npc_id,
"eid": eid,
"intention": intention,
"deployment": deployment,
"behavior": events,
"outcome": {"score": score}
}
db.insert("chronicle", record)
world_apiはゲームエンジンやシミュレーション環境とのブリッジ役です。EIDBOが「何をすべきか」を決定し、world_apiが「それをどう実行するか」に専念する、という役割分担が重要になります。
テレメトリと安全設計:自律エージェントを責任をもって運用するために
EIDBOフレームワークでは、ChronicleDBに蓄積されたログを通じて、エージェントの振る舞いを詳細に監視(テレメトリ)できます。
- EIDタグ:
eid=Joy@0.62のように感情とその強度を時系列で追跡。 - Intention Drift: 設定された目標がどの程度維持、または逸脱したかの割合。
- Outcome Gain: 行動によって意図達成度がどれだけ向上したか。
- Social Echo: 他のエージェントからの協力や対立といった反応の数。
これらの指標を分析することで、個々のエージェントの成長だけでなく、エージェント社会全体のダイナミクスを理解する手がかりが得られます。これは、エージェントが長期的に学習・適応していくための重要な基盤となります。
同時に、自律的なエージェントには安全設計が不可欠です。
- 行為制限: ツールはホワイトリスト方式で、許可された行動(Move, Say, Gatherなど)しか取れないようにします。
- 出力検査: 生成された行動(特に発言内容)がガードルール(暴力、誹謗中傷などを含まないか)に違反していないかチェックします。
- 可逆ログ:
Chronicleからいつでも過去の状態にロールバックできるように設計します。 - 人間の監督: 重要な意図(
Intention)に対して、人間が「許可/保留/却下」の判断を介在させるレイヤーを設けます。
まとめ:LangChainは「器」、EIDBOは「心の流れ」
この記事では、LangChainを拡張し、AIエージェントに感情と意図に基づいた自律的行動を実装するためのフレームワーク『EIDBO』をご紹介しました。
- LangChainは強力な「器」ですが、それだけではキャラクターの「心」は描けません。
- EIDBOは「感情→意図→展開→行動→結果」という5層モデルで「心の流れ」を定義します。
- このデータモデルと実装パイプラインを導入することで、NPCは単に「会話する存在」から、「目的を持って世界を自律的に変えていく存在」へと進化する可能性を秘めています。
これは、より深遠で、予測不能で、魅力的なインタラクティブ体験を創造するための大きな一歩となるでしょう。
次回は、EIDBOの5層の中でも特に重要なDeployment(展開)設計について深掘りします。意図から具体的な行動計画を生成するための設計指針や、複数の行動を並列で実行させるための優先度制御など、さらに実践的なテクニックを解説する予定です。ご期待ください。