2021/08/23

ASMR

ASMR(Autonomous Sensory Meridian Response)稱為「自發性感官經絡反應」「自發性知覺高潮反應」「顱內高潮」,主要是透過視覺、聽覺、嗅覺等知覺,刺激人類顱內、頭皮、後背以及四肢等部分,而產生愉悅的感知現象。

例如,有人聽到他人在吃炸雞的咀嚼聲、竊竊私語、切菜聲、衣物磨擦聲、燒木柴的劈啪聲等,身體就會出現一種酥麻感,進而感到治癒、放鬆。

2010年,珍妮佛·艾倫(Jennifer Allen)提出將該現象命名為「自主性感官經絡反應」

  • (A):自主性 – 自發的、自治的、有或沒有控制
  • (S):感官 – 跟感官或感覺有關
  • (M):經絡 – 表示高峰、高潮或最高點發展
  • (R):反應 – 意指由外部或內部事物觸發的體驗

ASMR 用於感官行銷,透過五感(視覺、聽覺、嗅覺、味覺、觸覺),連結消費者的感受,建立品牌在感官上的形象。

  • IKEA

IKEA在2017年時就推出一則廣告影片,影片中的解說員輕聲細語介紹床具,且透過整理抱枕、磨蹭衣物、輕拍檯燈等,發出舒服的聲響,讓觀眾可以從另一層面,來感受家具的舒適性。

IKEA便是透過拍攝ASMR影片,把聽覺、觸覺的效果展現出來,很多人看了之後,就會覺得他們家的家具質感很好,藉此產生了好印象。這部影片至今已累積3百多萬次觀看。

“Oddly IKEA”: IKEA ASMR

  • Netflix

Netflix上架的節目《家有壁爐》突然爆紅,一個小時的影片只拍攝著火爐的火光,和柴火發出的劈啪聲,豪無劇情、無對白。觀眾卻因為火舌的舞動、木柴發出的劈啪聲,感到無比的治癒感,而埋單。

《家有壁爐》爆紅後,甚至推出「4K樺木版」,也奪得知名電影電視評論網站《IMDb》8分的高分。

ref: 《家有壁爐》劈啪聲燒百萬竟獲IMDb高分 網友讚:超療癒

  • Apple

美國科技巨頭蘋果也搭上ASMR熱潮。蘋果為了推銷 Airpods、iPhone XS,2019年推出了四支ASMR 影片,包含木匠打磨、耳邊細語、雨滴打在不同物體上、行走叢林腳下摩擦的沙沙聲。利用拍攝環境白噪音,讓消費者身心放鬆,也藉此強調iPhone XS與iPhone XS Max收音、錄影畫質表現。

ref: Apple 最新的廣告系列是讓人舒爽的 ASMR 影片

  • 可口可樂

可口可樂在2019年時,推出了四支可口可樂ASMR影片,分別搭配烤肉、披薩、漢堡、義大利麵四種主食,他們將可樂那種氣泡聲,或是冰塊碰撞、倒飲料、瓶蓋的聲音強化後,讓消費者產生生理反應,想當場就打開一瓶可樂喝。

ref: ASMR Coca-Cola шашлыкhttps://youtu.be/FgXQPWGwcL0)

ASMR Coca-Cola пицца

  • 森永製菓

2013年,森有上市一款口味、成分並不出奇的巧克力冰棒,然而,該產品在2017年時,銷量卻突然翻3倍,就靠一支「咬冰棒聲音」的影片。

2016年,森永找感官訊息工程專家研究商品,結果發現,該款冰棒7mm厚巧克力外層的「質地」和「聲音」令人喜愛。

調查結果出來後,森永不做任何廣告,只透過網路影片傳達吃冰棒時候所產生的「Pakipaki」聲,2017年的銷量便是2013年的3倍。

ref: 鈴木奈々、ASMRやってみた60分版

  • 全家

FamilyMart 便利商店在 2019 年的時候,推出了相關影片。影片當中有熟悉的開門聲、結帳聲、咖啡機…等等不同種類的聲音,參雜其中,主要都是店內常常聽見的聲音。

全家療癒音|ASMR|讀書 專注 冥想 工作用BGM|白噪音|Relaxing FamilyMart Convenient Store Background Sounds

  • KFC

KFChill - Finger Lickin’ Good Vibes

  • Disney+

Zenimation

  • 噴火龍

【公式】ASMR・焚き火音 - ヒトカゲといっしょ Charmander's Fireside Slumber

  • 雕刻

ref: 【雕刻 ASMR】欣賞可以有很多種方式,而有人更享受過程

  • 寫字

ref: 如果你喜歡【寫字聲 ASMR】的話,那八成你是用功的孩子!

  • slime

ref: 史萊姆/鬼口水【簡單製作教學】,做出 100 萬觀看的 ASMR 影片吧!

References

ASMR wiki

森永靠「咬冰棒聲」銷量翻3倍!ASMR是什麼?連Netflix、蘋果都在用

【ASMR 行銷】連知名品牌也愛用!讓銷售量翻 2~3 倍的秘密!

聲音新浪潮 品牌必學ASMR淘金術

全球首間ASMR博物館來了!網路上爆紅、一聽就療癒

2021/08/09

MongoDB Cluster

設定三個節點的 MongoDB Cluster

在三台機器設定測試 MongoDB Cluster

環境設定

一個由三個 replica set 組成的 shard server,三個 config server,三個 route server。

shard1: 3 replica sets
192.168.1.11:27019
192.168.1.12:27019
192.168.1.13:27019

3 config server
192.168.1.11:27018
192.168.1.12:27018
192.168.1.13:27018

3 route server
192.168.1.11:27017
192.168.1.12:27017
192.168.1.13:27017

安裝

vi /etc/yum.repos.d/mongodb-org-4.2.repo

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
yum install -y mongodb-org

