С чего можно начать мыслить о создании цифрового интеллекта, даже если он будет очень простым. Несколько идей, которые должны показать, как можно мыслить о ИИ по-другому, какими основными свойствами должна обладать программа и с чего можно начать мыслить в направлении создания цифрового интеллекта.
Рассмотрим небольшую программу на основе некой обобщённой логики, с помощью которой можно изменять логику работы программы динамически, не изменяя её кода. Оригинальный взгляд на программирование.
Введение
Я рассматриваю создание ИИ с точки зрения того, что это очередная задача в программировании, которую можно решить, но для этого необходимы определенные представления и знания, которые просто так не получить путем решения очередных алгоритмических задач.
Обычно все представляют ИИ как систему, которая состоит из нейронов, подобно тому, как из нейронов состоит мозг. Но очень тяжело понять, какими свойствами должны обладать эти нейроны и какие функции они должны выполнять. Кроме самих нейронов должны быть еще и различные механизмы, на основе которых должна работать вся система. Что это за механизмы и каким образом они должны работать тоже непонятно.
Чтобы начинать что-то понимать, необходимо придумывать и исследовать различные идеи и пробовать их реализовывать. Постепенно понимание будет увеличиваться, а знаний будет становиться больше. Когда знаний становится много, их необходимо как-то обобщать и структурировать, чтобы находить в них взаимосвязи и новые идеи. Поэтому я решил попробовать создавать свою теорию, которая будет давать понимание того, как можно решить эту сложную задачу.
Простой чат-бот
Думать о создании цифрового интеллекта нужно начинать с описания простого чат-бота и далее усложнять идеи функционирования и работы такой, на первый взгляд, простой системы. Консольный чат‑бот — это основа для развития мышления в направлении создания ЦИ.
Любой бот должен обладать одной общей функциональностью — интерфейс взаимодействия с пользователем (со средой). У программы должен быть некий набор базовых команд, которые активируются после ввода команды пользователем через интерфейс или при активации некоторых условий внутри бота (при воздействии среды на программу).
В этом примере интерфейс взаимодействия с программой представлен вводом строки (а среда выглядит как получение текстовых данных).
Простой бот
commands, variables, stack = dict(), [True], []
while variables[0]:
input_command = input("\nEnter command: ")
stack.append(input_command)
if input_command == "new command":
commands[input("\tEnter key: ")] = input("\tEnter valeu: ")
elif input_command == "exit":
variables[0] = False
elif input_command == "create var":
variables.append(None)
else:
print(f"The '{input_command}' command is not exist!!!")
commands — список соответствий (словарь), это различные команды, на которые может реагировать программа; variables — список переменных программы, на основе которых программа выполняет какие-то действия; stack — список введенных строк, команд — некая рабочая память.
Этот бот может создавать новое ключ-значение (соответствие), изменить переменную цикла или создать новую переменную. Тут нет ничего особенного. Но есть факт, который играет ключевую роль в создании ЦИ. Он заключается в том, что можно изменять значения переменных извне программы, т. е. переменные в программе могут изменяться на основе воздействия среды. В этой программе можно изменить значение переменной цикла — variables[0]. Можно изменять поведение программы извне, не изменяя её кода. Например, если программа работает на основе системы нейронов, то можно изменять их значения, тем самым влияя на поведение программы.

