javascript - 如何让 OpenAI 停止在其答案中添加 "A:"或 "Answer:"?

标签 javascript node.js chatbot openai-api gpt-3

有时,我的 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 有解决方案吗?谢谢。

最佳答案

解决这个问题的方法是设置 logit bias ,额外演练here并且还使用 n .

基本上你可以使用logit bias将特定 token 的可能性设置为从 -100(禁止)到 100(独占选择)。您可以通过获取 token ID 并为其指定正确的值来完成此操作

你要做的就是首先使用 tokenizer tool对于您想要禁止的 token 。这需要一些思考,因为并非所有字符组合都适合一个标记。在您的情况下,“A:”是标记 [32, 25],“Answer:”是 [33706, 25],进一步来说,“Answer”的标记是 [33706],“:”是 [25],“A"是 32。

因此,您需要考虑此处的组合,因为虽然您想禁止“Answer:”和“A:”,但您可能不想禁止“Answer”一词或字母 A。一个可能的选择是禁止“:”负 100 值,并可能对答案产生一些偏差,并轻微偏差 A。当您找出正确的比率时,这可能需要进行一些实验,此外您可能会遇到其他应该禁止的内容,例如“a:”、“答案:”、“A-”等

现在这将帮助您在尝试后禁止使用单词。如果您想要一些额外的缓冲/保护,您还可以向 n 添加一个高于 1 的值。 n 允许您返回多于 1 个答案,您可以让它发送最好的 10 个答案,并按顺序进行直到一个匹配。

所以基本上你会尝试你的逻辑偏差,直到你应用了正确的偏差以确保“A:”和“答案”不会出现,并且你可以添加一些额外的代码来帮助你在它出现时将其过滤掉。下面的例子


 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

上面的代码禁止“:”对“Answer”设置了一个偏差,并对“A”设置了一个小偏差,并为我提供了前 5 个结果,让我可以在出现问题时进行备份。如前所述,您需要尝试 logit 偏差,并且随着“A:”的新变体(如“a:”)的弹出,您可能需要添加更多禁止的标记。

关于javascript - 如何让 OpenAI 停止在其答案中添加 "A:"或 "Answer:"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76865340/

相关文章:

javascript - 结合 JSON 文件与 grunt-contrib-concat

javascript - AngularJS 使用 $rootScope 共享工厂,然后丢弃 $rootScope

javascript - 使用 React-Multi-Carousel react 轮播

node.js - 如何通过 Accumulo 代理客户端基于 rowkey 删除 Accumulo 中的记录

node.js - 修改 $PATH 变量

python - 训练Dialogflow疑惑

node.js - Chatbot 消息不会显示在 Facebook Messenger 聊天头像中

python - Discord 自机器人 : Direct messaging a user when joining a server/guild

javascript - 如何在同一类的所有div上设置点击事件

javascript - 在 Angular 工厂上使用套接字