近期幾個科技巨頭不斷釋出聊天機器人(以下簡稱Bot)相關的開發套件:

以及慢慢浮現的Bot Store:BotlistBotpages…等等,不難發現這股趨勢或許會開始影響一般使用者、設計師以及開發者,或者,根本完全不會?根本只是新聞炒作下的熱品也不一定(就像「大數據」這個詞彙一樣,大數據講白了就是統計帶來的資料效益而已),但是可以確定的是,巨頭帶領的這股趨勢是否會改變整體市場需要一點時間發酵,近期做了一些觀察整理出的心得分享,希望能引起更多人共鳴:

Bot帶來的衝擊?

以下針對設計師、開發者、使用者以及一般服務提供者來個別說明,衝擊是大是小留給各位去評斷,也歡迎留言跟我們討論。

1. 對於設計師

Bot帶來的是最基本介面上、體驗上的改變,將從傳統的App介面(Graphic UI,以下簡稱GUI)轉到聊天介面(Conversational UI,以下簡稱CUI),對於現在介面設計師來說,設計師不需要再設計那麼多的介面,會從聚焦於圖像介面設計轉變到互動、流程設計,這將會讓使用者體驗設計更加的抬頭,如果你想知道更多聊天介面設計上的一些原則和心得,可以參考我的夥伴Evonne Wu所寫的「設計筆記:淺談聊天介面與人機互動設計」,裡面會有更詳盡的解說。

對於設計師,多了一個CUI,可以依照產品服務和操作體驗選擇不同的呈現方式。

2. 對於開發者

簡單一句話,開發工作總量沒有減少,因為一項服務只有換了介面、體驗和流程,但整體產品目標是一樣的,介面刻畫上可能會相對簡單許多,比較需要客製化的介面數量應該會減少一些,不過,這都只是相對而言,端看你的產品服務適合用什麼樣的介面來呈現,這就需要跟設計師多多討論。

Bot仰賴語意分析和人工智慧(關於人工智慧,可以參考我之前寫的「AI人工智慧是? 為何要有它? 對我們有何影響?」一文介紹),這也是開發者在Bot需要琢磨的部分,目的在於讓電腦可以讀懂使用者輸入的話語以及自動完成所需要進行的動作,以上面電影資訊Bot來說,使用者問:「請告訴我相關的劇情」,Bot要可以語意分析出 →

  1. 下文Context:目前使用者問的是電影「星際大戰7:原力覺醒」,討論基礎為此電影的相關資訊。
  2. 使用者的意圖Intent:需要查詢該電影的劇情,Bot需要呼叫相關的動作或程式。

人工智慧和語意分析會是Bot發展的重要推手,如果Bot少了語意分析,使用者只能依照設計好的輸入選項來跟Bot互動,例如:Facebook Assist要輸入編號來執行動作,[Slack Statsbot]需要依照它的指令輸入才能作動,這樣一來,使用者還需要記指令,雖然可以輸入「help」來看有哪些指令可以用,但是久了沒用都要查一次,這樣的體驗未必會是好的,這樣CUI反而沒有比GUI來得方便。

在Bot開發上也分幾個層次整理如下圖,層次越底下對於開發者來說越簡單、明確,越高層難度越高、越無法做到很精確,底下的幾個層次,可以用電腦科學解決,越高的層次越需要跨領域的知識結合,包含語言、心理、認知、人類學、社會學…等:

  1. 既定事實、主題:要Bot可以回答既定的事實或相關主題,我們可以把相關的資料轉為結構性的資料,例如:問天氣、找商品…等,這些應用做成Bot的背後都是跟一般現有資訊平台雷同。
  2. 學習和反應:透過機器學習Bot可以更瞭解使用者,這邊可以做一些相關的推薦或客製化功能,也可以修正語意分析上的問題,包括讀不懂、會錯意、同一句話有許多解讀意思(例如:三句話總結男人一生 XD),就像我們人一樣,一開始都會有上述情況,透過學習後可以知道我們在說什麼並且做出相對應的回答或反應。
  3. 情緒分析:「哇,這口感十分棒,入口即化」「講都講不聽,到底在幹嘛!」「阿不就好棒棒!」Bot要如何知道第一句話是褒、第二句話是生氣罵人、最後一句話是說好棒卻是反諷?這有賴文法分析、修辭學以及大量的字詞語句資料讓電腦學習和分類。
  4. 情境和記憶:我們跟人溝通的時候,一連串的對話下來,可能包含很多討論主題,我們可以很清楚地知道我們目前談論的是什麼,但是對於Bot來說,需要記憶不同的情境,依照不同情境去做回應這件事情是困難的,難在情境的儲存方式、結構、要如何連結情境和相對應的回應…等,電腦擅長記憶,但是加上情境(我們稱做上下文、Context)後,情況就會變得很複雜。
  5. 個性和情感:Bot知道愛是什麼?如何表現溫柔?Bot會不會有脾氣?等等,開發者如何讓Bot知道愛這個動作、怎麼呈現愛這回事、該如何表現愛(產生什麼舉動之類),這都是值得探討的議題,會不會哪天Skynet真的出現,出現自我意識和啟動自我保護。