Под процессором имеется в виду часть программы, которая обрабатывает команды.
Кроме того можно создавать новые переменные, вместо None может быть любой тип переменной, также можно использовать словарь для более удобного управления переменными. В качестве переменной может быть новый синапс между нейронами или новый нейрон, таким образом можно создавать сложную нейросеть, в которой будут храниться различные знания: команды, реакции, рефлексы и т. д.
Взаимодействуя определенным образом, переменные (нейроны) будут изменять своё значение, что будет влечь за собой изменение выходных переменных (нейронов) и, в результате, выполнение определённых действий программой. В качестве действий в этом примере рассматриваются изменение переменной цикла, создание нового элемента словаря, создание новой переменной, и, если бот не знает, что ему делать, то он может просто вывести сообщение об этом.
Команды бота
Основной функционал бота может быть следующим: 1) сделать соответствие ключ-значение (команда-действие), 2) выполнить значение ключа (выполнить действие команды): вывести значение ключа; изменить значение переменной; сделать вызов функции; создать функцию; создать переменную (в общем, выполнить какой-то код или какую-то команду, действие).
Вообще это похоже на классификацию, ввод можно обрабатывать какой-нибудь моделью машинного обучения. Но основной принцип программы всё равно основывается с точки зрения алгоритмов.

В контексте этого бота, команды — это инструкции языка программирования (блоки кода). В общем случае, команда — задача, которую должна выполнить программа, последовательность действий, какая-то реакция на воздействие среды, какое-то действие в среде или внутреннее действие.

Некоторые действия с ботом: сделать ввод; посмотреть список команд; создать команду; сделать вывод; добавить переменную; изменить переменную; вызвать функцию (процедуру); добавить процедуру (привязать команду к процедуре); посмотреть список задач; добавить задачу.
Также можно добавить к командам модификаторы, как в консольных программах операционной системы в терминале. Тогда команды будут выполняться ещё и с модификаторами. Например, для создания переменной можно будет указать её название, которое будет ключом в словаре: «create_var var_name». И, соответственно, при использовании модификатора будет запущен другой сценарий обработки команды.
Если команда не существует, то можно вызвать команду для создания новой команды. Для этого у чат-бота должен быть буфер (операционная память), в который нужно установить триггер о том, что нужно вызвать команду для создания команды и завершить выполнение текущей команды (задачи). После начала новой итерации цикла будет проверка триггерных переменных и создание новой команды.
Пример буфера
В качестве буфера можно использовать словарь. Ключами являются названия триггерных переменных. Значениями, в данном случае, являются указания на то, что бот должен вызвать процедуры, в которых происходит выполнение определенных операций. Здесь рассматривается создание новой команды. В значении триггерной команды указаны два значения: активирована ли эта команда; процедура, которая выполняет эту команду.
buffer = {
«to create command»: [False, to_create_command]
}

