ChatGPT 能“记住上文”的原因

原因如下

  1. 你把对话历史传给了它
    每次调用 OpenAI 接口时,都会把之前的对话作为参数传入(messages 列表),模型“看见”了之前你说了什么。

  2. 它没有长期记忆
    它不会自动记住你是谁或你说过什么,除非你手动保存历史并再次传入。

  3. 依赖上下文窗口
    能“记住”的内容是有限的(如 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 是一个聊天记录的列表,模型每次生成回答时都会“看到”这里面的全部内容:

rolecontent
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("它们聪明吗?"))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序van-dialog确认验证失败时阻止对话框的关闭

使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…

K8S Ingress、IngressController 快速开始

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、理论介绍 1&#xff09;什么是 Ingress 定义&#xff1a;Ingress 是 Kubernetes 中的一种资源对象&#xff0c;它定义了外部访问集群内…

Vue3 + Element Plus 动态表单实现

完整代码 <template><div class"dynamic-form-container"><el-formref"dynamicFormRef":model"formData":rules"formRules"label-width"auto"label-position"top"v-loading"loading"&g…

Mac修改hosts文件方法

Mac修改hosts文件方法 在 macOS 上修改 hosts 文件需要管理员权限 步骤 1&#xff1a;打开终端 通过 Spotlight 搜索&#xff08;Command 空格&#xff09;输入 Terminal&#xff0c;回车打开。或进入 应用程序 > 实用工具 > 终端。 步骤 2&#xff1a;备份 hosts 文件…

深度学习—BP神经网络

文章目录 [TOC](文章目录) 一、基本概念二、 网络结构三、BP神经网络的原理总结特点&#xff1a;应用场景优缺点 一、基本概念 BP 神经网络&#xff08;Backpropagation Neural Network&#xff09;是一种基于误差反向传播算法的多层前馈神经网络&#xff0c;由输入层、隐藏层…

Spring AI(6)——向量存储

向量数据库是一种特殊类型的数据库&#xff0c;在 AI 应用中发挥着至关重要的作用。 在向量数据库中&#xff0c;查询与传统关系型数据库不同。它们执行的是相似性搜索&#xff0c;而非精确匹配。当给定一个向量作为查询时&#xff0c;向量数据库会返回与该查询向量“相似”的…

Qt功能区:简介与安装

Qt功能区 1. 功能区简介2. SARibbon2.1 简介2.2 编译与安装采用CMake-gui进行编译采用VS进行编译安装与使用 Qt 官方不支持 Ribbon 风格&#xff08;Ribbon UI 风格是微软开创的&#xff0c;具有专利许可协议&#xff0c;许可协议对从构建 UI 的指令到每个按钮间的空格数都做了…

iOS safari和android chrome开启网页调试与检查器的方法

手机开启远程调试教程&#xff08;适用于 Chrome / Safari&#xff09; 前端移动端调试指南&#xff5c;适用 iPhone 和 Android&#xff5c;WebDebugX 出品 本教程将详细介绍如何在 iPhone 和 Android 手机上开启网页检查器&#xff0c;配合 WebDebugX 实现远程调试。教程包含…

Golang企业级商城高并发微服务实战

Golang企业级商城高并发微服务实战包含内容介绍&#xff1a; 从零开始讲了百万级单体高并发架构、千万级微服务架构&#xff0c;其中包含Rpc实现微服务、微服务的跨语言调用jsonrpc和protobuf、protobuf的安装、protobuf高级语法、protobuf结合Grpc实现微服务实战、微服务服务…

实现可靠的 WebSocket 连接:心跳与自动重连的最佳实践

概览 本文将手把手教你如何从零编写一个可用于直播或在线聊天的 WSocket 类&#xff0c;依次实现连接建立、心跳检测、断线重连、消息收发以及资源清理等功能。我们将结合 WebSocket API 的标准用法、心跳保持 和 重连策略&#xff0c;并充分运用现代 JavaScript 语法&#xf…

UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview(1)

33 - Human Interface Infrastructure Overview 本章节主要用于介绍Human Interface Infrastructure&#xff08;HII&#xff09;架构介绍&#xff0c;描述如何通过 HII 来管理用户的输入&#xff0c;以及描述在 UEFI spec 中涉及 HII 相关的 Protocol、function 和类型定义。…

ip命令详解

控制网卡的硬件状态 ip link set ens36 down ip link set ens36 up 修改网卡名称&#xff08;临时&#xff09; ip link set ens36 down ip link set ens36 name xxx 修改网卡的mac地址 ip link set ens36 down ip link set xxx name ens36 查看ip的addr ip addr show ip ad…

hadoop中了解yarm

Hadoop中的YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一种新的Hadoop资源管理器&#xff0c;是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度。以下是其相关介绍&#xff1a; 核心思想 将JobTracker的资源管理和作业调度/监控功…

做好的QT软件,换一个笔记本打开后发现字体很小,部分字体还被控件遮挡

出现这种情况的原因主要是屏幕的DPI&#xff08;每英寸点数&#xff09;不同。Qt中控件的大小单位为像素&#xff0c;在高DPI下&#xff0c;控件会变小&#xff0c;低DPI下控件会变大。而Qt中字体的单位默认为磅&#xff0c;无论在什么显示器上显示同一磅值的字体&#xff0c;其…

linux - 权限的概念

目录 用户权限 超级用户与普通用户的区别 超级用户&#xff08;root&#xff09;&#xff1a; 普通用户&#xff1a; 切换用户身份 使用sudo执行高权限命令 用户管理 用户组管理 文件权限 文件访问者类别 基本权限 权限表示方法 权限修改 chmod chown chgrp u…

Python函数返回值的艺术:为何True/False是更优实践及例外情况分析

在Python编程实践中&#xff0c;子程序的返回值设计往往是一个容易被忽视但却至关重要的设计决策。本文将深入探讨为什么返回True/False往往是更好的选择&#xff0c;何时应该避免这种做法&#xff0c;以及如何处理与None值相关的问题。 为什么返回True/False是更好的实践&…

STM32单片机内存分配详细讲解

单片机的内存无非就两种&#xff0c;内部FLASH和SRAM&#xff0c;最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器&#xff0c;即使在断电后&#xff0c;其所…

【Tools】Visual Studio使用经验介绍(包括基本功能、远程调试、引入第三方库等等)

这里写目录标题 1. VS基本使用1.1. 快捷键1.2. 查看变量地址1.3. 查看代码汇编1.4. visual studio 热重载功能的使用1.5. vs远程服务器调试1.6. 引入第三方库VLD1.7. release debug模式 1. VS基本使用 1.1. 快捷键 ctrl c :复制光标所在行 注意&#xff1a;只需要光标在这…

网络爬虫学习之httpx的使用

开篇 本文整理自《Python3 网络爬虫实战》&#xff0c;主要是httpx的使用。 笔记整理 使用urllib库requests库的使用&#xff0c;已经可以爬取绝大多数网站的数据&#xff0c;但对于某些网站依然无能为力。 这是因为这些网站强制使用HTTP/2.0协议访问&#xff0c;这时urllib和r…

Python内存管理:赋值、浅拷贝与深拷贝解析

赋值与共享资源 在Python中&#xff0c;直接赋值操作&#xff08;如 list2 list1&#xff09;会导致两个变量共享同一个内存地址。这意味着对 list1 的修改会直接影响到 list2&#xff0c;因为它们指向同一个对象。 注意: 赋值等于完全共享资源 如果我们不希望这样完全共享&…