函數計算的新征程:使用 Laf 構建 AI 知識庫

Laf 已成功上架 Sealos 模板市場,可通過 Laf 應用模板來一鍵部署!

這意味著 Laf 在私有化部署上的擴展性得到了極大的提升

Sealos 作為一個功能強大的云操作系統,能夠秒級創建多種高可用數據庫,如 MySQL、PostgreSQL、MongoDB 和 Redis 等,也可以一鍵運行各種消息隊列和微服務,甚至 GPU 集群上線后還可以跑各種 AI 大模型。

將 Laf 一鍵部署到 Sealos 中,我們就可以在 Laf 中直接通過內網調用 Sealos 提供的所有這些能力。無論用戶需要什么樣的后端支持,只需在 Sealos 上運行相應的服務即可。這種集成模式不僅提高了資源的利用效率,而且還提供了無縫的技術集成,使得 Laf 成為一個更加強大和多功能的 Serverless 平臺,彌補了傳統 Serverless 平臺在后端能力方面的不足。

Sealos 強大的模板市場提供了豐富的應用生態,用戶可以在模板市場中一鍵部署各種應用。本文以 Elasticsearch 為例,展示如何在 Laf 中調用 Sealos 模板市場中部署的 Elasticsearch 來搭建一個向量數據庫,提供定制化知識庫搜索能力。

背景知識

如果我們想往大模型里邊注入知識,最先能想到的就是對大模型進行微調,大模型有很好的根據上文來回答問題的能力。

假設一個場景,我有個問題是:“請給我介紹一下萬能青年旅店這支樂隊 “(假設模型內部并沒有存儲萬青的相關信息),然后我有個 100w 字的文檔,里邊包含了世界上所有樂隊的介紹。如果模型對無限長的輸入都有很好的理解能力,那么我可以設計這樣一個輸入 “以下是世界上所有樂隊的介紹:[插入 100w 字的樂隊簡介文檔],請根據上文給我介紹一下萬青這支樂隊”,讓模型來回答我的問題。但模型支持的輸入長度是很有限的,比如 ChatGPT 只支持 32K Token 長度的輸入 (大約 50 頁文本)。

實際上,如果想讓大模型根據文檔來回答問題,必須要精簡在輸入中文檔內容的長度。一種做法是,我們可以把文檔切成若干段,只將少量的和問題有關的文檔片段拿出來,放到大模型的輸入里。至此,”大模型外掛數據庫 “的問題轉換成了 “文本檢索的問題” 了,目標是根據問題找出文檔中和問題最相關的片段,這已經和大模型本身完全無關了。

文本檢索里邊比較常用的是利用向量進行檢索,我們可以把文檔片段全部向量化 (通過語言模型,如 bert 等),然后存到向量數據庫 (如 Annoy、FAISS、hnswlib 等) 里邊,來了一個問題之后,也對問題語句進行向量話,以余弦相似度或點積等指標,計算在向量數據庫中和問題向量最相似的 top k 個文檔片段,作為上文輸入到大模型中。

向量數據庫都支持近似搜索功能,在犧牲向量檢索準確度的情況下,提高檢索速度。完整流程圖如下所示:

按照這個思路我們需要做的事情有兩個,一個是把文檔向量化,另一個是搭建一個向量數據庫。文檔向量化最簡單的方法可以使用 openai 提供的轉化接口將文檔轉化成向量數組,除此之外還可以通過 bert 模型。OpenAI 還給出了向量數據庫參考選項,建議我們使用 cosin 相似度公式來求向量相似度:

$$\cos (\theta) = \frac {A.B} {|A| |B|} = \frac {\sum {i=1}^{n} A_i B_i} {\sqrt {\sum {i=1}^{n} A_i^2} \sqrt {\sum_ {i=1}^{n} B_i^2}}$$

如何在 Sealos 上快速部署向量數據庫呢?從 OpenAI 的推薦上我們看到了里面有個 Elasticsearch 選項,那我們就用它了。

部署 Laf 與 Elasticsearch

首先我們需要打開 Sealos 公有云桌面:https://cloud.sealos.top

Sealos 是完全開源的,您也可以通過 Sealos 構建自己的私有云:https://sealos.run/self-hosting

然后進入 “模板市場”,通過 Laf 模板與 Elasticsearch 模板分別部署 Laf 和 Elasticsearch。

然后在 Laf 中新建一個應用,安裝依賴 elastic/elasticsearch

一旦應用創建完畢,您可以使用云函數代碼來連接 Elasticsearch。在此示例中,我們直接插入了 10 條測試數據 (為了簡化演示過程,我們直接使用了測試數據,并沒有用 OpenAI 的接口去生成文檔的向量數據)。