對於開發者,就是要致力讓Bot可以像真人一樣和使用者互動,可以賦予他情感、讓它像人一樣說話。

3. 對於使用者

一個產品服務將會從既定的介面操作轉變到人和人最基本的互動方式:「交談」來進行,如果未來介面都改用CUI來呈現,面對不同的產品服務,使用者不需要再去適應各種不同的介面,不用再去抱怨什麼介面或流程設計的那麼難用,因為全部都變成談話,很多服務都在與Bot談話之中完成。

使用者:「幫我叫車,15分鐘後在台北101等我。」
Bot:「OK,沒問題,等等車號1234-AB將會在台北101等你上車。」

使用者只需要下載一個Bot的家,這邊我暫時找不到合適的字詞描述,就是讓Bot可以依附的平台,使用者只需要這平台,需要什麼服務只需要呼叫對應的Bot即可或是拉Bot加入,叫車Bot、天氣Bot、新聞Bot、購物Bot…等等,不用再去載琳琅滿目的App,有些下載使用幾次後也就忘了,要完成不同事情也不需要再App之間切換。

如果一項產品服務選擇好的呈現方式(GUI / CUI相輔相成),對於使用者Bot都是一項加分的體驗。

4. 一般業者

業者的不同服務可以做更有效地整合,例如:Yahoo有推出新聞、氣象和拍賣數個獨立App,如果是使用傳統GUI整合,可能會讓App變得肥大、流程混雜、介面難用、程式難寫…等問題,而如今是使用Bot來提供服務,可以將這些東西整合到CUI呈現,全部通通在對話中進行服務,當使用者想知道新聞時只要說「告訴我新鮮事!」、想知道明天氣象只要問「明天天氣如何?」、想要買東西時只要說「幫我找xyz,規格好一點」,業者可以將所提供的產品整合成由Bot來服務,使用者只需要這個Bot平台就可以同時擁有不同的產品服務。

另外,服務可以依照使用者來客製化,傳統App一旦推出後,如果要加新功能或是修正錯誤,只能透過更新來發佈,有了Bot之後不需要再更新App,功能或修正可以無縫換上,這也將會改變App生態系的重要一環,App Store要轉變為Bot Store。

整體生態系從套裝軟體 → 網頁 → App → Bot/CUI

App還有戲唱嗎?

短時間內答案是肯定的,App依然會存在主宰,Bot的發展需要時間發酵,在Bot還無法很聰明地知道使用者想說什麼、不夠智慧還無法讓使用者盡情使用一般語言和Bot對話之時,App依舊仍會是主流,也並非所有產品服務都適合用Bot來做,一項工作如果可以拆解成數個繁雜的步驟才可以完成、或者整項工作需要來回溝通多次才可以完成的,例如:安排會議時間,都比較適合利用Bot來完成,至於GUI或是傳統App就給其他按鈕很快按一按就完成,比打一串話告訴Bot來做更快、更適合的產品服務來做。

下圖我用本文所提到電影資訊App → Bot,沒有考慮相關的設計原則,單純把原本App轉變為Bot,如果現在你要訂票,你會覺得哪種互動體驗比較好?你喜歡哪一種?原因為何?

結論

面對這波趨勢,我個人是蠻看好跟期待,看好的原因是因為使用者體驗在某些產品服務當中,使用Bot能比純GUI提供更好的體驗,加上語意分析與人工智慧的發展,會使得Bot能讓我們用簡單、自然的互動方式完成複雜的工作。 最後,期待我們的新作…

我是大白,Co-founder & Developer @DualCores Studio,歡迎對於Bot開發、人工智慧、語意分析、機器學習有興趣的朋友多跟我一起交流學習,接下來會更專注分享相關的題目。

同步發表於Medium,歡迎按讚以及關注。

上圖是我自己第一個新創公司所做的產品Demo,叫做Styletrip,是一個AI旅遊平台,使用者只需要輸入「要去的地方、預算(非必要)和去的期間多久(非必要)」,我的AI就可以幫你安排出一套完整的行程(看圖的右邊),包括要去玩的景點、可以去吃的美食和住宿以及交通,當初為何會想做這個平台?我們要解決的問題什麼問題?這平台想解決的問題就在於安排行程的過程太過於繁瑣、累人,有了這個AI的幫忙,使用者只需要告訴電腦一些需求,就可以泡杯咖啡來喝等待AI完成的行程規劃,完全解決人類的特點之一 = 「懶」