# 安裝後,會修改的檔案
# mongodb system service
/usr/lib/systemd/system/mongod.service
# mongodb config file
/etc/mongod.conf

/usr/lib/systemd/system/mongod.service

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

/etc/mongod.conf

# more /etc/mongod.conf
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.


#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:

先將 server 停掉

sudo systemctl stop mongod

備份舊資料

mv /var/lib/mongo-cfgsvr /var/lib/mongo-cfgsvr.bak
mv /var/lib/mongo /var/lib/mongo.bak

mkdir -p /var/lib/mongo-cfgsvr
chown -R mongod:mongod /var/lib/mongo-cfgsvr

mkdir -p /var/lib/mongo
chown -R mongod:mongod /var/lib/mongo

修改 os 設定

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

ssh 免密碼登入

/etc/hosts

192.168.1.11   larzio1
192.168.1.12   larzio2
192.168.1.13   larzio3
# ssh 免密碼

yum -y install openssh-clients

larzio1:
mkdir -p /root/.ssh
cd /root/.ssh
ssh-keygen -t dsa
按enter直到完成

(id_larzio1.pub為自己辨識用的名稱)
scp id_dsa.pub 192.168.1.12:/root/.ssh/id_larzio1.pub
scp id_dsa.pub 192.168.1.13:/root/.ssh/id_larzio1.pub

ssh 192.168.1.12(13)
cd /root/.ssh/
cat id_larzio1.pub >> authorized_keys
完成ssh免密碼

larzio2:
cd /root/.ssh
ssh-keygen -t dsa
按enter直到完成

(id_larzio2.pub為自己辨識用的名稱)
scp id_dsa.pub 192.168.1.11:/root/.ssh/id_larzio2.pub
scp id_dsa.pub 192.168.1.13:/root/.ssh/id_larzio2.pub


ssh 192.168.1.11(13)
cd /root/.ssh/
cat id_larzio2.pub >> authorized_keys
完成ssh免密碼


larzio3:
cd /root/.ssh
ssh-keygen -t dsa
按enter直到完成

(id_larzio3.pub為自己辨識用的名稱)
scp id_dsa.pub 192.168.1.11:/root/.ssh/id_larzio3.pub
scp id_dsa.pub 192.168.1.12:/root/.ssh/id_larzio3.pub


ssh 192.168.1.11(12)
cd /root/.ssh/
cat id_larzio3.pub >> authorized_keys
完成ssh免密碼

Note 備份, 還原 資料庫

mongodump -u root -p passwd --authenticationDatabase admin -d larzio -o /root/download/backup/

mongorestore -u root -p passwd --authenticationDatabase admin -d larzio --drop /root/download/backup/larzio

Config Server

步驟

  1. security key file
  2. config server 設定檔
  3. 產生 config server db path
  4. 啟動 config node service
  5. 部署到其他兩台機器
  6. 建立 replica set

security keyfile

openssl rand -base64 756 > /root/mongodb-keyfile

mkdir -p /var/lib/mongo
chown mongod.mongod /var/lib/mongo

cp -p /root/mongodb-keyfile /var/lib/mongo/
chmod 400 /var/lib/mongo/mongodb-keyfile
chown mongod.mongod /var/lib/mongo/mongodb-keyfile
# 複製到其他兩台機器
scp /var/lib/mongo/mongodb-keyfile  root@192.168.1.12:/var/lib/mongo/mongodb-keyfile
scp /var/lib/mongo/mongodb-keyfile  root@192.168.1.13:/var/lib/mongo/mongodb-keyfile

# 在 12, 13
sudo chmod 400 /var/lib/mongo/mongodb-keyfile
sudo chown mongod.mongod /var/lib/mongo/mongodb-keyfile

config file

cp -p /etc/mongod.conf /etc/mongod-cfgsvr.conf

vi /etc/mongod-cfgsvr.conf
# 修改以下設定
#  systemLog.path
#  storage.dbPath
#  net.port
#  net.bindIp
#  security.keyFile
#  sharding.clusterRole

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  logRotate: reopen
  path: /var/log/mongodb/mongod-cfgsvr.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo-cfgsvr
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod-cfgsvr.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27018
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

security:
  keyFile: /var/lib/mongo/mongodb-keyfile
#  authorization: enabled

#operationProfiling:

replication:
  replSetName: rs-config

sharding:
  clusterRole: configsvr

## Enterprise-Only Options

#auditLog:

#snmp:

config server dbpath

mkdir -p /var/lib/mongo-cfgsvr
chown -R mongod:mongod /var/lib/mongo-cfgsvr

config server service

# 不要用這個方式直接啟動, 所有產生的檔案owner 都會是 root:root
#mongod -f /etc/mongod-cfgsvr.conf

建立 mongod-cfgsvr service file

vi /usr/lib/systemd/system/mongod-cfgsvr.service

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-cfgsvr.conf"
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod-cfgsvr.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

啟動

systemctl daemon-reload
systemctl enable mongod-cfgsvr
systemctl start mongod-cfgsvr

deploy

複製到其他兩台機器

scp /etc/mongod-cfgsvr.conf root@192.168.1.12:/etc/mongod-cfgsvr.conf
scp /etc/mongod-cfgsvr.conf root@192.168.1.13:/etc/mongod-cfgsvr.conf

scp /usr/lib/systemd/system/mongod-cfgsvr.service root@192.168.1.13:/usr/lib/systemd/system/mongod-cfgsvr.service

scp /usr/lib/systemd/system/mongod-cfgsvr.service root@192.168.1.12:/usr/lib/systemd/system/mongod-cfgsvr.service

在 12, 13

mkdir -p /var/lib/mongo-cfgsvr
chown -R mongod:mongod /var/lib/mongo-cfgsvr

