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()