Может ли искусственный интеллект работать архитектором 1С

от автора

Давайте посмотрим, на что сейчас способны лучшие языковые модели в плане выполнения работы архитектора 1С. В этом обзоре присутствуют все основные игроки (OpenAI, Anthropic, Google). Также я добавил к ним двух отечественных провайдеров (Yandex и Сбер)

Проектирование конфигураций для 1С, это достаточно сложный процесс. Но концепции, лежащие в основе 1С, довольно просты и не требуют много слов для описания. В качестве препромта или системного промта можно использовать нечто подобное:

В учетной системе таблицы четырех видов. Справочники описывают объекты реального мира. Документы описывают события и в них есть дата. Спецификации описывают состав документов. Документы и спецификации связаны отношением один ко многим. Например, в документе мы указываем покупателя, а в спецификации мы указываем список товаров, которые купил покупатель. Регистры обладают способностью вычислять остаток. Если нам нужен остаток тогда дублируем информацию о событии в регистре.

После препромта описываем словами, что за конфигурацию мы хотим получить, а в конце добавляем «хвостик»:

Создай структуру таблиц базы данных для такого учета с названиями таблиц и полей на русском языке. Также надо указать связи между таблицами. Результат представь в виде JSON

Если представить себе, что мы хотим сделать рабочий инструмент для архитектора 1С, тогда препромт и хвост стоит спрятать внутри приложения, а пользователю предоставить одно единственное поле ввода, куда он внесет свое описание конфигурации человеческими словами, в произвольной форме. Мы же отправим большой языковой модели на обработку это пользовательское описание с препромтом впереди и хвостом сзади. Такая конструкция не единственно возможная. Можно было бы и хвост поставить вперед. Языковым моделям в данном случае более или менее все равно. Но я решил остановиться на таком варианте исключительно для наглядности. В окончательном виде то, что мы отправляем большой языковой модели могло бы выглядеть, например, так:

В учетной системе таблицы четырех видов. Справочники описывают объекты реального мира. Документы описывают события и в них есть дата. Спецификации описывают состав документов. Документы и спецификации связаны отношением один ко многим. Например, в документе мы указываем покупателя, а в спецификации мы указываем список товаров, которые купил покупатель. Регистры обладают способностью вычислять остаток. Если нам нужен остаток тогда дублируем информацию о событии в регистре.
У меня мелкооптовая торговля. Я хочу вести учет закупок товаров у поставщиков и продаж товаров покупателям. Хочу видеть остатки товаров на текущий момент. И сколько и на какую сумму я продал товаров.
Создай структуру таблиц базы данных для такого учета с названиями таблиц и полей на русском языке. Также надо указать связи между таблицами. Результат представь в виде JSON

«Отдадим» это GPT-4 (OpenAI). Результат будет следующим:

{   "Таблицы": [     {       "Название": "Справочник_Поставщики",       "Поля": [         {           "Название": "ID_Поставщика",           "Тип": "int"         },         {           "Название": "Название_Поставщика",           "Тип": "string"         }       ]     },     {       "Название": "Справочник_Товары",       "Поля": [         {           "Название": "ID_Товара",           "Тип": "int"         },         {           "Название": "Название_Товара",           "Тип": "string"         },         {           "Название": "Цена_Товара",           "Тип": "float"         }       ]     },     {       "Название": "Документ_Закупка",       "Поля": [         {           "Название": "ID_Документа",           "Тип": "int"         },         {           "Название": "Дата_Закупки",           "Тип": "date"         },         {           "Название": "ID_Поставщика",           "Тип": "int"         }       ],       "Связи": [         {           "Таблица": "Справочник_Поставщики",           "Поле": "ID_Поставщика"         }       ]     },     {       "Название": "Спецификация_Закупка",       "Поля": [         {           "Название": "ID_Спецификации",           "Тип": "int"         },         {           "Название": "ID_Документа",           "Тип": "int"         },         {           "Название": "ID_Товара",           "Тип": "int"         },         {           "Название": "Количество",           "Тип": "int"         }       ],       "Связи": [         {           "Таблица": "Документ_Закупка",           "Поле": "ID_Документа"         },         {           "Таблица": "Справочник_Товары",           "Поле": "ID_Товара"         }       ]     },     {       "Название": "Регистр_Остатки",       "Поля": [         {           "Название": "ID_Товара",           "Тип": "int"         },         {           "Название": "Остаток",           "Тип": "int"         }       ],       "Связи": [         {           "Таблица": "Справочник_Товары",           "Поле": "ID_Товара"         }       ]     },     {       "Название": "Документ_Продажа",       "Поля": [         {           "Название": "ID_Документа",           "Тип": "int"         },         {           "Название": "Дата_Продажи",           "Тип": "date"         }       ]     },     {       "Название": "Спецификация_Продажа",       "Поля": [         {           "Название": "ID_Спецификации",           "Тип": "int"         },         {           "Название": "ID_Документа",           "Тип": "int"         },         {           "Название": "ID_Товара",           "Тип": "int"         },         {           "Название": "Количество",           "Тип": "int"         },         {           "Название": "Сумма",           "Тип": "float"         }       ],       "Связи": [         {           "Таблица": "Документ_Продажа",           "Поле": "ID_Документа"         },         {           "Таблица": "Справочник_Товары",           "Поле": "ID_Товара"         }       ]     }   ] } 

