目標(biāo)已定,劍指“源碼杯”一等獎(jiǎng)和那五千塊獎(jiǎng)金!黎陽(yáng)眼中閃爍著勢(shì)在必得的光芒。
他很清楚,想在眾多參賽者中殺出重圍,作品沒(méi)點(diǎn)“黑科技”含量,光靠平庸是絕對(duì)不行的。
既要有技術(shù)深度,又得接地氣,最好還能蹭上“智能”這個(gè)時(shí)髦熱點(diǎn)。
盤(pán)算著自己目前能‘合理’拿出來(lái)的技術(shù),再結(jié)合對(duì)校園里那些“痛點(diǎn)”的理解,黎陽(yáng)目光如炬,迅速鎖定了一個(gè)方向——搞一個(gè)能幫大學(xué)生管課程、催作業(yè)的“智能”小助手!
“就叫‘智能課代表’!”
這名字,一聽(tīng)就懂,校園味兒十足,還透著一股“聰明勁兒”。
當(dāng)然,黎陽(yáng)心里門(mén)兒清。憑他現(xiàn)在這臺(tái)破筆記本和緊張的時(shí)間,再加上得藏著掖著他那真正的AI底牌,這個(gè)“智能”前面,必須得打個(gè)大大的引號(hào)!
他要做的,壓根不是什么高大上的人工智能,而是一個(gè)披著“智能”外衣,內(nèi)里靠關(guān)鍵詞匹配和復(fù)雜規(guī)則堆砌起來(lái)的“偽智能”系統(tǒng)!
核心思路?簡(jiǎn)單粗暴!
預(yù)設(shè)海量的指令模板和規(guī)則,覆蓋大學(xué)生日常學(xué)習(xí)生活的方方面面。只要用戶輸入的話,能撞上某個(gè)格式或者關(guān)鍵詞,程序就“秒懂”,執(zhí)行對(duì)應(yīng)操作!
這法子聽(tīng)起來(lái)挺“笨”的,但在2015年,只要規(guī)則庫(kù)夠全、場(chǎng)景覆蓋夠廣、反應(yīng)夠快,那效果絕對(duì)炸裂!足以讓用戶驚呼:“臥槽!這App成精了?”
方向明確,黎陽(yáng)立刻化身“卷王”,開(kāi)始了爆肝模式。
白天,他維持著“好學(xué)生”人設(shè),按部就班地上課,偶爾泡泡圖書(shū)館,不顯山不露水。
可一到晚上,宿舍熄燈鈴響過(guò),那盞微弱的充電臺(tái)燈下,才是他思維高速運(yùn)轉(zhuǎn),代碼瘋狂敲擊的主場(chǎng)!
第一步,功能設(shè)計(jì)!
黎陽(yáng)攤開(kāi)草稿本,筆尖飛舞,迅速勾勒出“智能課代表”的骨架:
課程表管理: 不僅要能導(dǎo)入標(biāo)準(zhǔn)課表文件,自動(dòng)顯示當(dāng)日、本周課程,更要秀出“騷操作”——支持自然語(yǔ)言查詢!比如直接問(wèn):“明天上午有啥課?”、“C語(yǔ)言在哪上?”、“周三下午第一節(jié)是啥玩意兒?”
智能提醒: 這才是靈魂!同樣要支持自然語(yǔ)言設(shè)置!“提醒我周五晚上交高數(shù)作業(yè)!”、“設(shè)個(gè)明早7點(diǎn)起床的鬧鐘!”——徹底告別手動(dòng)輸入的繁瑣!
校園信息聚合(畫(huà)餅階段): 先把概念拋出來(lái),作為“未來(lái)可期”的亮點(diǎn)。聚合校園通知、講座信息,同樣支持自然語(yǔ)言查詢,比如:“最近有計(jì)算機(jī)的講座嗎?”
要實(shí)現(xiàn)這些,尤其是那個(gè)酷炫的自然語(yǔ)言交互,一個(gè)強(qiáng)大的規(guī)則引擎和關(guān)鍵詞庫(kù)是重中之重。
這玩意兒,成了開(kāi)發(fā)中最大的攔路虎,也是最耗費(fèi)心神的地方。
黎陽(yáng)得像個(gè)猜謎大師一樣,預(yù)判用戶可能提出的各種五花八門(mén)的問(wèn)法,再把它們轉(zhuǎn)換成機(jī)器能懂的規(guī)則。
就拿查明天課程來(lái)說(shuō),用戶可能問(wèn):“明天有課嗎?”、“明天課表發(fā)我”、“看看明天上啥”、“查下明兒的安排”……簡(jiǎn)直無(wú)窮無(wú)盡!
黎陽(yáng)必須把這些千奇百怪的問(wèn)法,通過(guò)抓住“明天”、“課”之類(lèi)的關(guān)鍵詞和句式結(jié)構(gòu),統(tǒng)統(tǒng)指向“查詢明天課程”這一個(gè)動(dòng)作。
這幾天,他的草稿本上畫(huà)滿了各種詞語(yǔ)、符號(hào)和邏輯箭頭,密密麻麻,看得人眼暈。
“如果匹配到‘提醒’+時(shí)間+事件……” “如果匹配到‘查詢’+課程名+‘教室’……”
他像個(gè)強(qiáng)迫癥患者, meticulously (一絲不茍)地雕琢著每一條匹配規(guī)則,構(gòu)建著龐大的詞典。
“媽蛋,這關(guān)鍵詞庫(kù)也太費(fèi)頭發(fā)了……” 黎陽(yáng)看著屏幕上不斷增長(zhǎng)的詞語(yǔ)列表,揉著發(fā)酸的眼睛,忍不住吐槽。
下一秒,他熟練地切換到后臺(tái),打開(kāi)那個(gè)絕對(duì)不能暴露的“藍(lán)鯨AI”控制臺(tái),敲下一行指令: > 給我生成盡可能多的關(guān)于‘查詢課程表’的中文同義、近義表達(dá)方式,以及常用的時(shí)間限定詞(今天、明天、本周、下周一…)。越多越好!
“唰!”
AI幾乎是瞬間就刷出了上百條風(fēng)格各異的問(wèn)法和時(shí)間詞匯組合。
“嘖,氪金玩家的效率就是不一樣?!?黎陽(yáng)滿意地哼了一聲,飛快地復(fù)制粘貼,篩選整理后,巧妙地融入到自己的規(guī)則庫(kù)里。
“當(dāng)然,對(duì)外嘛,必須得說(shuō)是自己一個(gè)字一個(gè)字摳出來(lái)的,嘔心瀝血!”他心里的小算盤(pán)打得噼啪響。
為了讓“偽智能”更逼真,他甚至還搞了一套簡(jiǎn)單的優(yōu)先級(jí)和模糊匹配邏輯。萬(wàn)一真遇到無(wú)法識(shí)別的指令,就彈出統(tǒng)一的“賣(mài)萌”回復(fù): “唔……這個(gè)問(wèn)題有點(diǎn)難到我了,我還只是個(gè)課代表呢,正在努力學(xué)習(xí)中!(?? . ??)” ——用這種擬人化、略帶俏皮的語(yǔ)氣,完美掩蓋了能力的邊界。
整個(gè)開(kāi)發(fā)過(guò)程,黎陽(yáng)把前世積累的軟件工程經(jīng)驗(yàn)發(fā)揮到了極致。
模塊化設(shè)計(jì)、代碼復(fù)用、異常處理……他敲出來(lái)的代碼,結(jié)構(gòu)清晰得不像大一新生能寫(xiě)出來(lái)的東西,可讀性強(qiáng),擴(kuò)展性也好。
為了提升規(guī)則匹配的速度,他還用上了哈希表快速定位關(guān)鍵詞,甚至動(dòng)用了前綴樹(shù)(Trie樹(shù))來(lái)優(yōu)化句式模板的匹配效率。
這些玩意兒,別說(shuō)大一課堂了,就是高年級(jí)也未必會(huì)教!
黎陽(yáng)這邊埋頭苦肝,他這“反?!钡呐e動(dòng),自然也逃不過(guò)室友的眼睛,尤其是對(duì)技術(shù)同樣有點(diǎn)敏感的陳東。
陳東好幾次半夜起來(lái)上廁所,都看到黎陽(yáng)對(duì)著屏幕上那些“RuleEngine”、“KeywordMatcher”、“IntentParser”之類(lèi)的鬼畫(huà)符代碼冥思苦想,旁邊還攤著畫(huà)滿框框箭頭的草圖。
“黎陽(yáng),你這……搗鼓啥呢?又是流程圖又是規(guī)則引擎的,看起來(lái)就好復(fù)雜?。 ?陳東終于按捺不住好奇心,湊了過(guò)來(lái)。
“哦,給我那參賽的App裝個(gè)‘大腦’。” 黎陽(yáng)頭也沒(méi)抬,隨口開(kāi)了個(gè)玩笑,“想讓它能勉強(qiáng)聽(tīng)懂我們說(shuō)話,幫著查個(gè)課、定個(gè)鬧鐘什么的。”
“聽(tīng)懂人話?!” 陳東瞬間瞪圓了眼睛,聲音都高了八度,“真的假的?我靠,跟鋼鐵俠里那賈維斯一樣牛逼?!”
“呃……你想太多了,山寨版的,山寨版的。” 黎陽(yáng)被他逗笑了,停下手中的活,開(kāi)始了他的“忽悠式”技術(shù)科普:
“其實(shí)不是真聽(tīng)懂,是‘假裝’聽(tīng)懂。你看,我預(yù)先設(shè)了N多規(guī)則和關(guān)鍵詞。比如你問(wèn)‘明天有啥課’,程序就抓住‘明天’和‘課’這兩個(gè)詞,然后執(zhí)行查課表的操作。你換個(gè)說(shuō)法,比如‘明天的課程安排’,它也能通過(guò)匹配規(guī)則,找到對(duì)應(yīng)的動(dòng)作。大概……就是這么個(gè)原理,用規(guī)則硬懟出智能效果!”
說(shuō)著,他調(diào)出自己設(shè)計(jì)的、那龐大到令人頭皮發(fā)麻的規(guī)則庫(kù)文件,以及部分匹配邏輯代碼,給陳東展示了一下冰山一角。
陳東湊近屏幕,看著那密密麻麻、如同天書(shū)般的規(guī)則條目,再聽(tīng)完黎陽(yáng)“簡(jiǎn)單”的解釋,雖然有點(diǎn)小失望,不是他以為的真AI,但更多的是難以置信的震驚和滔滔江水般的佩服!
“臥槽!臥槽!黎陽(yáng),你這……這也太牛逼了吧?!用規(guī)則硬生生模擬智能?!這特么得設(shè)計(jì)多少規(guī)則???光是想這些五花八門(mén)的問(wèn)法和關(guān)鍵詞,就得把腦漿榨干吧!你這腦袋瓜子是啥構(gòu)造?。 ?/p>
他覺(jué)得黎陽(yáng)這思路簡(jiǎn)直是鬼才!而且能把這么復(fù)雜變態(tài)的邏輯,用代碼如此清晰地實(shí)現(xiàn)出來(lái),這技術(shù)實(shí)力,這耐心……簡(jiǎn)直不是人!是“牲口”!
“還行吧,就是工作量大了點(diǎn),頭發(fā)都快掉光了?!?黎陽(yáng)輕描淡寫(xiě)地一筆帶過(guò),順手指向桌上那幾張寫(xiě)滿了同義詞和句式、看起來(lái)像是自己手動(dòng)整理的草稿紙。
看到陳東對(duì)這項(xiàng)目興趣盎然,眼睛里都快冒出光來(lái)了,黎陽(yáng)心中一動(dòng),順?biāo)浦鄣溃?/p>
“對(duì)了,東子,我這人審美是硬傷,你看這App界面做得,我自己都嫌棄。你要是感興趣,能不能幫我參謀參謀,把它搞得好看點(diǎn)?順便,你也多幫我測(cè)測(cè),看看還有哪些話它‘聽(tīng)不懂’,找找茬!”
“沒(méi)問(wèn)題??!包在我身上!” 陳東一聽(tīng),立刻打了雞血似的,興奮地拍著胸脯答應(yīng)下來(lái),臉上寫(xiě)滿了“求之不得”。
他早就對(duì)黎陽(yáng)這個(gè)“神秘項(xiàng)目”好奇得抓心撓肝了,現(xiàn)在能親身參與進(jìn)來(lái),還能貢獻(xiàn)一份力量,簡(jiǎn)直是天上掉餡餅!這可是抱上了“技術(shù)大神”的大腿啊!
于是乎,接下來(lái)的幾天里,303宿舍的深夜燈光下,經(jīng)常能看到兩個(gè)人并肩作戰(zhàn)的身影。
黎陽(yáng)繼續(xù)完善他那“偽智能”的核心引擎和后端邏輯,不斷優(yōu)化規(guī)則,提升效率。
陳東則充分發(fā)揮他那尚未完全覺(jué)醒的“美工”天賦和用戶直覺(jué)。雖然技術(shù)還是初級(jí)水平,但也像模像樣地調(diào)整著App的界面布局、配色方案,甚至還主動(dòng)去啃了一些基礎(chǔ)的XML布局知識(shí)。
更重要的是,他化身成了第一個(gè)“刁鉆”的用戶,絞盡腦汁地用各種奇葩問(wèn)法轟炸“智能課代表”,樂(lè)此不疲地尋找著匹配規(guī)則的漏洞和體驗(yàn)上的槽點(diǎn)。
“黎陽(yáng)!我問(wèn)‘后天下午第二節(jié)大課是啥玩意兒’,它沒(méi)反應(yīng)哎!”
“黎陽(yáng)你看,這個(gè)按鈕顏色是不是太吃藕了?換個(gè)騷氣的藍(lán)色試試?”
“黎陽(yáng),課表格子能不能加點(diǎn)顏色區(qū)分?。炕ɡ锖诘哪欠N,像那個(gè)超級(jí)課程表一樣!”
黎陽(yáng)耐心地解答著陳東的各種問(wèn)題,對(duì)合理的建議也從善如流。兩人的合作越來(lái)越默契。
陳東也在這個(gè)過(guò)程中,眼界大開(kāi),接觸到了遠(yuǎn)超課堂所學(xué)的編程實(shí)戰(zhàn)。雖然核心引擎的代碼他還是看得云里霧里,但對(duì)一個(gè)App從無(wú)到有的開(kāi)發(fā)流程,卻有了真切的認(rèn)識(shí),眼里閃爍著對(duì)未知技術(shù)的興奮和渴望。
終于,在比賽提交截止日期的前一天晚上,伴隨著最后一次編譯成功——
“智能課代表”App,第一個(gè)穩(wěn)定版本,正式誕生!
它擁有一個(gè)在陳東努力下,顯得簡(jiǎn)潔清爽(至少比黎陽(yáng)自己搞的好多了)的界面。
核心的課程查詢和提醒設(shè)置功能,都能通過(guò)特定格式或關(guān)鍵詞的“自然語(yǔ)言”指令來(lái)驅(qū)動(dòng),響應(yīng)速度飛快,在精心設(shè)計(jì)的規(guī)則覆蓋范圍內(nèi),準(zhǔn)確率高得驚人!
雖然距離真正的智能還差著十萬(wàn)八千里,但它所展現(xiàn)出的那種“仿佛能聽(tīng)懂人話”的偽智能效果,以及高度契合校園需求的實(shí)用性,在2015年的大學(xué)校園里,絕對(duì)稱得上是“黑科技”級(jí)別的降維打擊!
黎陽(yáng)深吸一口氣,將新鮮出爐的App打包,連同那份重點(diǎn)吹噓了“規(guī)則引擎巧妙設(shè)計(jì)”的詳細(xì)文檔、以及一段精心錄制的演示視頻(用手機(jī)錄屏,瘋狂展示各種自然語(yǔ)言交互場(chǎng)景),鄭重其事地上傳到了比賽指定的提交平臺(tái)。
成了!就等結(jié)果了!