Приделываем "лапки" ИИ

15.08.24

Интеграция - Нейросети

Как в 1С сделать вызов функции для больших языковых моделей (LLM).

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

Но непростым пользователям, тем, кто может связать две строчки кода (по тысяче строк в каждой))), хочется чего-то большего. Было бы неплохо превратить милого, но в общем бесполезного болтуна в эффективного деятеля. И это можно сделать, в том числе в привычной нам среде 1С, и не очень сильно напрягаясь.

Что у нас есть.  Во-первых, модели. Сильно упрощая, чтобы обучить большую языковую модель, нужно, в частности, подготовить много пар: вопрос - правильный ответ. И где это можно было взять? Правильно, у ничего не подозревавшего на тот момент Stack Overflow. Там это все было уже в готовом виде. Большие языковые модели умеют много чего, но лучше всего у них получается в программировании, SQL запросах, JSON.

Во вторых, у нас есть API. Практически все игроки сейчас предоставляют доступ к своим моделям через API. Он, кстати, почти унифицирован. То есть, все сдирают у первопроходца, Open AI. Не всем, правда, удается удержаться, и не внести какие-нибудь изменения от себя, испортив тем самым всю малину.

В принципе, уже этого было бы достаточно. Пишем некоторое количество функций (любых). Получив запрос от пользователя на естественном языке, добавляем к этому запросу сигнатуры наших функций и просим ИИ разобраться: какую функцию и с какими параметрами следует применить. Результат просим представить в JSON. Имея на руках JSON, нам ничего не стоит запустить нужную функцию с нужными параметрами. Это работало, но с некоторыми техническими недоразумениями (время от времени JSON оказывался не совсем тот, который ожидался или вместе с JSON прилетало всякое ненужное бла-бла-бла, от которого нужно было избавляться). Поэтому, с недавних пор у нас есть в-третьих, механизм получения вызовов функций. Он есть у лидеров: Google, OpenAI, Anthropic. Есть у китайцев, которые не отстают от лидеров. К сожалению, нет у Яндекса. Есть у Сбер, но у них модель в принципиально другой весовой категории и недотягивает до Яндекса, не говоря уже о лидерах.

Механизм вызова функций сильно упрощает жизнь разработчикам. Но это не предел! Чтобы улучшить жизнь разработчикам 1С, у нас есть, в-четвертых, Библиотека искусственного интеллекта для 1С (в свободном доступе)

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

//Основная функция. Используется технология GPT для генерации текста
//Результат - текст ответа большой языковой модели (LLM) или массив вызовов функций или неопределено в случае ошибки 
//промт - текст запроса пользователя
//модель - ссылка на элемент справочника БИИ_Модели
//температура - число, уровень "креативности" ответа, 0-минимум креативности
//инструменты - необязательный, массив ссылок на справочник БИИ_Инструменты
Функция Генерация(промт, модель, температура, инструменты=неопределено) экспорт

 

Доступ к справочнику можно получить из обработки, которая включена в расширение 

 

 

Для примера создадим описание функции GetGoodsBalance

 

 

Помимо названия функции, надо заполнить описание и список параметров. В списке параметров у каждого параметра также есть описание. Описания следует заполнять как можно более четко. Именно на описания будет ориентироваться ИИ, решая какую функцию использовать.

Добавим еще одно определение функции.

 

 

