Например, пользователь спросит «Есть ли у вас красные яблоки в наличии?», после чего модель зайдёт в 1С, посмотрит остатки красных яблок и даст точный ответ.
Для снижения порога вхождения статья будет построена на облачных серверах. Поэтому для реализации нам понадобится лишь Windows 10 или выше, т.к. начиная с Windows 10 появился встроенный SSH-клиент. А также нам понадобится 115 рублей для аренды серверов. Примерно столько мне потребовалось денег, чтобы за 2 часа аренды двух серверов с тарифами на апрель 2025 решить поставленную задачу.
Продвинутые пользователи, прочитав эту статью, смогут сами сократить затраты до нуля, перенеся функционал на свои машины. А также ознакомиться с более подробным описанием механизма работы вызова функции из статьи «Вызов функций в Ollama».
Шаг 1. Публикуем демо-базу 1С
Заходим на сайт 1С и запрашиваем учебную платформу 1С. Нам потребуется платформа не ниже 8.3.25.1394. Замечание: если есть стандартная платформа и комьюнити-лицензия (для разработчика), то можно воспользоваться таким вариантом.
Регистрируемся в Selectel и создаем облачный сервер (Продукты — Облачные серверы). Имя сервера — fc-1c (далее его IP адрес — IP_АДРЕС_FC_1C). Источник - Windows Server 2019 Standard. Конфигурация — Фиксированная, Standard, 1 vCPU. Диски — 40 Гб. Сохраняем пароль администратора. Нажимаем кнопку «Создать сервер». Данный сервер стоит 2,81 руб. в час. Если использовать собственный сервер, то достаточно выбрать машину, которая удовлетворяет минимальным требованиям для запуска Windows 10.
Через RDP заходим на выданный IP-адрес сервера — IP_АДРЕС_FC_1C.
Устанавливаем учебную платформу 1С: указываем «Web server extension modules» и «Additional interface — Russian».
Загрузим демо-конфигурацию 1С в локальную базу с именем ollama-function-calling-1c.
Устанавливаем IIS и даём доступ на локальный путь к базе пользователю IUSR. Т. к. учебная платформа x86, не забываем включить разрешение 32-разрядных приложений (такая описана в этой статье). Публикуем демо-базу от имени администратора в вебе и убеждаемся, что база доступна по ссылке http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/ru/.
Шаг 2. Публикуем LLM-модель
На своём компьютере генерируем SSH-ключ. Открываем командную строку (CMD) и набираем ssh-keygen. На все вопросы следует просто нажимать Enter. Запоминаем публичный ключ, который сформировался в файле C:\Users\ИМЯ_ПОЛЬЗОВАТЕЛЯ/.ssh/id_ed25519.pub.
В Selectel и создаем облачный сервер (Продукты — Облачные серверы). Имя сервера — fc-ollama (далее его IP-адрес — IP_АДРЕС_FC_OLLAMA). Источник — Ubuntu 24.04 LTS 64-bit CUDA 12.8 Docker. Конфигурация — Фиксированная, GPU, 4 vCPU и 1 x Tesla T4 16 Гб, диски — 60 Гб. SSH-ключ — указываем наш сформированный ключ. Нажимаем кнопку «Создать сервер». Данный сервер стоит 54,2 руб. в час. Если использовать собственный сервер, то необходимо выбрать машину с видеокартой с памятью не менее 16 Гб.
Через командную строку подключаемся к нашему серверу: ssh root@IP_АДРЕС_FC_OLLAMA.
Обновляем индексы — apt-get update.
Обновляем пакеты — apt-get upgrade. На всё соглашаемся и во всплывающем окне нажимаем Enter.
Устанавливаем git — apt install git.
Устанавливаем docker compose — apt-get install docker-compose-plugin.
Скачиваем демо-проект LLM-модели — git clone https://github.com/HardAndHeavy/ollama-function-calling.
Переходим в каталог ollama-function-calling — cd ollama-function-calling.
Создаём файл настроек — make gen. На все вопросы нажимаем Enter, устанавливая значения по умолчанию.
Запускаем конфигурацию для модели — make run-1c.
Загружаем LLM-модель — make seed-saiga-llama.
Убеждаемся, что LLM-модель работает, — заходим на http://IP_АДРЕС_FC_OLLAMA и общаемся с моделью. Внимание, первое сообщение будет обрабатываться долго, т. к. модель всё ещё загружается в видеокарту. Необходимо подождать.
Переходим в настройки Open WebUI (иконка пользователя справа сверху — Настройки).
Свяжем 1С и Open WebUI: Учетная запись — Ключи API (показать) — Создать новый секретный ключ (далее КЛЮЧ_API).
Свяжем Open WebUI с 1С: Настройки администратора — Конвейеры — Base Url (далее BASE_URL) устанавливаем http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/hs/function-calling и нажимаем кнопку «Сохранить».
Заходим в базу 1С — Демо. Вызов функций 1С из Ollama — Настройки. Имя сервера - IP_АДРЕС_FC_OLLAMA. Ключ API — КЛЮЧ_API.
Замечание. Остановить работу сервисов LLM-модели можно командой — make stop. Запустить работу — make run-1c.
Шаг 3. Тестирование
Внимание, т. к. платформа учебная, то необходимо закрыть конфигуратор 1С и предприятие 1С. Не должно быть никаких соединений с базой. Проверить работу HTTP-сервиса можно по ссылке http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/hs/function-calling — успешным ответом будет «Calling 1C functions from Ollama».
Демо работы в Open WebUI
Для полноценного функционирования и тестирования в 1С необходима стандартная платформа и лицензии. Для учебной версии протестировать функционал в 1С не получится.
Демо работы в 1C
Как это работает
Для того чтобы заработал механизм вызова функций, Open WebUI расширяется плагином Pipelines. После его включения Open WebUI начинает прогонять каждый вопрос дважды. В результате чего мы получаем:
- Фильтр сообщений — проверяет сообщения на запретные темы (взлом, мошенничество, создание запрещенных вещей и т. д.).
- Лимит запросов — ограничение пользователей по количеству запросов.
- Логирование запросов — сохранение того, что пользователи спрашивают и что им отвечает модель.
- Дополнение запросов нужным контекстом — например, документацией.
- Вызов функций.
В нашем случае Pipelines перехватывает сообщение и пытается определить, нет ли в вопросе чего-то, что связано с описанными функциями в файле function_calling_1c.py:
def cost_of_remaining_stock(
self,
days: int,
) -> str:
"""
Get the cost of the remaining stock on the specified date.
:param days: The number of days of deviation from the current date. If it is now, then 0. If yesterday, then -1. If a week ago, then -7.
:return: The value of the remaining stock on the specified date.
"""
date = now()
date = date + timedelta(days=days)
res = requests.post(self.pipeline.valves.BASE_URL, json={ "name": "store", "date": date.strftime('%Y-%m-%dT%H:%M:%S.%f') })
json = res.json()
return f"The product in stock is estimated at ${json['value']} at {date.strftime('%d %B %Y')}"
Т. е. если человек начинает говорить про склад, то надо запустить эту процедуру. В ней же срабатывает POST-запрос по пути BASE_URL (http://IP_АДРЕС_FC_1C/ollama-function-calling-1c/hs/function-calling).
По пути BASE_URL работает HTTP-сервис FunctionCalling быза 1С. В модуле менеджера вычисляется сумма по формуле 3 * (НомерМесяца * 1000 + НомерДняВГоду). Поэтому модель отвечает, что остаток на складе оценивался в 12 273 на третье апреля и 12 276 на второе апреля. И это правильные ответы.
Функция ЛюбойURLМетодPOST(Запрос)
ДанныеЗапроса = ОбщегоНазначения.ЗначениеИзJSONСтроки(Запрос.ПолучитьТелоКакСтроку());
ИмяПоказателя = ДанныеЗапроса.name;
Дата = ПолучитьДатуИзСтроки(ДанныеЗапроса.date);
Если ИмяПоказателя = "store" Тогда
Значение = 3 * (Месяц(Дата) * 1000 + ДеньГода(Дата));
ИначеЕсли ИмяПоказателя = "money" Тогда
Значение = 5 * (Месяц(Дата) * 1000 + ДеньГода(Дата));
Иначе
Значение = 0;
КонецЕсли;
ДанныеОтвета = Новый Структура;
ДанныеОтвета.Вставить("value", Значение);
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(ОбщегоНазначения.СтрокаJSONИзЗначения(ДанныеОтвета));
Возврат Ответ;
КонецФункции
На этом наша работа завершена, не забудьте удалить облачные сервера.
Дополнительно
- Open WebUI — Очень простая и мощная платформа ИИ, поддерживающая множество LLM-моделей и RAG. В связке с Ollama и Pipelines позволяет настроить агентов, которые будут работать над приватными данными локально в собственном окружении.
- Код демо базы 1С