diff --git a/metagpt/memory/longterm_memory.py b/metagpt/memory/longterm_memory.py index 1f4698704..f8abea5f3 100644 --- a/metagpt/memory/longterm_memory.py +++ b/metagpt/memory/longterm_memory.py @@ -42,21 +42,21 @@ class LongTermMemory(Memory): # and ignore adding messages from recover repeatedly self.memory_storage.add(message) - def remember(self, observed: list[Message], k=0) -> list[Message]: + def find_news(self, observed: list[Message], k=0) -> list[Message]: """ - remember the most similar k memories from observed Messages, return all when k=0 - 1. remember the short-term memory(stm) news - 2. integrate the stm news with ltm(long-term memory) news + find news (previously unseen messages) from the the most recent k memories, from all memories when k=0 + 1. find the short-term memory(stm) news + 2. furthermore, filter out similar messages based on ltm(long-term memory), get the final news """ - stm_news = super(LongTermMemory, self).remember(observed, k=k) # shot-term memory news + stm_news = super(LongTermMemory, self).find_news(observed, k=k) # shot-term memory news if not self.memory_storage.is_initialized: - # memory_storage hasn't initialized, use default `remember` to get stm_news + # memory_storage hasn't initialized, use default `find_news` to get stm_news return stm_news ltm_news: list[Message] = [] for mem in stm_news: - # integrate stm & ltm - mem_searched = self.memory_storage.search(mem) + # filter out messages similar to those seen previously in ltm, only keep fresh news + mem_searched = self.memory_storage.search_dissimilar(mem) if len(mem_searched) > 0: ltm_news.append(mem) return ltm_news[-k:] diff --git a/metagpt/memory/memory.py b/metagpt/memory/memory.py index 92f0428a7..c818fa707 100644 --- a/metagpt/memory/memory.py +++ b/metagpt/memory/memory.py @@ -63,8 +63,8 @@ class Memory: """Return the most recent k memories, return all when k=0""" return self.storage[-k:] - def remember(self, observed: list[Message], k=0) -> list[Message]: - """remember the most recent k memories from observed Messages, return all when k=0""" + def find_news(self, observed: list[Message], k=0) -> list[Message]: + """find news (previously unseen messages) from the the most recent k memories, from all memories when k=0""" already_observed = self.get(k) news: list[Message] = [] for i in observed: diff --git a/metagpt/memory/memory_storage.py b/metagpt/memory/memory_storage.py index 8b639150c..302d96aa7 100644 --- a/metagpt/memory/memory_storage.py +++ b/metagpt/memory/memory_storage.py @@ -74,7 +74,7 @@ class MemoryStorage(FaissStore): self.persist() logger.info(f"Agent {self.role_id}'s memory_storage add a message") - def search(self, message: Message, k=4) -> List[Message]: + def search_dissimilar(self, message: Message, k=4) -> List[Message]: """search for dissimilar messages""" if not self.store: return [] diff --git a/metagpt/roles/role.py b/metagpt/roles/role.py index b1ae51cf5..44bb3e976 100644 --- a/metagpt/roles/role.py +++ b/metagpt/roles/role.py @@ -185,7 +185,7 @@ class Role: observed = self._rc.env.memory.get_by_actions(self._rc.watch) - self._rc.news = self._rc.memory.remember(observed) # remember recent exact or similar memories + self._rc.news = self._rc.memory.find_news(observed) # find news (previously unseen messages) from observed messages for i in env_msgs: self.recv(i) diff --git a/metagpt/schema.py b/metagpt/schema.py index 27f5dd10c..bdca093c2 100644 --- a/metagpt/schema.py +++ b/metagpt/schema.py @@ -29,6 +29,7 @@ class Message: cause_by: Type["Action"] = field(default="") sent_from: str = field(default="") send_to: str = field(default="") + restricted_to: str = field(default="") def __str__(self): # prefix = '-'.join([self.role, str(self.cause_by)]) diff --git a/tests/metagpt/memory/test_longterm_memory.py b/tests/metagpt/memory/test_longterm_memory.py index 62a3a2361..dc5540520 100644 --- a/tests/metagpt/memory/test_longterm_memory.py +++ b/tests/metagpt/memory/test_longterm_memory.py @@ -21,35 +21,35 @@ def test_ltm_search(): idea = 'Write a cli snake game' message = Message(role='BOSS', content=idea, cause_by=BossRequirement) - news = ltm.remember([message]) + news = ltm.find_news([message]) assert len(news) == 1 ltm.add(message) sim_idea = 'Write a game of cli snake' sim_message = Message(role='BOSS', content=sim_idea, cause_by=BossRequirement) - news = ltm.remember([sim_message]) + news = ltm.find_news([sim_message]) assert len(news) == 0 ltm.add(sim_message) new_idea = 'Write a 2048 web game' new_message = Message(role='BOSS', content=new_idea, cause_by=BossRequirement) - news = ltm.remember([new_message]) + news = ltm.find_news([new_message]) assert len(news) == 1 ltm.add(new_message) # restore from local index ltm_new = LongTermMemory() ltm_new.recover_memory(role_id, rc) - news = ltm_new.remember([message]) + news = ltm_new.find_news([message]) assert len(news) == 0 ltm_new.recover_memory(role_id, rc) - news = ltm_new.remember([sim_message]) + news = ltm_new.find_news([sim_message]) assert len(news) == 0 new_idea = 'Write a Battle City' new_message = Message(role='BOSS', content=new_idea, cause_by=BossRequirement) - news = ltm_new.remember([new_message]) + news = ltm_new.find_news([new_message]) assert len(news) == 1 ltm_new.clear()