Linux下跨語(yǔ)言調(diào)用C++實(shí)踐
發(fā)布日期:2022-05-07 18:49:37文章轉(zhuǎn)載自GitHub中文社區(qū) 作者: 林陽(yáng) 朱超 識(shí)瀚
查詢(xún)理解(QU, Query Understanding)是美團(tuán)搜索的核心模塊,主要職責(zé)是理解用戶(hù)查詢(xún),生成查詢(xún)意圖、成分、改寫(xiě)等基礎(chǔ)信號(hào),應(yīng)用于搜索的召回、排序、展示等多個(gè)環(huán)節(jié),對(duì)搜索基礎(chǔ)體驗(yàn)至關(guān)重要。該服務(wù)的線上主體程序基于C++語(yǔ)言開(kāi)發(fā),服務(wù)中會(huì)加載大量的詞表數(shù)據(jù)、預(yù)估模型等,這些數(shù)據(jù)與模型的離線生產(chǎn)過(guò)程有很多文本解析能力需要與線上服務(wù)保持一致,從而保證效果層面的一致性,如文本歸一化、分詞等。
而這些離線生產(chǎn)過(guò)程通常用Python與Java實(shí)現(xiàn)。如果在線、離線用不同語(yǔ)言各自開(kāi)發(fā)一份,則很難維持策略與效果上的統(tǒng)一。同時(shí)這些能力會(huì)有不斷的迭代,在這種動(dòng)態(tài)場(chǎng)景下,不斷維護(hù)多語(yǔ)言版本的效果打平,給我們的日常迭代帶來(lái)了極大的成本。因此,我們嘗試通過(guò)跨語(yǔ)言調(diào)用動(dòng)態(tài)鏈接庫(kù)的技術(shù)解決這個(gè)問(wèn)題,即開(kāi)發(fā)一次基于C++的so,通過(guò)不同語(yǔ)言的鏈接層封裝成不同語(yǔ)言的組件庫(kù),并投入到對(duì)應(yīng)的生成過(guò)程。這種方案的優(yōu)勢(shì)非常明顯,主體的業(yè)務(wù)邏輯只需要開(kāi)發(fā)一次,封裝層只需要極少量的代碼,主體業(yè)務(wù)迭代升級(jí),其它語(yǔ)言幾乎不需要改動(dòng),只需要包含最新的動(dòng)態(tài)鏈接庫(kù),發(fā)布最新版本即可。同時(shí)C++作為更底層的語(yǔ)言,在很多場(chǎng)景下,它的計(jì)算效率更高,硬件資源利用率更高,也為我們帶來(lái)了一些性能上的優(yōu)勢(shì)。
本文對(duì)我們?cè)趯?shí)際生產(chǎn)中嘗試這一技術(shù)方案時(shí),遇到的問(wèn)題與一些實(shí)踐經(jīng)驗(yàn)做了完整的梳理,希望能為大家提供一些參考或幫助。
為了達(dá)到業(yè)務(wù)方開(kāi)箱即用的目的,綜合考慮C++、Python、Java用戶(hù)的使用習(xí)慣,我們?cè)O(shè)計(jì)了如下的協(xié)作結(jié)構(gòu):
圖 1
Python、Java支持調(diào)用C接口,但不支持調(diào)用C++接口,因此對(duì)于C++語(yǔ)言實(shí)現(xiàn)的接口,必須轉(zhuǎn)換為C語(yǔ)言實(shí)現(xiàn)。為了不修改原始C++代碼,在C++接口上層用C語(yǔ)言進(jìn)行一次封裝,這部分代碼通常被稱(chēng)為“膠水代碼”(Glue Code)。具體方案如下圖所示:
圖 2
聯(lián)系電話:
13528173451