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