Рассказ на первый взгляд дзен

Трагедии на шахтах были, есть и будут, пока в горном деле задействован человеческий фактор, считают шахтеры ветераны кузбасса. в

Трагедии на шахтах были, есть и будут, пока в горном деле задействован человеческий фактор, считают шахтеры – ветераны Кузбасса. В том числе и с шахты «Листвяжная», куда приехал специальный корреспондент газеты ВЗГЛЯД после трагедии, унесшей жизни 51 горняка и спасателя.

– Траур объявлен, да. Подавлены повсюду люди, но везде понемножку, – объясняет Екатерина, подруга одной из родственниц погибших. – Мы все тут из Ленинска-Кузнецкого, оттуда наши пять семей, которые сейчас здесь. Я Светлану пришла поддержать, у нее сын Сергей там погиб…

– А так, – перечисляет Екатерина, – из города Белово на «Листвяжной» работают. И из поселка Грамотеино. Из Прокопьевска, из Колмогоровского. Отовсюду на «Листвяжную» ездят, говорит она. – Потому и нет сейчас такого, чтобы всем населением в плач уходить. Не как в Союзе, где в бригадах чуть ли не всеми соседями шли. В этом плане сейчас полегче, чем в Союзе: там целиком поселками шли в горе, если что.

Суббота, второй день после трагедии. Из проходной «Листвяжной» то и дело выходят родные погибших – «вот наши», в какой-то момент говорит Екатерина. Некоторые, увидев журналистов, сгрудившихся у проходной, говорят с ними. В основном – про чудо, случившееся накануне.

Горноспасателя, врача Александра Заковряшина уже успели наградить орденом Мужества посмертно – вместе с пятью коллегами, погибшими на «Листвяжной» в четверг. Заковряшина его коллеги нашли в пятницу, через день после трагедии – поймал под завалами поток свежего воздуха, смог не только не задохнуться, но и выбраться и пойти навстречу спасателям. Жив, но в тяжелом состоянии: переохлаждение и интоксикация, есть угроза почкам. Спасенный Александр лежит в больнице в Кемерове, рядом – искусственная почка, готовая к подключению в любой момент.

Указ под случившееся чудо переписали быстро. Счет погибших изменился в лучшую сторону. Но у тех, кто убит горем, свои вопросы.

 Наградили спасателя, а он живой выходит. И слава Богу, долгих лет ему. А наши-то где?
 Один выжил – значит, нам неправду говорят про концентрацию метана?
 Пожалуйста, люди добрые, мы согласны пойти в шахту и руками раскопать. Только пустите нас туда.

(Здесь и далее курсивом – прямая речь тех, кто потерял на шахте «Листвяжной» родных и близких – прим. ВЗГЛЯД)

* * *

– Они что, закончили спасательную операцию? – недоумевает кто-то из родных.

Из-под шлагбаума с «Листвяжной» выезжают несколько машин: «Передвижной командный пункт МЧС», «Пункт пожарной службы», «Межведомственный командный пункт», вереница ведомственных автобусов в придачу. У шахтоуправления – лишь несколько машин: полиция, Следственный комитет, пара скорых. О том, что как раз в этот момент продолжилась спасательная операция и горноспасатели ушли вниз, в шахту (точнее, то, что от нее осталось), и родственникам, и журналистам сообщат позже.

Судя по тому, как отреагировали родные и близкие – слишком поздно. Реакция убитых горем понятна, описанию поддается; стоит ли.

– Все же надо как-то соизмерять, – говорит Екатерина. – Мой муж шахтер, у нас всякое было. Никто не прекратит работы до последнего, тем более за два дня, это невозможно. Но у Светы горе, у всех горе – им каждый шаг надо каждую секунду объяснять, если они на шахту пришли. Почему этого не делают?

 Они работали ради семьи. Где работать? У нас трое детей. В шахте только. Мой не знал, что до такой степени, до гибели все будет происходить. Почти четыре года работал, но не знал, что так. Когда он работал продавцом, десять тысяч получал – попробуйте, прокормите себя и детей. Продукты купите, игрушки, вещи – которые стоят дороже, чем у взрослых.
 От 60 тысяч зарплата, плюс-минус. Стоит вот такое – этих денег?
 Горнорабочим – тысяч 50 грязными. В лаве – тысяч 70. При плане можно и нормально получить, но это несколько раз в год. Заработок зависит от плана, поэтому наши мужья идут на это.
 За вещами мужа [на шахту] не начальство сказало приехать, а друг нашей семьи. Приезжай, говорит, я тебя отвезу. Как я не поеду, как не поеду? Забрала баулы, пошла домой. Верните мужа, я прошу вас…

* * *

В ожидании новостей можно открыть массивный альбом, подаренный спецкору газеты ВЗГЛЯД в администрации города Белово. «Шахта «Листвяжная» От кирки и лопаты до шахты мирового уровня» – сообщает разворот. Альбом посвящен недавнему, 2018 года, 80-летию Белова и городского округа: 125 тыс. жителей, «уголь – становой хребет экономики», 47% городских налогов. Выше, чем в среднем по Кузбассу, где уголь дает более четверти регионального ВРП.

Шахта, где работает почти 1800 человек, действительно из лучших, из образцовых. В 2012 году ее посетил Дмитрий Медведев, в то время уже председатель правительства РФ – перед совещанием по угольной отрасли, собранном в Ленинске-Кузнецком. Про «Листвяжную» Медведев сказал тогда отдельно: «Условия на этой шахте хорошие, шахта современная, но сам труд шахтера, конечно, очень тяжелый». 

 Мы ждем, что они вытащат наших. Вчера сказали, что живых нет. Мы ждем тела.
 Они запустили азот, чтобы нейтрализовать взрывные газы. Теперь могут поднять только трупы.
 Двое суток, трое суток – еще можно что-то сделать. Сегодня  последний день, когда можно кого-то спасти.
 Живых нет, навряд ли теперь будут. А могли бы сегодня попробовать.

