MemX × Kova × Lurus API
記憶を持つ AI カスタマーサポートの構築
目標:30 分以内に、ユーザーの過去の質問を記憶し、クラッシュから自動復旧し、必要に応じて知識を蒸留するサポート Agent を動かします。
30 分動作目標
6 ステップ依存関係から書き戻しまで
3 サービスMemX · Kova · API
アーキテクチャ図
3 つのサービスがそれぞれ役割を担います。MemX は長期記憶の想起と蒸留を、Lurus API は LLM 呼び出しを、Kova WAL は状態の永続化とクラッシュ復旧を担当します。
graph LR
U[ユーザー] --> W[Web フロントエンド]
W -->|HTTP| A[Agent App]
A -->|1. 想起| M[MemX]
A -->|2. LLM| L[Lurus API]
A -->|3. 状態| K[Kova WAL]
A -->|4. 書き込み| M
L --> A
M --> A6 ステップ
依存関係の準備
bashpip install lurus memx-client kova-py lumen-ai openai3 つのサービスの初期化
pythonfrom openai import OpenAI from memx import Memory from kova import KovaClient llm = OpenAI(base_url="https://hub.lurus.cn/v1", api_key="sk-...") mem = Memory(config={"ace_enabled": True}) kova = KovaClient("kova://localhost")Agent 状態の定義
pythonfrom typing import TypedDict, Annotated, Sequence class State(TypedDict): user_id: str messages: Annotated[Sequence, "chat history"] relevant_memory: list履歴の想起 — MemX から現在の質問に関連する記憶を取得します
pythondef retrieve_memory(state: State) -> State: last = state["messages"][-1]["content"] hits = mem.search(last, user_id=state["user_id"], limit=5) return {**state, "relevant_memory": hits}LLM の呼び出しと応答 — 想起した事実を system prompt に注入します
pythondef respond(state: State) -> State: context = "\n".join(h["text"] for h in state["relevant_memory"]) resp = llm.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": f"已知事实:\n{context}"}, *state["messages"], ], ) reply = resp.choices[0].message.content return {**state, "messages": [*state["messages"], {"role": "assistant", "content": reply}]}蒸留と書き戻し — 新しい会話を MemX に書き戻し、次回の想起で利用できるようにします
pythondef distill(state: State) -> State: mem.add( list(state["messages"][-2:]), user_id=state["user_id"], scope="support:general", ) return state
Kova クラッシュ復旧を追加する
Kova を LangGraph の checkpointer として接続すると、Agent はクラッシュ後に WAL から復旧し、LLM を再呼び出ししません。
python
from kova.langgraph import KovaCheckpointer
graph = wf.compile(checkpointer=KovaCheckpointer(kova))なぜ LLM を再呼び出ししないのか
Kova は各ステップの実行を先行書き込みログ(WAL)に記録します。プロセスのクラッシュ後、エンジンはブレークポイントから実行状態を再生し、完了済みの LLM 呼び出しは再び発行されません。これにより Token を節約しつつ、回答の一貫性も保証されます。
完全なプロジェクト成果物
サンプルリポジトリ
https://github.com/hanmahong5-arch/lurus-examples/tree/main/memory-agent — コードの完全版、docker-compose.yml(ローカルで MemX + Kova を起動)、3 ノードをカバーする Pytest、.env.example を含みます。