清水理史の「イニシャルB」

「AI」すごいぜ! メールから自動で請求書作成にノンプログラミングでチャレンジした話

 個人や小規模オフィスの環境でも、「AI」を日々の業務に活用できる環境は、すでに整いつつある。Office 365で提供される「Microsoft Flow」と、「Cognitive Services」の「LUIS(Language Understanding)」を使えば、形式や文言が微妙に違うメールから、金額や日付などの業務に必要な情報を簡単に取り出すことできる。すでに目の前にある「AI」のパワーを、実はマクロよりも簡単に業務へ活用できる時代になりつつある。

「契約金額:10000円(税別)」と「対価(消費税抜き)10000円(10800円)」

 人が判断するのは簡単。

 でも自動化しようとすると悩ましい。

 なんてことは、身の回りに結構ある。

 例えば、筆者の場合であれば、毎月の請求書処理。普段は、編集部から届く「校了」のメールを目で確認し、そこから項目名や日付、金額を請求書システムへ手動で入力してPDFとして出力し、これをメールで送信するのだが、この作業を自動化しようとすると、結構面倒くさい。

このようなメールから、内容を確認し、必要な情報を取り出し、請求書を作ることは、人間ならとても簡単

 というのも、届くメールの内容が、同じ会社(まあインプレスなんだけどね)でも部署によって微妙に違うからだ。

 請求書の発行に必要となる主な情報は、「日付(発行日)」と「項目名」と「金額」の3つ。

 しかしながら、例えば項目名が「案件名」の場合と「委託業務」となっている場合でまちまちだったり、日付が掲載日と校了日で複数あったり、金額が「契約金額:10000円(税別)」となっている場合もあれば、括弧書きが「(税抜き)」の場合もあったり、はたまた「対価(消費税抜き)10000円(10800円)」というように税込み価格がメインで税抜き金額がカッコ書きで示されている場合もある。

 文書の形式も微妙に違っており、「案件名:」が「案件名 :(コロンの前に半角スペースがある)」だったり、「案件名: (後ろに半角スペースがある)」だったりして、微妙に違っている。

メールの書式や文言が編集部ごとにバラバラ。自動化しようとすると、ここがネックになる

 もちろん、自分の目でメールを確認して、手動で請求書を発行しているときは、そんな違いは、まったく気にする必要がなかった。

 しかし、今回、Microsoft Flowの検証も兼ねて、この処理を自動化してみようと試みたところ、はたと困ってしまった。

 当初は、メールから本文を抽出して、「案件名」などのキーワードを検索し、そこから「IndexOf」で文字の位置を割り出したり、文字数を計算したりして、項目や日付、金額などの情報を取り出そうとしたのだが、前述の通り検索する文字がバラバラで、しかも半角スペースの有無などで、うまく範囲を指定することができない。

 あー、めんどくさい。

 本当は、「10分掛かっていた請求書処理が1秒で!」なんてタイトルで原稿を書きたかったのだが、いざやってみようとすると、些細な違いが大きく影響して、まったくうまくいかなかったわけだ……。

こんな感じで、取り出したい文字列検索して、その位置を割り出し……、なんてやろうとすると、文言の違いで処理が複雑になりがち。面倒くさくなって諦めた

もはやマクロより簡単

 そもそも、なぜそんなことに挑戦したのかというと、Office 365でサービスが提供されているMicrosoft Flowが、予想以上に「現場向き」だったからだ。

 Flowは、言わばMicrosoft版のIFTTTで、Office 365やAzure、Gmailなどの外部サービスの動作をきっかけとして、さまざまな処理を自動的に実行することができるサービスとなっている。

 リリースからしばらく時間が経過したおかげで、接続可能なサービステンプレートも数多く用意されるようになり、以下のような動作であれば、テンプレートに必要な情報を追加するだけで、すぐに実行可能となっている。

  • Office 365のメールの添付ファイルをOneDrive for Businessに保存する
  • VIP顧客からのメールを受信したらプッシュ通知を受け取る
  • フォームの回答をSharePointに記録する