import cloud from '@lafjs/cloud'
const { Client } = require('@elastic/elasticsearch')
const ca = `-----BEGIN CERTIFICATE-----
MIIDITCCAgmgAwIBAgIQQKs5V2terYVNUrHt9K0CzTANBgkqhkiG9w0BAQsFADAb
MRkwFwYDVQQDExBlbGFzdGljc2VhcmNoLWNhMB4XDTIzMTEyMjA3MDcxOFoXDTI0
MTEyMTA3MDcxOFowGzEZMBcGA1UEAxMQZWxhc3RpY3NlYXJjaC1jYTCCASIwDQYJ
KoZIhvcNAQEBBQADggEPADCCAQoCggEBAPYyHrFgyoD3Pkkc/ekXhHGKi+qKPBbp
afPuGImQfTtkGlzhaHJ7Iy3MZojP/iyt3FTY+LvxODsbkgIrQJWwiG2s26rw03Zd
lphf7RULRa9Z/TKt0jxHV9M419ge2zRij6Al3uUHCP2FxjVMgYjuFisKwNalQfUE
spCTq9lWNp4bKP32GieEBQKeNRD8ElNBJkInIA2aTyH2TIhyICK0f5GjH52rxKeV
wrE/BHq8zomHRVtTM67KHoXc9RJgYNICfooeDHvi/f9f+pWrX881rmbNWXGcxu2u
GQLqCAkqpIpUwn5HAoSvUYHmxwgaDC866fjsgxv/6DMDJuGPmfsBqQMCAwEAAaNh
MF8wDgYDVR0PAQH/BAQDAgKkMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
AjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQaGk9O4hQFjJPU6ay8qqU8CNug
uzANBgkqhkiG9w0BAQsFAAOCAQEAfZUesinfp1jeSqfHBSPHOgZ1q/v8xoClEPRl
wzh8sbL14iuuSb190J8zQefvzxC7ip4kVCVTW52fBZNyoMpvj0cXKWRGFmz3yHIs
TNdwOy15mQRQGbOTDBkQ528SbrmrWF4W7kDMoWs0t02UIlSfBWDjJrVharRR9QuF
cGjoS59TCAFcHHUsPO3lcUT1TCq/W4xnds3zBxJiGeIdmDqE6DbS78YfwP9rhTx0
oxcQwpKaOj8vxQNQxNbJRmWgffx0PgUzFPni/N5FgFQQXDPG4i0gMciekHWz8VRM
pp2z1uD1lVdDa/83w/IZCQOqDU7cRjDosg+gaAefFGNMHVbPBw==
-----END CERTIFICATE-----
`export default async function (ctx: FunctionContext) {const client = new Client({node: 'https://elasticsearch-master.ns-wz9g09tc.svc.cluster.local:9200',auth: {username: 'elastic',password: 'zhtvadgdinhkyirozeznxlxd'},tls: {ca: ca,rejectUnauthorized: false}})const health = await client.cluster.health()console.log(health)// 刪除已存在的索引(如果有)await client.indices.delete({index: 'vectors',ignore_unavailable: true})// 創建一個新的向量索引await client.indices.create({index: 'vectors',body: {mappings: {properties: {embedding: {type: 'dense_vector',// 向量列表的長度dims: 3,index:true,// 字段索引,consin函數求相似度similarity:'cosine'},text: {type: 'text'}}}}})// 測試數據const documents = [{ embedding: [0.5, 10, 6], text: 'text1' },{ embedding: [-0.5, 10, 10], text: 'text2' },{ embedding: [1.0, 5, 8], text: 'text3' },{ embedding: [-0.2, 8, 12], text: 'text4' },{ embedding: [0.8, 12, 4], text: 'text5' },{ embedding: [-0.7, 6, 14], text: 'text6' },{ embedding: [0.3, 14, 2], text: 'text7' },{ embedding: [-0.4, 16, 8], text: 'text8' },{ embedding: [0.6, 8, 10], text: 'text9' },{ embedding: [-0.6, 12, 6], text: 'text10' }];// 插入測試數據for (const doc of documents) {await client.index({index: 'vectors',document: doc,refresh: true});}// Define the vector to search forconst query_vector = [0.2, 12, 5]const body = await client.knnSearch({index: 'vectors',knn: {field: 'embedding',query_vector: query_vector,k: 3,num_candidates: 5},_source: ["text"]});// 輸出搜索結果console.log(JSON.stringify(body, null, 2))return { data: 'hi, laf' }
}

通過 cosin 相似度搜索,我們找到了與向量 [0.2, 12, 5] 最相似的三條向量數據。這些數據的文本分別是 text8text5text10

