有时候,我的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有解决方案吗?谢谢。
1条答案
按热度按时间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"不会出现,并且您可以添加一些额外的代码来帮助您在出现时将其过滤掉。
上面的代码bans ":"对"Answer"设置了一个偏差,对"A"设置了一个小偏差,并让我得到了前5个结果,如果出现问题,我可以备份。正如前面提到的,你需要试验logit偏差,当"A:"的新变体(如"a:")弹出时,你可能需要添加更多被禁止的令牌。