ChatGPT-3 如何让OpenAI停止在其答案前添加“A:”或“Answer:”?

2hh7jdfx  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(467)

有时候,我的OpenAI API在调用时,

const completion = await openai.createChatCompletion({
  model: 'gpt-3.5-turbo',
  messages: [
    {
      role: 'system',
      content:  `You are ChatbotAssistant, an automated service to answer questions of a website visitors.` +
`You respond in a short, very conversational friendly style. If you can't find an answer, provide no answer and apologize.`
    },
    {role: 'user', content: userQuestion}
  ]
})
 const responseText = completion.data.choices[0].message.content

给出的答案前面加上“A:“或“Answer:“。因为我不需要这样做,我试图通过改变系统消息来明确指示它不要这样做:

`You are ChatbotAssistant, an automated service to answer questions of a website visitors.` +
`Do not prepend "A:" or "Answer:" to your answers` +
`You respond in a short, very conversational friendly style. If you can't find an 
answer, provide no answer and apologize.`

但没有效果。
我知道我可以用JavaScript来处理这个问题,比如。

let cleanedText = responseText

if (responseText.startsWith('A:') || responseText.startsWith('Answer:')) {
  cleanedText = responseText.replace(/^(A:|Answer:)\s*/, '')
}

但OpenAI有解决方案吗?谢谢。

f45qwnt8

f45qwnt81#

解决这个问题的方法是设置logit bias,额外的遍历here并使用n。
基本上,您可以使用logit bias将特定令牌的likihood从-100(禁止)设置为100(独占选择)。
你要做的是首先使用tokenizer tool作为你想要禁止的token/token。这需要一些思考,因为不是所有的字符组合都适合一个token。在你的例子中,"A:"是token [32,25],"Answer:"是[33706,25],更进一步,"Answer"有一个token [33706],":"是[25],"A"是32。
所以你要考虑你的组合在这里,因为当你想禁止"答案:"和"A:"你可能不想禁止单词答案或字母A.一个潜在的选择是禁止":"与负100值,并可能把一些偏见的答案和轻微的偏见A.这可能需要一些实验,因为你找出正确的比例,此外,你可能会遇到其他的东西,你应该禁止像"a:","答案:","A-"等.
如果你想要一些额外的缓冲/保护,你也可以给n增加一个大于1的值。n允许你返回多于1个的答案,你可以让它发送最好的10个答案,然后依次进行,直到有一个匹配。
因此,基本上,您可以对logit偏差进行试验,直到您应用了正确的偏差以确保"A:"和"Answer"不会出现,并且您可以添加一些额外的代码来帮助您在出现时将其过滤掉。

const completion = await openai.createChatCompletion({
  model: 'gpt-3.5-turbo',
  logit_bias={25:-100, 33706:-10, 32,-1},
  n:5,
  messages: [
    {
      role: 'system',
      content:  `You are ChatbotAssistant, an automated service to answer questions of a website visitors.` +
`You respond in a short, very conversational friendly style. If you can't find an answer, provide no answer and apologize.`
    },
    {role: 'user', content: userQuestion}
  ]
})
 const responseText = completion.data.choices[0].message.content

上面的代码bans ":"对"Answer"设置了一个偏差,对"A"设置了一个小偏差,并让我得到了前5个结果,如果出现问题,我可以备份。正如前面提到的,你需要试验logit偏差,当"A:"的新变体(如"a:")弹出时,你可能需要添加更多被禁止的令牌。

相关问题