– Не могли, – заочно отвечает Николай Медведев, глава военизированной горноспасательной части (ВГСЧ) федерального МЧС. Полковник Медведев появляется ближе к вечеру, когда все родственники уже уехали по домам: снег, около минус 20, долго стоять трудно даже без горя. – Шансов нет, мы людям еще вчера сказали об этом.

– Но и вчера, и сегодня вы говорили о пострадавших, а не о погибших, – напоминает кто-то из журналистов, обступивших Медведева около проходной «Листвяжной».

Действительно, говорил и говорит. Что в субботу в шахту в 14.20 вошли три спасательных отделения – одно на разведку, два в резерве. Что главное при этом – «выяснение состояния газовой атмосферы в шахте». Проще говоря, сколько там накопилось метана. И только вторым пунктом – поиск и обнаружение возможных мест нахождения пострадавших. И план «на поиск и выдачу» этих самых пострадавших будет разработан только по итогам разведки – то есть, если позволит газовая атмосфера.

– Для нас пострадавший, если он не выдан на поверхность, в любом случае [называется] пострадавший, – отвечает Медведев. – Азот, согласно плану мероприятий, действительно подается в шахту. Это происходит, чтобы исключить взрыв газовой смеси.

* * *

 Шансов нету, говорят. А кто их видел мертвыми? Может, они просто под завалами там. Я понимаю, если бы их тела видели, но не могли эвакуировать. Но их не видели.
 Сегодня только пригласили [на шахту] на встречу, побеседовать психологи. Зачем мне беседовать, вы мужика моего выньте. Я сама педагог, воспитательница в детском саду, сейчас в декрете.
 Как нас могут не запустить в шахту? Я родная мать, она – жена, как нас могут не пустить.

– Нет, – отвечает губернатор Кемеровской области Сергей Цивилев на вопрос, можно ли пустить в поисковую экспедицию роботов. – Там все так исковеркано, что проходить сегодня может только человек. И то лишь специально подготовленный.

– Нет, – отвечает Цивилев на предложение ускорить поисковые работы. –

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

При всех системах безопасности, горное дело – одна из самых опасных профессий. А когда [после трагедии в шахту] идет спасатель, степень опасности в разы выше. Это надо понимать.

– Нет, – говорит он в ответ на просьбу пустить журналистов на территорию шахты. Здесь – просто «нет», без объяснений.

К концу субботы «ВГСыЧевские», как горноспасателей называют горняки – все три отделения – выходят из шахты. Все штатно, замеры произведены. Кроме того, на поверхность выданы пятеро. И до того шестерых нашли почти сразу – шахтеры и спасатели.

Итого погибших – 11. И еще 40 пострадавших – там, внизу.

* * *

 Руководство все знает, как внизу с датчиками мухлюют. И все молчат. Всем рты закрывают. Им метры надо проходить – чем больше, тем лучше. Наши мужики метры копали, чтобы денег заработать побольше.
 Люди все в кредитах, у всех семьи. У меня трое, жена в декрете. Где еще работать, если не в шахте? Водителем можно работать – но то так себе. Работаешь, датчики [метановые] загрубляешь, чтобы автоматика не останавливала процесс. Кто не согласен – могут выгнать с шахты, и где работать…

О проклеенных двусторонним скотчем датчиках, занижающих показатели уровня метана, вокруг «Листвяжной» не говорит только самый ленивый.

Так же, как и о подобных «загрубленных» приборах говорили близ шахты «Северной» под Воркутой, где взорвалось в 2016-м – 36 погибших, консервация на семь лет.

То же самое – про «Распадскую» близ Междуреченска, Кузбасс: взрывы в мае 2010 года, погиб 91 человек. И так далее, по любой горняцкой трагедии. Разве что «Листвяжную» выделяют особо, называя «дежавю Распада», подчеркивая, что она стала второй по количеству жертв после «Распадской».

Потому что взрывы здесь – были и до нынешнего. И в 2004-м, когда погибли 13 человек. И раньше, во времена СССР.

Валерий Хриенко, бывший главный инженер

Валерий Хриенко, бывший главный инженер «Листвяжной» (фото: Юрий Васильев/ВЗГЛЯД)

– Про нынешнюю трагедию у меня нет информации, – предупреждает Валерий Хриенко. – Зато есть про другие. На «Листвяжной», конечно же. С самого начала она «Грамотеинская», по поселку Грамотеино, где мы с вами сидим сейчас. А я на нее как на «Инскую» пришел, по речке Иня. Но все одно, как ни называй – а моя родная шахта.

Работу на шахте Хриенко закончил в 2014 году – уже не под землей. Тогда ему было 67 лет, сейчас – 74. После пенсии проработал еще 16 лет – потому что пенсия «маленькая, 20 тыщ». При трудовой книжке от горнорабочего до главного инженера.

– Как главный инженер, как технолог, как горняк – обывательские разговоры про датчики поддерживать не намерен, – предупреждает Хриенко. – Есть вполне профессиональный разговор, про случаи, которые были у меня. Начало 1980-х, я как раз главный инженер. Датчик метана был помещен туда, где этого метана быть не может. Вы знаете, что такое вентиляционная труба? С огромным сечением труба, через которую в шахту вентилятор чистый воздух гонит. Лучше всего датчик снять и в эту трубу кинуть – с гарантией на сто процентов, что не запищит.

– Чем закончилось?