Конечно же этот JSON (впрочем, как и любой другой) не предназначен для того, чтобы выдавать его пользователю как есть. Если у вас имеется некоторый опыт разработчика 1С, тогда вы можете присмотреться внимательнее к результату и убедиться, что относительно простая утилита может превратить этот JSON в файл .cf, т.е. в конфигурацию 1С. А утилита чуть посложнее может даже сделать два файла выгрузки (.dt), как это принято для типовых конфигураций 1С. Первая выгрузка будет пустой базой, а вторая — демонстрационной базой с некоторым количеством данных, сгенерированных той же языковой моделью.

Это был результат флагманской модели OpenAI GPT-4. Модель 3.5 можете не пробовать. Я вам так скажу, результат будет малопригоден для дальнейшей обработки. Давайте посмотрим, что мы можем получить от ближайшего конкурента OpenAI, компании Anthropic с ее флагманской моделью Claude-3-opus. Не так давно Claude сумел на некоторое время сместить GPT-4 с первого места на арене LMSys. Сейчас, правда, последняя модель GPT-4 вернула себе первое место. Арена LMSys это такая площадка, на которой различные модели соревнуются друг с другом в решении одинаковых задач. Соревнуются всегда две модели. Это как партия в шахматах. В результате получается ELO, как у шахматистов. Я считаю, что это более объективная оценка, чем всевозможные бенчмарки.

Результат Клода такой:

{   "справочники": [     {       "название": "Товары",       "поля": [         {           "название": "Код",           "тип": "число"         },         {           "название": "Наименование",           "тип": "строка"         }       ]     },     {       "название": "Контрагенты",       "поля": [         {           "название": "Код",           "тип": "число"         },         {           "название": "Наименование",           "тип": "строка"         },         {           "название": "Тип",           "тип": "строка",           "значения": [             "Поставщик",             "Покупатель"           ]         }       ]     }   ],   "документы": [     {       "название": "ПриходнаяНакладная",       "поля": [         {           "название": "Номер",           "тип": "число"         },         {           "название": "Дата",           "тип": "дата"         },         {           "название": "Поставщик",           "тип": "ссылка",           "таблица": "Контрагенты"         }       ]     },     {       "название": "РасходнаяНакладная",       "поля": [         {           "название": "Номер",           "тип": "число"         },         {           "название": "Дата",           "тип": "дата"         },         {           "название": "Покупатель",           "тип": "ссылка",           "таблица": "Контрагенты"         }       ]     }   ],   "спецификации": [     {       "название": "СпецификацияПрихода",       "поля": [         {           "название": "Документ",           "тип": "ссылка",           "таблица": "ПриходнаяНакладная"         },         {           "название": "Товар",           "тип": "ссылка",           "таблица": "Товары"         },         {           "название": "Количество",           "тип": "число"         },         {           "название": "Цена",           "тип": "число"         },         {           "название": "Сумма",           "тип": "число"         }       ]     },     {       "название": "СпецификацияРасхода",       "поля": [         {           "название": "Документ",           "тип": "ссылка",           "таблица": "РасходнаяНакладная"         },         {           "название": "Товар",           "тип": "ссылка",           "таблица": "Товары"         },         {           "название": "Количество",           "тип": "число"         },         {           "название": "Цена",           "тип": "число"         },         {           "название": "Сумма",           "тип": "число"         }       ]     }   ],   "регистры": [     {       "название": "ОстаткиТоваров",       "поля": [         {           "название": "Товар",           "тип": "ссылка",           "таблица": "Товары"         },         {           "название": "Количество",           "тип": "число"         }       ]     },     {       "название": "ПродажиТоваров",       "поля": [         {           "название": "Товар",           "тип": "ссылка",           "таблица": "Товары"         },         {           "название": "Количество",           "тип": "число"         },         {           "название": "Сумма",           "тип": "число"         }       ]     }   ],   "связи": [     {       "таблица1": "ПриходнаяНакладная",       "таблица2": "СпецификацияПрихода",       "тип": "один-ко-многим"     },     {       "таблица1": "РасходнаяНакладная",       "таблица2": "СпецификацияРасхода",       "тип": "один-ко-многим"     }   ] }

