Comments 9
А имя бот "забыл" (Максим вместо Андрея) или это скриншот из другой сессии?
Иметь вторую память для чат бота - голубая мечта. Складывать туда какие то значимые данные и потом вставлять их перед основной памятью, в системный промпт. Теоретически можно просто каждый новый запрос от юзера пропускать через дополнительный запрос на выделение этих данных, можно даже не сразу а параллельно и другой ллмкой.
Практически...тупить будет так же как с определением намерений юзера (как у яндекса с алисой, юзер говорит алиса вруби чонить, алиса понимает что надо включить панк-рок, и погромче, но на самом деле часто ошибается, а ведь в ее развитие вбухиваются миллионы если не миллиарды).
В первой версии функции памяти мы так и делали - отдельным запросом анализировали что нужно изменить в данных постоянной памяти.
В версии которая описывается в данной статье есть два существенных момента для стабилизации работы:
ИИ может менять значения только определенного ключа в памяти - это существенно снижает риск того, что какие-то данные из памяти будут потеряны.
Решение о сохранении чего-то в постоянной памяти принимается за счет использования встроенного и хорошо отлаженного (по крайней мере в моделях OpenAI) механизма вызова функций. Тем самым экономия в два раза токенов в отличии от первой версии функции памяти.
Получилось запустить функцию на джемини. Оказалось это совсем просто. При создании объекта в него передается список функций, их описание и параметры он сам смотрит (питон такое позволяет), и сам же их вызывает когда думает что это поможет ответить.
Таким образом завести вторую, третью итп память не составит никакого труда.
import google.generativeai as genai
import cfg
import my_google
genai.configure(api_key=cfg.gemini_keys[0])
def func1(location: str) -> str:
'''Return weather forecast for location'''
return f"The weather is good in {location}."
def search_google(query: str) -> str:
'''Search Google for query, return texts of found web pages.'''
return my_google.search_v3(query, max_search=3, download_only=True)[:30000]
model = genai.GenerativeModel('gemini-1.5-flash', tools=[func1,search_google])
chat = model.start_chat(history=[], enable_automatic_function_calling = True)
while 1:
q = input('> ')
r = chat.send_message(q).text.strip()
print(r)
Как человек, который пытался пользоваться этой функцией в ChatGPT, могу сказать что на данный момент это не работает. Намного лучше работать над размером контекста.
Например, может отказаться записывать что либо в список покупок, а потом почему-то записать в память, что я однажды попросил нарисовать мем на армянском языке (потом оооочень долго не мог понять, почему на всех картинках надписи по-армянски)
Попробовал чат с функциями на джемини. Получилось вообще не очень. Функции он исправно дергает, параметры вроде верные передает, но это не сильно помогает. С постоянной памятью работает тоже как то хреново, иногда отвечает сразу и правильно, иногда упирается никак из него не вытащишь даже имя, в отладчике видно что всё ему в память правильно попадает. Похоже что быстрой дешевой модельке мозгов не хватает.
соберите в ProTalk бота с памятью из статьи - интересно ваше мнение
Кстати а функций то может быть несколько и он их сам дергает когда надо и сколько надо раз. Добавил функцию калькулятор - он теперь большие числа правильно считает Ж) Еще погоду и валюты смотрит на сайте а не выдумывает как обычно.
Причем калькулятор сделан через eval(), бот по сути сам пишет программы на питоне и выполняет их на интерпретаторе питона.
JSON словарь в качестве постоянной памяти для GPT-ботов (версия 3.0)