– Ну что, пять человек погибли, – говорит бывший главный инженер нынешней «Листвяжной». – На шахтах в СССР был общий выходной по воскресеньям. А бывало так, что шахты плана дать не могут. Значит, надо договориться с людьми на воскресенье, дать двойную оплату. Все идут, работают. А за двойную оплату надо поднапрячься, побольше добыть и побольше заработать. Вот в этом забое произошел хлопок.

«Хлопок» – не дань нынешним традициям СМИ. Так горняки называют взрыв метана.

– Вот угольная пыль взрывается очень сильно и ни в какие сравнения с газовым хлопком не идет.

Взрыв метана – это мама дитятке по попке хлопнула. А взрыв угольной пыли – это Тайсон или Валуев вам по морде съездили.

Кувырком все, кручено-верчено, полшахты на поверхность вылетит. Вот такая разница, – объясняет Хриенко.

И продолжает – про хлопок на «Инской», нынешней «Листвяжной», в начале 1980-х:

– Работы было больше обычного, потому что за двойную оплату хотелось больше выдать на-гора. Газу, соответственно, тоже было много. Датчик метана работать не давал, отключал все автоматом. Горняки сунули датчик в вентиляционную трубу. Все равно не дает работать. Стали смотреть – оказалось, что у кабеля изоляция низкая. При кабеле есть другой датчик, который не дает работать при низкой изоляции. Они его загрубили, чувствительность понизили. А тут с кровли упал кусок и перебил кабель. А защита от короткого замыкания – считайте, что тоже отключена. А уровень метана неизвестен, потому что метановый датчик – в вентиляционной трубе, где чистый воздух. Какой-то метан, стало быть, был.

Все пятеро, попавшие под «хлопок», погибли от угарного газа. Никого не изувечило, подчеркивает Хриенко.

– Просто кислород выгорел, вдохнули они – и все. Единственный, кто сориентировался – машинист комбайна. Выбежал, побежал к выходу. Тоже упал – как говорится, головой домой.

Остальные остались там, где были. У телефона мастер сидел – наряд передавал. Другие у комбайна стояли. Еще один с лопатой упал. Итого пятеро, и опять же – датчики.

– А в 2004-м, когда 13 горняков погибли?

– Это мой второй взрыв, я тогда технологом работал, – вспоминает Хриенко. – Девять человек тогда осудили, в основном коллег инженерно-технических. Правда, сроки условные.

 * * *

– Я в 80-х работала на здравпункте шахты «Пионерка», – говорит медработник Светлана, ныне пенсионерка. – Взрыв был в 1984-м на шахте, которая потом стала самостоятельной «Колмогоровской», а тогда под «Пионеркой» управлялась. За каждым погибшим, за каждым родственником закрепили одного медика и одного рабочего либо ИТРа. Мы ходили, успокаивали, были рядом.

На «Колмогоровской» машинистом подземных установок начинал Сергей Махраков – нынешний директор «Листвяжной», отправленный на два месяца в СИЗО. В августе он был признан лучшим директором шахты по итогам областного конкурса «Кузбасс – угольное сердце России». Полный кавалер ордена «Шахтерская слава» – как и Владимир Вениаминов, муж Светланы: 35 лет стажа, больше десяти лет – начальник участка на «Пионерке». На пенсию ушел в 55 лет в 1990-м, но работал еще шесть лет – «пока «Пионерку» не закрыли, а так бы продолжал».

– 35 погибших на «Колмогоровской» было, – продолжает Вениаминов рассказ жены. – Людской фактор, обыкновенный. Вентилятор перестал дуть – работа автоматически остановилась. Раз, диод [в датчик воздуха] поставили, загрубили датчик – поехали без воздуха. Метан добрался до концентрации 6% – искра, взрыв.

– А от чего искра?

– Комиссия постановила, что упала порода и перебила провод, – говорит Вениаминов. – На самом же деле… Курил в забое один: нашли тело, во рту мундштук. Но советский человек не мог курить на рабочем месте; так вот решили.

– Комиссии не всегда точно работают, – подтверждает Хриенко, ветеран нынешней «Листвяжной». – И не только при СССР.

Когда речь заходит об искре как начале трагедии, бывший главный инженер Хриенко выделяет три причины. Курение – первая. Вторая – короткое замыкание на кабельной сети: случается, когда в аппаратуре копаются неквалифицированные слесари.

Третья – искра в перебитом кабеле. Не в стационарных, тяжелых, где бронированная оплетка – а тех, которые близ забоев: гибкие, в резиновой оболочке.

– Вообще-то такой кабель к бортам выработки положено подвешивать, – напоминает о технике безопасности Хриенко. – Но на практике он может лежать на почве. И на него что-то сверху может свалиться – вот как про «Колмогоровскую» говорили. Грохнулось, перебилось – искра… ВГСыЧовские дойдут до места, все выяснят, все найдут.

* * *

Что же касается метана, то родная для Хриенко «Листвяжная» по этому показателю особо опасной не считается. Здесь-то, уверен он, и кроется – по парадоксу – реальная опасность:

– Там, где шахта сильно газовая – там все настороже, и вольностей себе люди никаких не позволяют. А тут – расслабуха, газа нет, ну и работаем как работается. Всё, обывательские разговоры прекращаем, ждем результатов комиссии…

Вот что действительно настораживает бывшего главного инженера – время трагедии. 8.30. Это пересменка – одна смена выходит из забоя на-гора, другая под землей идет на работу.

– И что у нас с возможными источниками хлопка ли, взрыва ли? – спрашивает Хриенко. – Курение я отметаю. Одна смена уходит, знает, что через 20-30 минут поднимется на поверхность и накурится выше крыши. Ни от кого не прячась: поймают шахтеры кого за курением в шахте – так и убить могут, тоже были случаи. А те, кто спускаются на смену – уже до ушей накуренные, зеленые; им-то зачем.

