我们可以通过源码来分析ConversationSummaryBufferMemory是如何实现长短期记忆的。首先要关注ConversationSummaryBufferMemory.save_context()方法,它将每轮对话的inputs和outputs成对加入memory,然后调用self.prune()方法。prune()方法会计算memory的当前token数,如果超过self.max_token_limit,则对超出的messages总结,调用的方法是self.predict_new_summary(pruned_memory, self.moving_summary_buffer)。总结时使用的PromptTemplate来自prompt.py的_DEFAULT_SUMMARIZER_TEMPLATE,_DEFAULT_SUMMARIZER_TEMPLATE的部分内容如下:
EXAMPLE
...
Current summary:
{summary}
New lines of conversation:
{new_lines}
也就是通过示例,让llm学习如何完成长期记忆的总结。
ConversationSummaryBufferMemory是在应用层平衡长短期记忆,我们也可以看看模型层是如何平衡长短期记忆的。RNN模型t时间步的隐藏层参数H_t计算公式为:H_t = phi(X_t*W_xh+H_(t-1)*W_hh+b_h),X_t*W_xh表示短期记忆,H_(t-1)*W_hh表示长期记忆,平衡长短期记忆,就是给短期记忆和长期记忆加一个权重,来控制对整体记忆(H_t)的影响。现代循环神经网络GRU和LSTM的模型有区别,但是原理上都是为短期记忆和长期记忆加权重。