這Styletrip產品沒有後續了,簡單來說就是創業失敗了,對這題目有興趣、想做旅遊新創或是想聽聽為何失敗之經驗分享的朋友們都歡迎找我聊聊。

Styletrip所用的核心技術,就是AI (Artificial Intelligence),讓人工智慧幫你找出你要去的景點、推薦你喜愛吃的美食、找到符合預算的機加酒,而人工智慧到底是什麼?為何它要存在?它的存在對你的影響是什麼?

AI = 學習 + 推理 + 行動

因為AI都是從我們人類發展以來各個領域的研究來啟發它的進化,下面列出了一些AI所涵括的領域:

哲學

  • 我們所知道的規則,是否能用來得到有用的結論嗎?我們的經驗能幫助我們什麼?
  • 我們腦袋的思考,是如何從大腦的物質所產生?
  • 知識從哪裡來?這些知識怎麼引導行動?

哲學簡單來說就是AI如何思考,描述當我們有知識或經驗時會如何引導我們的行動?

數學

  • 邏輯:在確定的情況下,我們要怎麼推理、找出下一步的動作?
  • 機率:在不確定的情況下,我們要怎麼推理、找出下一步的動作?
  • 計算:一個問題可以在有限時間內被解決。電腦科學領域有一類的問題歸類為難解問題,何謂難解?就是問題困難的程度可以瞬間暴增(以電腦科學的講法叫做時間複雜度呈現指數成長),舉個例子就是要一年級小學生算數從1+1=?變成算出2^74,207,281 − 1=?並且證明這個數字是質數一樣。

數學在AI當中扮演著一個有理論佐證的角色,讓整個決策是合理、有跡可循的,並且保證可以被解決。

上述難解問題在電腦科學領域有一個經典問題叫做Travel Salesman Problem (TSP),問題舉例一個業務員要從臺北出發,一天之內要去拜訪100個地點都不同的客戶(好血汗喔Orz….),且拜訪完後一樣要回到臺北出發原點,請問他可以走得最短路徑為何? 電腦是否能幫他找出那個路徑?以目前可行的理論能找出相對短的路徑而已(參閱Optimization or Approximation Algorithm)。

Styletrip也是遇到同樣的問題,「你想去台北玩,AI幫你列出可以玩的所有景點,每個景點都要去玩過一次,接下來你可以走的最短路徑為何?」當然這邊問題更複雜,包括要考慮景點的開放時間、使用者對景點是否有興趣、景點加入後會不會超出使用者預算…等,讓整個問題更加的複雜。

經濟

  • 我們會怎麼選擇,來讓目前得到最大效益?
  • 我們會怎麼選擇,來讓未來得到最大效益?

這裡的經濟不是跟金錢、金融相關,而是指人們會如何進行決策,來達到他們所想要的目的,同樣也可以套用在AI上,人類都會選擇最好的選擇,同樣AI也是。

神經科學

  • 大腦是如何學習?如何思考?如何處理資訊?

電腦科學家參考人類的神經系統,設計出「類神經」的計算架構,讓電腦可以接收到資訊後,加總和觸發而做出最後的輸出,並且可以依照輸出再回傳到神經系統,讓電腦可以自主學習,就像人類一樣,透過不斷的訓練肌肉、刺激神經,讓我們的組織或反應更加發達一樣。

類神經的架構就是設計多個層次(上圖的Hidden Layer)神經的計算,每一個神經結點都會接收不同的刺激來源(例如開車看到紅燈,刺激來源來自眼睛、四肢),加總累積到一個臨界值時,就會產生相對應的輸出(大腦要告訴腳該踩剎車了),而每一層神經的計算結果都可以變成下一層神經的輸入。

電腦工程

  • 電腦如何運算,如何儲存和表示知識?
  • 電腦如何加速運算?

這領域舉例來說,Google無人車看到紅燈要停下來,這在電腦裡面要如何表示「看到紅燈」「要停下來」這些現象?以及「看到紅燈要停下來」這個知識?電腦要如何在0.000001秒計算出並且反應看到紅燈要停下來這件事?這都是這個領域要在AI上所做的精進和努力。

AI為何存在?帶來的影響是?

這篇只是一個開頭引導,AI目前還是偏向冷冰冰的電腦,情感或許是我們該要賦予給它,讓它可以更親近人、更有溫度的跟人互動,要讓使用者感覺到他是一個貼心的管家,而非冰冷的機器,就像電影魔鬼終結者5裡面的老爹一樣,也是有情感會對人笑一樣(不好意思暴雷惹)。