Короткое замыкание от слесарей «с руками понятно откуда», отклоняется бывшим главным инженером по той же причине: те ушли, другие не пришли. Значит, остается легкий кабель, лежащий на земле и перебитый упавшей породой.

– Но и тут есть вопросы, – говорит Хриенко. – Максимум метана выделяется, когда рубят уголь. А в пересменку никто ничего не рубит. Даже если перед этим комбайн интенсивно рубил в конце смены, торопились горняки план дать – так пересменка полчаса, все всё уже проветрили, источника метана нету. Основного, самого главного.

Среди прочих источников газа, по Хриенко, – метан, «сочащийся» со стен выработки; но его не так много, «с основным не сравнится». Или метан с конвейера, где уголь идет – но конвейер, опять же, между сменами не работает. Возможно, предполагает ветеран «Листвяжной», в пересменку рухнула глыба с кровли, «плита огромной площади – бывает четыреста квадратных метров, а бывает и полторы. Вот тогда большое метановое облако может высвободиться», говорит горный инженер. Но это бывает редко. А чтобы попасть на легкий кабель и перебить его – еще реже.

– И однако же, странное время пересменка, – возвращается к началу Хриенко. – Как профессионала меня оно напрягает. Источников хлопка, взрыва – не так много. А людей – гораздо больше, чем обычно. И вот я бы сказал, что кому-то трупов надо было побольше…

Что называется, немая сцена.

– Я не верю в диверсию на шахте, – тут же оговаривается ветеран «Листвяжной» со стажем более 40 лет. – Просто и эту фантастику, по моим выкладкам и имеющейся информации, исключать пока бы не стал. На всякий случай. А следствие поработает, новые данные найдет – все будет понятнее. Ну, я надеюсь, что понятнее.

* * *

Владимир Вениаминов, ветеран шахты

Владимир Вениаминов, ветеран шахты «Пионерка», Кузбасс (фото: Юрий Васильев/ВЗГЛЯД)

– Сколько бы датчиков ни ставили, травмы были, есть и будут. Пока людей в шахтах роботы не заменят – будет одно и то же, – уверен Владимир Вениаминов, ветеран шахты «Пионерка». – За 35 лет меня – как всех нас – и ломало, и крутило. Оглох на 50%, спину угробил. Я так скажу: на нормальном производстве пенсию в полтинник не дают.

Что считать нормой: советские зарплаты шахтеров при дефиците товаров – или нынешнее форменное, по сравнению с временами Союза, изобилие, но при «плюс-минус» 60-70 тысяч в забое, а больше – если повезет с планом? Если, как того желает ветеран Вениаминов, в забои когда-то спустятся «роботы», то есть целиком автоматизированные системы, – где работать людям, что не могут прокормить свои семьи как «продавцы за 10 тысяч»? Как, прежде всего, быть с безопасностью – проблема которой как стояла, так и стоит? Что при социализме, что при капитализме.

– На каждой шахте есть государственный стандарт промышленной безопасности. У нас в Кузбассе есть свой, более высокий стандарт промышленной безопасности на опасных объектах, – разъясняет собравшимся у проходной «Листвяжной» губернатор Сергей Цивилев. – Этот набор мероприятий прописан в журналах, все контролируется. Все эти материалы сейчас изъял Следственный комитет. Он разбирается, соответствуют ли прописанное в журналах реальной обстановке или нет. Подтверждаю, что родственники делали заявления [о датчиках]. Следствие установит, были ли нарушения, и если да – то кто в них виноват. Это очень важно для всех: разобраться в ситуации – и чтобы такое не повторялось, чтобы трагедий больше не было.

– Это было всегда. Это есть. И это будет, – вздыхает Вениаминов, когда речь заходит о гибели шахтеров.

– Даже если ввести, как в очередной раз предлагается, огромные штрафы для угольных промышленников? В дополнение к уголовной ответственности, просто по факту гибели людей в забое?

– Человек, спускающийся в шахту, берет билет в один конец, – говорит полный кавалер ордена «Шахтерская слава». – Просто контролер приходит не каждый раз.

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

В понедельник все будет готово к выдаче первых тел погибших на «Листвяжной». Будут вытаскивать остальных. В Кузбассе начнется время похорон.

 Мой не дожил до отпуска, до второго числа…
 Берегите своих родных, да *** с ними, с любыми деньгами, прожили бы…
 Наших уже не уберегли. Пусть у вас всегда будет не так, как у нас. Извините, что коряво сказала.

Большинство разработчиков, когда-либо сталкивавшихся с NLP задачами, рано или поздно задумывались над проблемой, обозначенной в заголовке статьи. Решений подобного рода создавалось достаточное количество, каждое со своими особенностями, плюсами и минусами. Первое, с которым мы с коллегами встретились лет 10 назад, и ссылку на которое я не смог сейчас даже найти, было оформлено в виде абсолютно нечитаемой диссертации. Мы честно, шаг за шагом пытались прорваться сквозь ее страницы, но отчаялись и утратили интерес к данной тематике на несколько лет. Но, рано или поздно к этой проблеме возвращаешься. И в целом в индустрии интерес к данному вопросу уже не один раз разогревался и остывал, а в последние годы он снова на подъеме.

image

Системы преобразования текстовых запросов в SQL

Что должна уметь такая система:

  • Найти в тексте сущности, соответствующие сущностям базы данных: таблицы, колонки, иногда значения.
  • Связать таблицы, сформировать фильтры.
  • Определить набор возвращаемых данных, то есть составить select list.
  • Определить порядок выборки и количество строк.
  • Выявить, помимо относительно очевидных, некие абсолютно неявные зависимости или фильтры, непрозрачные ни для кого, кроме дизайнеров схемы базы (смотри условие по полю bonus_type на картинке выше)
  • Разрешить неоднозначности при выборе сущностей. “Дай мне данные по Иванову” — следует запросить информацию по контрагенту или сотруднику с такой фамилией? “Данные по сотрудникам за февраль” — ограничить выборку по дате найма или по дате продаж? и т.д.

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

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