Elasticsearch 內網調用地址如下:

ca 的值就是 Elasticsearch 的證書,Elasticsearch 的證書可以通過命令行來獲取,先在 Sealos 桌面中打開 “終端” App,然后執行以下命令獲取證書:

kubectl get secret elasticsearch-master-certs -o jsonpath="{.data.ca\.crt}"|base64 -d

Elasticsearch 的用戶名密碼可以通過以下命令獲取:

$ kubectl get secret elasticsearch-master-credentials -o jsonpath="{.data.username}"|base64 -d && echo
elastic
$ kubectl get secret elasticsearch-master-credentials -o jsonpath="{.data.password}"|base64 -d && echo
xurcwgjxpfztmgjquufyyiml

至此簡單的 Demo 已經完成了,后續我們需要做的就是持續地向我們的向量數據庫中添加更多文檔的向量化數據,通過這種方式,我們可以構建起一個功能強大的知識庫。當用戶提問時,先將用戶問題轉換成向量數據,然后在向量數據庫中找到最相似的文檔,將文檔作為上文輸入到大模型中,最后大模型輸出答案。我們的明星項目 FastGPT 就是這樣做的哦。另外不難看出 Bing Chat 也是異曲同工。

總結

通過將 Laf 集成到 Sealos 云操作系統中,可以更高效地利用云操作系統的資源。用戶可以直接在 Laf 中調用 Sealos 提供的各種數據庫和服務,如 MySQL、PostgreSQL、MongoDB 和 Redis 等,以及消息隊列和微服務,實現資源的最大化利用。這種集成方式使得 Laf 成為了一個功能更加全面的 Serverless 平臺。尤其是在后端能力方面,這種集成提供了一個無縫的解決方案,彌補了傳統 Serverless 平臺的不足。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj,將數組中的內容作為對象的key轉化為對象,對應的值轉換為對象對應的值

1.需求場景 哈嘍 大家好啊,今天遇到一個場景, js實現獲取原生form表單的數據序列化表單以及將數組轉化為一個對象obj,將數組中的內容作為對象的key轉化為對象,對應的值轉換為對象對應的值 數組對象中某個屬性的值,轉…

元宇宙現已開放!

在 2023 年 11 月 3 日 The Sandbox 首個全球創作者日上,The Sandbox 聯合創始人 Arthur Madrid 和 Sebastien Borget 宣布元宇宙已開放,已創作完整體驗的 LAND 持有者可以自行將體驗發布至 The Sandbox 地圖上。 精選速覽 LAND 持有者:如果…

在JVM中 判定哪些對象是垃圾?

目錄 垃圾的條件 1、引用計數法 2、可達性分析 3、強引用 4、軟引用 5、弱引用 6、虛引用 判斷垃圾的條件 在Java虛擬機(JVM)中,垃圾收集器負責管理內存,其中的垃圾收集算法用于確定哪些對象是垃圾,可以被回收…

VBA即用型代碼手冊之工作薄的關閉保存及創建

我給VBA下的定義:VBA是個人小型自動化處理的有效工具。可以大大提高自己的勞動效率,而且可以提高數據的準確性。我這里專注VBA,將我多年的經驗匯集在VBA系列九套教程中。 作為我的學員要利用我的積木編程思想,積木編程最重要的是積木如何搭建…

[Latex] Riemann 問題中的激波,接觸間斷,膨脹波的 Tikz 繪圖

