“美術(shù)獅 AI 繪畫”(以下簡(jiǎn)稱“美術(shù)獅”),是我們小團(tuán)隊(duì)的一次嘗試,定位是人人都可以上手的,充滿創(chuàng)意的,理解中文和中國(guó)文化的圖片生成工具。
在完善圖像模型和論證核心問(wèn)題之后,我們開(kāi)始構(gòu)建 MVP(最小化可行產(chǎn)品)。MVP 的構(gòu)建需要:
- 實(shí)現(xiàn)快,開(kāi)發(fā)周期較短
- 模式輕,產(chǎn)品重點(diǎn)突出
- 成本低,只投入較少的人力、物力
這些目標(biāo),對(duì)于我們而言都是不小的挑戰(zhàn)。得益于 Laf 的使用,從開(kāi)發(fā)到第一個(gè)版本上線,只用了一周時(shí)間;小程序功能精簡(jiǎn)、目標(biāo)清晰;主體服務(wù)成本(杭州+新加坡)在 100 元 / 月以內(nèi)(含有優(yōu)化空間)。
下面會(huì)結(jié)合“美術(shù)獅”MVP 構(gòu)建的全過(guò)程,和大家交流使用 Laf 這個(gè)平臺(tái)(技術(shù))的思考。
原文鏈接:https://forum.laf.run/d/984
技術(shù)選型過(guò)程
函數(shù)即服務(wù),是目前我們對(duì) Laf范式的思考和理解。也是“美術(shù)獅”選擇 Laf 作為服務(wù)端的主要因素。
我在 2015 年就接觸了“類似”的 BaaS 平臺(tái) LeanCloud,并做過(guò)兩次實(shí)踐。第一次是對(duì)爬取的小紅書內(nèi)容做維護(hù),第二次是給一個(gè)中科院的朋友做化學(xué)試劑編號(hào)的管理。
LeanCloud,偏向于數(shù)據(jù)庫(kù)即服務(wù)這種范式,對(duì)數(shù)據(jù)增刪改查,提供基于數(shù)據(jù)的豐富的查詢、聚合運(yùn)算方法是這個(gè)范式的核心。
范式無(wú)優(yōu)劣之分,取決于需要解決的問(wèn)題場(chǎng)景、復(fù)雜度和規(guī)模。對(duì)于以數(shù)據(jù)庫(kù)為中心的,包含簡(jiǎn)單鑒權(quán)的系統(tǒng)比如 CRM、甚至是 ERP,LeanCloud 都可以很好地適應(yīng)和匹配。
我們還嘗試和了解過(guò)主打?qū)崟r(shí)性的野狗云(已下線),以及后來(lái)上線一段時(shí)間又被字節(jié)跳動(dòng)下線的輕服務(wù)(已下線)。也嘗試過(guò)跟著教程使用 Firebase。
“美術(shù)獅”或者其他的 AI 應(yīng)用的實(shí)際使用場(chǎng)景中,數(shù)據(jù)庫(kù)的操作只是一個(gè)部分,復(fù)雜的內(nèi)容生成邏輯、多平臺(tái)資源調(diào)度、相對(duì)密集的計(jì)算是這類場(chǎng)景中的重心。
小程序本身,雖然運(yùn)行在客戶端內(nèi)擁有一定的計(jì)算能力,但是把它看作一個(gè)增強(qiáng)的 BS 結(jié)構(gòu)通用性會(huì)更好,我們需要把大量地生成邏輯和計(jì)算處理流程剝離出來(lái)放在服務(wù)端由多平臺(tái)協(xié)同完成;同時(shí)為了減小分發(fā)包的大小,當(dāng)需要包含其他 SDK 文件時(shí),我們也會(huì)格外謹(jǐn)慎。
因此,數(shù)據(jù)庫(kù)即服務(wù),并不能很好地解決我們所面臨的問(wèn)題,可能并不是 AICG 應(yīng)用優(yōu)先會(huì)選擇的范式。
騰訊云函數(shù)(Serverless)
接下來(lái)嘗試了使用騰訊云函數(shù),能滿足了我們的一部分需求。
但是對(duì)于單次計(jì)算相對(duì)密集,調(diào)用資源繁多,訪問(wèn)量不穩(wěn)定的應(yīng)用而言。冷啟動(dòng)是可怕的,服務(wù)被冷卻后,再一次被拉起來(lái)需要較長(zhǎng)地等待時(shí)間。在并發(fā)和訪問(wèn)量不大時(shí),云函數(shù)被頻繁地冷卻,對(duì)用戶體驗(yàn)傷害較大,較為致命。這個(gè)對(duì)于每一個(gè)從 0 到 1 的獨(dú)立開(kāi)發(fā)者可能都是個(gè)頭疼的問(wèn)題。
對(duì)存儲(chǔ)桶、數(shù)據(jù)庫(kù),騰訊云函數(shù)并沒(méi)有做深度地整合,單獨(dú)配置云數(shù)據(jù)庫(kù)、存儲(chǔ)桶,會(huì)在 MVP 階段增加不必要的時(shí)間和費(fèi)用的開(kāi)銷。
微信云開(kāi)發(fā)
微信云開(kāi)發(fā)可以通過(guò)微信開(kāi)發(fā)者工具一鍵開(kāi)通。在“美術(shù)獅”遷移的 Laf 之前,我們?cè)谖⑿旁崎_(kāi)發(fā)中做了大量的嘗試。
放棄使用微信云開(kāi)發(fā),主要是下面一些原因:
- 基礎(chǔ)庫(kù) Node 版本過(guò)低,對(duì)第三方包支持不好;
- IDE 開(kāi)發(fā)體驗(yàn)不好,寫代碼像是看 PPT,本地調(diào)試不夠方便直觀;
- 計(jì)費(fèi)系統(tǒng)詭異,雖然我們是騰訊云的老用戶,小程序無(wú)法在原有賬戶中開(kāi)通服務(wù),必須以小程序的維度新開(kāi)通賬戶,付費(fèi)和管理維護(hù)不方便;
- 對(duì)跨區(qū)域、跨服務(wù)支持不佳;
- 冷啟動(dòng)延遲依然明顯。
通過(guò)內(nèi)置的鑒權(quán)機(jī)制快速獲取 openid,是微信云開(kāi)發(fā)宣稱的優(yōu)勢(shì)。
在“美術(shù)獅”產(chǎn)品遷移后到 Laf 后,結(jié)合社區(qū)教程,也可以在“3 分鐘”內(nèi),實(shí)現(xiàn)實(shí)現(xiàn)這些功能。
從 0 寫一個(gè)微信小程序?qū)?Laf 云開(kāi)發(fā)獲取用戶 openid - Sealos 開(kāi)發(fā)者社區(qū)
Supabase、Vercel、Cloudflare
Verce、Cloudflare 是我特別喜歡的兩個(gè)平臺(tái),這里一筆帶過(guò)。主要原因是無(wú)法整合到國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境中。
最終我們選擇了 Laf。在使用 Laf 的過(guò)程中,我們獲得幾乎等同于 Woker、EdgeFunction 的使用體驗(yàn)和開(kāi)發(fā)效率。
為什么選擇 Laf?
函數(shù)即服務(wù)
Laf 最吸引我們的,是通過(guò)云函數(shù)的構(gòu)建應(yīng)用的方式。
函數(shù)即服務(wù)在一定程度上,是可以包容(包含)數(shù)據(jù)庫(kù)即服務(wù)這個(gè)范式的。
傳統(tǒng)的 Server 端開(kāi)發(fā),通過(guò) Router
和 Controller
去組織代碼,利于管理和維護(hù)。但是,從另一個(gè)層面看,會(huì)在一定程度上,降低了 MVP 產(chǎn)品的開(kāi)發(fā)效率,阻礙了創(chuàng)新的落地。
“美術(shù)獅”在第一個(gè)版本上線前半個(gè)小時(shí),決定添加一個(gè)每日簽到的功能。
通過(guò)云函數(shù),我們更聚焦新特性、新功能,而不是困在這個(gè)簽到功能應(yīng)該放在哪個(gè) Router 下,哪個(gè) Controller 下這些工程管理的思考中。通過(guò)定義一個(gè) task_user_daily_check_in
,我們很快地實(shí)現(xiàn)了這個(gè)功能。
云函數(shù)調(diào)用云函數(shù),是另外一個(gè)我喜歡的特性,我們定義了若干個(gè)“內(nèi)部”云函數(shù)(同時(shí)關(guān)閉了所有 HTTP 方法),來(lái)為其他云函數(shù)服務(wù)。比如獲取第三方服務(wù)的 access token
并在本地持久化。一方面,代碼能夠解耦和復(fù)用,另一方,安全性也大大提升。
例如這段代碼,獲取百度云服務(wù)的 access token
,關(guān)閉請(qǐng)求方法后,僅能被內(nèi)部調(diào)用。
import cloud from '@lafjs/cloud'
export default async function (ctx: FunctionContext) {
const ret = await cloud.fetch({
url: "https://aip.baidubce.com//oauth/2.0/token?",
method: "get",
params: {
'grant_type': 'client_credentials',
'client_id': process.env.BAE_CLIENT_ID,
'client_secret': process.env.BAE_CLIENT_SECRET
},
});
cloud.shared.set('bae_access_tooen', ret.data.access_token)
}
當(dāng)然,云函數(shù)過(guò)多后,僅能通過(guò)修改函數(shù)名去人為地調(diào)整云函數(shù)的排序,目錄結(jié)構(gòu)會(huì)顯得凌亂,如果能按照 Tag(虛擬文件夾)去聚合、管理云函數(shù),對(duì)我而言,會(huì)更清晰和直觀。
技術(shù)棧友好
Laf 使用 Typescript
( Javascript
)進(jìn)行開(kāi)發(fā),與 web 端、小程序開(kāi)發(fā)屬于同一技術(shù)棧。大大降低了全棧開(kāi)發(fā)的難度,同時(shí)絕大多數(shù)代碼可以在兩端進(jìn)行復(fù)用。
在避免討論“誰(shuí)是世界上最好的編程語(yǔ)言”的前提下,僅從團(tuán)隊(duì)、成本、開(kāi)發(fā)效率幾個(gè)方面討論,一致的技術(shù)棧是 MVP 開(kāi)發(fā)的一個(gè)好選擇。
良好地第三方支持
Laf 對(duì) 第三方 NPM
包的支持很好。我嘗試過(guò)引用 moment
等這些第三方庫(kù)處理時(shí)間數(shù)據(jù),七牛等第三方服務(wù)處理圖片資源,同時(shí)內(nèi)置了大量常用的第三方庫(kù)。
如同樂(lè)高拼圖,云函數(shù)可以不斷地、從不同維度地整合和豐富。存在大量第三方依賴的項(xiàng)目,遷移時(shí)成本較低。
實(shí)測(cè),秒下各類第三方 NPM 包,精準(zhǔn)版本控制,不需要“魔法”。
開(kāi)箱即用的數(shù)據(jù)庫(kù)
Laf 內(nèi)置了對(duì) Mongodb
的良好支持,提供了一個(gè)開(kāi)箱即用的數(shù)據(jù)庫(kù)。夠用,好用。
Laf 除了提供大量封裝后的查詢、聚合方法外,也提供了與原生 Mongo
交互的接口。
例如:通過(guò)與原生數(shù)據(jù)庫(kù)交互創(chuàng)建索引。
import cloud from "@lafjs/cloud";
const db = cloud.database()
export async function main(ctx: FunctionContext) {
let res = await cloud.mongo.db.collection('users').createIndex({ "openid": 1})
const resIndexs = await cloud.mongo.db.collection("users").indexes()
return resIndexs
};
便利、直觀的在線調(diào)試
在 Laf 中通過(guò)控制臺(tái)、日志,可以完成絕大部分的調(diào)試工作。復(fù)雜一點(diǎn)的操作可以通過(guò)內(nèi)置的極簡(jiǎn)的 Postman(接口調(diào)試)去完成。
這種極簡(jiǎn)、干練的風(fēng)格貫穿 Laf 的功能(也包括上面提到的數(shù)據(jù)庫(kù)設(shè)計(jì))、UI,是我們 fancy Laf 的另一個(gè)重要原因。
實(shí)際的使用過(guò)程中,除了“存儲(chǔ)”這個(gè)功能,其他所有的功能區(qū),面板都能被我們高頻地使用到。聚焦目標(biāo),專注效率,冗余度低。
杭州、新加坡兩地部署
在“美術(shù)獅”的開(kāi)發(fā)過(guò)程中,我們?cè)?laf.run(杭州)、laf.dev(新加坡)分別購(gòu)買和部署了 Laf。多服務(wù)交融、跨區(qū)域的開(kāi)發(fā)是一種奇妙的體驗(yàn)。
“美術(shù)獅”在圖片的生成過(guò)程中,利用了騰訊云在新加坡的 GPU,圖片的存儲(chǔ)、優(yōu)化又在國(guó)內(nèi)完成,最終由七牛提供持久化和 CDN 服務(wù)。
Laf 在杭州與新加坡之間通信通暢,可用性高,與其他第三方平臺(tái)能夠完美地整合。
一鍵彈性伸縮
得益于同門的 Sealos
等項(xiàng)目和 Laf
在云計(jì)算方面的深耕,Laf 可以一鍵配置應(yīng)用規(guī)格和彈性伸縮。
雖然,無(wú)數(shù)的產(chǎn)品默默地消失了,除非被 DDOS,很多產(chǎn)品很難觸發(fā)彈性伸縮的條件(比如“美術(shù)獅”),但是夢(mèng)想總是要有的。
短時(shí)間的高平發(fā)需要專業(yè)的運(yùn)維,極快地做出水平拓展,對(duì)于小團(tuán)隊(duì)而言,在技術(shù)、資金方面都很難做到。Laf 很好地解決了這個(gè)后顧之憂,給我們提供了莫大的安全感,這個(gè)方面,我會(huì)在后面的部分繼續(xù)補(bǔ)充。
開(kāi)源、開(kāi)放
Laf 與我使用過(guò)的其他 BaaS 不同,是一個(gè)開(kāi)源項(xiàng)目。
之前有幸和 @ 馬斯洛 有過(guò)一次對(duì)話,馬老板是一個(gè)深邃、有遠(yuǎn)見(jiàn)的 Leader。
如果一個(gè)項(xiàng)目只隸屬于一個(gè)公司,那么這個(gè)項(xiàng)目的命運(yùn)大致會(huì)捆綁在這個(gè)公司的命運(yùn)上。而一個(gè)項(xiàng)目屬于社群,哪怕公司沒(méi)有了,項(xiàng)目仍然能發(fā)展、完善。
開(kāi)源的決定讓 Laf 擁有了更長(zhǎng)的生命周期和可靠性。用戶再也不用擔(dān)心像“輕服務(wù)”突然下線這種事情的發(fā)生,可以更放心地實(shí)踐和使用平臺(tái)和技術(shù)。
另外,不到萬(wàn)不得已,我不會(huì)去嘗試部署 Laf 的服務(wù)。我有一堆自己的理由:
- 可靠和穩(wěn)定能夠節(jié)省更多的成本,自部署相當(dāng)于自己承擔(dān)服務(wù)的可靠性,很多人的專業(yè)性和運(yùn)維能力并不足以完成這個(gè)工作;
- 項(xiàng)目的維護(hù)者們更了解項(xiàng)目,也能更好、更快地解決突發(fā)問(wèn)題;
- Laf 的部分特性,是靠集群發(fā)揮的,購(gòu)買和維護(hù)集群的成本會(huì)更高;
- 向開(kāi)源項(xiàng)目付費(fèi)、貢獻(xiàn)代碼,是對(duì)開(kāi)發(fā)者很好地鼓勵(lì)和支持。
良好用戶運(yùn)營(yíng)和收費(fèi)
在使用了 Laf 的過(guò)程中,曾遇到一個(gè)無(wú)法為文檔創(chuàng)建索引的故障。@ 白夜 幫忙聯(lián)系了 @ 馬斯洛 后,很快解決了我的問(wèn)題。絕大多數(shù)問(wèn)題可以在文檔和社區(qū)找到解答和代碼片段。
我們反饋過(guò)希望有一個(gè)“回收站”的功能。Laf 迭代更新后,回收站如期而至,作為用戶,想法被傾聽(tīng)、尊重并實(shí)現(xiàn)真是一件開(kāi)心的事情。
之前對(duì) Laf 的配置缺乏了解,在后臺(tái)調(diào)整了過(guò)高的配置。馬老板 會(huì)把實(shí)際資源消耗情況和建議調(diào)整值告訴我,每一次溝通都能讓我們感受到技術(shù)大牛的魅力和一顆為用戶著想的心。
合計(jì)下來(lái),價(jià)廉物美,比一臺(tái)中等配置的云服務(wù)器性價(jià)比高很多,同時(shí),我也不用擔(dān)心可能會(huì)到來(lái)的流量高峰,我相信 Laf 專業(yè)的運(yùn)維一定會(huì)解決“美術(shù)獅”未來(lái)會(huì)遇到的問(wèn)題。
番外篇
我們是 Midjourney 和 SD 的忠實(shí)粉絲?!懊佬g(shù)獅”這個(gè)名稱是 GPT-4 出謀劃策的,小程序 Logo 和部分圖片資源也是由“美術(shù)獅”生成的。
在使用 Mid 和 SD 的過(guò)程中,我們發(fā)現(xiàn)兩個(gè)問(wèn)題:
- 準(zhǔn)確的 Prompts 需要使用英文書寫,特定的英文詞匯需要記憶、積累(比如風(fēng)格、鏡頭、視角等);
- Prompts 需要通過(guò)結(jié)構(gòu)化排列,關(guān)鍵詞的順序也會(huì)影響出圖質(zhì)量,同時(shí)創(chuàng)作者需要具備一定的美術(shù)、攝影方面的專業(yè)素養(yǎng)。
身邊能把 Mid 或者 SD 用好的人少之又少;一個(gè)是語(yǔ)言問(wèn)題,一個(gè)是專業(yè)問(wèn)題。
我們以 Dalle2 模型,作為訓(xùn)練起點(diǎn),沒(méi)錯(cuò),就是畫面慘不忍睹的 Dalle2,雖然如此,Dalle 是目前繪畫模型中最懂自然語(yǔ)言的。
Prompts 是文字,由圖片 describe
出的 Tag
也是文字,語(yǔ)言文字是信息溝通最重要的媒介,大語(yǔ)言模型更是這次 AI 浪潮的基石。
我們通過(guò) 3 個(gè)多月,提升了“美術(shù)獅”對(duì)自然語(yǔ)言特別是中文的理解,讓它更靈動(dòng)、更懂你,盡管還有諸多不完美,過(guò)程中仍然帶給我們?cè)S多驚喜。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-684554.html
我們團(tuán)隊(duì)在以后的實(shí)踐中,會(huì)繼續(xù)使用 Laf,使用 Laf 是快樂(lè)的事情。希望越來(lái)越多的人能夠感受到 Laf 的魅力。也希望 Laf 明天會(huì)更好。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-684554.html
到了這里,關(guān)于使用 Laf 一周內(nèi)上線美術(shù)獅 AI 繪畫小程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!