如何使用discord.js开发Discord机器人实现GPT-3 davinci与用户对话
问题根因
- 未维护会话上下文:每次调用OpenAI API仅传入用户最新发送的单条消息,没有拼接历史的人类提问和AI回复,模型无法承接对话上下文,无法实现多轮聊天效果
- 缺少聊天场景初始化提示:GPT-3 Playground的聊天预设会在prompt最开头加入引导模型扮演聊天AI的前置提示,当前代码缺失该部分引导内容
- 变量拼写错误:定义的
retart_sequence为拼写错误,正确应为restart_sequence - 传参逻辑错误:prompt没有按照
[初始引导] + [历史会话] + \nHuman: [当前提问]\nAI:的格式拼接,和stop序列配置不匹配
修复后代码
// 初始化会话历史数组和前置引导prompt const initPrompt = "The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\n" let conversationHistory = [] const start_sequence = "\nAI: " const restart_sequence = "\nHuman: " var collector = new MessageCollector(message.channel, filter, { max: 10, time: 60000, }) collector.on("collect", async (msg) => { // 过滤机器人自己的消息,避免循环触发 if (msg.author.bot) return console.log(msg.content) // 拼接当前用户消息到会话历史 conversationHistory.push(`${restart_sequence.slice(1)}${msg.content}`) // 组装完整prompt const fullPrompt = initPrompt + conversationHistory.join("") + start_sequence try { const response = await openai.Completion.create({ engine: "davinci", prompt: fullPrompt, temperature: 0.9, max_tokens: 150, top_p: 1, frequency_penalty: 0.35, presence_penalty: 0.6, stop: [" Human:", " AI:"] }) const aiReply = response.choices[0].text.trim() // 把AI回复存入会话历史 conversationHistory.push(`${start_sequence.slice(1)}${aiReply}`) // 发送回复到频道 message.channel.send(aiReply) } catch (err) { console.error("OpenAI API调用错误:", err) message.channel.send("抱歉,当前无法响应你的请求,请稍后再试。") } })
配置优化提示
- 若需要更长的多轮会话,可适当提升
max_tokens参数,同时调整MessageCollector的max上限,注意davinci模型的上下文总长度限制为2048token - 可根据需求修改
initPrompt的引导内容,自定义AI的人设、回复风格,和Playground的预设修改逻辑完全一致 - 若使用更新的
gpt-3.5-turbo或gpt-4模型,建议改用Chat Completion接口,成本更低效果更好
内容的提问来源于stack exchange,提问作者bruh
相关产品推荐
相关产品推荐

