前言
记忆化推理的基础
- 预训练中的知识记忆:在预训练阶段,大模型会接触并学习海量的文本数据,从而记住语言的模式、语义理解、事实性知识以及各种逻辑关系等。例如,模型会记住 “太阳从东方升起” 这一事实,以及不同词语之间的常见搭配和语义关联。
- 参数化记忆:这些记忆以模型参数的形式被存储和表示。通过对大量数据的学习,模型调整参数以拟合数据中的规律和模式,从而在后续推理中能够依据这些参数化的记忆来生成相应的文本或回答。
记忆化推理的优势
- 高效性:能够快速地从记忆中获取信息并生成回答,无需重新进行复杂的计算或推导,提高了推理的效率。尤其在处理常见问题和熟悉的任务时,可以迅速给出答案,节省时间和计算资源。
- 知识丰富性:由于预训练数据的海量性,模型拥有丰富的记忆知识,能够为各种类型的问题提供广泛的背景信息和相关知识支持,从而使推理结果更加全面和准确。
- 适应性:基于记忆的模式识别能力使模型能够较好地适应不同但相似的问题场景,具有一定的泛化能力,可对未曾见过的具体问题依据记忆中的类似模式进行合理的推理和解答。
使用ConversationChain
# 设置OpenAI API密钥
import os
# 导入所需的库
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
# 初始化大语言模型
llm = ChatOpenAI(
model=os.environ.get("LLM_MODELEND"),
temperature=0.5,
)
# 初始化对话链
conv_chain = ConversationChain(llm=llm)
# 打印对话的模板
print(conv_chain.prompt.template)
- 输出
Current conversation:
{history}
Human: {input}
AI:
- 使用ConversationBufferMemory
可以使用ConversationBufferMemory(缓冲记忆)进行最简单的记忆机制
import os
# 导入所需的库
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferMemory
# 初始化大语言模型
llm = ChatOpenAI(
model=os.environ.get("LLM_MODELEND"),
temperature=0.5,
)
# 初始化对话链
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())
# 第一天的对话
# 回合1
conversation("我姐姐明天要过生日,我需要一束生日花束。")
print("第一次对话后的记忆:", conversation.memory.buffer)
# 回合2
conversation("她喜欢粉色玫瑰,颜色是粉色的。")
print("第二次对话后的记忆:", conversation.memory.buffer)
# 回合3 (第二天的对话)
conversation("我又来了,还记得我昨天为什么要来买花吗?")
print("/n第三次对话后时提示:/n", conversation.prompt.template)
print("/n第三次对话后的记忆:/n", conversation.memory.buffer)
输出
第一次对话后的记忆: Human: 我姐姐明天要过生日,我需要一束生日花束。
AI: 那有很多不错的选择呢!如果你的姐姐喜欢优雅的花,白色的百合花束就很合适。百合花象征着纯洁、神圣,白色的百合花更是给人一种清新、高雅的感觉,很适合用来庆祝生日。
或者是粉色的康乃馨花束也很棒。康乃馨代表着母爱、温馨,粉色康乃馨充满了温柔的气息,能表达你对姐姐的爱和祝福。
还有色彩鲜艳的郁金香花束也可以考虑。郁金香有多种颜色,比如红色郁金香代表着浓烈的爱意,黄色郁金香象征着阳光和快乐,把不同颜色的郁金香搭配在一起,会是非常夺目的生日花束。
第二次对话后的记忆: Human: 我姐姐明天要过生日,我需要一束生日花束。
AI: 那有很多不错的选择呢!如果你的姐姐喜欢优雅的花,白色的百合花束就很合适。百合花象征着纯洁、神圣,白色的百合花更是给人一种清新、高雅的感觉,很适合用来庆祝生日。
或者是粉色的康乃馨花束也很棒。康乃馨代表着母爱、温馨,粉色康乃馨充满了温柔的气息,能表达你对姐姐的爱和祝福。
还有色彩鲜艳的郁金香花束也可以考虑。郁金香有多种颜色,比如红色郁金香代表着浓烈的爱意,黄色郁金香象征着阳光和快乐,把不同颜色的郁金香搭配在一起,会是非常夺目的生日花束。
Human: 她喜欢粉色玫瑰,颜色是粉色的。
AI: 粉色玫瑰是个很棒的选择呢!粉色玫瑰通常代表着初恋、特别的关怀和喜欢你那灿烂的微笑。你可以选择一束全是粉色玫瑰的花束,那种纯粹的粉色会非常迷人。如果想要更丰富一些,还可以搭配一些白色的满天星,满天星就像繁星点点,能让整个花束看起来更加梦幻、浪漫,也更能凸显出粉色玫瑰的娇艳。或者搭配一些嫩绿的尤加利叶,它独特的形状和清新的颜色会给花束增添一份自然的气息。
/n第三次对话后时提示:/n The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
Current conversation:
{history}
Human: {input}
AI:
/n第三次对话后的记忆:/n Human: 我姐姐明天要过生日,我需要一束生日花束。
AI: 那有很多不错的选择呢!如果你的姐姐喜欢优雅的花,白色的百合花束就很合适。百合花象征着纯洁、神圣,白色的百合花更是给人一种清新、高雅的感觉,很适合用来庆祝生日。
或者是粉色的康乃馨花束也很棒。康乃馨代表着母爱、温馨,粉色康乃馨充满了温柔的气息,能表达你对姐姐的爱和祝福。
还有色彩鲜艳的郁金香花束也可以考虑。郁金香有多种颜色,比如红色郁金香代表着浓烈的爱意,黄色郁金香象征着阳光和快乐,把不同颜色的郁金香搭配在一起,会是非常夺目的生日花束。
Human: 她喜欢粉色玫瑰,颜色是粉色的。
AI: 粉色玫瑰是个很棒的选择呢!粉色玫瑰通常代表着初恋、特别的关怀和喜欢你那灿烂的微笑。你可以选择一束全是粉色玫瑰的花束,那种纯粹的粉色会非常迷人。如果想要更丰富一些,还可以搭配一些白色的满天星,满天星就像繁星点点,能让整个花束看起来更加梦幻、浪漫,也更能凸显出粉色玫瑰的娇艳。或者搭配一些嫩绿的尤加利叶,它独特的形状和清新的颜色会给花束增添一份自然的气息。
Human: 我又来了,还记得我昨天为什么要来买花吗?
AI: 当然记得,你昨天来是因为你的姐姐明天要过生日,而她喜欢粉色玫瑰,所以你想要一束包含粉色玫瑰的生日花束。
使用ConversationBufferWindowMemory
ConversationBufferWindowMemory 是缓冲窗口记忆,它的思路就是只保存最新最近的几次人类和AI的互动。因此,它在之前的“缓冲记忆”基础上增加了一个窗口值 k。这意味着我们只保留一定数量的过去互动,然后“忘记”之前的互动。
import os
# 导入所需的库
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferWindowMemory
# 初始化大语言模型
llm = ChatOpenAI(
temperature=0.5,
model=os.environ.get("LLM_MODELEND"),
)
# 初始化对话链
conversation = ConversationChain(llm=llm, memory=ConversationBufferWindowMemory(k=1))
# 第一天的对话
# 回合1
result = conversation("我姐姐明天要过生日,我需要一束生日花束。")
print(result)
# 回合2
result = conversation("她喜欢粉色玫瑰,颜色是粉色的。")
# print("\n第二次对话后的记忆:\n", conversation.memory.buffer)
print(result)
# 第二天的对话
# 回合3
result = conversation("我又来了,还记得我昨天为什么要来买花吗?")
print(result)
输出
result = conversation("我姐姐明天要过生日,我需要一束生日花束。")
{'input': '我姐姐明天要过生日,我需要一束生日花束。', 'history': '', 'response': '那有很多不错的选择呢!如果你的姐姐喜欢优雅的花,百合是个很棒的选择。白色的百合象征着纯洁和美好,通常几支百合搭配一些满天星就会非常好看。\n\n要是她比较活泼开朗,向日葵可能很合适。向日葵充满活力,黄色的花朵能带来阳光般的温暖感觉。\n\n玫瑰也是经典的生日花材。红色玫瑰代表热情的爱,粉色玫瑰则更显温柔和甜蜜。你可以把不同颜色的玫瑰混合在一起,再加上一些绿叶点缀,做成一个精美的花束。\n\n另外,郁金香也很受欢迎。它有多种颜色,比如红色郁金香代表着浓烈的爱意,紫色郁金香则有一种神秘而高贵的感觉。你可以根据姐姐的喜好来挑选哦。'}
{'input': '她喜欢粉色玫瑰,颜色是粉色的。', 'history': 'Human: 我姐姐明天要过生日,我需要一束生日花束。\nAI: 那有很多不错的选择呢!如果你的姐姐喜欢优雅的花,百合是个很棒的选择。白色的百合象征着纯洁和美好,通常几支百合搭配一些满天星就会非常好看。\n\n要是她比较活泼开朗,向日葵可能很合适。向日葵充满活力,黄色的花朵能带来阳光般的温暖感觉。\n\n玫瑰也是经典的生日花材。红色玫瑰代表热情的爱,粉色玫瑰则更显温柔和甜蜜。你可以把不同颜色的玫瑰混合在一起,再加上一些绿叶点缀,做成一个精美的花束。\n\n另外,郁金香也很受欢迎。它有多种颜色,比如红色郁金香代表着浓烈的爱意,紫色郁金香则有一种神秘而高贵的感觉。你可以根据姐姐的喜好来挑选哦。', 'response': '那你可以选择10支左右的粉色玫瑰,这是比较常见且美观的数量。再搭配一些白色的洋桔梗,洋桔梗的花瓣层层叠叠,和玫瑰搭配起来很和谐,能增加花束的层次感。还可以加入几枝尤加利叶,它那银绿色的叶子带有淡淡的清香,能让整个花束看起来更加清新自然。然后用淡粉色的包装纸把花束包起来,再系上一个漂亮的蝴蝶结,这样一束充满爱意又很适合生日的花束就完成啦。'}
{'input': '我又来了,还记得我昨天为什么要来买花吗?', 'history': 'Human: 她喜欢粉色玫瑰,颜色是粉色的。\nAI: 那你可以选择10支左右的粉色玫瑰,这是比较常见且美观的数量。再搭配一些白色的洋桔梗,洋桔梗的花瓣层层叠叠,和玫瑰搭配起来很和谐,能增加花束的层次感。还可以加入几枝尤加利叶,它那银绿色的叶子带有淡淡的清香,能让整个花束看起来更加清新自然。然后用淡粉色的包装纸把花束包起来,再系上一个漂亮的蝴蝶结,这样一束充满爱意又很适合生日的花束就完成啦。', 'response': '很抱歉,我不太清楚你昨天买花的原因呢。'}
使用ConversationSummaryMemory
ConversationSummaryMemory(对话总结记忆)的思路就是将对话历史进行汇总,然后再传递给 {history} 参数。这种方法旨在通过对之前的对话进行汇总来避免过度使用 Token。
ConversationSummaryMemory有这么几个核心特点。
- 汇总对话:此方法不是保存整个对话历史,而是每次新的互动发生时对其进行汇总,然后将其添加到之前所有互动的“运行汇总”中。
- 使用LLM进行汇总:该汇总功能由另一个LLM驱动,这意味着对话的汇总实际上是由AI自己进行的。
- 适合长对话:对于长对话,此方法的优势尤为明显。虽然最初使用的 Token 数量较多,但随着对话的进展,汇总方法的增长速度会减慢。与此同时,常规的缓冲内存模型会继续线性增长。
# 导入所需的库
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationSummaryBufferMemory
# 初始化大语言模型
llm = ChatOpenAI(
temperature=0.5,
model=os.environ.get("LLM_MODELEND"),
)
# 初始化对话链
conversation = ConversationChain(
llm=llm, memory=ConversationSummaryBufferMemory(llm=llm, max_token_limit=300)
)
# 第一天的对话
# 回合1
result = conversation("我姐姐明天要过生日,我需要一束生日花束。")
print(result)
# 回合2
result = conversation("她喜欢粉色玫瑰,颜色是粉色的。")
# print("\n第二次对话后的记忆:\n", conversation.memory.buffer)
print(result)
# 第二天的对话
# 回合3
result = conversation("我又来了,还记得我昨天为什么要来买花吗?")
print(result)
- 输出
{'input': '我姐姐明天要过生日,我需要一束生日花束。',
'history': '',
'response': ' 我明白,你需要一束生日花束。我可以为你提供一些建议吗?我可以推荐一些花束给你,比如玫瑰,康乃馨,百合,仙客来,郁金香,满天星等等。挑选一束最适合你姐姐的生日花束吧!'}
{'input': '她喜欢粉色玫瑰,颜色是粉色的。',
'history': "\nThe human asked what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good because it will help humans reach their full potential. The human then asked the AI for advice on what type of flower bouquet to get for their sister's birthday, to which the AI provided a variety of suggestions.",
'response': ' 为了为你的姐姐的生日准备一束花,我建议你搭配粉色玫瑰和白色康乃馨。你可以在玫瑰花束中添加一些紫色的满天星,或者添加一些绿叶以增加颜色对比。这将是一束可爱的花束,让你姐姐的生日更加特别。'}
{'input': '我又来了,还记得我昨天为什么要来买花吗?',
'history': "\n\nThe human asked what the AI thinks of artificial intelligence. The AI thinks artificial intelligence is a force for good because it will help humans reach their full potential. The human then asked the AI for advice on what type of flower bouquet to get for their sister's birthday, to which the AI suggested pink roses and white carnations with the addition of purple aster flowers and green leaves for contrast. This would make a lovely bouquet to make the sister's birthday extra special.",
'response': ' 确实,我记得你昨天想买一束花给你的姐姐作为生日礼物。我建议你买粉红色的玫瑰花和白色的康乃馨花,再加上紫色的雏菊花和绿叶,这样可以让你的姐姐的生日更加特别。'}
使用ConversationSummaryBufferMemory
最后一种记忆机制是ConversationSummaryBufferMemory,即对话总结缓冲记忆,它是一种混合记忆模型,结合了上述各种记忆机制,包括ConversationSummaryMemory 和 ConversationBufferWindowMemory的特点。这种模型旨在在对话中总结早期的互动,同时尽量保留最近互动中的原始内容。