You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenAI的Telegram Bot多线程会话数据冲突问题求助

解决Telegram Bot多用户会话串数据的问题

你的问题根源在于全局变量my_list被所有用户共享,所有用户的请求都会读写同一个列表,导致不同用户的会话上下文互相覆盖,出现回复串线的情况。要解决这个问题,需要为每个用户维护独立的会话历史,而不是使用全局变量。

修改方案

用字典存储每个用户的会话数据,以用户ID作为唯一键,确保每个用户的对话历史独立:

  • 替换全局变量:将全局的my_list改为字典user_conversations,用于存储每个用户的对话历史
  • 会话初始化:处理消息时,根据用户ID获取或初始化其专属的会话上下文
  • 独立读写:所有对话历史的操作都基于当前用户的专属上下文,不再操作全局变量

修改后的完整代码

from aiogram import Bot, types
import openai
from googletrans import Translator
from aiogram.utils import executor
from aiogram.dispatcher import Dispatcher

TOKEN = "你的Telegram Bot Token"
openai.api_key = "你的OpenAI API Key"

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

# 用字典存储每个用户的会话,键为用户ID,值为包含对话历史的字典
user_conversations = {}

@dp.message_handler(content_types=["text"])
async def start(message: types.Message):
    user_id = message.from_user.id
    translator = Translator()
    
    # 初始化新用户的会话上下文
    if user_id not in user_conversations:
        user_conversations[user_id] = {
            "human_history": "",
            "ai_history": ""
        }
    
    # 翻译用户输入到英文
    dest_language = "en"
    translated_text = translator.translate(message.text, dest=dest_language).text
    current_human_input = "\n\nHuman: " + translated_text + "\n\nAI: "

    # 构造当前用户的完整prompt
    prompt = f"{user_conversations[user_id]['human_history']}{user_conversations[user_id]['ai_history']}{current_human_input}"
    
    # 请求OpenAI
    response = openai.Completion.create(
        model="text-davinci-003",
        prompt=prompt,
        temperature=0.5,
        max_tokens=1024,
        top_p=1.0,
        frequency_penalty=0.5,
        presence_penalty=0.0
    )
    
    # 翻译回复到俄语
    dest_language_2 = "ru"
    translated_reply = translator.translate(text=response['choices'][0]['text'], dest=dest_language_2).text
    await message.answer(translated_reply)
    
    # 更新当前用户的会话历史
    user_conversations[user_id]['ai_history'] = "\n\nAI: " + response.choices[0].text
    user_conversations[user_id]['human_history'] = "\n\nHuman: " + translated_text

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=False)

关键修改说明

  • user_conversations字典:每个用户ID对应一个独立的会话上下文,彻底隔离不同用户的对话数据
  • 会话初始化:新用户首次发送消息时,自动创建其专属的会话存储结构
  • 上下文读写:所有prompt构造和历史更新操作,都只针对当前用户的会话数据,不会影响其他用户

内容的提问来源于stack exchange,提问作者Deoken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:16:06