Алгоритмы и правила

На первый взгляд задача преобразования разобранного предложения в SQL — проблема чисто алгоритмическая, то есть без проблем решаемая. Кажется, что у нас есть все, что нужно для конвертации одной строгой модели в другую: распознанные сущности, ссылки, co-references и т.д. Но, к сожалению, нюансы и неоднозначности как и всегда все усложняют, а в данном случае делают стопроцентно универсальный подход почти нерабочим. Модели неидеальны (см. примеры выше и далее по ходу статьи), сущности пересекаются, как по именам так и по смыслу, рост сложности при росте количества сущностей и усложнении базы становится нелинейным.

Нейросети

Использование нейросетей для подобных систем — бурно развивающееся направление. В рамках данной статьи ограничусь ссылками и краткими выводами.

Советую прочесть небольшой цикл статей: 1, 2, 3, 4, 5, в них совсем немного теории, рассказ о том как проводится обучение и тестирование на качество, краткий обзор решений. Дополнительно здесь — подробнее о SparkNLP. Здесь — о решении Photon от SalesForce. По ссылке еще один представитель open source сообщества — Allennlp. Здесь — данные по качеству систем, то есть показатели тестов. Здесь — данные по использованию NLP библиотек и в частности подобных решений в enterprise.

За данным направлением большое будущее, но снова с оговорками — пока не для всех типов моделей. Если при работе с моделью не требуется получение совершенно строгих цифр и гарантированно точного, повторяемого, предсказуемого результата (например, требуется определить тренд, сравнить показатели, выявить зависимость и т.д.) — все хорошо. Но недетерминированность и вероятностный характер ответов накладывают ограничения на использование подобного подхода для целого ряда систем.

Примеры работы с системами, основанными на нейросетях

Зачастую компании, предоставляющие сервисы подобного рода, демонстрируют прекрасные результаты на отлично сделанных видео и далее предлагают связаться с ними для детальной беседы. Но есть и доступные в сети онлайн демо. Особенно удобно экспериментировать с Photon, так как в данном случае схема базы сразу перед глазами. Второе демо, которое я видел в свободном доступе — от Allennlp. Разбор некоторых запросов удивляет своей изощренностью, некоторые варианты чуть менее удачны. Общее впечатление смешанное, попробуйте поиграть с этими демо, если есть интерес, и составить свое мнение.

image

В целом получается достаточно интересная ситуация. Системы автоматического перевода текстовых неструктурированных запросов в SQL, основанные на нейронных сетях, становятся все лучше и лучше, качество прохождения тестовых наборов все выше и выше, но все равно их значение не превышает в лучшем случае 70% (spider dataset — порядка 69% на сегодняшний день). Можно ли считать этот результат хорошим? С точки зрения развития подобных систем — да, безусловно, результаты впечатляют, но использовать их уже сегодня в реальных системах без доработки возможно далеко не для всех видов задач.

Инструменты Apache NlpCraft

Как может помочь проект Apache NlpCraft при построении и организации подобного рода систем? Если по первой части задачи (разбор текстового запроса) вопросов не возникает, все как обычно, то для второй части (формирование SQL запросов, основанных на NLP данных), NlpCraft не предоставляет стопроцентно законченного решения, а лишь инструментарий, помогающий в самостоятельном решении данной проблемы.

С чего начать? Если мы хотим по максимуму автоматизировать процесс разработки, нам помогут метаданные схемы базы и сами данные. Перечислим какую информацию мы можем извлечь из базы и для простоты ограничимся таблицами, не будем пытаться анализировать триггеры, stored procedures и т.д.

  • Имена таблиц и имена колонок — самая важная информация. Эти имена по сути определяют сущности нашей модели, мы можем искать их в тексте запроса напрямую или через синонимы.
  • Признак обязательности (null / not null) поможет правильно составить запросы с фильтром (where clause).
  • Отношения между сущностями, определяющиеся через объявленные foreign keys и уникальные индексы, выявляют связи типа 1:1, 1:0, 1:n, n:m. Информация необходимая для построения корректных joins.
  • Типы данных столбцов могут помочь в создании правильных фильтров. Так, например, условия сравнения могут применяться для числовых столбцов и гораздо реже используются для строковых и т.д. Также по типам данных могут быть сделаны выводы, стоит ли включать эти данные в select list.
  • Анализ самих данных. Простор для творчества безграничен. Если в каком-то столбце на все множество записей приходится лишь ограниченный повторяющийся набор значений — можно предположить, что тип данных рассматриваемого столбца — enumeration, это может пригодиться для построения запросов. И это только один пример.
  • Наличие индексов. Указывает на то, что по данным индексированным полям предполагается делать соединения между таблицами или осуществлять фильтрацию. Это знание очевидно пригодится в процессе формирования все тех же фильтров.
  • Primary and unique keys — информация об уникальности записей, помимо многого другого, поможет составить подзапросы, возвращающие гарантированное количество строк.
  • Комментарии для таблиц и столбцов (имеющиеся, например, в Oracle) — очевидная дополнительная информация к именам.
  • Check constraints — знание ограничений может помочь в построении все тех же фильтров по данным столбцам.

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

CREATE TABLE users (
    id number primary key,
    first_name varchar(32) not null,
    last_name varchar(64) not null unique,
    birthday date null,
    salary_level_id number not null foreign key on salary_level(id)
);

