openai запоминание предыдущих ответов

недавно начал писать тг бота с интеграцией туда chatgpt, и возникли некоторые проблемы. Во первых, бот не запоминает прошлые вопросы и ответы пользователю, и каждый раз отвечает заново. Например:

  • User: Сколько лет Илону Маску?
  • ChatGPT: Илону Маску 50 лет. Он родился 28 июня 1971 года.
  • User: Какого он роста?
  • ChatGPT: Извините, я не знаю, о ком или о чем вы говорите. Вам нужно указать объект или человека, о котором вы хотите узнать рост.

Также бот иногда очень долго отвечает, скорее всего это связано с тем, что он отправляет конечный ответ только после генерации всего текста ответа. Можно ли это как-то исправить?

import telebot
from openai import OpenAI
from telebot import types

token = 'bot_token'
bot = telebot.TeleBot(token)

@bot.message_handler(commands=['start'])
def start_message(message):
    markup = types.InlineKeyboardMarkup()
    bt1 = types.InlineKeyboardButton('Текстовая модель (GPT 3.5)', callback_data='bt1')
    bt2 = types.InlineKeyboardButton('Графическая модель (В разработке⚙)', callback_data='bt2')
    bt3 = types.InlineKeyboardButton('Голосовая модель (В разработке⚙)', callback_data='bt3')
    markup.add(bt3, bt2, bt1)
    start = bot.send_message(message.chat.id, 'Привет! Я бот *****. Выбери желаемое действие:', reply_markup=markup)

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
    if call.message:
        if call.data == 'bt1':
            bot.send_message(call.message.chat.id, 'Привет! Я - текстовая модель, готовая ответить на любой твой вопрос.\nСкорее пиши мне!')

@bot.message_handler(content_types=['text'])
def answ(message):
    global cnt
    cnt = message.text
    result = generate()
    print(result)
    bot.send_message(message.chat.id, result)

def generate():
    generated_content = ""
    messages = [
        {"role": "user", "content": cnt}
    ]

    client = OpenAI(api_key='api_key')

    stream = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=messages,
        stream=True,
    )



    for chunk in stream:
        if chunk.choices[0].delta.content is not None:
            generated_content += chunk.choices[0].delta.content
    return generated_content

bot.infinity_polling()

Ответы (1 шт):

Автор решения: Трипольский Пётр

Ответы пользователя нужно заносить в chromadb

Есть пример подобной программы, который реализует ИИ продавца с базой товаров в json документе, можно посмотреть по ссылке

def main():
    chroma_client = chromadb.Client()
    embedding_function = OpenAIEmbeddingFunction(api_key=os.getenv("OPENAI_KEY"), model_name=os.getenv("EMBEDDING_MODEL"))
    collection = chroma_client.create_collection(name="conversations", embedding_function=embedding_function)
    current_id = 0
    while True:
        chat_history = []
        chat_metadata = []
        history_ids = []

        messages=[
            {"role": "system", "content": "You are a kind and wise wizard"}
            ]
        input_text = input("You: ")
        if input_text.lower() == "quit":
            break

        results = collection.query(
            query_texts=[input_text],
            where={"role": "assistant"},
            n_results=2
        )

        # append the query result into the messages
        for res in results['documents'][0]:
            messages.append({"role": "user", "content": f"previous chat: {res}"})

        # append user input at the end of conversation chain
        messages.append({"role": "user", "content": input_text})
        response = generate_response(messages)

        chat_metadata.append({"role":"user"})
        chat_history.append(input_text)
        chat_metadata.append({"role":"assistant"})
        chat_history.append(response['content'])
        current_id += 1
        history_ids.append(f"id_{current_id}")
        current_id += 1
        history_ids.append(f"id_{current_id}")
        collection.add(
            documents=chat_history,
            metadatas=chat_metadata,
            ids=history_ids
        )
        print(f"Wizard: {response['content']}")

if __name__ == "__main__":
    main()
→ Ссылка