На мой взгляд, даже несколько лучше, чем у GPT4, проще разбирать ссылки. А что нам даст Google со своими Близнецами? Прямо сейчас ELO у модели Gemini-1.5-pro 1249. Это на единицу больше, чем у Claude-3-opus. Результат Близнецов:

{   "таблицы": [     {       "название": "Справочник товаров",       "поля": [         "Код товара",         "Наименование товара",         "Цена закупки",         "Цена продажи"       ]     },     {       "название": "Справочник поставщиков",       "поля": [         "Код поставщика",         "Наименование поставщика"       ]     },     {       "название": "Справочник покупателей",       "поля": [         "Код покупателя",         "Наименование покупателя"       ]     },     {       "название": "Документ закупки",       "поля": [         "Номер документа",         "Дата документа",         "Код поставщика",         "Сумма закупки"       ]     },     {       "название": "Спецификация закупки",       "поля": [         "Номер документа",         "Код товара",         "Количество",         "Цена закупки"       ]     },     {       "название": "Документ продажи",       "поля": [         "Номер документа",         "Дата документа",         "Код покупателя",         "Сумма продажи"       ]     },     {       "название": "Спецификация продажи",       "поля": [         "Номер документа",         "Код товара",         "Количество",         "Цена продажи"       ]     },     {       "название": "Регистр остатков товаров",       "поля": [         "Код товара",         "Количество на начало периода",         "Количество поступило",         "Количество продано",         "Количество на конец периода"       ]     }   ],   "связи": [     {       "таблица1": "Документ закупки",       "поле1": "Номер документа",       "таблица2": "Спецификация закупки",       "поле2": "Номер документа"     },     {       "таблица1": "Документ продажи",       "поле1": "Номер документа",       "таблица2": "Спецификация продажи",       "поле2": "Номер документа"     },     {       "таблица1": "Справочник товаров",       "поле1": "Код товара",       "таблица2": "Спецификация закупки",       "поле2": "Код товара"     },     {       "таблица1": "Справочник товаров",       "поле1": "Код товара",       "таблица2": "Спецификация продажи",       "поле2": "Код товара"     },     {       "таблица1": "Справочник поставщиков",       "поле1": "Код поставщика",       "таблица2": "Документ закупки",       "поле2": "Код поставщика"     },     {       "таблица1": "Справочник покупателей",       "поле1": "Код покупателя",       "таблица2": "Документ продажи",       "поле2": "Код покупателя"     },     {       "таблица1": "Справочник товаров",       "поле1": "Код товара",       "таблица2": "Регистр остатков товаров",       "поле2": "Код товара"     }   ] } 

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

На этом хорошие результаты заканчиваются. Возможно, что следовало бы попробовать еще и Llama-3 с ее 1208 ELO, но я пока так и не смог преодолеть свой скепсис в отношении этой модели. В языковых моделях размер имеет значение. И 70 миллиардов у Llama сильно проигрывают своим ближайшим конкурентам.