# 啟動 config-svr
systemctl daemon-reload
systemctl enable mongod-cfgsvr
systemctl start mongod-cfgsvr

replica set

先回到 192.168.1.11 關掉 config server,註解 replica, shard 的設定部分,以免 create user 發生 "no master" 的問題

# sudo mongod -f /etc/mongod-cfgsvr.conf -shutdown
systemctl stop mongod-cfgsvr

vi /etc/mongod-cfgsvr.conf
#註解掉 replica 與 shard

重新啟動 config server

#sudo mongod -f /etc/mongod-cfgsvr.conf
systemctl start mongod-cfgsvr
mongo -port 27018

use admin

db.createUser( {
    user: "root",
    pwd: "passwd",
    roles: [ { role: "root", db: "admin" } ]
  });

db.auth('root', 'passwd');

db.createUser( {
    user: "admin",
    pwd: "passwd",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  });
vi /etc/mongod-cfgsvr.conf
# 開啟 replica 與 shard

重新啟動服務

#sudo mongod -f /etc/mongod-cfgsvr.conf -shutdown
#sudo mongod -f /etc/mongod-cfgsvr.conf
systemctl restart mongod-cfgsvr

登入 mongo

mongo -port 27018 -u 'root' -p 'passwd' -authenticationDatabase 'admin'

rs.initiate(
  {
    _id: "rs-config",
    configsvr: true,
    members: [
      { _id : 0, host : "192.168.1.11:27018" },
      { _id : 1, host : "192.168.1.12:27018" },
      { _id : 2, host : "192.168.1.13:27018" }
    ]
  }
)

rs.status()

Router Server

192.168.1.11, 192.168.1.12

config file

vi /etc/mongod-router.conf

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  logRotate: reopen
  path: /var/log/mongodb/mongod-router.log

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod-router.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.


security:
  keyFile: /var/lib/mongo/mongodb-keyfile

sharding:
  configDB: rs-config/192.168.1.11:27018,192.168.1.12:27018,192.168.1.13:27018

router service

建立 mongod-router service file

vi /usr/lib/systemd/system/mongod-router.service

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-router.conf"
ExecStart=/usr/bin/mongos $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod-router.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

啟動 router

# sudo mongos -f /etc/mongod-router.conf
systemctl daemon-reload
systemctl enable mongod-router
systemctl start mongod-router

deploy

scp /etc/mongod-router.conf root@192.168.1.12:/etc/mongod-router.conf

scp /usr/lib/systemd/system/mongod-router.service root@192.168.1.12:/usr/lib/systemd/system/mongod-router.service

在 192.168.1.12

systemctl daemon-reload
systemctl enable mongod-router
systemctl start mongod-router

Shard Server

config file

vi /etc/mongod.conf

# mongod.conf
# 修改
# - net.port
# - net.bindIp
# - security.keyFile

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  logRotate: reopen
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27019
  bindIp: 0.0.0.0

security:
    keyFile: /var/lib/mongo/mongodb-keyfile

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options

#auditLog:

在另外兩台 server 做一樣的設定 接下來,先啟動第一台 shard server,建立 replica set 之前必須要有 root user,否則會失敗。

scp /etc/mongod.conf root@192.168.1.12:/etc/mongod.conf
scp /etc/mongod.conf root@192.168.1.13:/etc/mongod.conf

啟動第一台 shard server

建立使用者

systemctl start mongod
mongo -port 27019

use admin

db.createUser( {
    user: "root",
    pwd: "passwd",
    roles: [ { role: "root", db: "admin" } ]
  });

db.auth('root', 'passwd');

db.createUser( {
    user: "admin",
    pwd: "passwd",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  });

關閉 mongod 服務

systemctl stop mongod

修改

vi /etc/mongod.conf

replication:
  replSetName: rs-data
    
sharding:
  clusterRole: shardsvr

啟動 mongod

systemctl start mongod

在 192.168.1.12, 192.168.1.13 複製設定, 啟動 mogod

scp /etc/mongod.conf root@192.168.1.12:/etc/mongod.conf
scp /etc/mongod.conf root@192.168.1.13:/etc/mongod.conf
systemctl start mongod

登入 mongo 並設定 replica

mongo -port 27019 -u 'root' -p 'passwd' -authenticationDatabase 'admin'

rs.initiate(
  {
    _id: "rs-data",
    configsvr: false,
    members: [
      { _id : 0, host : "192.168.1.11:27019" },
      { _id : 1, host : "192.168.1.12:27019" },
      { _id : 2, host : "192.168.1.13:27019" }
    ]
  }
)

登入 router (mongos) 設定 shard

mongo -port 27017 -u 'root' -p 'passwd' -authenticationDatabase 'admin'

sh.addShard('rs-data/192.168.1.11:27019,192.168.1.12:27019,192.168.1.13:27019')

把認證模式給開啟,要加入認證模式的有 config 與 shard 開啟很簡單只要將 security.authorization 設定為 enabled

vi /etc/mongod-cfgsvr.conf

security:
    keyFile: /var/lib/mongo/mongodb-keyfile
    authorization: enabled
vi /etc/mongod.conf

security:
    keyFile: /var/lib/mongo/mongodb-keyfile
    authorization: enabled
scp /etc/mongod-cfgsvr.conf root@192.168.1.12:/etc/mongod-cfgsvr.conf
scp /etc/mongod-cfgsvr.conf root@192.168.1.13:/etc/mongod-cfgsvr.conf

scp /etc/mongod.conf root@192.168.1.12:/etc/mongod.conf
scp /etc/mongod.conf root@192.168.1.13:/etc/mongod.conf

重新啟動服務

systemctl restart mongod
systemctl restart mongod-cfgsvr

logrotate

vim /etc/logrotate.d/mongod