Latex 代碼 \begin{figure}\begin{subfigure}[b]{0.32\textwidth}\centering\resizebox{\linewidth}{!}{\begin{tikzpicture}\coordinate (o) at (0,0);\coordinate (Si) at (2.5,2.5);\coordinate (x) at (1,0);\draw[->] (0,0) -- (3,0) node[right] {$x$};\draw[->] …

ArkTS-自定義組件學習

文章目錄 創建自定義組件頁面和自定義組件生命周期自定義組件和頁面的區別頁面生命周期(即被Entry修飾的組件)組件生命周期(即被Component修飾的組件) Builder裝飾器:自定義構建函數按引用傳遞參數按值傳遞參數 BuilderParam裝飾器:引用Builder函數 這個…

Python 將列表拼接為一個字符串,Python join

目錄 join方法的源碼: 列表數據為字符串 列表數據為數字 三引號也可以使用join join方法的源碼: def join(self, abNone, pqNone, rsNone): # real signature unknown; restored from __doc__"""Concatenate any number of strings.T…

harmonyos應用開發者高級認證考試部分答案

1只要使用端云一體化的云端資源就需要支付費用(錯) 2所有使用Component修飾的自定義組件都支持onPageShow,onBackPress和onPageHide生命周期函數。(錯) 3 HarmonyOS應用可以兼容OpenHarmony生態(對&#…

一文讀懂如何安全地存儲密碼

目錄 引言 明文存儲 基本哈希存儲 加鹽哈希存儲 適應性哈希算法 密碼加密存儲 小結 引言 密碼是最常用的身份驗證手段,既簡單又高效。密碼安全是網絡安全的基石,對保護個人和組織信息的安全具有根本性的作用。然而有關密碼泄漏的安全問題一再發生…

生物動力葡萄酒和有機葡萄酒一樣嗎?

農業維持了數十萬年的文明,但當人類以錯誤的方式過多干預,過于專注于制造和操縱產品時,農業往往會失敗。如果我們的目標是獲得最高質量的收成,并長期堅持我們的做法,我們就必須與土地打交道。 當我們開始尋找生物動力…

應用內測分發平臺如何上傳應用包體?

●您可免費將您的應用(支持蘋果.ios安卓.apk文件)上傳至咕嚕分發平臺,我們將免費為應用生成下載信息,但咕嚕分發將會對應用的下載次數進行收費(每個賬號都享有免費贈送的下載點數以及參加活動的贈送點數)&a…

UVA1025 城市里的間諜 A Spy in the Metro

UVA1025 城市里的間諜 A Spy in the Metro 題面翻譯 題目大意 某城市地鐵是一條直線,有 n n n( 2 ≤ n ≤ 50 2\leq n\leq 50 2≤n≤50)個車站,從左到右編號 1 … n 1\ldots n 1…n。有 M 1 M_1 M1? 輛列車從第 1 1 1 站開…

【電路筆記】-分壓器

分壓器 文章目錄 分壓器1、概述2、負載分壓器3、分壓器網絡4、無功分壓器4.1 電容分壓器4.2 感應分壓器 5、總結 有時,需要精確的電壓值作為參考,或者僅在需要較少功率的電路的特定階段之前需要。 分壓器是解決此問題的一個簡單方法,因為它們…

【Vue】filter的用法

上一篇&#xff1a; vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5502 本篇所使用指令 v-for v-on v-html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

在vscode下將ipynb文件轉成pdf的方法

正常情況下&#xff0c;可以在vscode的ipynb界面點擊上面的三個點&#xff0c;里面有export&#xff0c;可以選擇直接輸出html和pdf&#xff0c;但是需要latex&#xff0c;由于按扎u安裝麻煩&#xff0c;所以我換了一種方法。 ----------------------------------------------…

記一次docker服務啟動失敗解決過程

環境&#xff1a;centos 7.6 報錯&#xff1a;start request repeated too quickly for docker.service 由于服務器修復了內核漏洞&#xff0c;需要重啟&#xff0c;沒想到重啟后&#xff0c;docker啟動失敗了 查看狀態 systemctl status docker如下圖 里面有一行提示&…

網絡互聯與IP地址

目錄 網絡互聯概述網絡的定義與分類網絡的定義網絡的分類 OSI模型和DoD模型網絡拓撲結構總線型拓撲結構星型拓撲結構環型拓撲結構 傳輸介質同軸電纜雙絞線光纖 介質訪問控制方式CSMA/CD令牌 網絡設備網卡集線器交換機路由器總結 IP地址A、B、C類IP地址特殊地址形式 子網與子網掩…

[NOIP2013 提高組] 積木大賽

Description 春春幼兒園舉辦了一年一度的“積木大賽”。今年比賽的內容是搭建一座寬度為 n 的大廈&#xff0c;大廈可以看成由 n 塊寬度為 1 的積木組成&#xff0c;第 i 塊積木的最終高度需要是 hi?。 在搭建開始之前&#xff0c;沒有任何積木&#xff08;可以看成 n 塊高度…

使用rsync從OpenShift的pod復制文件

環境 Red Hat Enterprise Linux release 8.6 (Ootpa)OCP 4.12.22 準備 安裝rsync&#xff1a; yum install rsync 查看pod&#xff1a; [rootapi.kai1123.cp.fyre.ibm.com ~]# oc get pod -n cpd-instance | grep dmc ...... ibm-dmc-1700727413211000-monitor-0 …

DCDC電感發熱嘯叫原因分析

一、電感發熱嘯叫原因解析 發熱原因&#xff1a;電感飽和&#xff0c;實際使用的電感值<理論電感計算值 原因1&#xff1a;電感選擇過小&#xff0c;計算值不合理。 原因2&#xff1a;PCB布局不合理&#xff0c;屏蔽型電感下方應設禁止鋪銅區。 嘯叫原因&#xff1a; 人耳的…