RUC-GSAI / YuLan-Rec

MIT License
247 stars 14 forks source link

生成两个 LLM 驱动的 agent 对话中,为什么取了 agent2 LTM 中的相关记忆填充 prompt,agent 1 的 LTM 为何不取呢? #8

Closed beshining closed 3 months ago

beshining commented 7 months ago

在 SOCIAL 行为模拟时,当两个 agent 都是 LLM 驱动时,调用 RecAgent::_generate_reaction_between_two 生成二者的对话。在看具体细节时,发现只从 agent2 的 LTM 中提取了相关记忆用来填充 prompt 中的 Most recent observations of {agent_name2},但是 agent1 的却没有这样的历史记忆补充,代码里目前设置是 空字符串,这是为什么呢? 另外 RecAgent::_generate_reaction 中,对 agent 的 Most recent observations 也是设置空,两个地方都是如此,是基于哪些特别的考虑吗? 谢谢!

beshining commented 7 months ago

补充问一下,在 __generate_reaction_betweentwo 提取 agent2 的 LTM 记忆时,调用的函数 _fetch_memories_withlist,会利用 LTM 提取出的和 observation 相关的记忆 retrieved_list,对 STM 中相关的记忆做增强,增强后达到阈值的 STM 记忆会移动至 LTM。 最终返回的 agent2 的 most_recent_memories 是 LTM 中的相关记忆 retrieved_list 加上移除增强记忆后 STM 剩余的记忆。 采用这样的逻辑是因为什么呢,特别是从 LTM 提取出的相关记忆要对 STM 记忆做增强,这是基于什么考虑呢? 谢谢!

Paitesanshi commented 7 months ago

Hi,

  1. 因为Agent的Most recent observations会在self.chain中进行提取,这部分是LangChain本身的实现,在最后的prompt中这部分会进行填充,而不是空字符串。
  2. 这部分内容可以参考我们的论文中对记忆模块的设计。这里记忆模块的设计参考了人的记忆机制,最近观察和想到的事会对记忆有增强的作用,加深印象。想到关联的事的同样如此,所以LTM中提前的记忆会对STM中的记忆进行增强。在决策的时候是长短期记忆结合,所以会是STM+LTM。
beshining commented 6 months ago

Hi,

  1. 因为Agent的Most recent observations会在self.chain中进行提取,这部分是LangChain本身的实现,在最后的prompt中这部分会进行填充,而不是空字符串。
  2. 这部分内容可以参考我们的论文中对记忆模块的设计。这里记忆模块的设计参考了人的记忆机制,最近观察和想到的事会对记忆有增强的作用,加深印象。想到关联的事的同样如此,所以LTM中提前的记忆会对STM中的记忆进行增强。在决策的时候是长短期记忆结合,所以会是STM+LTM。

原来如此,受教了👍 再请问下,langchain 的实现逻辑,和代码中对 agent2 most_recent_memories 的获取逻辑,是一样的吗 谢谢!

Paitesanshi commented 6 months ago

是一样的