MemBase#
概述#
MemBase 定义了Memory与智能体交互基础协议。在使用Evofabric框架时, 可以通过继承MemBase并实现其基础方法完成自定义记忆使用
特性#
统一接口: 所有记忆系统继承自
MemBase,提供一致的调用方式。记忆拓展: 用户可继承MemBase并定义自己的方法。
示例记忆: EvoFabric 在MemBase的基础上实现了RetrievalMem,ChatMem和TaskMem三类常用记忆类型,供用户直接使用。
开源记忆适配#
实现其中retrieval_update, add_messages和clear方法(均为异步)
from typing import Dict, Optional, Union, List
from pydantic import Field, PrivateAttr
from mem0 import AsyncMemory
from evofabric.core.mem import MemBase
from evofabric.core.typing import StateMessage, UserMessage
# Example implementation of Mem0
class Mem0Module(MemBase):
message_rounds: int = Field(default=20,
description="Messages rounds considered in retrieval and save")
mem_config: Dict[str, Union[str, bool, Dict]] = Field(description="Mem0 initialization config")
user_id: str = Field(default="default", description="mem0 user_id")
_mem0_client: Optional[AsyncMemory] = PrivateAttr(default=None)
async def get_client(self) -> AsyncMemory:
"""Initialize AsyncMem when first call"""
if self._mem0_client is None:
self._mem0_client = await AsyncMemory.from_config(self.mem_config)
return self._mem0_client
async def retrieval_update(self, messages: List[StateMessage], **kwargs) -> List[StateMessage]:
"""Implement the retrieval_update method"""
context = "context: "
for msg in messages[-self.message_rounds:]:
context += f"\n{msg.role}: {msg.content}"
_mem0_client = await self.get_client()
items = await _mem0_client.search(context, user_id=self.user_id)
contents = [item['memory'] for item in items['results']]
messages = [UserMessage(content="Historical memory: " + str(contents))] + messages
return messages
# Implement memory update functionality
async def add_messages(self, messages: List[StateMessage], **kwargs) -> None:
"""Implement the add_messages method"""
_mem0_client = await self.get_client()
message_dict = [
{"role": msg.role, "content": msg.content} for msg in messages[-self.message_rounds:]
]
await _mem0_client.add(message_dict, user_id=self.user_id)
return
async def clear(self):
"""Implement the clear method"""
_mem0_client = await self.get_client()
await _mem0_client.reset()
接入Agent#
当前Agent支持传入一个或多个Memory系统。 检索:在Agent推理推理前,会依据上下文信息逐个记忆系统检索,并在消息列表中拼接UserMessage信息。入口方法即retrieval_update。 更新:在智能体推理结束后,将上下文信息逐一更新记忆库。入口方法即 add_messages。 以上执行流程均在智能体内部实现,只需将记忆模块接入即可。
from evofabric.core.agent import AgentNode
# Create an English chat mem
chat_mem = ChatMem(
zh_mode=True,
vectorstore=vectorstore,
chat_client=test_client_common,
feat_define_prompt="Please extract the user's professional identity and personal habits."
)
# Create an agent node using memory
agent = AgentNode(client=chat_client, memory=[retrieval_mem])