Как использовать: проходимся по каждому ключ-значению в словаре и проверяем активность.
for key, value in buffer.items():
if value[0]: # проверка активности команды
buffer[key][1]() # вызов функции
value[0] = False # сделать задачу неактивной
В buffer[key][1] находится ссылка на процедуру, если триггерная переменная активна, то эта процедура выполнится. Здесь в качестве выполнения процедуры рассматривается функция в коде, в качестве функции может быть и какая-то нейросеть, которая отвечает за определенные действия или какая-либо другая логика в принципе (подпрограмма, модуль, объект).
Создание команд
Главная задача при создании ЦИ состоит в том, чтобы описать автоматическое создание команд. В этом примере можно вести стек ввода-вывода и использовать последний ввод как ключ, а затем предложить пользователю ввести значение этого ключа. Если ключ не подходящий, то его можно изменить. Это пример того, как можно создать новое ключ-значение используя предпоследний и последний вводы.
key = stack[-2]
value = stack[-1]
commands[key] = value
Можно сделать так, чтобы весь ввод и вывод записывались в буфер, для каждого типа информации можно сделать отдельный буфер или же один, но с указанием на то, является ли запись вводом или выводом. Это похоже на то, как система должна запоминать всё, что с ней происходит, другими словами — это память.
Для создания команды может быть много разных ситуаций. Одной из особенностей автоматического создания команд является то, что бот должен самостоятельно выявлять команды и их модификаторы, самостоятельно создавать соответствия. Информация о том, что делаем бот или информация о вводе может записывать в стек, потом бот может просматривать этот стек и на основе этой информации делать какие-то действия, создавать соответствия.
Проверка ключа — это не просто проверка на то, есть ли такое значение, это более обобщенная операция: проверка наличия знания о чем-либо, умения, действия. Для отображения можно сделать отдельный класс, чтобы можно было легко изменить логику отображения (соответствия), например, на нейросеть.
Различные механизмы (механики, подсистемы) бота
В бота можно добавлять различные системы, например, система, которая будет управлять задачами или планированием. Эти системы можно совмещать между собой и создавать более сложную логику программы, создавать новые механизмы, команды и т. д.
Можно придумывать разные подсистемы. Они должны работать по одинаковому принципу. Для этого нужно сделать основную систему так, чтобы в неё можно было добавлять разные подсистемы. В эту систему можно будет добавлять новые функциональности не изменяя при этом основного кода системы. Эти модификации будут работать на основе одного общего принципа, поэтому можно будет легко совмещать различные модификации между собой. По этому принципу можно создавать и систему с нейронами.
Список задач. Чтобы бот мог выполнять какие-либо задачи, действия, у него должен быть некий список задач, которые он должен выполнить. В этом примере в качестве задачи можно рассмотреть добавление новой команды в ответ на то, что пользователь ввёл несуществующую задачу. Сначала в список задач добавляется задача, которая должна спросить у пользователя, нужно ли создать новую команду. Если да, то добавить новую задачу по добавлению команды в список задач.
Эта система должна создавать задачи, например, она должна создать задачу создания новой команды. Для этого нужно сделать для бота список задач, которые он должен выполнить. Его можно записывать в виде списка или словаря, а потом периодически его просматривать. Ещё у каждой задачи может быть свой список задач — подзадачи, которые нужно выполнить, чтобы выполнить основную задачу.
Система планирования. Система планирования чем-то похожа на планирование процессов в операционной системе. Она должна заниматься планированием процессов выполнения задач. В обычном чат-боте что-то планировать можно задавая время, в которое задача должна начать выполняться. Или как и в механизмах ОС будет планироваться выполнение команд по очереди исходя из каких-то критериев, например, приоритета задачи (команды) или времени выполнения текущей задачи (времени пользования процессором).
Видеотуториал
В этом видео я рассказал про то, как начать думать о создании ЦИ с нуля, разбор и написание кода с пустого файла. В статье я рассказал про готовую программу, а в видео я показываю это всё с нуля, также содержание отличается.
Заключение
В этой статье я рассказал про своё представление о том, с чего можно начать думать о том, какие идеи могут лежать в основе создания цифрового интеллекта. Я сделал демонстрациюнекоторых идей в виде простых примеров кода (это действительно выглядит очень просто — нужно же с чего‑то начинать). Поняв эти идеи можно двигаться дальше и усложнять модель ЦИ. Но для того, чтобы лучше что‑то понять, нужно написать код самому (если вы раньше не писали чего-то подобного). Я надеюсь, что в результате прочтения этой работы у читателя появилось новое представление о том, с чего начинать думать о создании программы, обладающей интеллектом.
Основные идеи в этой статье:
создание ЦИ — это очередная задача в программировании, которую можно решить;
на поведение программы можно влиять путем изменения и создания новых переменных не изменяя кода;
изменение определенных переменных влечёт выполнение определенных команд (действий) программой;
у программы должна быть память, в которой находятся задачи для текущего выполнения и память, в которой хранятся все знания программы;
интеллектуальная программа должна уметь создавать команды (соответствия или комплексы команд) автоматически (самостоятельно).
В будущем будут более интересные идеи про цифровой интеллект и про его создание. Я занимаюсь проектом «Теория цифрового интеллекта», основная цель — развитие мышления о создании ЦИ и создать теорию, которая будет описывать принципы интеллекта с точки зрения алгоритмов. Приглашаю в сообщество. Канал в телеграме. Страничка проекта (содержание).
neuromancertdi Автор
Я случайно удалил комментарий. Напишите, пожалуйста, снова.