いろいろなテンプレートが用意されており、簡単な処理なら数クリックで自動化できる

 もちろん、自分でいちからフローを作成することも可能だ。メールやTwitterなど、動作のきっかけになるトリガーを選択後、例えば「請求書フォルダーに新しいメールが届いたとき」などの動作を指定し、次のステップとしてOneDriveやkintoneなど連携させたい別のサービスを選択して、処理を記述する。こうしたように、文字通りフローチャートを作るように、処理を次々に追記していくだけでいい。分岐やループなども可能だ。

 ビジネスシーンでは、Excelのマクロを使って特定の処理を自動化することがよく行われているが、これと似たような活用も可能で、しかもマクロよりも使えるサービスの範囲が広く、それでいて操作はシンプル、かつ必要であれば複雑な処理もできるようになっている。応用次第では、さまざまな日常業務を自動化することもできそうだ。

 というわけで、メールの本文からキーワードを抽出して請求書を自動的に作成する、という「楽をしたい衝動」にかられたわけだが、第1段階はあえなく「微妙な違い」の前に断念せざるを得なくなってしまった。

いちからフローを作成することも可能。サービスを選んで、動作を指定していけばOK。マクロより簡単なイメージ

LUIS「さん」サイコー!

 それでも、しばらくは諦め切れずに、ケースバイケースで処理を分岐させて自動化を図ろうと四苦八苦していたのだが、「『AI』に……」というテレビ番組を見ていて、はっと気付かされた。

 「『AI』を使えば、人が目で見て判断するのと同じように、微妙な違いを乗り越えて、メールの本文を解析できるんじゃないの?」

 「AI」というと、高度なコンピューターと複雑な処理が必要で、筆者も含めた「ユーザー」の立場の人間には、ほど遠い存在のように思えるが、実は、サービスとして活用する土壌はすでに整っており、AzureのCognitive Servicesとして、画像認識や音声認識、テキスト分析などの各種サービスが利用可能となっている。

 これだけだと、どう使っていいのかが悩ましいところだが、先のFlowからも以下のようなCognitive Servicesを利用可能となっており、メールやTwitterのメッセージをこれらのサービスに受け渡して「AI」で分析するといったことが簡単にできるようになっている。

Cognitive Services APIsAPIの機能
Computer Vision API画像から意志決定に役立つ情報を抽出
Content Moderator画像やテキストを分類、評価
Custom Vision Service画像を任意に学習させそれをベースに評価させる
Face API顔の検出や分析
Video Indexer動画の分析
LUIS言語の認識
Text Analytics API単語の抽出や感情検出
QnA MakerFAQサービスの作成
Bing系サービスBing検索など
Cognitive Servicesのウェブサイト。視覚、音声、言語、知識、検索といったカテゴリーごとに、すぐに試せるサービスが提供されている
Content ModeratorやFace APIなどのサービスをFlowから利用可能

 で、実際に試してみたのが、このうちのLUISだ。「Text Analytics API」でも何とかなりそうに思えたのだが、あらかじめモデルが決まっているためか、思い通りに金額などの情報がピックアップされなかった。Text Analytics APIは、SNSのメッセージの感情分析などに使うのが便利そうだ。

 LUISは、Language Understandingの意味で、文章の中からキーワードを検出し、その意味を理解することができるものだ。こちらのウェブページで簡単なデモを体験できる。

LUISのデモ。「Light on」ならライトが点灯するが、「Light oooonnn」では点灯しないといったように微妙な違いを理解してくれる

 デモでは、表現に微妙に違いがあっても、ライトをオン/オフするという動作を理解できるようなモデルが使われているが、このようにユーザーがあらかじめ決めたルールに従って言語を学習させることで、臨機応変に文章を理解させることができるようになっている。

 このため、メールから必要な部分を抽出して請求書を作るという場合であれば、以下のような細かな違いがあるケースでも、例文をいくつか用意して、[price]や[date]といったあらかじめ決めておいた項目(LUISではエンティティと呼ぶ)として、しっかりと学習させておけば、単語を理解させ、意味を持つものとして抽出できる。

