Думаю, многие уже успели вдоволь наговориться с большими языковыми моделями, именуемыми в просторечии искусственным интеллектом. Развлекательные настройки, установленные по умолчанию практически во всех ныне доступных простым пользователям "общалках" с ИИ, действительно неплохо развлекают.
Но непростым пользователям, тем кто может связать две строчки кода, хочется чего-то большего. Было бы неплохо превратить милого, но в общем бесполезного болтуна в эффективного деятеля. И это можно сделать, в том числе в среде 1С, и не очень сильно напрягаясь
Что у нас есть. Во-первых, модели. Сильно упрощая, чтобы обучить большую языковую модель, нужно, в частности, подготовить много пар: вопрос - правильный ответ. И где это можно было взять? Правильно, у ничего не подозревавшего на тот момент Stack Overflow. Там это все было уже в готовом виде. Большие языковые модели умеют много чего, но лучше всего у них получается в программировании, SQL запросах, JSON.
Во вторых, у нас есть API. Практически все игроки сейчас предоставляют доступ к своим моделям через API. Он, кстати, почти унифицирован. То есть, все сдирают у первопроходца, Open AI. Не всем, правда, удается удержаться, и не внести какие-нибудь изменения от себя.
В принципе, уже этого было бы достаточно. Пишем некоторое количество функций (любых). Получив запрос от пользователя на естественном языке, добавляем к этому запросу сигнатуры наших функций и просим ИИ разобраться: какую функцию и с какими параметрами следует применить. Результат просим представить в JSON. Имея на руках JSON, нам ничего не стоит запустить нужную функцию с нужными параметрами. Это работало, но с некоторыми техническими недоразумениями (время от времени JSON оказывался не совсем тот, который ожидался или вместе с JSON прилетало всякое ненужное бла-бла-бла, от которого нужно было избавляться). Поэтому, с недавних пор у нас есть в-третьих, механизм получения вызовов функций. Он есть у лидеров: Google, OpenAI, Anthropic. Есть у китайцев, которые не отстают от лидеров. К сожалению, нет у Яндекса. Есть у Сбер, но у них модель в принципиально другой весовой категории и недотягивает до Яндекса, не говоря уже о лидерах.
Механизм вызова функций сильно упрощает жизнь разработчикам. Но это не предел! Чтобы улучшить жизнь разработчикам 1С, у нас есть, в-четвертых, Библиотека искусственного интеллекта для 1С (в свободном доступе)
Для того, чтобы задействовать вызов функций, надо передать в метод "Генерация" массив ссылок.
/Основная функция. Используется технология GPT для генерации текста
//Результат - текст ответа большой языковой модели (LLM) или массив вызовов функций или неопределено в случае ошибки
//промт - текст запроса пользователя
//модель - ссылка на элемент справочника БИИ_Модели
//температура - число, уровень "креативности" ответа, 0-минимум креативности
//инструменты - необязательный, массив ссылок на справочник БИИ_Инструменты
Функция Генерация(промт, модель, температура, инструменты=неопределено) экспорт
Доступ к справочнику можно получить из обработки, которая включена в расширение
![](https://habrastorage.org/getpro/habr/upload_files/919/df2/20e/919df220e01cab6e50bca713f3ae7641.png)
Для примера создадим описание функции GetGoodsBalance
![](https://habrastorage.org/getpro/habr/upload_files/17e/a4d/a4b/17ea4da4bbb5a8211006fa086223a93f.png)
Помимо названия функции, надо заполнить описание и список параметров. В списке параметров у каждого параметра также есть описание. Описания следует заполнять как можно более четко. Именно на описания будет ориентироваться ИИ, решая какую функцию использовать.
Добавим еще одно определение функции.
![](https://habrastorage.org/getpro/habr/upload_files/874/b4b/a15/874b4ba153ab8d549c54aba2ec674472.png)
Теперь напишем сами функции (для типовых УТ/ERP/КА). Функция получения остатка товара будет совсем простой.
Функция GetGoodsBalance(параметры)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(параметры);
данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
запрос = новый запрос;
запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура.Наименование ПОДОБНО &Товар) КАК ТоварыНаСкладахОстатки";
запрос.УстановитьПараметр("Товар","%"+данные.GoodsName+"%");
выб = запрос.Выполнить().Выбрать();
если выб.Следующий() тогда
возврат строка(выб.ВНаличииОстаток);
иначе
возврат "Не найден товар: "+данные.GoodsName;
конецесли;
КонецФункции
Функция получения баланса взаиморасчетов чуть "покучерявее"
Функция GetMutalSettlementsBalance(параметры)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(параметры);
данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
баланс = 0;
запрос = новый запрос;
запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(РасчетыСКлиентамиОстатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Остатки(, АналитикаУчетаПоПартнерам.Контрагент.Наименование ПОДОБНО &Контрагент) КАК РасчетыСКлиентамиОстатки";
запрос.УстановитьПараметр("Контрагент","%"+данные.Partner+"%");
выб = запрос.Выполнить().Выбрать();
если выб.Следующий() тогда
баланс=выб.СуммаОстаток;
конецесли;
запрос = новый запрос;
запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(РасчетыСПоставщикамиОстатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| РегистрНакопления.РасчетыСПоставщиками.Остатки(, АналитикаУчетаПоПартнерам.Контрагент.Наименование ПОДОБНО &Контрагент) КАК РасчетыСПоставщикамиОстатки";
запрос.УстановитьПараметр("Контрагент","%"+данные.Partner+"%");
выб = запрос.Выполнить().Выбрать();
если выб.Следующий() тогда
баланс=баланс+выб.СуммаОстаток;
конецесли;
возврат баланс;
КонецФункции
Мы получаем от ИИ массив структур JSON, в каждой из которых содержится имя функции и список параметров с именами параметров их значениями. Осталось сделать запускателя, чтобы функции запускались на выполнение.
Процедура Вызов(имя,параметры)
если имя="GetGoodsBalance" тогда
Ответ = Ответ + GetGoodsBalance(параметры)+символы.ПС;
иначеесли имя="GetMutalSettlementsBalance" тогда
Ответ = Ответ + GetMutalSettlementsBalance(параметры)+символы.ПС;
конецесли;
КонецПроцедуры
Проверим работу. Попросим дать остаток товара.
![](https://habrastorage.org/getpro/habr/upload_files/2f6/5c0/8a0/2f65c08a0546922be9eb9373e467f493.png)
Такой же ответ будет на все возможные формы вопроса: "сколько чая на складе", "чай на складе", "как много у нас чая", "остаток чая" и т.д.
Зададим вопрос по взаиморасчетам.
![](https://habrastorage.org/getpro/habr/upload_files/a31/1af/38f/a311af38ff190cfab0f540561e9bc993.png)
Как видите, это работает. Но есть одна проблема. Выключим функцию получения баланса по взаиморасчетам.
![](https://habrastorage.org/getpro/habr/upload_files/c34/065/e67/c34065e67a75db33def764a13d4a03cb.png)
И теперь в ответ на запрос мы получим...
![](https://habrastorage.org/getpro/habr/upload_files/b2f/44a/c00/b2f44ac008cbf781cd26f93c6616cb15.png)
Говорят, что недостатки есть ни что иное, как продолжение достоинств. Так оно и есть! У нас очень хороший работник. Он никогда не разведет лапками и не скажет: "я не могу". Нет у него такой опции. Он будет искать и находить наиболее подходящие варианты для действия. Как мы уже убедились, если ничего не предпринять, это может привести к нежелательным последствиям.
К счастью, проблема решается удивительно простым образом. Просто дадим нашему работнику инструкцию, что ему делать, когда он не знает, что ему делать.
Функция need_help(параметры)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(параметры);
данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
возврат "Не удалось подобрать функцию для вопроса:"+символы.ПС+данные.UserRequest;
КонецФункции
Теперь никакой путаницы
![](https://habrastorage.org/getpro/habr/upload_files/cee/bbe/4bd/ceebbe4bd666e5d8f9ba1138d3a69964.png)
Механизм вызова функции, это один из ключевых моментов в практическом использовании больших языковых моделей. Надеюсь, что этот короткий ликбез поможет вам быстро сориентироваться в данном вопросе
Комментарии (14)
ayrtonSK
22.08.2024 07:52Это поиграться или есть реальный опыт использования пользователями?
exwill Автор
22.08.2024 07:52Есть, конечно. Что вас интересует?
kukuvs
22.08.2024 07:52Меня в данный момент интересует можно ли это допилить, и сделать так что на запрос "сделай мне такой-то отчёт " Он его делал и показывал. Можно даже через костыли, можно сделать так что бы он ни только их составлял но и мог делать сложные запросы в БД просто просматривая её ( это конечно потребует соответственно крупные мощности но суть не в этом)
exwill Автор
22.08.2024 07:52Конечно можно. И уже довольно давно так и делается. Давать доступ ИИ к БД не нужно. Описываете структуру БД, получаете от ИИ текст запроса. Выполняете этот запрос на своей стороне. Результат запроса - таблица. Визуализируете эту таблицу более или менее "красиво". Вот и все, если у вас не 1С.
Если у вас 1С, вам надо будет перед выполнением каким-то образом транслировать текст SQL запроса в текст запроса 1С.
DM_man
22.08.2024 07:52"каким-то образом транслировать текст SQL запроса в текст запроса 1С " - замечательно.
exwill Автор
22.08.2024 07:52В этом нет ничего сложного. Язык запросов 1С, это один из диалектов SQL
В Библиотеке искусственного интеллекта для 1С есть простой транслятор MySQL в 1C
DM_man
22.08.2024 07:52А ну раз простой транслятор - то живем дальше и не читаем этого всего:
"Как следствие простой случай общения с пользователем:
f() <- someData(); // читаем данные из базы необходимые для myForm DIALOG myForm OBJECTS a INPUT DO // ОткрытьФормуМодально, пользователь выбирает какой-то объект IF isSomething(a) DO // читаем данные для этого объекта и если с ними что-то не то DIALOG otherForm OBJECTS b = a DO { // ОткрытьФормуМодально, открываем другую форму где пользователь выбирает другой объект b g(b) <- someInput(b); // записываем данные для b APPLY; // сохраняем изменения в базу }
превращается в кашу из пяти различных процедур с надуманными именами. Если при этом еще надо передать данные между myForm и otherForm, то придется использовать так называемые временные хранилища (что тоже было бы не нужно, если бы поток выполнения был на сервере) в результате чего код усложняется еще больше. " https://habr.com/ru/companies/lsfusion/articles/468415/
ayrtonSK
22.08.2024 07:52Value for money, срок окупаемости и востребованость в процентах от пользователей на каждый рабочий час
exwill Автор
22.08.2024 07:52Сейчас продукты на стадии запуска. Такая статистика будет не раньше, чем через год
exwill Автор
22.08.2024 07:52Что касается value for money...
Ну за 2-3 рубля вы получаете ответ на любой бизнес-вопрос. Примерно такой value за такие money
ne_kto_kto_to
22.08.2024 07:52интеграция ИИ через питон в 1С и последующим импортом данных в гугл докс в режиме реального времени. Возможно?
skela23
Очень интересно, спасибо)