Теперь напишем сами функции (для типовых УТ/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(параметры)+символы.ПС;
	конецесли;	
КонецПроцедуры	

 

Проверим работу. Попросим дать остаток товара.

 

  

 

Такой же ответ будет на все возможные формы вопроса: "сколько чая на складе", "чай на складе", "как много у нас чая", "остаток чая" и т.д.

Зададим вопрос по взаиморасчетам.

 

 

Как видите, это работает. Но есть одна проблема. Выключим функцию получения баланса по взаиморасчетам.

 

 

И теперь в ответ на запрос мы получим...

 

 

 

Говорят, что недостатки есть ни что иное, как продолжение достоинств. Так оно и есть! У нас очень хороший работник. Он никогда не разведет лапками и не скажет: "я не могу". Нет у него такой опции. Он будет искать и находить наиболее подходящие варианты для действия. Как мы уже убедились, если ничего не предпринять, это может привести к нежелательным последствиям.

К счастью, проблема решается удивительно простым образом. Просто дадим нашему работнику инструкцию, что ему делать, когда он не знает, что ему делать.

 

 

Функция need_help(параметры)
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(параметры);	
	данные = ПрочитатьJSON(ЧтениеJSON);
	ЧтениеJSON.Закрыть();
	возврат "Не удалось подобрать функцию для вопроса:"+символы.ПС+данные.UserRequest;
КонецФункции

 

Теперь никакой путаницы

 

 

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

См. также

Нейросети 8.3.6 1С:Управление торговлей 11 Управленческий учет Платные (руб)

Обработка подключения фотокамер Canon и Nikon к Управление торговлей 11.4 для потоковой загрузки фотографий в карточки товаров с автоматическим удалением фона

22800 руб.

24.06.2021    9982    4    4    

15

Мастера заполнения Нейросети Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

Расширение для заполнения описания товара (номенклатуры) с помощью модели ИИ ChatGPT с ключевыми словами. Расширение формирует продающее описание товара по его наименованию с помощью модели искусственного интеллекта. Будет полезно для владельцев интернет магазинов, каталогов товаров и продающих через маркетплейсы. Адаптировано для основных конфигураций: УТ, ЕРП, КА, УНФ. Прошло аудит на 1cfresh.com. Версия для автоматического заполнения

5000 руб.

13.03.2023    18437    47    50    

76

Нейросети Мастера заполнения Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Расширение для заполнения описания номенклатуры с помощью модели ИИ GigaChat от Сбера. Расширение формирует продающее описание товара по его наименованию с помощью модели искусственного интеллекта. Будет полезно для владельцев интернет магазинов, каталогов товаров и продающих через маркетплейсы. Адаптировано для основных конфигураций: УТ, ЕРП, КА, УНФ.

5000 руб.

08.11.2023    2835    12    0    

21

Нейросети Бесплатно (free)

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

10.01.2025    1551    mkalimulin    57    

26

Нейросети Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Поставщики присылают счета на оплату. Чтобы на основе счета сделать платежное поручение, нужно завести контрагента, создать его банковский счет, вбить реквизиты, назначение платежа. А это около 5 минут времени, если поставщик новый. Данное решение позволяет вставить скопированный текст счета в окно 1С и по одной кнопке нейросеть вычислит реквизиты контрагента, сгенерирует самого контрагента, его банковский счет. Далее по кнопке будет создано платежное поручение и для удобства сгенерирован qr код, который, например, можно задействовать для оплаты в мобильном банке.

3 стартмани

09.01.2025    346    4    svcoopers    0    

2

Инструментарий разработчика Нейросети Программист Платформа 1С v8.3 Абонемент ($m)

Решение демонстрирует механизмы взаимодействия с сетями TVM (Telegram Open Network Virtual Machine), такими как Everscale, TON и другими, построенными на базе этой виртуальной машины. Взаимодействие реализовано через клиента командной строки ever-cli. Пример реализации выполнен для сети Everscale, но с небольшими доработками может быть использована для сети TON.

2 стартмани

27.12.2024    404    0    lectorkoba    0    

2

Нейросети Россия Бесплатно (free)

Иногда читаешь статью на Инфостарте и понимаешь, что для тебя это слишком сложно. К счастью, сейчас есть искусственный интеллект. Искусственный интеллект разберет статью на тезисы и ответит на вопросы о непонятом. Можно, конечно, задать вопрос автору статьи, но есть проблема. Всегда есть вероятность, что твой вопрос окажется «глупым». С искусственным интеллектом можно не стесняться и задавать любые вопросы. Хочу рассказать, как я осмысливал сложную статью с Инфостарта с помощью языковой модели O1 от OpenAI.

24.12.2024    803    Torin57    1    

5

Нейросети Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Разговоров о применении искусственного интеллекта в бизнесе сейчас много. Но по большей части это именно что разговоры. Довольно часто все сводится к перечислению того, что ИИ можно применить вот так и вот так, вот здесь и здесь, без каких-либо дальнейших подробностей. Предлагаю вашему вниманию подробное описание одного из возможных применений технологии искусственного интеллекта в бизнесе. С техническими подробностями и экономикой

23.12.2024    2563    mkalimulin    35    

34
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 302 16.08.24 09:07 Сейчас в теме
Тут узкое место, как мне кажется, - это поиск товара/контрагента через "подобно".
Ведь чая на складе может быть множества видов: черный, зеленый, крупнолистовой, в пачке по 500 гр, 250 и т.п.
С контрагентами такая же проблема, особенное если в базе есть ИПшники.
По-хорошему в случаях, когда есть более одного совпадения, нужно задавать уточняющий вопрос и/или предлагать список выбора. Или же давать ответ по всем найденным товарам/партнерам.
Вы как-то обходили этот момент на своих инструментах?
2. mkalimulin 1250 16.08.24 16:42 Сейчас в теме
(1) Функции получения остатков я взял для примера, чтобы продемонстрировать основную проблему при вызове функций и способ ее решения.
Вообще, функции могут быть любыми. И не только на чтение. Проблемы, которые тут могут возникнуть ничем не отличаются от проблем, которые нам, разработчикам, приходится решать сейчас. На мой взгляд, здесь самое важное заключается в том, что ИИ нас никак не ограничивает. Какую функцию напишем, такую и будет использовать. Со всевозможными сложностями можно разбираться внутри вашей функции.
Что касается конкретно проблемы с поиском по наименованию, то способ решения зависит от ситуации. Иногда наиболее правильным будет отказ от поиска по наименованию, вместо него можно использовать поиск по артикулу, например.
Если есть возможность в рамках решения конкретной задачи сформировать относительно небольшой список наименований (товаров или чего-нибудь еще), тогда лучше пойти этим путем. Механизм вызова функций, кстати, позволяет задавать списки (enum).
То, что предлагаете вы, тоже возможно, но надо пробовать в реальной работе. Представим, к примеру, что пользователь диктует заказ. В заказе пять позиций. Мы обрабатываем голосовое сообщение пользователя, а потом начинаем по каждой позиции задавать уточняющие вопросы. Хватит ли у пользователя терпения?
3. JohnyDeath 302 16.08.24 16:48 Сейчас в теме
(2)
Представим, к примеру, что пользователь диктует заказ

я себе в голове примерно такой же тест и нарисовал, только вместо пользователя - ответственный за закупку, который спрашивает остаток товара на складе.
Но если пойти по вашему примеру с заказом, то мы ему запихнем в заказ всё, что у нас попало первым в выборке. Я как покупатель был бы не очень рад, если бы мне бездушная машина подсунула в заказ совсем другие продукты. Перепроверять, а потом передергивать товары в заказе еще сложней, как мне кажется, чем ответить на доп вопросы по строкам, где нет единого понимания между машиной и мешком
4. user1880116 17.08.24 12:51 Сейчас в теме
(3)
Я как покупатель
Это лекция для колхозников статья для разработчиков, а не для покупателей. Проходите, товарищ.
5. mkalimulin 1250 17.08.24 14:29 Сейчас в теме
(4) Плох тот разработчик, что не может представить себя покупателем )))
6. user1880116 19.08.24 08:12 Сейчас в теме
(5)
Плох тот разработчик, что не может представить себя покупателем
Ох, Михаил...
А какому покупателю ты продаешь вот это, текущее решение?
7. JohnyDeath 302 19.08.24 08:51 Сейчас в теме
(4) а разработчик для кого делает всё это?
8. user1880116 19.08.24 09:11 Сейчас в теме
(7)
а разработчик для кого
У меня вот к Михаилу тот же вопрос.
9. saver77 65 27.08.24 12:19 Сейчас в теме
Не понятен пункт "Теперь напишем сами функции (для типовых УТ/ERP/КА). Функция получения остатка товара будет совсем простой.". Где конкретно писать функцию?
10. mkalimulin 1250 27.08.24 14:06 Сейчас в теме
(9) В том модуле, в какой вы хотите ее поместить (модуль формы, модуль объекта, модуль менеджера, общий модуль). Где хотите, там и пишите. Например. Если вы делаете свою обработку, тогда можете поместить эту функцию в модуль формы. А можете в модуль объекта или в общий модуль. Это дело вкуса
Оставьте свое сообщение