Но у нас есть еще модели, которые вообще не участвуют в рейтинге. Речь идет об отечественных моделях от Yandex и Сбер.

Результат Yandex:

{   "Справочник товаров": {     "id": "Идентификатор товара",     "название": "Название товара",   },   "Документ закупки": {       "id": "Уникальный идентификатор документа закупки",       "дата": "Дата закупки",       "поставщик": "Ссылка на справочник поставщиков",       "количество": "Количество закупленных товаров",       }   "Спецификация закупки": {        "идентификатор_документа": "Ссылка на документ закупки",         "товар": "Ссылка на товары из справочника товаров"   }      "Регистр остатков": {         "идентификатор": "Идентификатор регистра остатков",          "товар": "Товар из справочника товаров",           "количество":  "Количество товара на складе",             "сумма": "Стоимость товара на складе"         },     "Документ продажи": {            "id": "Документ продажи",               "дата":  "Дата продажи",                 "покупатель": "Покупатель из справочника покупателей",                   "количество": "Продаваемое количество товаров",                     "цена": "Цена продажи товаров"                } } 

Как видите, конфигурацию из этого не собрать. Хотя в целом у Яндекса неплохая модель со 100 миллиардами параметров. И, например, запросы SQL (а значит и запросы для 1С) она генерит достаточно хорошо.

Сберовский GIgaChat с его 39 миллиардами намного слабее. И его результат ожидаемо не лучше, чем у Яндекс:

{     "таблицы": [         {             "название": "Поставщики",             "поля": [                 {"имя": "ID", "тип": "integer", "ключевое_поле": true},                 {"имя": "Название", "тип": "text"},                 {"имя": "Адрес", "тип": "text"}             ]         },         {             "название": "Товары",             "поля": [                 {"имя": "ID", "тип": "integer", "ключевое_поле": true},                 {"имя": "Название", "тип": "text"},                 {"имя": "Цена", "тип": "decimal"}             ]         },         {             "название": "Закупки",             "поля": [                 {"имя": "ID", "тип": "integer", "ключевое_поле": true},                 {"имя": "Дата", "тип": "date"},                 {"имя": "Поставщик_ID", "тип": "integer", "связь": "многие_ко_многим", "с_таблицей": "Поставщики"},                 {"имя": "Товар_ID", "тип": "integer", "связь": "многие_ко_многим", "с_таблицей": "Товары"}             ]         },         {             "название": "Продажи",             "поля": [                 {"имя": "ID", "тип": "integer", "ключевое_поле": true},                 {"имя": "Дата", "тип": "date"},                 {"имя": "Покупатель", "тип": "text"},                 {"имя": "Товар_ID", "тип": "integer", "связь": "многие_ко_многим", "с_таблицей": "Товары"}             ]         }     ],     "связи": [         {"откуда": "Закупки", "куда": "Поставщики", "связь": "один_ко_многим"},         {"откуда": "Закупки", "куда": "Товары", "связь": "многие_ко_многим"},         {"откуда": "Продажи", "куда": "Товары", "связь": "многие_ко_многим"}     ] } 

Подведем итоги

  1. Модели из топ-5 арены уже сейчас могут по описанию на человеческом языке создавать работающие конфигурации 1С. Справочники, документы и регистры у вас будут. Отчеты в современных условиях не очень-то и нужны. Пользователь сформулирует, что ему надо на человеческом языке, а модель превратит это в запрос к базе данных.
  2. Отечественные модели в этом вопросе пока не дотягивают до флагманских моделей. И в целом выдают непригодный для дальнейшего использования результат. Но будем надеяться, что ситуация в будущем исправится.

Если вы хотите развивать свою карьеру в качестве архитектора 1С, следите внимательно за тем, что происходит в области искусственного интеллекта.

Также приходите на открытые уроки, посвящённые архитектуре 1С: 10 июня — «Юнит-тестирование в 1С», 20 июня — «Мониторинг производительности в ЦУП».


ссылка на оригинал статьи https://habr.com/ru/articles/813887/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *