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

Введение в задачу «создание ИИ»

Я рассматриваю создание ИИ с точки зрения того, что это очередная задача в программировании, которую можно решить, но для этого необходимы определенные представления и знания, которые просто так не получить путем решения очередных алгоритмических задач.

Обычно все представляют ИИ как систему, которая состоит из нейронов, подобно тому, как из нейронов состоит мозг. Но очень тяжело понять, какими свойствами должны обладать эти нейроны и какие функции они должны выполнять. Кроме самих нейронов должны быть еще и различные механизмы, на основе которых должна работать вся система. Что это за механизмы и каким образом они должны работать тоже непонятно.

Для того, чтобы начинать что-то понимать, необходимо придумывать и исследовать различные идеи и пробовать их реализовывать. Постепенно понимание будет увеличиваться, а знаний будет становиться больше. Когда знаний становится много, их необходимо как-то обобщать и структурировать, чтобы находить в них взаимосвязи и новые идеи. Поэтому я решил попробовать создавать свою теорию, которая будет давать понимание того, как можно решить эту сложную задачу — создание ИИ. Можете посмотреть какая теория у меня получается тут (в pdf-файле).

Простой чат-бот

Описание модели ЦИ нужно начинать с описания простого чат-бота и далее усложнять идеи функционирования и работы такой, на первый взгляд, простой системы. Я не рассматриваю чат-бот как ИИ. Это лишь учебный пример для развития мышления в направлении создания ИИ.

Любой бот должен обладать одной общей функциональностью - интерфейс взаимодействия с пользователем. У каждого бота должен быть некий набор базовых команд, которые активируются после ввода команды пользователем через интерфейс или при активации некоторых условий внутри бота.

В этом примере интерфейс взаимодействия с программой представлен вводом строки.

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

Можно сделать так, чтобы весь ввод и вывод записывались в буфер, для каждого типа информации можно сделать отдельный буфер или же один, но с указанием на то, является ли запись вводом или выводом. Это похоже на то, как система должна запоминать все, что с ней происходит, другими словами — это память.

Для создания команды может быть много разных ситуаций. Одной из особенностей автоматического создания команд является то, что бот должен самостоятельно выявлять команды и их модификаторы, самостоятельно создавать соответствия.

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

Различные механизмы бота

В бота можно добавлять различные системы, например, система, которая будет управлять задачами или планированием.

Можно придумывать разные подсистемы. Они должны работать по одинаковому принципу и на основе одного общего бота. Для этого нужно сделать основную систему так, чтобы в нее можно было добавлять разные подсистемы. Получается в эту систему можно будет добавлять новые функциональности не изменяя при этом основного кода системы. Эти модификации будут работать на основе одного общего принципа, поэтому можно будет легко совмещать различные модификации между собой. По этому принципу можно создавать и систему с нейронами.

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

Эта система должна создавать задачи, например, она должна создать задачу создания новой команды. Для этого нужно сделать для бота список задач, которые он должен выполнить. Его можно записывать в виде списка или словаря, а потом периодически его просматривать. Еще у каждой задачи может быть свой список задач — подзадачи, которые нужно выполнить, чтобы выполнить основную задачу.

Система планирования. Система планирования чем-то похожа на планирование процессов в ОС. Она должна заниматься планированием процессов выполнения задач. В обычном чат-боте что-то планировать можно задавая время, в которое задача должна начать выполняться. Или как и в механизмах ОС будет планироваться выполнение команд по очереди исходя из каких-то критериев, например, приоритета задачи (команды) или времени выполнения текущей задачи (времени пользования процессором).

Заключение

В этой статье я рассказал про свое представление о том, с чего можно начать думать о том, какие идеи могут лежать в основе создания ЦИ. Я сделал демонстрацию некоторых идей в виде простых примеров кода (это действительно выглядит очень просто - нужно же с чего-то начинать). Поняв эти идеи можно двигаться дальше и усложнять модель ЦИ. Но для того, чтобы лучше что-то понять, нужно написать код самому (если вы раньше не писали чего-то подобного). Я надеюсь, что в результате прочтения этой работы у читателя появилось новое представление о том, что такое искусственный интеллект.

Основные идеи, о которых я рассказал в этой статье:

  • создание ИИ — это очередная задача в программировании, которую можно решить;

  • на поведение программы можно влиять путем изменения и создания новых переменных не изменяя кода;

  • изменение определенных переменных влечет выполнение определенных команд (действий) программой;

  • у программы должна быть память, в которой находятся задачи для текущего выполнения и память, в которой хранятся все знания программы;

  • интеллектуальная программа должна уметь создавать команды (соответствия или комплексы команд) автоматически (самостоятельно).

Пример кода тут (там же я выкладываю и другие идеи о ИИ).

Комментарии (2)


  1. 2medic
    07.05.2024 08:40
    +1

    Также по данной теме есть неплохая книга  Харбанса Ришала «Грокаем алгоритмы искусственного интеллекта», которая доступно объясняет фундаментальные концепции ИИ. Для чтения достаточно знаний алгебры на уровне школьной программы.


  1. Georgij56665
    07.05.2024 08:40

    ИИ зто будующее.