В реальности все будет не так уж и радужно, имена будут сокращены и нечитаемы, типы данных зачастую окажутся совершенно неожиданными, а денормализованные поля и впопыхах добавленные таблицы типа 1:0 будут разбросаны там и тут. В итоге, если быть реалистами, большинство существующих какое-то продолжительное время в продакшене БД, можно будет разве что с большим трудом использовать для распознания сущностей без какой-то предварительной подготовки. Это касается любых систем, а основанных на нейросетях, возможно, даже в большей степени, чем прочих.

В данной ситуации можно посоветовать дать NLP модулю доступ к несколько облагороженной схеме — заранее подготовленному набору views, с правильными названиями полей, необходимым и достаточным набором таблиц и столбцов, тут же можно учесть вопросы security и т.д.

Приступаем к проектированию

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

  • Опросите пользователей и выпишите 30-40 наиболее стандартных типов вопросов.
  • Выявите запрашиваемые сущности, определите их соответствие сущностям базы данных, таблицам, столбцам и т.д.
  • Объедините группы запросов в интенты. Пусть интенту соответствует один параметризованный SQL, тогда для выбранных на первом этапе вопросов вы получите максимум 20-30 интентов. При этом оставьте один общий интент, по умолчанию. Вы можете сами формировать для него SQL или воспользоваться одной из ML библиотек text2Sql, о которых мы говорили выше.
  • Далее задача легко параллелится. С одной стороны — описываете элементы через синонимы, для начала с помощью минимального набора, пусть даже одного слова, этот список может быть расширен позднее. С другой стороны — отлаживаете параметризованные SQL запросы. C третьей — формируете интенты и пишите тесты на сам факт их срабатывания, на первом этапе можно даже без выполнения реальных запросов.

При таких объемах работы и достаточных ресурсах, время, требующееся для решения подобной задачи, измеряется днями, и на выходе вы имеете 80% покрытия потребностей пользователя, причем с достаточно высоким качеством исполнения. Далее вернитесь к первому пункту и добавьте еще интентов.

Зачем стоит поддерживать несколько интентов, проще всего пояснить на примере. Почти всегда пользователей интересует какое-то количество весьма нестандартных отчетов, что-то вроде “сравни мне то-то и то-то для такого-то периода, но не входящее в такой-то период и при этом …”. Ни одна система не сможет сразу сформировать SQL для подобного запроса, вам придется или как-то обучать ее, или выделять и отдельно программировать подобные случаи. Умение отвечать на ограниченный круг замысловатых запросов очень важно для ваших пользователей. Снова ищите баланс, не факт, что вообще хватит ресурсов удовлетворить все подобные запросы, но полностью игнорировать такие пожелания значит сузить функционал системы до неприемлемого уровня. Если вы найдете правильное соотношение, ваша система будет требовать конечного времени на разработку и не являться просто забавной игрушкой на несколько дней, вызывающей впоследствии скорее раздражение, а не приносящей пользу. Очень важный момент — добавлять интенты для хитрых запросов, можно не сразу, а в процессе работы, один за одним. MVP мы имеем сразу всего с одним универсальным интентом.

Инструментарий и API

Apache NlpCraft предлагает инструментарий для упрощения процедуры работы с базой данных.

Порядок работы:

  1. Сгенерируйте шаблон модели по jdbc url базы данных. Как я уже упоминал выше, иногда лучше подготовить набор views с более “правильной“ репрезентацией данных и предоставить доступ к этому набору. Генерация шаблона проще всего производится с помощью утилиты CLI. Запускаем утилиту, указываем в качестве параметров схему базы, jdbc driver, список используемых и игнорируемых таблиц и другие параметры, подробнее в документации.
  2. В результате работы утилиты получаем модель в виде JSON или YAML файла, описывающую таблицы, столбцы, связи между таблицами, простейшие синонимы и т.д., то есть все, что можно извлечь из данных и метаданных схемы базы.

    Пример описания для одной и таблиц и одного из ее столбцов схемы примера:

    - id: "tbl:orders"
     groups:
     - "table"
     synonyms:
     - "orders"
     metadata:
       sql:name: "orders"
       sql:defaultselect:
       - "order_id"
       - "customer_id"
       - "employee_id"
       sql:defaultsort:
       - "orders.order_id#desc"
       sql:extratables:
       - "customers"
       - "shippers"
       - "employees"
     description: "Auto-generated from 'orders' table."
    .....
    - id: "col:orders_order_id"
     groups:
     - "column"
     synonyms:
     - "{order_id|order <ID>}"
     - "orders {order_id|order <ID>}"
     - "{order_id|order <ID>} <OF> orders"
     metadata:
       sql:name: "order_id"
       sql:tablename: "orders"
       sql:datatype: 4
       sql:isnullable: false
       sql:ispk: true
     description: "Auto-generated from 'orders.order_id' column."
    
  3. Полученная модель — это шаблон, полученный на основании анализа данных и метаданных, он сформирован для экономии вашего времени. Теперь его нужно внимательно изучить, расширить и возможно исправить. Дополнить список синонимов, уточнить, если потребуется, значения по умолчанию, сортировку, указанные межтабличные связи, таблицы дополнений и т.д. Вся документация приведена на сайте.
  4. На основании обогащенной модели разработчик может воспользоваться компактным API, существенно облегчающим построение SQL запросов в функции интентов — смотри детальный пример.

Ниже для наглядности фрагмент кода:

@NCIntent(
  "intent=commonReport " +
  "term(tbls)~{groups @@ 'table'}[0,7] " +
  "term(cols)~{
    id == 'col:date' || 
    id == 'col:num' || 
    id == 'col:varchar'
  }[0,7] " +
  "term(condNums)~{id == 'condition:num'}[0,7] " +
  "term(condVals)~{id == 'condition:value'}[0,7] " +
  "term(condDates)~{id == 'condition:date'}[0,7] " +
  "term(condFreeDate)~{id == 'nlpcraft:date'}? " +
  "term(sort)~{id == 'nlpcraft:sort'}? " +
  "term(limit)~{id == 'nlpcraft:limit'}?"
)
def onCommonReport(
  ctx: NCIntentMatch,
  @NCIntentTerm("tbls") tbls: Seq[NCToken],
  @NCIntentTerm("cols") cols: Seq[NCToken],
  @NCIntentTerm("condNums") condNums: Seq[NCToken],
  @NCIntentTerm("condVals") condVals: Seq[NCToken],
  @NCIntentTerm("condDates") condDates: Seq[NCToken],
  @NCIntentTerm("condFreeDate") freeDateOpt: Option[NCToken],
  @NCIntentTerm("sort") sortTokOpt: Option[NCToken],
  @NCIntentTerm("limit") limitTokOpt: Option[NCToken]
): NCResult = {
  val ext = NCSqlExtractorBuilder.build(SCHEMA, ctx.getVariant)
  
  val query =
    SqlBuilder(SCHEMA).
      withTables(tbls.map(ext.extractTable): _*).
      withAndConditions(extractValuesConditions(ext, condVals): _*).
      ...
    // Все прочие операции по построению SQL запроса из найденных
    // сущностей. 
 }

Здесь представлен фрагмент функции интента по умолчанию, реагирующего на любой определенный в запросе элемент базы и срабатывающего если в процессе матчинга не было найдено ни одного более строгого совпадения. В нем продемонстрировано использование API SQL elements extractor, задействованного при построении SQL запросов, а также работа с SQL builder примера.

Что еще раз хочется подчеркнуть, Apache NlpCraft не предоставляет готовый tool для перевода разобранного текстового запроса в SQL, эта задача находится вне рамок проекта, по крайней мере в текущей версии. Код построителя запросов доступен в примерах, а не в API, он имеет существенные ограничения, но он и состоит при этом всего из 500 строк кода с комментариями, или около 300 без них. При этом, несмотря на всю свою простоту и даже ограниченность, даже эта простейшая имплементация способна сформировать нужные SQL для весьма существенного количества самых разнообразных типов пользовательских запросов. В настоящей версии мы предлагаем нашим пользователям, заинтересованным в построении подобных систем, использовать данный пример в качестве шаблона и развивать его под свои потребности. Да, это задача не на один вечер, но вы получите результат несопоставимо более высокого качества, чем при использовании в лоб универсальных решений.

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

Заключение

Построить систему обращения к базе данных задача не из простых, но Apache NlpCraft уже взял на себя немалую часть рутинной работы, и во многом благодаря этому, разработка системы достойного качества займет измеримое время и ресурсы. Будет ли Apache NlpCraft community развивать направление автоматизации перевода текстовых запросов в SQL и расширять этот простой SQL пример до полноценного API — покажет время и запросы пользователей, формирующие план и направление развития проекта.

«Зенит» узнал соперника по стыковым матчам Лиги Европы. Им стал «Бетис», занимающий третье место в турнирной таблице текущего сезона Примеры. Наиболее интересным же на этой стадии станет противостояние «Барселоны» и «Наполи». Жеребьёвка 1/8 финала Лиги чемпионов с участием Андрея Аршавина в роли звёздного гостя оказалась омрачена серьёзными техническими накладками, из-за которых церемонию пришлось проводить заново. В итоге образовались две суперпары: ПСЖ померится силами с «Реалом», а «Интер» — с «Ливерпулем».

Непростой жребий для «Барселоны»

В понедельник, 13 декабря, в швейцарском Ньоне состоялась жеребьёвка плей-офф всех трёх еврокубков. Однако внимание российских болельщиков было приковано к Лиге Европы, где своего соперника должен был узнать «Зенит». Петербуржцы заняли третье место в группе H Лиги чемпионов и вылетели из турнира, а на стадии 1/16 финала достаться им могли команды, ставшие вторыми в квартетах ЛЕ: загребское «Динамо», «Олимпиакос», «Реал Сосьедад», «Наполи», «Бетис», «Рейнджерс», «Брага» и «Лацио».

Откровенно пугающих вариантов не было, но нежелательно было бы попасть на двух итальянских грандов, пусть неаполитанцы дважды и уступили «Спартаку» на групповой стадии. Все остальные коллективы на бумаге смотрелись чуть слабее.

Также по теме

Александр Селихов
Спасение Селихова, вера Джикии и похвала от Карреры: что обсуждали после победы «Спартака» над «Легией» в Лиге Европы

Выход «Спартака» в 1/8 финала Лиги Европы с первого места в группе — феноменальный результат, заявил бывший главный тренер москвичей…

В результате клуб с берегов Невы получил промежуточный вариант в виде «Бетиса». На первый взгляд испанский коллектив не кажется грозным. Он редко попадает в еврокубки, чаще оказываясь в середине турнирной таблицы национального первенства, и в XXI веке даже несколько раз вылетал из элитного дивизиона. Интересно, что ранее пути оппонентов никогда не пересекались, хотя севильцы провели четыре игры с «Рубином» и московским «Динамо».

Однако в новом сезоне Примеры «Бетис» приятно удивляет своих болельщиков и под руководством опытного тренера Мануэля Пеллегрини, известного по работе с «Манчестер Сити», «Реалом» и «Вильярреалом», занимает третье место в турнирной таблице, уступая только «Реалу» и «Севилье». А нападающий клуба Хуанми с десятью голами делит вторую строчку в гонке бомбардиров турнира с Винисиусом Жуниором.