/var/log/mongodb/mongod.log  {
    daily
    missingok
    rotate 30
    copytruncate
    dateext
    compress
    notifempty
    create 644 mongod mongod
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 'cat /var/run/mongodb/mongod.pid 2> /dev/null' 2> /dev/null || true
    endscript
}

vim /etc/logrotate.d/mongod-cfgsvr


/var/log/mongodb/mongod-cfgsvr.log {
    daily
    missingok
    rotate 30
    copytruncate
    dateext
    compress
    notifempty
    create 644 mongod mongod
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 'cat /var/run/mongodb/mongod-cfgsvr.pid 2> /dev/null' 2> /dev/null || true
    endscript
}

vim /etc/logrotate.d/mongod-router


/var/log/mongodb/mongod-router.log {
    daily
    missingok
    rotate 30
    copytruncate
    dateext
    compress
    notifempty
    create 644 mongod mongod
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 'cat /var/run/mongodb/mongod-router.pid 2> /dev/null' 2> /dev/null || true
    endscript
}

測試

logrotate -f -v /etc/logrotate.d/mongod

database user

在目標資料庫建立使用者

mongo -port 27017 -u 'root' -p 'passwd' -authenticationDatabase 'admin'

use larzio

db.createUser({
    user: "larzio",
    pwd: "passwd",
    roles: [{ role: "readWrite", db: "larzio" }, { role: "dbAdmin", db: "larzio" }]
})

References

在 cent os 7上安裝 mongodb with Sharded Cluster (1) config server

在 cent os 7上安裝 mongodb with Sharded Cluster (2) router server 與 shard server

MongoDB Sharding 分散式儲存架構建置 (實作篇)

2021/08/02

Chatbot

系統分類

  • 問答 QA 系統

    一問一答,一般沒有對話管理的功能。偏重問句分析,取得問句的主題、問題詞、中心動詞。問句分析目前主要採用 template 比對和語意分析兩種方法

  • 任務導向型對話系統

    目的是解決使用者的明確需求。透過對話管理追蹤目前狀態,確定目的與需求。重點在對話管理,將自然語言映射為使用者的意圖和對應的槽位。

  • 閒聊系統

    使用者無特定目的,沒有具體的需求的多輪人機對話。

  • 主動推薦系統

    人機自然互動

不同類型的系統都包含這三個模組

  • 自然語言理解 NLU
  • 自然語音生成 NLG
  • 對話管理

自然語言理解 NLU

可從語音、音韻、詞態、文法、語意、語用六個維度理解自然語言

  • 語音

    跟發音有關,例如中文拼音

  • 音韻

    由語音組合起來的讀音,例如中文拼音 + 四種聲調

  • 詞態

    詞態封裝可用 NLU,資訊量大小取決於具體的語言種類。拉丁語系有很詞態變化,中文沒有太多的詞態變化,只有偏旁的差異,例如:他 她

  • 文法

    主要研究詞語如何組成合乎語法的句子,文法提供單字組成句子的約束條件,為語意的合成提供框架

  • 語意、語用

    自然語言包含和表達的意思

自然語言的難度

  • 沒有固定的格式,相同的意思有多種句式表達,改了一個字、調整語調、語序,都可能改變語意
  • 不斷有新的詞彙出現
  • 不同的場景(上下文),同樣的句子有不同的意思

問句 + 上下文 ------> 自然語言理解 NLU -------> 語意

英文單字以空格分隔,但中文詞語沒有自然分隔符號,故要先進行分詞處理

NLU 需要提供的模組功能

  • 實體識別 Named Entity Recognition

    識別具有特定意義的實體,例如:人名、時間、地名及專有名詞

  • 使用者意圖識別

    顯式及隱式意圖

    ex: "好熱啊" -> 可能是想知道現在的氣溫,或是控制空調

  • 情感識別

    顯式及隱式情感

    ex: "今天心情很好" -> 正面 -> 顯式、容易判斷

    ex: "今天跟客戶談判出了問題" -> 負面情感 -> 程式很難判斷

  • 指代消解、省略恢復

    在聊天主題背景一致的情況下,對話過程通常會習慣使用代詞,取代出現過的實體。或為了方便表述,省略部分句子。

  • 回覆確認

    如果發生判斷模糊的狀況,chatbot 要主動詢問意圖,也就是回覆確認

  • 拒識判斷

    chatbot 要能主動拒絕識別,及回覆超過自身理解/回覆範圍,或涉及敏感話題

NLU 的方法分為基於規則和統計兩種

  • 基於規則

    人工定義很多語法規則,利用規則定義如何從文字中提取語意。NLU 根據規則解析輸入該模組的文字。

    優點:靈活,可定義各式各樣的規則

    缺點:需要大量不同場景的規則,隨著規則數量增加,維護規則的難度也增加

    適合簡單的場景,可快速時做一個簡單可用的 NLU

  • 基於統計

    資料量大,就要用統計方法訓練模型。

    優點:資料驅動

    缺點:訓練資料難以取得,模型難以解釋和偵錯

    適合處理分類和序列標註的問題。可將意圖識別定義為分類問題:輸入句子的文字特徵,輸出該特徵所屬的意圖分類。 SVM、AdaBoost 演算法

    實體識別就是序列標註問題:輸入句子的文字特徵,輸出特徵中,每個字詞屬於某個實體的機率。HMM、CRF(Conditional Radom Field) 演算法

採用 deep learning 方法時,需要大量的資料,因為長尾資料普遍存在,基於統計的方法,受訓練資料品質影響很大

實作通常結合使用兩種方法

  1. 沒有資料及資料較少,先採用基於規則的方法,累積資料後,再採用基於統計的方法
  2. 基於統計的方法可涵蓋大部分的場景,在涵蓋不到的場景,改用基於規則的方法

NLU 產品,強調通用性,很難客製

  • Facebook 的 Wit.ai

  • Google 的 api.ai

  • MS 的 LUIS.AI

