JSON dictionary as persistent memory for GPT bots
What problem are we solving?
Any GPT bot based on any LLM (for example, ChatGPT) must itself and invisible to the user remember into permanent memory the information we need from the dialogue.
Step #1: Create a Function Definition
{
"name": "ai_memory_v3",
"description": "Call this function when you need to make adjustments to JSON memory.",
"parameters": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "New or existing key from JSON memory",
},
"value": {
"type": "string",
"description": "Text to be written by the specified key",
},
"action": {
"type": "string",
"enum": ["+", '-', '.', '_'],
"description": "Action type. `+` - means adding information to memory. `-` - means deleting information from memory. `.` - means changing information in memory. `_` - means clear all memory",
},
},
"required": ["key", "value", "action"],
},
},
Our function parameters:
“key” – New or existing key from JSON memory. This parameter specifies which key the action will be applied to.
“value” – Text that will be written according to the specified key. This parameter contains data that will be added, changed or deleted in memory.
“action” – The type of action that will be performed on the memory. Possible values:
–+
– adding information to memory.
–-
– deleting information from memory.
–.
– change of information in memory.
–_
– clearing all memory.
Function handler on our server
from flask import Flask, request, json
import os
import logging
# Инициализация логгера
logger = logging.getLogger(__name__)
config.ROOT_PATH = '/path/to/your/application/' # Установите корректный путь к приложению
# Создаем экземпляр приложения Flask
app = Flask(__name__)
# Определение маршрута и функции для записи в постоянную память
@app.route('/write_memory_dict', methods=['POST'])
def write_memory_dict():
# Получение данных из запроса в формате JSON
data = GetJsonFromRequest(request)
# Логирование данных запроса
logger.debug(f"[/write_memory_dict] {data}")
# Инициализация сообщения для пользователя
Res="Покажи новое состояние памяти и получи подтверждение на внесение изменений пользователю.n"
# Основная логика для обработки различных действий
if data['action'] == '_':
try:
# Попытка удалить файл памяти
os.remove(config.ROOT_PATH + 'json_memory/' + data['chat_id'])
except Exception as e:
# Если файл не найден, логируем предупреждение
logger.warning(f"File not found {data['chat_id']}")
# Ответ о том, что память очищена
Res="Память очищена.n"
else:
# Имя файла соответствует chat_id
filename = data['chat_id']
memory_json = {}
if filename is not None:
# Чтение существующего файла памяти
memory_json = read_file(config.ROOT_PATH + 'json_memory/' + filename)
try:
# Попытка преобразовать прочитанные данные из файла в JSON
memory_json = json.loads(memory_json)
except:
# Если преобразование не удалось, считаем что данных нет
memory_json = {}
# Добавление данных в память
if data['action'] == '+' and data['key'] not in memory_json:
memory_json[data['key']] = data['value']
Res="Данные добавлены в постоянную память.n"
if data['action'] == '+' and data['key'] in memory_json:
memory_json[data['key']] += ', ' + data['value']
Res="Данные добавлены в постоянную память.\n"
# Удаление данных из памяти
if data['action'] == '-' and data['key'] in memory_json:
memory_json.pop(data['key'])
Res="Данные удалены из постоянной памяти.n"
# Обновление данных в памяти
if data['action'] == '.' and data['key'] in memory_json:
memory_json[data['key']] = data['value']
Res="Данные в постоянной памяти изменены.n"
# Сохранение изменений в файл
if filename is not None and memory_json is not {}:
with open(config.ROOT_PATH + 'json_memory/' + filename, 'w', encoding='utf-8') as f:
json.dump(memory_json, f, ensure_ascii=False, indent=4)
# Логирование успешного сохранения
logger.info(f"/write memory_json OK {filename}, {memory_json}")
Res += 'Данные сохранены в постоянную память.n'
# Возвращение ответа клиенту
return json.dumps(Res), 200
# Функция для чтения файла, предполагается, что она определена где-то в коде
def read_file(file_path):
# Тут должна быть ваша реализация функции чтения файла
pass
# Функция для получения JSON из запроса, предполагается, что она определена где-то в коде
def GetJsonFromRequest(req):
# Тут должна быть ваша реализация функции извлечения JSON из запроса
pass
# Запустить приложение, если файл запущен напрямую
if __name__ == '__main__':
app.run()
Creating a bot to test persistent memory
![Bot for testing persistent memory on the ProTalk platform Bot for testing persistent memory on the ProTalk platform](https://habrastorage.org/getpro/habr/upload_files/9f2/98f/7cd/9f298f7cd4cd647b26d5a77c0987d5a0.png)
![Connecting our function to the bot Connecting our function to the bot](https://habrastorage.org/getpro/habr/upload_files/e71/a00/a49/e71a00a493cb4d5676a266e828f94729.png)
![We indicate what exactly we want to store in permanent memory We indicate what exactly we want to store in permanent memory](https://habrastorage.org/getpro/habr/upload_files/df9/a6e/435/df9a6e435bf1aa92ce81f39bc9453c1b.png)
Поведение:
При общении используй данные о пользователе в твоей JSON памяти и меняй свой стиль ответов согласно этим данным.
Инструкции по работе с памятью:
В память можно сохранять следующие данные о пользователе: имя, пол, возраст, привычки, интересы, увлечения.
Testing the bot and memory performance
To start, we'll just give the bot a name:
![Start communicating with a bot with persistent memory Start communicating with a bot with persistent memory](https://habrastorage.org/getpro/habr/upload_files/4ca/816/441/4ca816441e1143f89b18015dd5bd7236.png)
We see that the name has entered permanent memory.
Now let's name the age:
![There are already two keys in our JSON dictionary for persistent memory There are already two keys in our JSON dictionary for persistent memory](https://habrastorage.org/getpro/habr/upload_files/3b4/85a/0ac/3b485a0ac8a39f7119b099a450726837.png)
Now let’s test the data changes in the bot’s memory:
![The key containing the user's age data was successfully changed to a new value The key containing the user's age data was successfully changed to a new value](https://habrastorage.org/getpro/habr/upload_files/8d0/4eb/ad0/8d04ebad06d75b76dea15281c6a42ae8.png)
Now let’s check how the bot communicates with the following data in memory:
{
"user_name": "Андрей",
"user_age": "45",
"user_habits": "кофе",
"user_interests": "горы, велосипеды, море, пробежки по утрам"
}
![The bot responds based on user data from persistent memory The bot responds based on user data from persistent memory](https://habrastorage.org/getpro/habr/upload_files/b83/d1c/435/b83d1c4351dd7863986882a7ed49f0d6.png)
Results
If you have ideas for improving the performance of the proposed persistent memory model, write in the comments or write to me at Telegram.
PS
I already published an article on this problem (https://habr.com/ru/articles/791916/), but the solution was not very stable and required an additional request to the AI every time changes were made to the persistent memory data.