rabbit-slide-znz-osakarubykaigi02-chatbot 2019.09.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +1 -0
- data/README.md +23 -0
- data/Rakefile +17 -0
- data/chatbot.md +231 -0
- data/config.yaml +20 -0
- data/pdf/osakarubykaigi02-chatbot-chatbot.pdf +0 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b2ed3b5be47aee4a9b1c5bcbbff73f7b6bd344a48d11db48e135fe496ff415c5
|
4
|
+
data.tar.gz: 80a6a5154bd5eb9c7caef22a7c24f4580642b3aa1d6bb645ad7c2979126eefd5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 03bde3a96e46e564899103f3f63662721a1206afb3c038a4d2e22384d7351ee1be8d23af84cfb75c710ab6e19a44cafaff3a8c36857553f64c87a17d93a7ec42
|
7
|
+
data.tar.gz: cc56ca1ba76d3d21706b4ec4e564e9a9b8ecdd8f8708622f1f3a55cd378341c06031d85bf7e23e41efd5190122374d58767de0e4a6657efaf431dd5e04e379f7
|
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
chatbot.md
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# チャットボットのススメ
|
2
|
+
|
3
|
+
[Osaka RubyKaigi 02](http://regional.rubykaigi.org/osaka02/) での発表資料です。
|
4
|
+
|
5
|
+
## For author
|
6
|
+
|
7
|
+
### Show
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
### Publish
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
## For viewers
|
16
|
+
|
17
|
+
### Install
|
18
|
+
|
19
|
+
gem install rabbit-slide-znz-osakarubykaigi02-chatbot
|
20
|
+
|
21
|
+
### Show
|
22
|
+
|
23
|
+
rabbit rabbit-slide-znz-osakarubykaigi02-chatbot.gem
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
# spec.add_runtime_dependency("YOUR THEME")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/chatbot.md
ADDED
@@ -0,0 +1,231 @@
|
|
1
|
+
# チャットボットのススメ
|
2
|
+
|
3
|
+
author
|
4
|
+
: Kazuhiro NISHIYAMA
|
5
|
+
|
6
|
+
content-source
|
7
|
+
: Osaka RubyKaigi 02
|
8
|
+
|
9
|
+
date
|
10
|
+
: 2019/09/15
|
11
|
+
|
12
|
+
institution
|
13
|
+
: 株式会社Ruby開発
|
14
|
+
|
15
|
+
allotted-time
|
16
|
+
: 30m
|
17
|
+
|
18
|
+
theme
|
19
|
+
: lightning-simple
|
20
|
+
|
21
|
+
# Agenda
|
22
|
+
|
23
|
+
- チャットとは
|
24
|
+
- チャットボットとは
|
25
|
+
- なぜおすすめなのか
|
26
|
+
- 色々なボット例
|
27
|
+
- 人工無脳の話
|
28
|
+
- ボット作成時の注意
|
29
|
+
|
30
|
+
# チャットとは?
|
31
|
+
|
32
|
+
- 主にテキストで
|
33
|
+
- リアルタイムに
|
34
|
+
- 会話(chat)するシステム
|
35
|
+
|
36
|
+
# 使ってきたチャットシステム
|
37
|
+
|
38
|
+
- NIFTY-Serve の RT
|
39
|
+
- → RT を含むサービス終了 (@nifty 自体は存続)
|
40
|
+
- IRC → 今も利用
|
41
|
+
- Slack → 今のメイン
|
42
|
+
- Idobata, Gitter, Discord, ... → たまに利用
|
43
|
+
- Mattermost, その他色々 → 必要に応じて
|
44
|
+
|
45
|
+
# チャットボットとは?
|
46
|
+
|
47
|
+
- 誰かの発言に対して反応して発言
|
48
|
+
- 時間や通知など他のトリガーで自動発言
|
49
|
+
- システムによって使えるトリガーは違う
|
50
|
+
- RT は入退室で挨拶するボットが可能だった
|
51
|
+
- IRC は入室の挨拶は可能だが退室前は不可能
|
52
|
+
- Slack は使われ方が違うので挨拶ボットは困難
|
53
|
+
|
54
|
+
# なぜおすすめなのか? (1/3)
|
55
|
+
|
56
|
+
- プログラムの基本は入力を受けて出力を返す
|
57
|
+
- 出力がないと
|
58
|
+
- 計算だけしてもできているのかどうかわからない
|
59
|
+
- 入力がないと
|
60
|
+
- 同じことしかできない (そういう用途も多い)
|
61
|
+
- テキスト以外に時刻なども入力
|
62
|
+
|
63
|
+
# なぜおすすめなのか? (2/3)
|
64
|
+
|
65
|
+
- チャットボットはテキスト入出力で単純
|
66
|
+
- 昔ながらのチャットシステム (IRC など) だと行ごとの入出力でさらに単純
|
67
|
+
- テストもしやすい
|
68
|
+
- 標準入出力で試せるようにするのも簡単
|
69
|
+
|
70
|
+
# なぜおすすめなのか? (3/3)
|
71
|
+
|
72
|
+
- システム移行も経験可能
|
73
|
+
- 例: RT から IRC への移行を経験
|
74
|
+
- 複数対応するといろんな経験を積める
|
75
|
+
- 本質的な部分とシステム依存の分離
|
76
|
+
- システムによる機能差
|
77
|
+
- システム依存だが便利な機能の実装
|
78
|
+
|
79
|
+
# 便利ボット例
|
80
|
+
|
81
|
+
- URL → タイトル
|
82
|
+
- 文字コード, JavaScript, HTML 以外の対応など、簡単そうに見えて実際やってみると大変
|
83
|
+
- `g> 検索キーワード` → Web 検索のトップ
|
84
|
+
- `tenki> 大阪` → 天気予報
|
85
|
+
- `amedas> 大阪` → アメダスの最近の値
|
86
|
+
|
87
|
+
# 反応例
|
88
|
+
|
89
|
+
```
|
90
|
+
g> OsakaRubyKaigi02
|
91
|
+
osrk02 - https://twitter.com/hashtag/osrk02 (and 3 hits)
|
92
|
+
tenki> 大阪
|
93
|
+
tenki bot: 大阪府 大阪 の天気: 今日:晴時々曇(max:31),
|
94
|
+
明日:晴れ(min:24,max:35), 明後日:晴時々曇 - 近畿地方は、
|
95
|
+
北部や中部では高気圧に覆われておおむね晴れていますが、南部では
|
96
|
+
湿った空気の影響でおおむね曇り、雨の降っている所があります。
|
97
|
+
(2019-09-14T10:31:00+0900)
|
98
|
+
- http://weather.livedoor.com/area/forecast/270000
|
99
|
+
amedas> 大阪
|
100
|
+
amedas: 2019年09月14日 大阪(オオサカ) 時刻:15時,
|
101
|
+
気温:31.6℃, 降水量:0.0mm, 風向:北東, 風速:3.8m/s,
|
102
|
+
日照時間:0.6h, 湿度:49%, 気圧:1008.9hPa
|
103
|
+
http://www.jma.go.jp/jp/amedas_h/today-62078.html?groupCode=45&areaCode=000
|
104
|
+
amedas: 2019年09月14日 大阪(オオサカ)
|
105
|
+
最低気温(℃):22.7 at 05:53, 最高気温(℃):32.0 at 13:43,
|
106
|
+
最大瞬間風速(m/s)(風向(16方位)):9.1(東) at 01:14
|
107
|
+
```
|
108
|
+
|
109
|
+
# 小ネタ系ボット例
|
110
|
+
|
111
|
+
- `ping` → `pong` と返すだけ
|
112
|
+
- ボットの生存確認やユーザー側の接続確認
|
113
|
+
|
114
|
+
# 時報ボット
|
115
|
+
|
116
|
+
- 「西暦2019(平成31/昭和94/大正108/明治152/皇紀2679)年(己亥)09月(長月)14日(土)08時00分28秒(インターネットタイム@000.3)です。」
|
117
|
+
- 過去の元号や干支や旧暦の月なども対応
|
118
|
+
- Swatch のインターネットタイムも対応 (24時間=1000ビート、タイムゾーンなしの世界共通の時刻)
|
119
|
+
|
120
|
+
# 時報ボット
|
121
|
+
|
122
|
+
- 「西暦2019年(令和元年/平成31年/昭和94年/大正108年/明治152年/皇紀2679年)(己亥)09月(長月) _13日(金)_ 18時00分00秒(インターネットタイム@416.7)です。」
|
123
|
+
- 13日の金曜日は装飾
|
124
|
+
|
125
|
+
# 挨拶ボット
|
126
|
+
|
127
|
+
- 挨拶ボット
|
128
|
+
- IRC のように接続通知がないと難しい
|
129
|
+
- 「prefix+時間の挨拶+suffix > nick+敬称」(秘蔵のランダムデータで生成)
|
130
|
+
|
131
|
+
# 挨拶ボット例
|
132
|
+
|
133
|
+
- 「次はおはようございますみゅ > NICK御中」
|
134
|
+
- 「なんでもいいおはようございますするか? > NICK代表」
|
135
|
+
- 「積極的におはようがなんともうれしい > NICKタン」
|
136
|
+
|
137
|
+
# 運用系ボット
|
138
|
+
|
139
|
+
- uptime : サーバーの uptime 確認
|
140
|
+
- 「`| uptime`」の出力を発言するだけ
|
141
|
+
- upgradable : apt で upgradable になっているパッケージ一覧
|
142
|
+
- 「`apt list -qq -o APT::Cmd::use-format=true -o APT::Cmd::format=${Package}(${installed:Version}->${candidate:Version}) --upgradable`」
|
143
|
+
|
144
|
+
# 人工無脳とは?
|
145
|
+
|
146
|
+
- 「人工無能」とも
|
147
|
+
- AI (人工知能) ほど高度なものではないということから
|
148
|
+
- ここでは人間の発言に自動発言を返すボット
|
149
|
+
|
150
|
+
# 人工無脳の種類 (1/3)
|
151
|
+
|
152
|
+
- 単純な部分文字列マッチ
|
153
|
+
- Slackbot のようにチャットシステム側に存在することも
|
154
|
+
- 正規表現マッチ
|
155
|
+
- 個人運用しているものはこれ
|
156
|
+
|
157
|
+
# 人工無脳の種類 (2/3)
|
158
|
+
|
159
|
+
- 形態素解析を利用
|
160
|
+
- 人工無脳ししゃも (Sixamo) など
|
161
|
+
- 書籍「恋するプログラム―Rubyでつくる人工無脳」の後半はこれ
|
162
|
+
|
163
|
+
# 人工無脳の種類 (3/3)
|
164
|
+
|
165
|
+
- ELIZA
|
166
|
+
- 人工無脳の起源, 英語のパターンマッチング
|
167
|
+
- 内容によってはかなり自然な会話ができるらしい
|
168
|
+
- 複数手法の組み合わせ
|
169
|
+
- 人工無能うずら (ソース非公開)
|
170
|
+
- 日本語の IRC (IRCnet) では多分一番有名
|
171
|
+
- 会話例も Wiki などで公開されている
|
172
|
+
|
173
|
+
# 人工無脳への攻撃対策 (1/2)
|
174
|
+
|
175
|
+
- 問題例: ReDoS (regular expression denial of service)
|
176
|
+
- 正規表現をユーザー登録可能な場合
|
177
|
+
- 不適切な語彙の学習
|
178
|
+
- 任意の言葉を登録可能な場合
|
179
|
+
|
180
|
+
# 人工無脳への攻撃対策 (2/2)
|
181
|
+
|
182
|
+
- 対応例 (クローズドなグループ向けを想定)
|
183
|
+
- 技術的な対応はあまりしない
|
184
|
+
- アカウントを ban するなどのソーシャルな対応が楽 (ボットが無視するアカウントにするなど)
|
185
|
+
|
186
|
+
# 不適切な学習の問題
|
187
|
+
|
188
|
+
- Tay というマイクロソフトの Twitter ボット
|
189
|
+
- ユーザーによる不適切な学習によりヘイトスピーチなどをするようになったらしい
|
190
|
+
- (その後停止)
|
191
|
+
|
192
|
+
対処は難しそう
|
193
|
+
|
194
|
+
# ボット作成時の注意
|
195
|
+
|
196
|
+
- ボットとボットのループに注意
|
197
|
+
- ボットの発言にボットが発言するとループの可能性があって危険
|
198
|
+
- IRC ではボットは NOTICE で発言して NOTICE には反応しないのが原則
|
199
|
+
- 大量発言に注意
|
200
|
+
- アカウントが ban される可能性も
|
201
|
+
|
202
|
+
# 脆弱性にも注意
|
203
|
+
|
204
|
+
- 任意コード実行ボットはかなり難易度が高い
|
205
|
+
- タイトル取得ボットは情報漏洩に注意
|
206
|
+
- 例えば localhost に制限しているもの
|
207
|
+
- "169.254.169.254" ?
|
208
|
+
|
209
|
+
# 発言量の問題
|
210
|
+
|
211
|
+
- ほとんどの発言に反応 → 迷惑?
|
212
|
+
- 受け入れられていれば問題なし
|
213
|
+
- 以前からそういうものとして存在
|
214
|
+
- 新規ならボットとの会話用チャンネルに隔離?
|
215
|
+
|
216
|
+
# 単調にみえる反応
|
217
|
+
|
218
|
+
大量のパターンを用意しても…
|
219
|
+
|
220
|
+
- キーワード反応型
|
221
|
+
- ユーザーの発言のバリエーションが少ない
|
222
|
+
→ 反応も単調
|
223
|
+
- 時間に依存するもの
|
224
|
+
- ユーザーが使う時間がほぼ同じ
|
225
|
+
→ 反応もほぼ同じ
|
226
|
+
|
227
|
+
# 最後に
|
228
|
+
|
229
|
+
- ping pong のような単純なものから始めるのがオススメ
|
230
|
+
- Twitter のような公開の場所は攻撃される可能性もあがるので Slack などのクローズドな場所で始めるのがオススメ
|
231
|
+
- アイデア次第で簡単なものでも便利だったり面白くなったり
|
data/config.yaml
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
id: osakarubykaigi02-chatbot
|
3
|
+
base_name: chatbot
|
4
|
+
tags:
|
5
|
+
- ruby
|
6
|
+
presentation_date: 2019/09/15
|
7
|
+
version: 2019.09.15
|
8
|
+
licenses: []
|
9
|
+
slideshare_id: ss-171884537
|
10
|
+
speaker_deck_id: tiyatutobotutofalsesusume
|
11
|
+
ustream_id:
|
12
|
+
vimeo_id:
|
13
|
+
youtube_id:
|
14
|
+
author:
|
15
|
+
markup_language: :markdown
|
16
|
+
name: Kazuhiro NISHIYAMA
|
17
|
+
email: zn@mbf.nifty.com
|
18
|
+
rubygems_user: znz
|
19
|
+
slideshare_user: znzjp
|
20
|
+
speaker_deck_user: znz
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-znz-osakarubykaigi02-chatbot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2019.09.15
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kazuhiro NISHIYAMA
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-09-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: "[Osaka RubyKaigi 02](http://regional.rubykaigi.org/osaka02/) での発表資料です。"
|
28
|
+
email:
|
29
|
+
- zn@mbf.nifty.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- chatbot.md
|
38
|
+
- config.yaml
|
39
|
+
- pdf/osakarubykaigi02-chatbot-chatbot.pdf
|
40
|
+
homepage: http://slide.rabbit-shocker.org/authors/znz/osakarubykaigi02-chatbot/
|
41
|
+
licenses: []
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.7.6
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: チャットボットのススメ
|
63
|
+
test_files: []
|