NLU 基本技術

詞法分析 (分詞 + 詞性標註) ----> 句法分析 ---> 語意分析

  • 詞法分析 lexical analysis

    常用漢字有六、七千字,遠多於 26 個英文字母,中文詞之間沒有明確的分隔標記,多音現象嚴重,缺少詞態變化(單複數、時態、陰陽性),這些特性帶來了中文分詞方法、重疊詞區分(黑 / 黑黑的)、歧義欄位切分、專有名詞識別等等問題

    詞法分析包含 分詞 + 詞性標註 兩個部分

    • 分詞 word segmentation 有基於詞表和基於統計兩種方法

    基於詞表:逐字掃瞄字串,當子字串跟詞表的詞相同就算吻合。再細分為 最大比對法、逆向最大比對法、雙向掃描法、逐詞巡訪法等等。ex: IKAnalyzer

    基於統計:根據人工標註的詞性和統計特徵,對中文進行建模,透過模型計算各分詞出現的機率,以機率最大的分詞作為結果,常用 HMM、CRF、LSTM+CRF 演算法。ex: ICTCLAS、Standford Word Segmenter * 詞性是詞語最基本的文法屬性之一,詞性標註 Part-Of-Speech Tagging (POS Tagging) 是詞法分析的一部分

    將句子的每一個詞賦予特定類別,ex: 動詞、名詞、介系詞,句子中最能代表資訊的是名詞、動詞、形容詞、副詞,這四種是 Open Class,詞量會隨著時間增加,Closed Class 包含冠詞、介系詞、連接詞,數量固定

    主要採用 HMM,陸續採用判別式的最大熵模型、支援向量機模型等。有基於規則、基於統計兩種方法

    基於規則:依照詞性關係與上下文情境建造詞類消岐規則

    基於統計:將機率最大的詞性作為結果

    工具:Stanford Log-linear Part-Of-Speech Tagger、LTP

  • 句法分析 Syntactic Parsing

    分析輸入的文句,得到句法結構。從字串得到句法結構的過程。ex: 句法驅動和統計的機器翻譯

    不同的句法形式,對應到不同的句法分析演算法,片語結構及依存結構,是最常用的兩類文法體系。以片語結構樹為目標的句法分析器應用範圍最廣。

    分析結果以樹狀結構的形式呈現,稱為句法分析樹。

    根據句法結構不同的表示形式,可將句法分析分為以下三種

    • 依存句法分析 Dependency Syntactic Parsing:識別詞彙之間的相互依存關係

    基本假設:一個句子存在主體(被修飾詞)和修飾詞,句子中,詞的修飾關係具有方向性,通常是一個詞支配另一個詞,這種支配關係就是依存文法。

    詞和詞之間的依存(修飾)關係,本質上包含在句法結構中。

    一個依存關係連接的兩個詞,分別是 head 核心詞與 dependent 依存詞

    依存關係的五條公理:

    1. 一個句子只有一個成分是獨立的
    2. 其他成分直接依存於某一個成分
    3. 任一個成分都不能依存於兩個或兩個以上的成分
    4. 如果 A 直接依存於 B,C在句子中位於 A, B 之間,則 C 直接依存於 B,或依存於 A, B之間某一個成分
    5. 中心成分左右兩邊的其他成分,相互之間不發生關係

    常見依存關係

    關係類型 標籤 描述 例子
    主謂關係 SBV subject-verb 他邀請我跳舞 (他 <- 邀請)
    動賓關係 VOB 直接賓語 verb-object 媽媽給我一個吻 (給 -> 吻)
    間賓關係 IOB 間接賓語 indirect-object 媽媽給我一個吻 (給 -> 我)
    前置賓語 FOB 前置賓語 fronting-object 莫我肯顧 (我 <- 顧)
    兼語 DBL double 他邀請我跳舞 (邀請 -> 我)
    定中關係 ATT attribute 紅寶石 (紅 <- 寶石)
    狀中結構 ADV adverbial 特別嚴厲(特別 <- 嚴厲)
    動補結構 CMP complement 打掃完衛生(打掃 -> 完)
    同位語 APS appositive 我本人非常高興(我 <- 本人)
    並列關係 COO coordinate 天空和海洋 (和 -> 海洋)
    介賓關係 POB preposition-object 在陽光下 (在 -> 下)
    左附加關係 LAD left adjunct 天空和海洋 (和 <- 海洋)
    右附加關係 RAD right adjunct 朋友們 (朋友 -> 們)
    獨立結構 IS independent structure 我五歲,他四歲 (各自獨立)
    核心關係 HED head 美麗的花朵爭相開放 (花朵 是整個句子的核心)

    目前採用資料驅動的依存句法分析,將資料分為訓練集和測試集。基於圖 graph-based 和 基於轉移 transition-based 兩種分析方法。

    基於圖 graph-based:

    ​ 將句子(字串)和對應的依存樹組成的資料做為訓練資料,訓練目的是,學習一個可以預測一句依存樹未知的最佳依存樹。建模過程需要增加依存樹限制條件,例如圖的邊是有向邊,在有向的路徑上,一個詞只能被存取一次,每個詞只能有一個支配節點。

    基於轉移 transition-based:

    ​ 將圖預測轉變為序列標註問題,主要的轉移系統有 arg-eager, arc-standard, easy-first 等等,基於轉移的系統有三個操作

    1. 將單字從 buffer 移入 stack,或將單字從 stack 移回
    2. 從 stack 將單字 pop
    3. 建立帶有 label 的有向邊(左向邊或右向邊)

    基於圖在短句的表現較好,但長句容易受到早期錯誤的影響。基於轉移在長句有較好的表現,但是缺乏豐富的結構化特徵。

    • 片語結構句法分析 Phrase-structure Syntactic Parsing,也稱為成分句法分析 Constituent Syntatic Parsing:識別句子中的片語結構和片語之間的層級句法關係

    基於 Context Free Grammar (CFG),其規則分為人工編寫規則和資料驅動的自動學習規則兩類。

    人工編寫的缺點:規則之間的衝突會隨規則數量的增多而加劇,不易增加新規則。資料驅動的自動學習規則,開發週期短,且規則運作良好,目前為主流方法。

    為了在句法分析導入統計資訊,需要將 CFG 擴充為 PCFG: Probabilistic Context Free Grammar,最後利用 Maxmimum Likelihood Estimation (MLE) 計算每一條規則的機率。

    因為 CFG 的獨立性假設過於嚴格(一條文法規則的確定,僅與該規則左側句子的非終結符號有關,與上下文資訊無關),導致文法中缺乏其他資訊用於規則消岐,因此分析器的效能較低。這個問題有兩種弱化 CFG 假設的方法:一種是使用詞彙化 Lexicalization 方法,一種是使用符號重標記 Symbol Refinement 的方法,透過改寫非終結符號的方式,將上下文資訊導入句法分析器。

    • 深層文法句法分析,利用深層文法,對句子進行深層句法及語意分析,包含詞彙化樹鄰接文法 Lexicalized Tree Adjoining Grammar (LTAG)、詞彙功能文法 Lexical Functional Grammar (LFG)、組合範疇文法 Combinatory Categorial Grammar (CCG)

    依存句法分析是淺層句法分析,適合用在多語言環境,深層文法採用相對複雜的文法,句法和語意資訊較為豐富,分析器複雜。

    先將句子的基礎特徵(詞、詞性、類別標籤)向量化,再利用 MLP 進行特徵提取。

    深層學習的優點:

    1. 只需要句子的基礎特徵,利用向量乘法組合向量化特徵,理論上可達到任意元的特徵組合
    2. 能使用更多基礎特徵
  • 語意分析 semantic analysis

    語意是資料對應現實世界中,事物所代表的涵義。語意分析涉及語言學、計算語言學、人工智慧、機器學習、認知語言等多個學科,最終目的是理解句子表達的真實涵義。

    1. 語意分析在機器翻譯的應用,統計機器翻譯提升了翻譯的效能
    2. 語意搜尋:搜尋不在拘泥於根據輸入關鍵字字面的意思,而是要了解背後真正的意圖
    3. 實現大數據的理解與價值發現的有效手段

    Chatbot 利用語意分析可得知使用者的意圖、情感,藉由上下文情境的語意建模,保持 chatbot 的個性一致