[price]エンティティとして学習

  • 対価(消費税抜):10,800円 (10,000)→対価(消費税抜):10,800円 ([price])
  • 金額:20,000 (税抜)→金額:[price] (税抜)
  • 契約金額:15,000(税別)→契約金額:[price](税別)

[date]エンティティとして学習

  • 校了日:[2018/2/18]→校了日:[date]
  • 校了日:[1月20日]→校了日:[date]
  • 検収完了日:[12月20日]→検収完了日:[date]

[subject]エンティティとして学習

  • 業務委託:コンテンツ制作→委託業務:[subject]
  • 案件名:清水理史のイニシャルB→案件名:[subject]

 このようなモデルは、「https://www.luis.ai/」で、あらかじめ作成と学習をしておく必要があるが、作成したモデルをアプリとして「PUBLISH」すれば、Flowから使えるようになるわけだ。

 これにより、例えば以下のようなフローで、請求書の発行を依頼するメールが届いたら、そこから日付(date)や件名(subject)、金額(price)を抽出できるようになる。

このような感じでLUISに学習させていく
FlowからLUISに接続して、学習させたモデルを使う
メールの案件名に続く文字列を「Subject」エンティティとして抽出できた

 まあ、しかしながら、そううまくはいかないもので、実際に試してみると、LUISの文字数制限と件名の取得に苦労した。

 LUISは、本来、「ライトを灯けて」のような自然言語による処理を前提としたものとなるため、メール本文のような長い文章を入力するように設計されていない。メールの本文をすべて受け渡すとエラーが発生してしまったので、取り出したい項目が記載されている部分のみを切り出して、LUISに投げるように工夫した。

 一方、件名は、最後の切れ目を理解するための学習が必要になった。前述したように「業務委託:コンテンツ制作」や「案件名:清水理史のイニシャルB」といった一文のみの学習の場合、実際にメール本文を受け渡したときに、その後に続く文章も、subjectとしてまるごと認識してしまった。

 このため、以下のように、後に続く文章も含めてLUISに学習させることで問題を回避した。

「案件名:窓の杜連載2018年2月分 納品日:4月27日納入 場所:弊社編集部(メールを含む電子媒体にて)校了日:5月29日数量:原稿一式金額:9,999円(税抜き)」

「案件名:[subject] 納品日: 4月27日納入 場所:弊社編集部(メールを含む電子媒体にて)校了日:[date] 数量:原稿一式金額:[price](税抜き)」
長い文章からも正確に抽出できるように学習させた

 トータルで学習させたのは、単語ベースで30ほど、文章ベースで15ほどだろうか。部署ごとに違うといってもバリエーションは3~4ほどなので、これくらいの数を学習させただけで、メールからほぼ正確に、項目名や日付、金額を取得できるようになった。

 実際の認識例を下に示そう。例のように、例えばメール本文中に複数の金額があっても、税込みではなく税抜きの金額をしっかり認識できる上、似たような日付が複数あっても、校了日として記載されている日付だけをピックアップできるようになっている。

 最初はそれなりに間違えたが、すぐに賢くなり、今や「LUISさん」と呼ばせていただきたいレベルにまで達している。

 無駄なスペースが入っているのは気になるが、ほぼ完璧に認識できるようになった。判断基準となったスコアが記録されている点にも注目だ。

元のメール本文

株式会社インプレス
東京都千代田区神田神保町
担当者:編集部
下記の内容にて業務委託を申し込みます。

委託業務:店頭配布用冊子Vol.3(Android版)
成果物: 校正データ一式
納入期日:2017年10月29日
納入場所:弊社事業所(または弊社担当者宛にデータ送付)
検収完了日:2017年11月30日
対価(消費税抜):21,600円(20,000円)
支払期日:上記検収完了日から60日

