如何让msg.content累加字符串而非被替换,满足Discord GPT-3机器人上下文需求
代码修改方案
核心调整逻辑
- 在collector实例的同级作用域声明上下文存储变量,生命周期和collector保持一致
- 每次触发消息收集事件时,先将新的用户消息按照GPT要求的对话格式追加到上下文变量中
- 拿到GPT返回结果后,同步将AI回复追加到上下文,保证后续请求携带完整对话历史
- collector计时结束/达到最大收集条数时自动清空上下文,避免内存占用
修改后完整代码
// 声明对话上下文存储变量,可根据需求添加初始prompt前缀 let conversationHistory = ''; var collector = new MessageCollector(message.channel, filter, { max: 10, time: 60000, }) collector.on("collect", (msg) => { console.log(msg.content) // 追加用户新消息到上下文,使用固定角色标识方便GPT识别对话角色 conversationHistory += `\n Human: ${msg.content}`; openai.Completion.create({ engine: "davinci", prompt: conversationHistory, temperature: 0.9, max_tokens: 150, top_p: 1, frequency_penalty: 0.35, presence_penalty: 0.6, stop: ["\n", " Human:", " AI:"] }).then((response) => { const aiReply = response.choices[0].text.trim(); // 追加AI回复到上下文,保证后续请求携带全量对话 conversationHistory += `\n AI: ${aiReply}`; message.channel.send(aiReply); }) }) // 监听collector结束事件,清空上下文 collector.on('end', () => { conversationHistory = ''; }) }
注意事项
davinci模型支持的最大token数为4097,该数值包含prompt的总token数和接口返回设置的max_tokens数,对话过长时需要对历史上下文做截断处理,避免触发接口参数错误。
内容的提问来源于stack exchange,提问作者bruh
相关产品推荐
相关产品推荐

