私は証券口座を管理するための音声インターフェースを作成しています。それについてはすでにHabré- Aliceで書いており、Yandexを購入しています。ある時点で、リクエストから異なる通貨で価格を抽出する必要がありました。私はそのような課題に直面した最初の人物ではないので、GitHubで既製のインテントまたは名前付きエンティティを見つけようとしましたが、何も見つかりませんでした。鼻にハッカソンがあり、多くの開発者が1か所にあったと私は思いました。全員がベストプラクティスを共有すれば、エンティティのライブラリ全体が存在すると思います。これは、エンティティライブラリリポジトリのアイデアが生まれた方法です。
ダイアログのカスタムエンティティ
スマートコラムで「1つのYandex共有を購入する」と言うと、スピーチはYandex.Dialogiプラットフォームの内部マジックを通過し、その後、スキルハンドラーとして指定したWebフックに進みます。これはハンドラーに入るものです:
"request": {
"command": " ",
"original_utterance": " ",
"nlu": {
"tokens": [
"",
"1",
"",
""
],
...
"intents": {
"market.order": {
"slots": {
"amount": {
"type": "YANDEX.NUMBER",
"tokens": {
"start": 1,
"end": 2
},
"value": 1
},
"unit": {
"type": "OperationUnit",
"tokens": {
"start": 2,
"end": 3
},
"value": "share"
},
"figi": {
"type": "EFigi",
"tokens": {
"start": 3,
"end": 4
},
"value": "BBG006L8G4H1"
},
"operation": {
"type": "OperationType",
"tokens": {
"start": 0,
"end": 1
},
"value": "buy"
}
}
}
}
},
...
},
figi
Tinkoff Investments取引プラットフォームのAPIとやり取りするために必要なYandex株識別子、いわゆるFIGI(Financial Instrument Global Identifier)を含む
スロットに注意してください。EFigiデータ型は、Yandex.Dialogiプラットフォームでスキルを作成するときに「エンティティ」セクションで説明したカスタムエンティティです。これは説明のスニペットです:
entity EFigi:
values:
BBG005DXJS36:
%exact
TCS
%lemma
()?
()?
()?
()?
BBG006L8G4H1:
%exact
YNDX
%lemma
BBG004730JJ5:
%exact
MOEX
%lemma
BBG002B2J5X0:
%exact
KRKNP
%lemma
[ ]
[ ]
...
エンティティメカニズムのおかげで、ハンドラーコードでは、FIGIを取得するために入力データをさらに操作する必要はありません。ダイアログプラットフォームは、セキュリティの名前をFIGIに変換します。
EFigiをインテントの非終端文法およびスロットタイプとして使用しています。インテントは、ダイアログでのステロイドの正規表現です。インテントは、ユーザーの要求から取得してハンドラーに渡す必要があるデータをダイアログが理解するのに役立ちます。以下は、市場価格で取引所の証券を売買するコマンドの意図の例です。
slots:
operation:
source: $Operation
type: OperationType
figi:
source: $Stock
type: Efigi
amount:
source: $Amount
type: YANDEX.NUMBER
unit:
source: $Unit
type: OperationUnit
root:
$Operation [$Amount $Unit $Stock]
$Operation:
$OperationType
$Amount:
$YANDEX.NUMBER
$Unit:
$OperationUnit
$Stock:
$EFigi
これは正規表現に似ています。
対話用エンティティライブラリ
アリスのスキルを開発するハッカソン中に、alice-entities-libraryリポジトリを作成し、EFigiエンティティをそこにプッシュし、GitHubに移動して、カスタムエンティティの説明があるリポジトリを探しました。私は何百ものリポジトリを見つけ、開発者に連絡し、エンティティライブラリにプルリクエストを送信することを提案することを期待していました。
yandex-dialogs、alice-skills、yandex-alice、alice-sdkのタグでリポジトリを検索しました。 GitHubでタグを使用する人はごくわずかであることがわかりました。ELangエンティティを説明するファイルを含むリポジトリを1つだけ見つけることができました。偶然にも、リポジトリの作者はハッカソンの主催者の一人であるデイビッドであることがわかりました。私はDavidにELangエンティティをライブラリに追加するよう提案し、数分後に彼からプルリクエストを受け取りました。
オンラインハッカソンの他のメンバーは、エンティティライブラリを補充することを提案するチャットメッセージを無視しました。おそらく、闘争の真っ只中に、これのための時間はありませんでした。正直なところ、少しイライラしましたが、最後にsameoldmadness / awesome-aliceにあるリポジトリへのリンクを追加しました。
結論の代わりに
Alice Skill Developers様、他のユーザーが学習できるように、可能な限りソースコードをGitHubにアップロードしてください。
他の人がGitHubで自分のスキルを見つけられるように、yandex-dialogs、alice-skills、yandex-aliceタグをリポジトリに追加してください。
リポジトリーにディレクトリーを作成
entities
し、スキル用に作成したエンティティー記述ファイルをそこに配置して、他のユーザーが作業を再利用できるようにします。
新しいエンティティについて説明する前に、エンティティライブラリを見てください。エンティティライブラリにはすでに必要なものが含まれている場合があります。そうでない場合は、エンティティをライブラリに追加してください。