AI現在也從原本只能靠人輸入訓練資料來教它,演化到只需要一開始教它、後面它會自己演化、自己學習的境界,最大的突破是在於Deep Learning的出現,或許哪天天網或是奧創的出現,那應該不用太意外吧?!

AI存在的價值,並非只有將繁瑣的操作做成自動化,和傳統自動化的差別在於,AI更突出的是它的「學習能力」、「主動判斷」以及判斷後的「決策」,也就是它可以將需要動手或動腦的地方幫忙你處理掉,你只需要悠閒的喝杯咖啡、聊聊天事情就處理完成,AI可以完全自行運作,依照目前現況去做學習、調整和變化,這才是真正的智慧化。

AI應該要是最懂你的助手,而不只是單純處理繁瑣雜事的替代品而已,使用者面對AI會感受到「你真體貼!還記得我喜歡什麼」。

“Sometimes it is the people no one can imagine anything of, who do the things no one can imagine.”
有時候,被世人遺棄的人,才能成就讓人想像不到的大事。
Alan Turing

我是大白,DualCores Studio的Co-founder & Developer,文章同步分享於Medium

需求

今天要來講Android如何定位取得目前位置後,並且在Google Map上顯示,這是一個看似蠻簡單的範例,但是定位在StackOverflow上面一堆寫法,看了眼花撩亂,這邊是我最後可以完美運作的版本。

思路

  • Google Map如何導入在專案內就請自行參考Google Map Android API - Get Started
  • 手機的GPS和網路皆可以定位,有時候使用者不一定會開啟GPS,所以我們採用兩個定位方式依序取得位置。
  • 在取得定位並且設定好Google Map後,我們就可以把目前位置顯示在地圖上了,就這麼簡單而已。

你也許會問,為何我需要使用GPS和網路定位?
原因有三個:

  1. 使用者不一定會開GPS或網路。
  2. GPS跟Network的精準度也不一。
  3. 兩者取得位置的速度兩者也不同。

程式碼實作

  1. res/layout/activity_main.xml加入MapView

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapview"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        map:cameraZoom="13"
        />
    
  2. Activity新增兩個Instance Variable,並且在onCreate()初始化Google Map。

@Bind(R.id.mapview)
MapView mMapView;
private GoogleMap mGoogleMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    /* 其他既有程式略 */
    ButterKnife.bind(this); /* 使用ButterKnife做View Injection */
    mMapView.onCreate(savedInstanceState); /* 初始化MapView */
    mGoogleMap = mMapView.getMap();
    int googlePlayStatus = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (googlePlayStatus != ConnectionResult.SUCCESS) {
        GooglePlayServicesUtil.getErrorDialog(googlePlayStatus, this, -1).show();
        finish();
    } else {
        /* 設定地圖 */
        if (mGoogleMap != null) {
            mGoogleMap.setMyLocationEnabled(true); 
            mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
            mGoogleMap.getUiSettings().setAllGesturesEnabled(true);
        }
    }
}
  1. 新增LocationListener的Instance Variable,目的用來監聽取得更新位置後的動作。
private LocationListener mLocationListener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        if (location != null) {
            Logger.d(String.format("%f, %f", location.getLatitude(), location.getLongitude()));
            drawMarker(location);
            mLocationManager.removeUpdates(mLocationListener);
        } else {
            Logger.d("Location is null");
        }
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {
    }

    @Override
    public void onProviderEnabled(String s) {
    }
  
    @Override
    public void onProviderDisabled(String s) {
    }
};
  1. 重頭戲來了,取得目前位置的實作,我們由網路和GPS來取得定位,因為GPS精準度比網路來的更好,所以先使用網路定位、後續再用GPS定位,如果兩者皆無開啟,則跳無法定位的錯誤訊息。
private void getCurrentLocation() {
    boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

    Location location = null;
    if (!(isGPSEnabled || isNetworkEnabled))
        Snackbar.make(mMapView, R.string.error_location_provider, Snackbar.LENGTH_INDEFINITE).show();
    else {
        if (isNetworkEnabled) {
            mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListener);
            location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
        }

        if (isGPSEnabled) {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    LOCATION_UPDATE_MIN_TIME, LOCATION_UPDATE_MIN_DISTANCE, mLocationListener);
            location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        }
    }
    if (location != null)
        drawMarker(location);
}

/* 在Google Map上放上目前位置的地標圖示。 */
private void drawMarker(Location location) {
    if (mGoogleMap != null) {
        mGoogleMap.clear();
        LatLng gps = new LatLng(location.getLatitude(), location.getLongitude());
        mGoogleMap.addMarker(new MarkerOptions()
                .position(gps)
                .title("Current Position"));
        mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(gps, 12));
    }
}

最後完整程式碼大家可以自行取用,謝謝各位。
我是大白,有任何問題歡迎在FB訊息敲來問我,請大家多多支持。