基于對 AI 的愛好與興趣,我走上了獨自鉆研機器學(xué)習(xí)的道路。和所有熱愛 AI 的人們一樣,在一段孤獨的摸索旅程中,我勉強完成了幾次深度學(xué)習(xí)模型的訓(xùn)練。
其中令我印象較深的成果就是情感分類模型。他能夠根據(jù)你的文字生成其背后作者的喜怒哀樂。
深度學(xué)習(xí)模型展示出來的 "人性化"讓我感到驚喜,于是我開始思考怎么將它的“人性化”轉(zhuǎn)化為幫助人們的工具。
基于多方面的考量,我最終選擇開發(fā)一款 微信 "情感" 小程序。
在進行小程序開發(fā)之前,我們非常有必要先對小程序做一個充分的了解。
簡單來說,比起傳統(tǒng)的 App,微信小程序是一種全新的連接用戶與服務(wù)的方式,它具有非常出色的使用體驗,并且它可以在微信內(nèi)被便捷地獲取與傳播。
實際上,小程序并非憑空而來的。當(dāng)微信逐漸流行、變成幾乎人人都離不開的社交工具時,承載微信的 WebView 也逐漸成為了量級最大的移動 Web 入口。每天訪問 WebView 的數(shù)量甚至超過了訪問所有瀏覽器的總和。雖然無法通過第三方獲取到微信 WebView 的日活數(shù)據(jù),但這個客觀事實間接促進了小程序的誕生。
其實在小程序正式步入人們視線之前,微信早已有了類似的 js 調(diào)用接口,這里給大家展示一個調(diào)用了微信 js-bridge 原生組件去瀏覽圖片的例子:
WeixinJSBridge.invoke('imagePreview', {
current: 'http://inews.com',
urls: [ // 所有圖片的URL列表,數(shù)組格式
'https://img/1.jpg',
'https://img/2.jpg',
'https://img/3.jpg'
]
}, function(res) {
console.log(res.err_msg)
})
復(fù)制代碼
此類 js 接口其實最開始是專門給騰訊內(nèi)部人員去進行調(diào)用的,但卻意外被許多個人開發(fā)者發(fā)現(xiàn)很多并進行了使用,這也慢慢成為了微信中網(wǎng)頁的標(biāo)準(zhǔn)。
在 15 年開始的時候,微信官方發(fā)布了一套專門用于進行網(wǎng)頁開發(fā)的工具包,名為 js-sdk ,在這個工具包內(nèi)開放了如微信支付、錄音、語音識別、等數(shù)十個接口。這給所有的 Web 開發(fā)者都打開了一扇從未開啟過的全新的大門,讓所有的開發(fā)者都可以自由地使用微信開發(fā)的原生能力,這使得他們可以去完成一些之前無法完成或是難以做到的事情。
js-sdk 完美繼承了 WeixinJSBridge 的特性,并且由只對內(nèi)部開放轉(zhuǎn)為了對外部開放。并且它通過其暴露的微信調(diào)用接口使得所有 Web 開發(fā)者有了更多操作微信功能的能力。但是,這個模式并沒有很好地解決移動網(wǎng)頁的體驗問題:
于是乎,js-sdk 的增強版本就誕生了,其中有一個非常重要的新特性,被稱之為: 微信 Web 資源離線存儲 。
?以下文字引用自內(nèi)部的文檔(沒有最終對外開放):
微信 Web 資源離線存儲是面向 Web 開發(fā)者提供的基于微信內(nèi)的 Web 加速方案。
通過使用微信離線存儲,Web 開發(fā)者可借助微信提供的資源存儲能力,直接從微信本地加載 Web 資源而不需要再從服務(wù)端拉取,從而減少網(wǎng)頁加載時間,為微信用戶提供更優(yōu)質(zhì)的網(wǎng)頁瀏覽體驗。每個公眾號下所有 Web App 累計最多可緩存 5M 的資源。
相信大家都已經(jīng)看明白了,這其實就是 HTML5 中 Application Cache 的加強版。
然而,在經(jīng)過了多次測試后發(fā)現(xiàn),還有問題沒有被完全的解決:
最終微信意識到 js-sdk 無法處理這些問題,這需要一個全新的系統(tǒng)去完成,而這個系統(tǒng)必須具備以下幾個能力:
加載速度快
原生的體驗
易用且安全的微信數(shù)據(jù)開放
兼顧開發(fā)效率與開發(fā)難度
而這就是小程序的由來。
首先請大家見諒,這一篇文章并不會教你如何零基礎(chǔ)開發(fā)小程序。如果你是一個軟件開發(fā)新手。那么我建議你先了解一些基礎(chǔ)的 js 語法 以及相應(yīng)的 前端知識 。
掌握前端基礎(chǔ)后,相信在 小程序前端組件官方文檔 的幫助下,任何人都可以快速上手開發(fā)小程序。
下面我主要跟大家分享兩個最核心、 最省錢 的兩個小程序開發(fā)技巧:
在剛開始考慮開發(fā)小程序時,和你們一樣,我有著許多的顧慮:
需要購買域名、服務(wù)器嗎?
維護成本大嗎?
帶著這些顧慮,我小心翼翼地翻開了 微信官方文檔 。在大腦經(jīng)過分布式閱讀過后,我發(fā)現(xiàn)了 云開發(fā) 這個關(guān)鍵詞。
微信官方文檔中是這么解釋的:
開發(fā)者可以使用云開發(fā)開發(fā)微信小程序、小游戲,無需搭建服務(wù)器,即可使用云端能力。
云開發(fā)為開發(fā)者提供完整的原生云端支持和微信服務(wù)支持,弱化后端和運維概念,無需搭建服務(wù)器,使用平臺提供的 API 進行核心業(yè)務(wù)開發(fā),即可實現(xiàn)快速上線和迭代,同時這一能力,同開發(fā)者已經(jīng)使用的云服務(wù)相互兼容,并不互斥。
云開發(fā)提供了幾大基礎(chǔ)能力支持:
簡單來說,有了云開發(fā), 我不需要購買服務(wù)器就可以開發(fā)一款全棧小程序。
嘿嘿,沒錯,這就是我想要的。
那么如何搭建云開發(fā)環(huán)境呢,綜合官方文檔,我總結(jié)了一套極簡搭建教程,大家可以作為參考。
云開發(fā)環(huán)境極簡搭建四部曲:
接著需要下載 小程序開發(fā)工具 ;
然后使用管理員 / 開發(fā)者賬號登錄開發(fā)工具并填入小程序的 APPID 以及勾選 云開發(fā) 選項后點擊新建;
至此一個云環(huán)境就算是搭建完畢了。
云開發(fā)環(huán)境搭建完畢后,是時候看看什么是 云函數(shù) 了。
官方的定義如下:
云函數(shù)是一段運行在云端的代碼,無需管理服務(wù)器,在開發(fā)工具內(nèi)編寫、一鍵上傳部署即可運行后端代碼。
簡單來說,云函數(shù)就是運行在云端的函數(shù)。
云函數(shù)大有用處。
有了它,就相當(dāng)于是有了一個 "大后端",所有業(yè)務(wù)邏輯以及對數(shù)據(jù)庫的操作我們都可以封裝在云函數(shù)中調(diào)用,十分方便。
說了這么多大道理,是時候來實戰(zhàn)一下了。
右鍵點擊云函數(shù)環(huán)境 (cloudfunctions | xxxxxxx)后新建一個名為 test 的云函數(shù):
可以看到默認的文件(index.js)中已經(jīng)有了云函數(shù)代碼(獲取當(dāng)前微信用戶上下文,并返回用戶信息):
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
復(fù)制代碼
這時候需要開啟命令行并進入到該目錄下運行 npm install 安裝 wx-server-sdk ( 若目錄下沒有 node_modules 則需要先運行 npm init ):
最后右鍵點擊該云函數(shù)并選擇 開啟云函數(shù)本地調(diào)試 后點擊右下角調(diào)用:
可以看到函數(shù)執(zhí)行成功并拿到了返回值(openid 等信息......)
至此,恭喜我們快速完成了第一個云函數(shù)。
相信大家都非常好奇,我是怎么做到在云函數(shù)中 "零成本" 調(diào)用 AI 能力的。
其實我開始也非??鄲肋@個問題,即使小程序有云函數(shù)的功能,但也沒辦法輕易 "零成本" 調(diào)用 AI 模型,原因如下:
但就在一個明媚的清晨,我翻身起床后突然靈光一閃:
想法再多不如動手行動,于是我訪問了 騰訊云控制臺的自然語言處理模塊 。
根據(jù)指引進行服務(wù)開通后,我進入到 API 密鑰管理 并記錄下了 API 密鑰:
那么如何在小程序中調(diào)用它呢?我再一次陷入了深深的沉思......
在經(jīng)過漫長的探索后我回到了 test 云函數(shù)目錄下的命令行,安裝了騰訊云服務(wù)調(diào)用包:
npm install tencentcloud-sdk-nodejs
復(fù)制代碼
然后修改 test 云函數(shù) (index.js):
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk')
const tencentcloud = require("tencentcloud-sdk-nodejs");
cloud.init()
// 云函數(shù)入口函數(shù)
exports.main = async (event, context) => {
const NlpClient = tencentcloud.nlp.v20190408.Client;
const models = tencentcloud.nlp.v20190408.Models;
const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;
let cred = new Credential(event.secretId, event.secretKey);
let httpProfile = new HttpProfile();
httpProfile.endpoint = "nlp.tencentcloudapi.com";
let clientProfile = new ClientProfile();
clientProfile.httpProfile = httpProfile;
let client = new NlpClient(cred, "ap-guangzhou", clientProfile);
let req = new models.SentimentAnalysisRequest();
let text = event.text
let params = '{"Text":\"' + text + '\"}'
console.log('待預(yù)測字符串: ' + text)
req.from_json_string(params);
client.SentimentAnalysis(req, function (errMsg, response) {
if (errMsg) {
console.log(errMsg)
}
console.log('AI 預(yù)測情緒正值: ' + response.Positive)
console.log('AI 預(yù)測情緒負值: ' + response.Negative)
})
}
復(fù)制代碼
在這段代碼中,我通過騰訊云賬號中的密鑰連通了 AI 情感預(yù)測接口,最后將情感預(yù)測的結(jié)果打印了出來。
接下來我開啟了本地云函數(shù)調(diào)用窗口并傳入相應(yīng)參數(shù):
secretId (騰訊云 API 服務(wù)密鑰 Id )
secretKey (騰訊云 API 服務(wù)密鑰 Key)
text (待預(yù)測的字符串)
然后點擊調(diào)用后終于看到了 AI 模型的預(yù)測結(jié)果:
。
這時我已經(jīng)熱淚盈眶,除了感動還有一絲小滿意,原來云開發(fā)還能這么玩。
文章到這里,相信最重要的兩個部分大家已經(jīng)了解并掌握了:
回頭望去,整個小程序開發(fā)過程大概歷經(jīng)三天兩夜,整段經(jīng)歷大概與 "編程馬拉松" 類似。
編程馬拉松,又稱黑客日、黑客節(jié)或編程節(jié),是一個流傳于黑客當(dāng)中的新詞匯。編程馬拉松是一種活動。
在該活動當(dāng)中,計算機程序員以及其他與軟件發(fā)展相關(guān)的人員,如圖形設(shè)計師、界面設(shè)計師與項目經(jīng)理,相聚在一起,以緊密合作的形式去進行某項軟件項目。
編程馬拉松的靈魂是合作地編寫程序和應(yīng)用。編程馬拉松的時長一般在幾天到一周不等 。
--維基百科
于是乎,在經(jīng)過 "瘋狂" 開發(fā)后,一個日記小程序的雛形就誕生了。
雖然說前端頁面并沒有多復(fù)雜,但是確實傾注了許多開發(fā)心血。
開發(fā)完成的那一刻我已經(jīng)不在乎是否有人真正去使用他。因為我已經(jīng)從他身上收獲到了全身心投入開發(fā)的快樂。