我希望ChatGPT记住过去的对话,并保持对话的一致性(有状态)。
我看过几个代码的ChatGPT提示工程.
有两种方式设计提示如下所示(伪代码)
1.使用单一输入(便宜)〈-如果可能,最好
1.堆叠所有以前的历史记录(昂贵,令牌限制)
def openai_chat(prompt):
completions = openai.Completion.create(
engine = "text-davinci-003",
prompt = prompt,
max_tokens = 1024,
n = 1,
temperature = 0.8,
)
response = completions.choices[0].text.strip()
return response
# 1. Use a single input
while True:
prompt = input("User: ")
completion = openai_chat(prompt)
# 2. Stack all of previous history (prompt + completion)
prompt = ""
while True:
cur_prompt = input("User: ")
prompt += cur_prompt # pseudo code
completion = openai_chat(prompt)
prompt += completion # pseudo code
是否可以选择第一种方式(便宜的方式)来进行一致的对话?
换句话说,即使提示只有当前输入,chatGPT是否会记住过去的历史?
2条答案
按热度按时间k97glaaz1#
一个小问题,ChatGPT是GPT模型的一个非常特定的版本,用于通过ChatGPT在线对话。您使用的是GPT-3。小问题,但很重要。
就回忆过去的对话而言;不,GPT-3不会自动执行此操作。2您需要通过提示符发送数据。
有几个变通办法,但没有一个是完美的,可以使用。
1.总结前面的对话。
使用GPT-3总结前面的对话,以便在下一个提示中提供。这样会失去一些意义,但会减少提示总数。
1.将以前的对话另存为向量嵌入,并使用向量搜索查找以前对话中最相关的部分,然后通过提示发送。这要复杂得多,需要了解GPT-3嵌入终结点。但它可能会解决丢失以前提示的含义的问题。
vs91vp4v2#
Tl; Dr:OpenAI API GPT-3模型不使用之前发送的输入数据来生成新的响应,但对于其他模型,您可以使用微调,这允许您发送更短的提示。
OpenAI今天宣布,正如我在他们的电子邮件通讯中看到的,官方ChatGPT API的发布。在OpenAI API文档中显示为聊天完成,它有一个guide section和一个reference section。
看起来你使用的代码已经过时了,因为它使用了"引擎",这个API已经过时了(参考Engines | OpenAI API Reference),现在OpenAI API使用的是
model
而不是引擎,即,根据https://platform.openai.com/docs/guides/chat ChatGPT(Web应用程序,https://chat.openai.com/chat)是由gpt-3.5-turbo
驱动的,gpt-3.5-turbo
是一个模型,而不是引擎。Chat Completions Guide解释了主要输入是一个messages对象数组,这些对象指定了role,可能是message对象的 * system 、 user * 或 * assistant *,并提到包含对话历史可能会被开发人员修改。
长话短说,每次调用全新的官方ChatGPT API时,您都应该发送一个消息对象数组,其中包含模型 * 构建响应所需的所有数据,它不使用以前调用的信息。
关于令牌限制,从https://platform.openai.com/docs/guides/chat/managing-tokens
...因为总令牌数必须低于模型的最大限制(
gpt-3.5-turbo-0301
为4096个令牌)输入和输出令牌都计入这些数量。
每种模式都有自己的容量,每种模式都有自己的价格。OpenAI说(摘自聊天完成指南)
由于
gpt-3.5-turbo
的性能与text-davinci-003
类似,但每个令牌的价格是text-davinci-003
的10%,因此我们建议将gpt-3.5-turbo
用于大多数使用情形。微调
根据OpenAI API Fine Tuning guide
微调功能目前仅适用于以下基本型号:
davinci
、curie
、babbage
和ada
。参考文献