Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenAI不能进行上下文对话。可否修订一下? #193

Closed
prairiewolf12 opened this issue Feb 17, 2023 · 5 comments
Closed

OpenAI不能进行上下文对话。可否修订一下? #193

prairiewolf12 opened this issue Feb 17, 2023 · 5 comments
Assignees
Labels
operation problem 用户操作问题

Comments

@prairiewolf12
Copy link

prairiewolf12 commented Feb 17, 2023

确认已寻找过答案
chat.openai.com里面的聊天体验很棒,有上下文功能。以下是我找到的一段代码,可以实现这样的体验。单独使用挺好,我尝试加入到AI.py里,我水平有限,没搞成,大神看是否可以加入此功能。

import openai
openai.api_key = "********************"
text = "" #设置一个字符串变量
turns = [] #设置一个列表变量,turn指对话时的话轮
last_result = ""

def get_answer(question):
global text
global turns
global last_result

prompt = text + "\nHuman: " + question

try:
    response = openai.Completion.create(
        model="text-davinci-003",  #这里我们使用的是davinci-003的模型,准确度更高。
        prompt=prompt,  # 你输入的问题
        temperature=0.9,  #  控制结果的随机性,如果希望结果更有创意可以尝试 0.9,或者希望有固定结果可以尝试 0.0
        max_tokens=2048,  #这里限制的是回答的长度,你可以可以限制字数,如:写一个300字作文等。
        top_p=1,
        frequency_penalty=
        0,  #  [控制字符的重复度] -2.0 ~ 2.0 之间的数字,正值会根据新 tokens 在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性
        presence_penalty=
        0  # [控制主题的重复度] -2.0 ~ 2.0 之间的数字,正值会根据到目前为止是否出现在文本中来惩罚新 tokens,从而增加模型谈论新主题的可能性
    )
    result = response["choices"][0]["text"].strip()
    last_result = result
    turns += [question] + [result]  #只有这样迭代才能连续提问理解上下文

    if len(turns) <= 10:  #为了防止超过字数限制程序会爆掉,所以提交的话轮语境为10次。
        text = " ".join(turns)
    else:
        text = " ".join(turns[-10:])
    return result

except Exception as exc:  #捕获异常后打印出来
    print(exc)

if name == 'main':

while True:
    question = input("\n请输入问题,若输入exit退出\n")
    if question == "exit":
        break
    answer = get_answer(question)
    print(answer)
@prairiewolf12
Copy link
Author

连续上下文对话很容易超出max_tokens,所以可能不行。

@prairiewolf11
Copy link

prairiewolf11 commented Mar 26, 2023

果然被我言中了,我就问了2句(马斯克在忙啥,如何画画),就超过最大token了,我设的是4000

openai.error.InvalidRequestError: This model's maximum context length is 4097 tokens. However, you requested 4258 tokens (258 in the messages, 4000 in the completion). Please reduce the length of the messages or completion.

@wzpan
Copy link
Owner

wzpan commented Mar 26, 2023

上下文对话超出 token 数量是不可避免的,这种情况下只能丢弃,目前不存在其他取巧的办法。

master 分支已经加了丢弃会话的处理并自动重试。

另外,我问了半天都没有出现这个情况,是不是你生成的内容实在是太长了。

如果要限制一下一轮返回的字数,其实可以使用 "prefix" 参数:

openai:
    ...
    # 在前面加的一段前缀,可以用来限制 ChatGPT 的回答长度
    # prefix: '请用200字回答:'

@prairiewolf11
Copy link

我把这个prefix清空了,prefix: ''
清掉prefix,我问了一句,它答了218个汉字和空格,应该占436个字节;再问一句时,就提示超过最大token,没搞明白。
事实证明:有个prefix确实是一个非常棒的办法。

我刚测试了加了丢弃后自动重试的程序了,重试后OPENai会有回答,但没有播放了出来。

@wzpan
Copy link
Owner

wzpan commented Mar 26, 2023

我刚测试了加了丢弃后自动重试的程序了,重试后OPENai会有回答,但没有播放了出来。

看了下,丢弃的代码确实有问题,已经修复。提交到了主干。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
operation problem 用户操作问题
Projects
None yet
Development

No branches or pull requests

3 participants