自然語言表示

三種常用的文字特徵表示模型,將自然語言表示為電腦可以理解的形式

  • 詞袋模型 Bag Of Words, BOW

    最初用在資訊檢索 Information Retrieval (IR)。每個詞的出現都不依賴於其他詞是否出現的假設。在表示文件時,可忽略文字的語序、文法、句法,將其視為片語的組合

    ex: 以下兩份文件

    (1) 台北今天下雨,台中也下。

    (2) 台北和台中今天都下雨。

    建構辭典(前面是索引):

    Dictionary = {1: "台北", 2: "今天", 3: "下", 4: "雨", 5: "台中", 6: "也", 7: "和", 8: "都"}

    根據索引,可用向量表示該單詞在文件中出現的次數

    下:在第一句話出現 2 次,第二句話中出現 1 次

    (1) [1, 1, 2, 1, 1, 1, 0, 0]
    (2) [1, 1, 1, 1, 1, 0, 1, 1]

    詞袋模型可將文件轉換為次數的向量,但沒有表示單詞在原句中出現的位置,這是明顯的缺點。

  • 詞頻-逆向文件頻率 TF-IDF: Term Frequency-Inverse Document Frequency

    基於統計的加權方法,常用於 IR,用具體詞彙在文件中出現的次數,和其在語料庫出現的次數,評估該詞彙對相關文件的重要程度。TF-IDF 常被搜尋引擎用來評估文件與查詢之間的相關程度。

    TF (Term Frequency 詞頻) 就是詞語在文件出現的次數

    IDF (Inverse Document Frequency 逆向文件頻率) 詞語普遍重要性的度量。

    詞彙在指定文件內的高 TF,高 IDF,將使該詞彙在文件內享有較高權重的 TF-IDF

    TF-IDF 傾向於過濾常見詞彙,保留重要詞彙的做法。核心概念是:在一篇文件中出現頻率高,但在其他文件很少出現的詞彙,有較好的類別區分效果。

    但實際上,同一類文件頻繁出現的詞彙,往往代表該類文件的特徵,這類詞彙有較高的權重,應該視為該類文件的特徵詞,這是 IDF 的不足處。

  • 詞嵌入 Word Embedding

    將深度學習導入 NLP 的核心技術之一。

    要在 NLP 使用機器學習,必須找到一種適合將自然語言數學化的方法。最初用 one hot representation 方法,利用詞表大小維度的向量描述單詞,每個向量中多數元素為 0,只有該詞彙在詞表對應位置的維度為 1。

    ex: 詞表 H,包含 N 個詞彙,「雨傘」是 H 的第 2 個詞彙,「傘」是 H 的第 4 個詞彙

    「雨傘」的 one hot representation 為 [0, 1, 0 , 0, 0, 0 .....]

    「傘」的 one hot representation 為 [0, 0, 0 , 1, 0, 0 .....]

    同時分配 ID,「雨傘」的 ID 為 2,「傘」的 ID 為 4

    One-Hot Encoding 將所有詞彙單獨考慮,以向量表示,難於發現同義及反義的詞彙關係。另外因向量過於稀疏,在機器學習容易造成維度災難。

    Word Embedding 在基於 One-Hot Encoding 時,增加了單詞間的語意聯繫,並降低詞向量維度。

    一個包含 t 個詞彙 \[ w_1, w_2, ..., w_t \] 的句子,自然語言的機率 (也稱為語言模型)為 \[ p(w_1, w_2, ..., w_t) \\ = p(w_1)*p(w_2|w_1)*...*p(w_t|w_1,w_2,...,w_{t-1}) \\ = p(w_t|w_1,w_2,...,w_{t-1}) \]

    對於 N-gram 模型來說

    \[ p(w_1, w_2, ..., w_t) ≌ p(w_t|w_{t-n+1},w_{t-n+2},...,w_{t-1}) \]

    Yoshua Bengio 發表三層神經網路建構語言模型的方法

    第一層:輸入層,輸入句子內已知前 n-1 個詞彙的詞向量,將前 n-1 個詞向量拼接成一個向量

    第二層:隱藏層

    第三層:輸出層,第 i 個節點的值,等於下一個詞為 \( w_i \) 的機率的對數

    在最佳化模型的過程中,同時對單詞的詞向量進行優化。最佳化後可得到語言模型及詞向量。

    Encoder-Decoder 是文字處理的框架,可用於 chatbot、機器翻譯、文字摘要、句法分析。也就是由句子 (篇章)X,產生句子(篇章) Y 的通用模型。如果 X, Y 是相異語言,就是自動翻譯器。

    Encoder 負責將 X 變換為中間語意 C,Decoder 將 C 和歷史存在的 Y,產生 i 時刻的 \(Y_i\)

    Google 於 2008 年發表 BERT

    對於基於生成的 chatbot,除了 Encoder-Decoder 解決核心問題外,還需要注意多輪對話、安全回答、個性一致的問題

    • 多輪對話問題

      要將前文聊天資料,導入Encoder-Decoder,可產生更好的回應

      簡單拼接 context 及本次輸入句子的方法,因為 RNN 輸入模型的長度增長而減低成效 -> RNN 對於過長輸入資料敏感的問題

      以多層前饋神經網路替代 RNN:多層前饋神經網路的輸出,代表上下文聊天資訊,和目前輸入內容的中間語意表示,Decoder 根據中間語意產生回覆。

      另一種方法:階層式神經網路 Hierarchical Neural Network (HNN),本質類似 Encode-Decoder框架。Encoder 採用二級結構,以第一級句子 RNN(Sentence RNN) 編碼句子的每一個單詞,形成中間語意,第二級句子 RNN 根據上下文句子出現的先後順序序列,對第一級中間語意進行編碼。這個 RNN 稱為 Context RNN

      RNN 對出現在多輪對話的語言片段進行編碼,Context RNN 對時間進行編碼,解碼 RNN 負責對下一個對話回覆進行預測

    • 避免安全回答

      生成式 chatbot 的問題是「安全回答」,例如不管使用者輸入什麼,都回答 I Don't Know、Sure、呵呵、是嗎

      會發生這個現象的原因是,訓練的資料確實包含很多無意義的回答。問題在於訓練資料的詞語在句子不同位置的機率分佈,呈現出明顯的長尾狀況。也就是神經網路回覆陷入局部最佳解,可藉由給模型增加一些干擾,使其跳出局部最佳解。因此就把 Generative Adversarial Network (GAN) 導入聊天回覆生成系統,以解決安全回答的問題

      將系統分為生成器 Generator、判別器 Discriminator 兩個子系統,生成器使用 seq2seq 模型,以前文為輸入,再輸出對話語句,判別器用來判斷前文產生的回答是否接近人類行為。生成器不斷改良答案欺騙判別器,判別器不斷以生成器的回答作為負例。直到兩者收斂。

    • 個性一致問題

      chatbot 會被當作有個性的虛擬人物,該人物必須要有一致的年齡、喜好、習慣、語言風格。

      seq2seq 訓練都是單句資訊對單據回覆的映射關係,沒有統一的個性資訊。利用 seq2seq 很難保持個性資訊一致

      方法:將預定義的個性化資訊,透過 word embedding 方法呈現,仍然採用 seq2seq,也就是把個性資訊匯入 Decoder,

  • 基於知識圖譜的 NLU

    知識圖譜是結構化的語意知識庫,以符號形式描述真實世界存在的各種實體、概念、及其相互關係,其基本單位是「實體-關係-實體」形式的三元組,以及實體及其相關屬性的「屬性-值」對(Attribute-Value Pair、AVP)

    知識圖譜用 global 唯一的識別字來標籤知識圖譜的每個實體或概念。每個「屬性-值」都是對實體內在具體特型的刻畫,利用關係連接兩個實體,描述實體間的關係,構成網路知識結構。知識圖譜可視為一張巨大、包含節點與邊的圖,其中節點表示真實世界的實體或概念,網路的邊代表實體間的各種語意關係,這個圖模型可用 W3C 提出的 Resource Description Framework (RDF) 或屬性圖表示

    知識圖譜是知識表示與推理、資料庫、資訊檢索、自然語言處理等多種技術融合的產物

    • 知識表示

      知識在電腦內儲存和處理格式,一般以三元組表示一筆知識,頭尾實體是圖譜的節點,關係是圖譜的邊。

      知識表示使用的資料結構,最常見的是 graph 和 tree。每個邊和節點都有中繼資料。現有圖形式資料庫的缺點:在知識表示存在侷限,導致專案成本高,無法混合表示結構與非結構化資料。

      知識酷的資料由結構與非結構化資料混合而成,專案上,廣為接受是使用 Tree,其中 JSON 滿足了結構與非結構化混合的需求,是目前最常用的知識表示方式。缺點是無法結合 machine learning

      為解決以上問題,提出基於幾何空間的知識表示方法,每個實體是空間中的一點,關係是平移向量,每個元組都以平移原則作為基本幾何表示形式,頭實體可按照關係向量移動到尾實體。根據這種方法,可設計出基於統計的AI演算法。

    • 知識建構

      結構化資料可用簡單的映射,對應到知識圖譜

      半結構化資料 ex: html,可用 wrapper,提取資訊存放到特定格式的知識圖譜

      非結構化資料,以 text mining 發現文字隱含的模式

    • 知識融合

      由各來源提取知識後,要融合為一個知識庫,融合過程。

      本體 ontology,提供統一的術語字典,構成術語間的關係,根據具體業務建立或修改資料模型的功能

      本體比對演算法:模式比對 schema matching和實例比對 instance matching 兩種

      模式比對 schema matching:尋找本體中屬性和概念之間的對應關係,大規模本體比對一般使用 anchor 技術,將來自兩個本體的相似概念作為起點,根據這兩個相似概念的父概念、子概念,逐漸建構小型的相似片段,進而找出相符的概念。同時利用反覆運算,將新的相符概念作為新的 anchor,再根據 anchor 相關本體的鄰居資訊,建置新的片段。不斷反覆此過程,直到找不到新的相符概念為止。分而治之的方法

      實例比對可評估來自不同異質資料實例對的相似度,評估的結果用來判斷這些實力是否指向特定領域的相同實體。利用 Locality-Sensitive Hashing 提高實例比對的可擴充性方法,與使用向量空間模型表示實例,基於規則採用 inverted index,取得最初相符候選的方法


      chatbot 特殊需求

    • 需要個性化的知識圖譜

    • 需要動態知識圖譜

      要有生活規律,描述生活軌跡

    • 需要刻畫主觀情感的知識圖譜

      回覆時,除客觀事實外,要增加個性化主觀認知的情感元素

    • 要提供 API

    • 要有多媒體知識圖譜

      結合圖片、語音、文字

