V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zrc199021
V2EX  ›  OpenAI

ChatGPT 会话里每条消息的交互,都会包含之前所有的对话吗?

  •  
  •   zrc199021 · 2023-06-08 15:19:53 +08:00 · 1423 次点击
    这是一个创建于 526 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,这个问题不是很理解。官方版 ChatGPT 的会话里面,每次提问回答,后台都默认带着之前所有的内容吗?还是又一定 quota 限制?

    我看 openai 的 api 不是这么做的。有人测试过或者了解吗?

    13 条回复    2023-06-22 21:30:55 +08:00
    kkhaike
        1
    kkhaike  
       2023-06-08 15:37:55 +08:00
    据我的理解,每个会话不会包含所有内容。
    而是 AI 算法经过前面所有内容的最终状态。
    你只要知道 chatgpt 本质是个向后生成算法就行
    chitanda
        2
    chitanda  
       2023-06-08 17:11:50 +08:00
    即使在同一个会话中,它也经常想不起来我之前发过的东西,还需要重新发一遍
    brader
        3
    brader  
       2023-06-08 17:27:02 +08:00
    目前我接入他们的 API ,确实是自己传递完整的上下文对话给他的,类似这样子,随着对话,数组一直叠加,我不知道你们是不是这么做的
    ```
    [
    {
    "role":"user",
    "content":"你好"
    },
    {
    "role":"assistant",
    "content":"你好!我是 AI 助手,请问你有什么需要帮助的吗?"
    },
    {
    "role":"user",
    "content":"我们来玩角色扮演"
    }
    ]

    ```
    didikee
        4
    didikee  
       2023-06-08 17:40:59 +08:00
    在 openai 的接口中:
    {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
    }

    其中的 role 规则:
    role string Required
    The role of the author of this message. One of system, user, or assistant.

    user 代表用户输入的内容。system 即代表上下文,也就是你之前说的话。

    所以从 openai 提供的接口来看是需要传入之前的话才能实现上下文连贯的。
    zrc199021
        5
    zrc199021  
    OP
       2023-06-08 17:51:01 +08:00
    @didikee 你这个不太对吧,system 代表的是当前会话的「背景设定」类似于:我要你扮演 xx 角色这类信息。

    我个人猜测,官方 ChatGPT 和 api 类似,他应该有个默认的上下文容量限制,比如 1024 个 token 什么的。
    mobpsycho100
        6
    mobpsycho100  
       2023-06-08 18:05:25 +08:00 via iPhone
    didikee
        7
    didikee  
       2023-06-08 18:05:26 +08:00
    @zrc199021 确实,我理解有误。根据这篇文章 ( https://ai.stackexchange.com/questions/39837/meaning-of-roles-in-the-api-of-gpt-4-chatgpt-system-user-assistant )的解释,应该需要像 @brader 回答的一样把之前的对话带过去。我目前使用的是别人写好的一个 UI 框架,它可以设置最多附带的上下文语句的数量。

    我之前在测试的时候把之前说过的话放在 system 里貌似也能得到附带上下文效果,可能我测试太少出现偏差。
    brader
        8
    brader  
       2023-06-08 18:09:13 +08:00
    @zrc199021 很早以前是限 1024 的,现在好像放宽大多了,能满足你大部分的使用场景了
    brader
        9
    brader  
       2023-06-08 18:16:24 +08:00
    @didikee
    @zrc199021
    @mobpsycho100 我接入这个 API 做产品也有一段时间了,根据我的个人经验观察,目前我能想到的比较好的方案就是:在综合考虑 API 限制、成本、用户体验下,在单次会话中,我们尽量保证一个足够长的上下文对话长度(比如最后 20 句话),因为多少句话并不能准确衡量消息长度,所以我们同时要递归检测消息长度是否超限,假设 API 的最大 token 限制是 4096 ,那么我们每次递归检查,判断到消息长度超过 4096 ,就丢弃一句上下文对话,直到符合长度限制为止。
    C0nvN3t
        10
    C0nvN3t  
       2023-06-09 10:22:16 +08:00
    @brader 大文本貌似还是不行 需要手动分片请求
    brader
        11
    brader  
       2023-06-09 10:39:55 +08:00
    @C0nvN3t 再怎么分片都是没有用的,别人有上限,你不同会话,就没有了关联性了
    aiqinxuancai
        12
    aiqinxuancai  
       2023-06-09 11:23:45 +08:00
    是需要包含之前所有的对话和回复,但是因为 token 有限制( 3.5=4096token ),说了太多的话,会逐步丢弃最早的会话内容,这就是遗忘的本质。

    另外 @brader ,token 长度不等于消息文本长度,可以通过 tiktoken 库提前计算 token 。
    Cod1ng
        13
    Cod1ng  
       2023-06-22 21:30:55 +08:00
    应该是做了某种的摘要,可以在对话多轮之后,问 chatGPT “我说过的第 x 句话是什么”或者“你回复的第 y 句话是什么”,就知道他是否存储了原始的 context 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1041 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:53 · PVG 03:53 · LAX 11:53 · JFK 14:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.