原因如下
-
你把對話歷史傳給了它
每次調用 OpenAI 接口時,都會把之前的對話作為參數傳入(messages
列表),模型“看見”了之前你說了什么。 -
它沒有長期記憶
它不會自動記住你是誰或你說過什么,除非你手動保存歷史并再次傳入。 -
依賴上下文窗口
能“記住”的內容是有限的(如 GPT-4 可處理約 128K tokens),超過就會“忘記”早期內容。
總結一句話:
ChatGPT 記住你說過什么,是因為你把歷史對話發給它了,而不是它自己真的記得。
? 核心原理總結一句話:
ChatGPT 并不是“記住”了你說過什么,而是每次調用 API 時,你 把之前的所有對話歷史一起發給它了!
這就是“它知道你說過什么”的根本原因。
代碼
🔧 使用 OpenAI Chat API 的方式
以 openai.ChatCompletion.create()
為例,調用格式是這樣的:
import openaiopenai.api_key = "你的API密鑰"response = openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "system", "content": "你是一個有幫助的助手。"},{"role": "user", "content": "我喜歡貓"},{"role": "assistant", "content": "貓非常可愛,它們很獨立又粘人。"},{"role": "user", "content": "它們為什么這么可愛?"}]
)print(response["choices"][0]["message"]["content"])
📌 分析一下這個 messages
參數
這個 messages
是一個聊天記錄的列表,模型每次生成回答時都會“看到”這里面的全部內容:
role | content |
---|---|
system | 指定模型的行為和角色 |
user | 你每次輸入的內容 |
assistant | 模型上一次的回復 |
所以 ChatGPT 并不是自己“記得”你說了什么,而是你把之前的對話再傳了一次,它“看到”了這些內容,然后做出合理回應。
它能記住多長?
取決于你用的模型:
gpt-3.5-turbo
:默認 16K tokens(約等于 30 頁文檔)gpt-4
:有 128K tokens 的版本(約等于 300 頁)
一旦對話太長,超出最大 token 限制,最早的內容就需要被“截斷”或者刪掉。
舉個動態構造的例子(代碼)
如果你自己寫聊天程序,每次發消息時都要把聊天歷史傳入:
chat_history = []def chat(user_input):chat_history.append({"role": "user", "content": user_input})response = openai.ChatCompletion.create(model="gpt-4",messages=[{"role": "system", "content": "你是一個聊天機器人。"}] + chat_history)assistant_reply = response['choices'][0]['message']['content']chat_history.append({"role": "assistant", "content": assistant_reply})return assistant_reply# 先問第一句
print(chat("我喜歡狗"))# 再問第二句,模型就知道“我”是誰,“狗”是什么
print(chat("它們聰明嗎?"))