自然語言生成

分為 pipeline, integrated 兩種

pipeline 個模組間互相獨立,只有輸入、輸出界面。

integrated 系統模組之間緊密結合

integrated 符合人腦設計,但實作困難,現時常用的是 pipeline,有文字規劃(說什麼)、句子規劃(怎麼說)、句法實現(讓句子連貫)三個模組。

chatbot 對話生成技術

  • 檢索式

    由對話資料庫找出最佳回覆,只能用固定語言回覆

  • 生成式

    由 chatbot 創造句子

    • 需要關聯文法結構和應用特有的語意表徵
    • context sensitive,語言要整合時間、地點、位置等資訊
    • 基於 machine learning 產生的回覆很難解釋,難以被理解

基於範本的 NLG

範本由 sentence和 word 組成,是含有變數的 sentence,word 是範本中變數對應的可能值

適合任務驅動的對話系統

  1. 對話管理模組會根據目前的對話狀態,使用者輸入的資料,生成下一步動作的相關資訊,也就是選擇句子範本,及可選的詞彙範本
  2. NLU 需要利用詞彙範本、句子範本、有限狀態機,進行 slot filling 的相關工作

基於深度學習的 NLG

GAN 在電腦視覺,尤其是圖形生成方面有顯著成果。

對話管理

