{
    "componentChunkName": "component---src-templates-doc-page-js",
    "path": "/docs/ru/NLU_core/slot_filling/",
    "result": {"data":{"site":{"siteMetadata":{"title":"Gatsby-doc-engine"}},"markdownRemark":{"id":"b964181e-0b47-5ce9-a9b0-63f8425cd8d8","excerpt":"Слот-филлинг Слот-филлинг — процесс уточнения информации, необходимой для выполнения запроса клиента. Слоты — сущности, которые клиент упоминает в запросе либо…","html":"<h1>Слот-филлинг</h1>\n<hr>\n<p><strong>Слот-филлинг</strong> — процесс уточнения информации, необходимой для выполнения запроса клиента.</p>\n<p><strong>Слоты</strong> — сущности, которые клиент упоминает в запросе либо в процессе уточнения информации.</p>\n<p>В данной статье рассматриваются следующие вопросы:</p>\n<ul>\n<li><a href=\"#%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%BB%D0%BE%D1%82%D0%BE%D0%B2\">Извлечение слотов</a>.</li>\n<li><a href=\"#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-%D1%81%D0%BB%D0%BE%D1%82%D0%BE%D0%B2\">Параметры слотов</a>.</li>\n<li><a href=\"#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8F-%D1%81%D0%BB%D0%BE%D1%82-%D1%84%D0%B8%D0%BB%D0%BB%D0%B8%D0%BD%D0%B3%D0%B0\">Подключение модуля слот-филлинга</a>.</li>\n<li><a href=\"#%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D1%81%D0%BB%D0%BE%D1%82%D0%BE%D0%B2-%D0%B2-%D1%81%D1%86%D0%B5%D0%BD%D0%B0%D1%80%D0%B8%D0%B8\">Обработка слотов в сценарии</a>.</li>\n<li><a href=\"#%D0%A3%D1%82%D0%BE%D1%87%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B5%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D1%85-%D1%81%D0%BB%D0%BE%D1%82%D0%BE%D0%B2\">Уточнение незаполненных слотов</a>.</li>\n<li><a href=\"#%D0%9F%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%81%D0%BB%D0%BE%D1%82-%D1%84%D0%B8%D0%BB%D0%BB%D0%B8%D0%BD%D0%B3%D0%B0\">Прерывание слот-филлинга</a>.</li>\n</ul>\n<h2>Извлечение слотов</h2>\n<p>Если представить <a href=\"/1.11.7/docs/ru/NLU_core/intent\">интент</a> как функцию, которую клиент может вызвать, то <em>слот</em> можно рассматривать как параметр этой функции.</p>\n<p>Допустим, в классификаторе предусмотрен интент <code class=\"language-text\">/Погода</code>, который обрабатывает запросы вида <code class=\"language-text\">Какая погода в Москве?</code>.</p>\n<ul>\n<li>С одной стороны, бот не может корректно отреагировать на данный интент, не узнав, какой город имеет в виду клиент.</li>\n<li>С другой стороны, клиент может упомянуть дату, которая его интересует, и эту информацию нужно учитывать при обработке.</li>\n</ul>\n<p>В данном случае <strong>город</strong> и <strong>дата</strong> являются слотами, которые необходимо извлечь из запроса.</p>\n<p class='warn'><a href=/1.11.7/docs/ru/platform_ux/nlu_core_caila/intents#Слоты  >Подробнее о настройке слотов в интерфейсе</a></p>\n<h2>Параметры слотов</h2>\n<h3><em>Название</em> и <em>Сущность</em></h3>\n<p>У каждого слота должны быть указаны два обязательных параметра:</p>\n<ul>\n<li><em>Название</em> — имя для обращения к каждому слоту из сценария, например <code class=\"language-text\">City</code> и <code class=\"language-text\">Date</code>.</li>\n<li><em>Сущность</em> — системная либо пользовательская <a href=\"/1.11.7/docs/ru/NLU_core/entities\">сущность</a>, соответствующая слоту:\n<ul>\n<li>для <code class=\"language-text\">Date</code> это может быть системная сущность <code class=\"language-text\">@duckling.time</code>;</li>\n<li>для <code class=\"language-text\">City</code> нужно предусмотреть справочник городов, для которых доступен прогноз.</li>\n</ul>\n</li>\n</ul>\n<p>При обработке запросов в них производится поиск сущностей, соответствующих слотам, подлежащим заполнению. Для примера фразы <code class=\"language-text\">Какая погода сегодня в Москве?</code> в слот <code class=\"language-text\">City</code> попадет Москва, в <code class=\"language-text\">Date</code> — указание на сегодняшний день.</p>\n<p class='warn'><a href=/1.11.7/docs/ru/platform_ux/nlu_core_caila/entities  >Подробнее о настройке сущностей</a></p>\n<p>Если для интента настроено несколько слотов с одинаковыми сущностями, при обработке запросов они будут заполняться последовательно.</p>\n<p>При необходимости обработать произвольное количество слотов с одинаковыми сущностями обращайтесь к структуре <a href=\"/1.11.7/docs/ru/NLU_core/entities\"><code class=\"language-text\">$entities</code></a>, в которую передаются все найденные в запросе сущности в исходном виде.</p>\n<h3>Параметр <em>Обязательно</em></h3>\n<p>Каждый слот может быть обязательным или необязательным.</p>\n<p>Если переключатель <em>Обязательно</em> <strong>активен</strong>, то запросы, в которых этот слот не заполнен, будут попадать в сценарий <a href=\"#%D0%A3%D1%82%D0%BE%D1%87%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BD%D0%B5%D0%B7%D0%B0%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D1%85-%D1%81%D0%BB%D0%BE%D1%82%D0%BE%D0%B2\">уточнения незаполненных слотов</a>. При этом требуется, чтобы параметр <em>Вопросы</em> для данного слота был непустым.</p>\n<p class='tip'>В случае, когда <em>Вопросы</em> не указаны, запросы без заполнения данного обязательного слота не будут попадать в интент.</p>\n<p>Если переключатель <strong>не активен</strong>, интент будет обработан, даже если слот не заполнен.</p>\n<h3>Параметр <em>Массив</em></h3>\n<p>При необходимости обработать в сценарии несколько повторяющихся сущностей из одного слота, необходимо пометить слот как массив.</p>\n<p>Если переключатель <em>Массив</em>:</p>\n<ul>\n<li><strong>Не активен</strong>: в слот помещается первое обработанное значение данной сущности.</li>\n<li><strong>Активен</strong>: в слот помещается массив всех сущностей данного типа. Если обнаружено только одно значение сущности, оно также оформляется как массив.</li>\n</ul>\n<h2>Подключение модуля слот-филлинга</h2>\n<p>Для подключения модуля слот-филлинга укажите в сценарии в файле <code class=\"language-text\">main.sc</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">require:</span> slotfilling/slotFilling.sc\r\n    module = sys.zb-common</code></pre></div>\n<h2>Обработка слотов в сценарии</h2>\n<p>В сценарии к заполненным слотам можно обратиться через структуру <a href=\"/1.11.7/docs/ru/JS_API/variables/parseTree\"><code class=\"language-text\">$parseTree</code></a>.</p>\n<p>Если у сущности, к которой привязан слот, есть значение <a href=\"/1.11.7/docs/ru/NLU_core/data\"><em>DATA</em></a>, то поле <code class=\"language-text\">$parseTree._&lt;ИмяСлота></code> будет содержать это значение <em>DATA</em>, а при его отсутствии — текст той части запроса, которая попала в сущность.</p>\n<p>Использование заполненных слотов в сценарии:</p>\n<div class=\"gatsby-highlight\" data-language=\"sc\"><pre class=\"language-sc\"><code class=\"language-sc\"><span class=\"token keyword\">state:</span>\r\n    <span class=\"token storageType\">intent!:</span> /Погода\r\n    <span class=\"token variableParameter\">script:</span>\r\n        if ($parseTree._Date) {\r\n            $temp.date = $parseTree._Date.value;\r\n        } else {\r\n            $temp.date = \"сегодня\";\r\n        }\r\n    <span class=\"token variableParameter\">a:</span> Погода в <span class=\"token constantCharacter\">{{$parseTree._City}}</span> на <span class=\"token constantCharacter\">{{$temp.date}}</span></code></pre></div>\n<p class='warn'>Поскольку в нашем примере слот <code class=\"language-text\">Date</code> необязателен, перед обработкой его нужно проверить и установить значение по умолчанию, если он не заполнен.</p>\n<h2>Уточнение незаполненных слотов</h2>\n<p>Для всех <a href=\"#%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80-%D0%9E%D0%B1%D1%8F%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE\">обязательных</a> слотов, которые остались незаполненными в изначальном запросе, система будет по очереди задавать уточняющие вопросы, указанные в поле <em>Вопросы</em>.</p>\n<p>В ответах клиента будет производиться поиск сущностей, соответствующих слотам. Если подходящие сущности найдены, то слот будет заполнен.</p>\n<p>После того, как все слоты заполнены, управление передается в основной сценарий со всеми заполненными слотами в <code class=\"language-text\">$parseTree</code>.</p>\n<p>Рассмотрим пример:</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 1176px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 19.166666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAABJ0AAASdAHeZh94AAAArElEQVQY01VQ2Q6DMAzj//9wzxNjhULpXXp5SgY7LFmNUjuRM8QQYEvDFjJ8rmgdjN77m/gH9S601r66k8MqJe7jA5s20MZCiBn7vsN7D+c81+I5QUoJIQSMMVjmGZtSiDGeOgdrLVJKGMigtUatFSlFTNPEn8dxoJYMHRJuo0BwDkop1q7bysOXZeGBpRTW0zvQlpzzJ8Jlopp7HdDO80IykZ6ikZn4ewKK/AKs5zbMV3RAPQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Заполнение слотов\"\n        title=\":size=950\"\n        src=\"/1.11.7/static/2d7fb462cda600243af9e678daad0ba6/e9d87/Screenshot_1.png\"\n        srcset=\"/1.11.7/static/2d7fb462cda600243af9e678daad0ba6/e85cb/Screenshot_1.png 480w,\n/1.11.7/static/2d7fb462cda600243af9e678daad0ba6/d9199/Screenshot_1.png 960w,\n/1.11.7/static/2d7fb462cda600243af9e678daad0ba6/e9d87/Screenshot_1.png 1176w\"\n        sizes=\"(max-width: 1176px) 100vw, 1176px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n<p>Здесь <code class=\"language-text\">@City</code> — пользовательская сущность, в которой указаны все доступные города.</p>\n<table>\n<thead>\n<tr>\n<th>Запрос клиента</th>\n<th>Действие бота</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code class=\"language-text\">Погода на завтра в Москве</code></td>\n<td>Оба слота заполнены. Управление сразу перейдет в сценарий.</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">Погода на завтра</code></td>\n<td>Слот <code class=\"language-text\">City</code> не заполнен, и он обязателен. Будет задан уточняющий вопрос.</td>\n</tr>\n<tr>\n<td><code class=\"language-text\">Погода в Москве</code></td>\n<td>Слот <code class=\"language-text\">Date</code> не заполнен, но он необязателен. Управление перейдет в сценарий.</td>\n</tr>\n</tbody>\n</table>\n<h2>Прерывание слот-филлинга</h2>\n<p>Прерывание слот-филлинга позволяет досрочно выйти из сценария заполнения слотов, если клиент не отвечает на уточняющие вопросы.</p>\n<p class='warn'>Используйте прерывание слот-филлинга, чтобы диалог не зацикливался при неуспешном заполнении слотов и клиент мог свободно перевести разговор на другие темы.</p>\n<p>Условия прерывания слот-филлинга конфигурируются в файле <a href=\"/1.11.7/docs/ru/common/bot_structure/configuration_file\"><code class=\"language-text\">chatbot.yaml</code></a> в разделе <a href=\"/1.11.7/docs/ru/common/bot_structure/configuration_file#injector\"><code class=\"language-text\">injector</code></a>:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">injector</span><span class=\"token punctuation\">:</span>\r\n  <span class=\"token key atrule\">slotfilling</span><span class=\"token punctuation\">:</span>\r\n    <span class=\"token key atrule\">maxSlotRetries</span><span class=\"token punctuation\">:</span> <span class=\"token number\">1</span>\r\n    <span class=\"token key atrule\">stopOnAnyIntent</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span>\r\n    <span class=\"token key atrule\">stopOnAnyIntentThreshold</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.2</span></code></pre></div>\n<p class='tip'>Независимо от этой конфигурации из слот-филлинга всегда можно досрочно выйти по команде <code class=\"language-text\">/start</code>. При этом произойдет переход в стейт <code class=\"language-text\">/Start</code>.</p>\n<h3>Прерывание по превышению числа переспросов</h3>\n<p>Параметр <code class=\"language-text\">maxSlotRetries</code> принимает целочисленное значение и задает количество попыток уточнения одного слота.</p>\n<p>Если клиент ответил указанное количество раз и слот не был заполнен, процесс слот-филлинга будет прерван. Последняя фраза клиента будет обработана в основном сценарии бота.</p>\n<h3>Прерывание по интенту</h3>\n<p>Прерывание по интенту регулируют параметры:</p>\n<ul>\n<li><code class=\"language-text\">stopOnAnyIntent</code> включает или выключает прерывание. Принимает булево значение <code class=\"language-text\">true</code>/<code class=\"language-text\">false</code>.</li>\n<li><code class=\"language-text\">stopOnAnyIntentThreshold</code> —  минимальная вероятность вхождения фразы в один из классов. Принимает вещественное значение.</li>\n</ul>\n<p class='warn'>В ходе разработки NLU-сервиса было эмпирически определено, что оптимальное значение этого параметра <code class=\"language-text\">0.2</code>.</p>\n<p>Если параметр <code class=\"language-text\">stopOnAnyIntent</code> включен и запросу клиента соответствует интент со степенью уверенности выше, чем <code class=\"language-text\">stopOnAnyIntentThreshold</code>, слот-филлинг будет прерван по интенту.</p>\n<p class='tip'>Важно учитывать контекст, где начался слот-филлинг. Если при прерывании в стейт с соответствующим интентом невозможно попасть из текущего (например, если тег <code class=\"language-text\">intent</code> не глобальный), то запрос попадет в стейт с активатором <code class=\"language-text\">event!: noMatch</code>.</p>\n<h3>Параметры по умолчанию</h3>\n<p>Если параметры для прерывания в конфигурационном файле <code class=\"language-text\">chatbot.yaml</code> не указаны, слот-филлинг будет прерываться согласно параметрам по умолчанию:</p>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">injector</span><span class=\"token punctuation\">:</span>\r\n  <span class=\"token key atrule\">slotfilling</span><span class=\"token punctuation\">:</span>\r\n    <span class=\"token key atrule\">maxSlotRetries</span><span class=\"token punctuation\">:</span> <span class=\"token number\">2</span>\r\n    <span class=\"token key atrule\">stopOnAnyIntent</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">false</span>\r\n    <span class=\"token key atrule\">stopOnAnyIntentThreshold</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0.2</span></code></pre></div>","frontmatter":{"title":"","description":null},"headings":[{"value":"Слот-филлинг"}]}},"pageContext":{"slug":"/docs/ru/NLU_core/slot_filling/","previous":{"fields":{"slug":"/docs/ru/NLU_core/project_migration/"},"frontmatter":{"title":"","description":null}},"next":{"fields":{"slug":"/docs/ru/NLU_core/nlu_core/"},"frontmatter":{"title":"","description":null}}}},
    "staticQueryHashes": ["1209419333"]}