Другой испанской команде «Барселоне», сенсационно не сумевшей выйти в плей-офф ЛЧ, достался наиболее грозный соперник из всех возможных — «Наполи». Возглавляемые Лучано Спаллетти неаполитанцы ведут борьбу за чемпионство в Италии, хотя и потерпели два поражения подряд. В противостоянии с переживающими серьёзный кризис каталонцами скорее они выглядят фаворитами.

В последний раз соперники встречались совсем недавно, в рамках 1/8 финала ЛЧ-2019/20. Причём между первой и второй играми тогда из-за пандемии коронавируса прошло полгода. В Италии в феврале команды разошлись миром (1:1), а в ответном матче в августе сильнее оказались сине-гранатовые (3:1).

Остальные пары получились менее представительными, а пути клубов из топ-5 ведущих первенств Старого Света пересеклись ещё только в одном случае.

Экс-наставнику «Спартака» Доменико Тедеско предстоит решить непростую задачу. Вверенный ему «Лейпциг» сойдётся с набравшим неплохой ход «Реалом Сосьедад». «Аталанта», цвета которой защищает Алексей Миранчук, встретится с многократным чемпионом Греции «Олимпиакосом». А другой итальянский коллектив «Лацио» сыграет с «Порту».

Пару слов необходимо сказать и про жребий для «Шерифа». Сильнейшая команда Молдавии, сенсационно обыгравшая на групповом этапе ЛЧ мадридский «Реал» и «Шахтёр», получила вполне проходимого соперника — «Брагу». А это значит, что подопечные Юрия Вернидуба имеют хорошую возможность впервые в истории пробиться в 1/8 финала еврокубка. Остаётся добавить, что первые стыковые матчи состоятся 17 февраля, а вторые — 24-го.

Извечные соперники для Месси и Роналду

Жеребьёвка Лиги чемпионов оказалась омрачена скандалом. Изначально она состоялась в 14:00 по московскому времени. По воле случая в инциденте оказался замешан бронзовый призёр Евро-2008 Андрей Аршавин, которого пригласили в качестве звёздного гостя для проведения процедуры.

Сначала всё шло по плану. В соперники «Реалу» бывший капитан сборной России достал «Бенфику». Проблемы начались при формировании следующей пары, когда жребий свёл пути «Вильярреала» и «Манчестер Юнайтед», хотя они не могли встретиться в 1/8 финала, поскольку играли в одной группе. Аршавина попросили достать другую команду, и ею стал «Манчестер Сити».

Также по теме

61b1141902e8bd3a3c0e9b30
Дубль Вернера, чудо-гол Оздоева и моменты Азмуна: как «Зенит» сыграл вничью с «Челси» в Лиге чемпионов

В матче заключительного тура группового этапа Лиги чемпионов «Зенит» дома сыграл вничью с «Челси» — 3:3. Петербуржцам удалось…

На этом сложности не закончились, ведь оппонентом «Атлетико» мог стать «Ливерпуль». Эти команды также противостояли друг другу в одном квартете главного еврокубка. Однако «Атлетико» попал на «Баварию», а мерсисайдцам достался «Зальцбург». Кроме того, ПСЖ достался МЮ, а значит, Лионелю Месси и Криштиану Роналду предстояло сойтись лицом к лицу.

Однако вскоре УЕФА объявил, что жеребьёвка будет проведена повторно.

«Из-за технической проблемы с программным обеспечением внешнего поставщика, который сообщает официальным лицам УЕФА, какие команды имеют право играть друг с другом, была допущена серьёзная ошибка при жеребьёвке 1/8 финала Лиги чемпионов», — говорится в заявлении организации.

Против новой жеребьёвки, по информации СМИ, выступил лишь «Реал». Мадридцы якобы упирали на то, что ошибки начались уже после определения их пары. И «сливочных» можно понять, ведь они получили в оппоненты скромную «Бенфику». Однако своё решение УЕФА менять, конечно, не стал.

В испанском клубе будто чувствовали — на этот раз Аршавин отправит их к куда более грозной команде. В результате 13-кратному обладателю трофея достался ПСЖ. А Месси в первом же сезоне после отъезда из «Барсы» предстоит впервые встретиться с извечным оппонентом не в составе каталонцев. Пути команд в последние годы регулярно пересекаются в ЛЧ. Так, в позапрошлом сезоне они попали в одну группу и парижане разгромили мадридцев дома (3:0) и сыграли вничью в гостях (2:2). Зато в сезоне-2017/18 те оказались сильнее в 1/8 финала — 3:1, 2:1.

Криштиану Роналду также придётся встретиться с прекрасно знакомым конкурентом — «Атлетико». За всю карьеру именно против мадридцев португалец играл больше всего — 35 раз. И в этих матчах он забил 25 мячей. Чаще нападающий огорчал только «Севилью» — 27 голов. Теперь у него есть шанс вывести соперника на первое место в своём личном рейтинге наиболее излюбленных оппонентов.

Большой интерес вызывает противостояние действующего чемпиона Италии «Интера» и одной из сильнейших команд Англии «Ливерпуля». Их пути пересекались на удивление нечасто — всего дважды. В полуфинале Кубка европейских чемпионов — 1964/65 сильнее оказались миланцы, совершившие впечатляющий камбэк после поражения в первом матче на выезде со счётом 1:3. В 1/8 финала ЛЧ-2007/08 мерсисайдцы взяли реванш — 2:0, 1:0.

  • Рассказ на пословицу хлеб всему голова
  • Рассказ на одну букву о отец онуфрий
  • Рассказ на лингвистическую тему сложносочиненные предложения
  • Рассказ на немецком языке о летних каникулах с переводом 7 класс
  • Рассказ на немецком языке о берлине на немецком языке с переводом