維護更新對話狀態與動作選擇,對話狀態是一種能夠處理聊天資料的表徵。包含所有可能會影響機器下一步決策的資訊。

動作選擇是基於目前狀態,選擇下一步合適的動作,例如向 user 詢問需要補充的資訊,執行要求的動作等等。

ex: user 輸入「幫我給媽媽預定一束花」,接下來可能是

  1. 詢問可接受的價位「請問預期價位如何?」
  2. 確認可接受的價位「像上次買兩百元的花可以嗎?」
  3. 直接預訂「好的,已預訂價值兩百元的紅玫瑰」

模組

  • 對話行為識別

    預先定義或動態產生,使用者對話意圖的抽象表示形式。分為封閉式、開放式兩種。

    封閉式:將對話意圖映射到預先定義好的對話行為類別體系,通常用在特定領域/任務,ex: 設定鬧鐘、票務預訂、酒店預訂

    開放式:對話行為沒有預先定義好的對話行為類別體系,ex: 閒聊系統

  • 對話狀態識別

    狀態跟 context 及對話行為相關,狀態轉移由前一時刻的對話狀態,與目前使用者輸入的對話行為決定

  • 對話策略學習

    讓機器從「人-人」的真實對話資料學習對話的行為與狀態

  • 對話獎勵

    通常將槽位填充效率、回覆流行度等參數納入考量

    基於強化學習的長期獎勵機制


常見的對話管理方法

  1. Finite State Machine FSM

    要人工定義對話系統可能出現的所有狀態,簡單易用,但需要人工設計,無法用於複雜場景

  2. 基於統計

    將對話過程表示為部分可見的馬可夫決策過程,只需要定義決策過程的狀態和動作,機器可透過學習得到不同狀態間的轉移關係

  3. 基於神經網路

    用神經網路學習動作選擇的策略,將自然語言理解的輸出,及其他特徵,都作為神經網路的輸入,把選擇的動作作為神經網路的輸出。需要大量訓練資料,為獲得大規模應用驗證

  4. 基於框架

    slot-value pair

    用於特定領域的對話系統


對話管理的挑戰

  1. 手工編寫的對話策略,難以涵蓋所有對話場景
  2. 基於統計與神經網路的方法,需要大量對話資料
  3. 要求大量的領域知識、對話知識,以產生有意義的回覆

One-shot Learning 和 Zero-shot Learning 可用少量(無)樣本進行訓練,以解決對話系統「冷開機」問題,透過 reward function 學習,不斷增加對話模型

seqGAN 採用對抗網路實作離散序列的生成模型,解決 GAN 難以應用於自然語言處理領域的問題,並可用來選擇最佳的獎勵函數與參數