AIGC:从‘金鱼记忆‘到‘过目不忘‘,实例解密大模型是如何记住对话的上下文的?
创作时间:
作者:
@小白创作中心
AIGC:从‘金鱼记忆‘到‘过目不忘‘,实例解密大模型是如何记住对话的上下文的?
引用
CSDN
1.
https://m.blog.csdn.net/surfirst/article/details/143063154
大语言模型(LLM)在对话中表现出"记忆"能力,似乎能够记住之前的对话内容。但实际上,这种"记忆"是如何实现的呢?本文将通过三个部分来探讨这个问题。
1. 无记忆的大模型
首先,让我们看一个简单的程序,展示大模型在默认情况下是没有任何记忆的:
import os
from dotenv import load_dotenv
from langchain_openai import AzureChatOpenAI
from langchain_core.messages import HumanMessage
# 加载环境变量和设置模型
load_dotenv()
model = AzureChatOpenAI(
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)
# 第一次对话
message = HumanMessage(content="I am Bob")
response = model.invoke([message])
print("Model's response:")
print(response.content)
# 第二次对话
message = HumanMessage(content="What's my name?")
response = model.invoke([message])
print("Model's response:")
print(response.content)
让我们看看这个程序的运行结果:
Model's response:
Hello Bob! It's nice to meet you. Is there anything I can help you with today?
Model's response:
I apologize, but I don't have any prior context or information about your name. Each interaction with me starts fresh, and I don't retain information from previous conversations. If you'd like me to know your name, you'll need to tell me in this current conversation. So, may I ask what your name is?
从这个运行结果中,我们可以清楚地看到:
- 在第一次对话中,模型正确地响应了"I am Bob"这个陈述。
- 然而,在第二次对话中,当我们问"What’s my name?"时,模型无法回答这个问题。它表示没有任何先前的上下文或信息来知道用户的名字。
- 模型明确指出每次交互都是全新的开始,它不会保留之前对话的信息。
这个例子清楚地展示了大模型在默认情况下是没有"记忆"的。每次调用都是独立的,模型无法记住之前的对话内容。这就是为什么在实际应用中,我们需要特别的机制来维护对话的上下文。
2. 提供对话历史实现"记忆"
那么,如何让模型"记住"之前的对话呢?答案是:我们需要在每次提问时,将整个对话历史发送给模型。下面是一个实现这一功能的程序:
import os
from dotenv import load_dotenv
from langchain_openai import AzureChatOpenAI
from langchain_core.messages import HumanMessage
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import START, MessagesState, StateGraph
# 加载环境变量和设置模型
load_dotenv()
model = AzureChatOpenAI(
model_name="gpt-4",
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)
# 设置对话图和记忆
workflow = StateGraph(state_schema=MessagesState)
def call_model(state: MessagesState):
response = model.invoke(state["messages"])
return {"messages": response}
workflow.add_edge(START, "model")
workflow.add_node("model", call_model)
memory = MemorySaver()
app = workflow.compile(checkpointer=memory)
# 进行对话
config = {"configurable": {"thread_id": "tom"}}
# 第一次对话
query = "Hi! I'm Bob."
input_messages = [HumanMessage(query)]
output = app.invoke({"messages": input_messages}, config)
output["messages"][-1].pretty_print()
# 第二次对话
query = "What's my name?"
input_messages = [HumanMessage(query)]
output = app.invoke({"messages": input_messages}, config)
output["messages"][-1].pretty_print()
让我们看看这个程序的完整运行结果:
Human: Hi! I'm Bob.
AI: Hello Bob! It's nice to meet you. How can I assist you today?
在这个例子中,我们使用了MemorySaver来保存对话历史,并在每次调用时将整个对话历史发送给模型。这样,模型就能"记住"之前的对话内容,并正确回答"What’s my name?"这个问题。
3. 总结:大模型的"记忆"机制与限制
通过以上两个例子,我们可以得出以下结论:
- 大模型本身没有长期记忆能力。每次调用都是独立的,不会自动记住之前的对话内容。
- 要实现"记忆"效果,我们需要在每次调用时提供完整的对话历史。这就是为什么在实际应用中,我们常常需要保存和管理对话历史。
- 所有的大模型都有对话中token数量的限制。这个限制实际上决定了模型能够"记住"的对话长度。例如,如果一个模型的token限制是4096,那么当对话历史超过这个限制时,我们就需要进行截断或者使用更复杂的方法来管理长对话。
- 这种基于输入的"记忆"机制也解释了为什么大模型可能会产生矛盾的回答 - 如果我们没有提供完整的上下文,模型就可能基于不完整的信息给出不一致的回答。
- 在实际应用中,开发者需要权衡记忆的长度和调用的成本。保存更长的对话历史可以提供更好的上下文理解,但也会增加API调用的成本和延迟。
总的来说,大模型的"记忆"能力是通过每次提供完整对话历史来实现的。这种机制虽然有其局限性,但也为我们提供了灵活管理对话上下文的可能性。在开发基于大模型的应用时,理解并合理利用这一机制是至关重要的。
热门推荐
鲜竹沥液:传统中药的现代科学解读
2025年电动自行车国补来了!最高补贴700元,新国标9月实施
成都太古里:千年古刹旁的时尚地标
马骏院士:增效减毒,纵览鼻咽癌治疗策略的优化进程 | 2024鼻咽癌GRC会议
肺癌放疗指南:副作用及其管理
周杰伦4场演唱会完整歌单及嘉宾名单:五月天张惠妹惊喜助阵
成都灯会:非遗文化的璀璨明珠
揭秘!和田市假玉石交易背后竟是摆拍闹剧?
和田玉:丝路宝藏的千年传承
科普知识 | “健康风险”无处不在,提高重视早安心
智能墨香阁:让AI工具分享充满诗意
八字预测正缘:时间、地点与特征的精准解读
2024年狮子座正缘星座相遇时间揭秘!
为什么建议你:多穿基础款、基础色的衣服?看这27套穿搭示范就懂了
双十一剁手实录:从期待到抢购再到反思
人最好的生活状态,莫过于养成这3种极简的习惯,你有那个?
《尚书》教你如何理解“玩人丧德”的深层含义
掌握这些数字算法,你也能成为数学达人!
黄酒包括哪些酒 黄酒分类及特点
各大黄酒产区:别样的黄酒风韵
寒假必打卡:乌江寨&思达·遵义乐园亲子游攻略
张学友杭州演唱会攻略:时间、交通、入场全指南
瘦子如何增肌增重?附详细健身和饮食计划
见证历史!比特币首次突破10万美元,有分析师预测明年底或涨至22.5万美元
如何理解黄金交易的市场规律?这种规律在实际操作中有哪些体现?
康熙与孝庄太后:停尸多年背后的宫廷秘辛
蒋奇明:用演技赋予王安全新生
蒋奇明:从便利店打工到春晚舞台的逆袭之路
蒋奇明新片《负负得正》:从“道明寺”看都市青年的情感困境
医用同位素,有啥大用场