如题,这个问题不是很理解。官方版 ChatGPT 的会话里面,每次提问回答,后台都默认带着之前所有的内容吗?还是又一定 quota 限制?
我看 openai 的 api 不是这么做的。有人测试过或者了解吗?
1
kkhaike 2023-06-08 15:37:55 +08:00
据我的理解,每个会话不会包含所有内容。
而是 AI 算法经过前面所有内容的最终状态。 你只要知道 chatgpt 本质是个向后生成算法就行 |
2
chitanda 2023-06-08 17:11:50 +08:00
即使在同一个会话中,它也经常想不起来我之前发过的东西,还需要重新发一遍
|
3
brader 2023-06-08 17:27:02 +08:00
目前我接入他们的 API ,确实是自己传递完整的上下文对话给他的,类似这样子,随着对话,数组一直叠加,我不知道你们是不是这么做的
``` [ { "role":"user", "content":"你好" }, { "role":"assistant", "content":"你好!我是 AI 助手,请问你有什么需要帮助的吗?" }, { "role":"user", "content":"我们来玩角色扮演" } ] ``` |
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 提供的接口来看是需要传入之前的话才能实现上下文连贯的。 |
5
zrc199021 OP @didikee 你这个不太对吧,system 代表的是当前会话的「背景设定」类似于:我要你扮演 xx 角色这类信息。
我个人猜测,官方 ChatGPT 和 api 类似,他应该有个默认的上下文容量限制,比如 1024 个 token 什么的。 |
6
mobpsycho100 2023-06-08 18:05:25 +08:00 via iPhone
|
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 里貌似也能得到附带上下文效果,可能我测试太少出现偏差。 |
9
brader 2023-06-08 18:16:24 +08:00
@didikee
@zrc199021 @mobpsycho100 我接入这个 API 做产品也有一段时间了,根据我的个人经验观察,目前我能想到的比较好的方案就是:在综合考虑 API 限制、成本、用户体验下,在单次会话中,我们尽量保证一个足够长的上下文对话长度(比如最后 20 句话),因为多少句话并不能准确衡量消息长度,所以我们同时要递归检测消息长度是否超限,假设 API 的最大 token 限制是 4096 ,那么我们每次递归检查,判断到消息长度超过 4096 ,就丢弃一句上下文对话,直到符合长度限制为止。 |
12
aiqinxuancai 2023-06-09 11:23:45 +08:00
是需要包含之前所有的对话和回复,但是因为 token 有限制( 3.5=4096token ),说了太多的话,会逐步丢弃最早的会话内容,这就是遗忘的本质。
另外 @brader ,token 长度不等于消息文本长度,可以通过 tiktoken 库提前计算 token 。 |
13
Cod1ng 2023-06-22 21:30:55 +08:00
应该是做了某种的摘要,可以在对话多轮之后,问 chatGPT “我说过的第 x 句话是什么”或者“你回复的第 y 句话是什么”,就知道他是否存储了原始的 context 了
|