---------抽出されたエンティティの配列(json形式)---------

[
  {
    "entity": "2017年 11月 30日",
    "type": "date",
    "startIndex": 145,
    "endIndex": 155,
    "score": 0.9796134
  },
  {
    "entity": "20,000円",
    "type": "price",
    "startIndex": 174,
    "endIndex": 180,
    "score": 0.883200765
  },
  {
    "entity": "店頭 配布 用 冊子 vol.3 ( android 版 )",
    "type": "subject",
    "startIndex": 58,
    "endIndex": 79,
    "score": 0.8409796
  }
]

実際にLUISを使う上での注意点

 なお、LUISはAzureのCognitive Servicesとして提供されている。無料体験版のアカウントを利用することもできるが、Office 365のアカウントの場合は、クレジットカードを登録して課金対象のアカウント(初回は30日2万2500円分利用可能)としておくことでLUISを利用可能だ。

 有料プランもあるが、「F0(Free)」プランでは、1秒あたりの呼び出し回数が5、1カ月あたりの呼び出し回数が10000に限られるものの、無料で利用できる。テスト目的や小規模な環境なら、これでも十分だろう。

 なお、FlowからLUISに接続する際に、キーを登録する必要があるが、ここで指定するキーはAzureのポータルから確認できるものではなく、「https://luis.ai」から確認できるキーとなる。Azureポータルのキーを入力すると、Flowで404エラーが発生するので注意が必要だ。

 また、リージョンも重要なようで、LUISのインスタンスを作成するときに、米国西海岸を選択しないとエラーが発生するという報告もあった(筆者は米国西海岸以外でテストしていないので未確認)。

 実際に利用する際は、これらの点に注意するといいだろう。

利用制限がある上、サブスクリプションに対して1つしか作成できないが無料の「F0」プランも利用できる
Flowから指定するLUISのキーは、「https://luis.ai」から確認できるものを指定(画面の赤い部分)。Azure Portalのキーを指定すると404エラーが発生するので注意

「こうして『AI』に仕事が任されていくのか……」を実感

 以上、Microsoft FlowからCognitive ServicesのLUISを使って、メールの本文から必要な情報を抽出するという操作をしてみたが、若干、試行錯誤はあったものの、ほぼ1日でここまでのことができた。

 チュートリアルなどを参考にしながら作業したため、余計な時間も含まれているので、慣れてしまえば、こうした自動化がもっと早くできると思われる。それくらいFlowは分かりやすい。

 それにしても、実際に使ってみて驚かされるのは、「AI」(LUIS)のカシコさと、手軽さだ。難しいことは考えずに、ここを認識して欲しいということをいくつか学習させれば、まさに「よきにはからってくれる」印象だ。

 同じ作業を人間に依頼しても、「これ金額がいくつかあるんですけど?」「日付はどれ使えばいいんですか?」などといった質問に答える必要があるが、その手間よりも学習させる方が簡単だし、確実に思える。

 「あー、こうして人間の仕事が『AI』に任されていくのかぁ」

 ということを、ものすごーく強烈に実感させられ、これからもっと便利になりそうだという予感と同時に、さみしさというか、怖さも感じられる経験であった。

 まあ、今の段階では、メールから要素を認識させるまでしか至らなかったので、実際には、ここから請求書を作成して、PDFで書き出して、メールで送信する、というところが残っているのだが、このうち、PDF出力、メール送信まではFlowで簡単に実現できることを確認済みだ。

 もうひと山越えれば、本当に、請求書処理を1秒、いや実際には何もしないので0秒で終わらせることもできるかもしれない。

 いやー、「AI」すごいぜ!

清水 理史

製品レビューなど幅広く執筆しているが、実際に大手企業でネットワーク管理者をしていたこともあり、Windowsのネットワーク全般が得意ジャンル。最新刊「できる Windows 10 活用編」ほか多数の著書がある。