golang cobra使用chatgpt qdrant實現(xiàn)ai知識庫
- 將數(shù)據(jù)集 通過 openai embedding 得到向量+組裝payload,存入 qdrant
- 用戶進行問題搜索,通過 openai embedding 得到向量,從 qdrant 中搜索相似度大于0.8的數(shù)據(jù)
- 從 qdrant 中取出數(shù)據(jù)得到參考答案
將問題標(biāo)題+參考答案,組裝成promot 向gpt進行提問,得到偏向于 已有知識庫設(shè)定的擴展知識回答
kbai 知識庫的導(dǎo)入和搜索
倉庫地址:https://github.com/webws/embedding-knowledge-base
kabi 是使用 golang 基于 openai chatgpt embedding + qdrant 實現(xiàn)知識庫的導(dǎo)入和問答
? kabi -h a local knowledge base, based on chatgpt and qdrant usage: kbai [flags] kbai [command] available commands: completion generate the autocompletion script for the specified shell help help about any command import import data to vector database search ask the knowledge base example: kbai ask --msg 'first, the chicken or the egg' flags: --apikey string openai apikey:default from env apikey --collection string qdrant collection name default: kubernetes (default "kubernetes") -h, --help help for kbai --proxy string http client proxy default:socks5://127.0.0.1:1080 (default "socks5://127.0.0.1:1080") --qdrant string qdrant address default: 127.0.0.1:6334 (default "127.0.0.1:6334") --vectorsize uint qdrant vector size default: 1536 (default 1536) use "kbai [command] --help" for more information about a command.
啟動向量數(shù)據(jù)庫
qdrant 是一個開源的向量搜索引擎,支持多種向量距離計算方式
docker 運行 qdrant
docker run --rm -p 6334:6334 qdrant/qdrant
kbai庫導(dǎo)入數(shù)據(jù)到知識庫
clone 源碼運行(后續(xù)提供二進制文件)
git clone https://github.com/webws/embedding-knowledge-base.git cd ./embedding-knowledge-base
這里使用的測試數(shù)據(jù)是k8s相關(guān)的知識庫,真實數(shù)據(jù)需自己準(zhǔn)備
1.設(shè)置 openai apikey
export apikey=xxx
2.導(dǎo)入知識庫(源碼運行)
go run ./ import --datafile ./example/data.json
data.json 數(shù)據(jù)格式如下,為 真實數(shù)據(jù)需自己準(zhǔn)備
[ { "questions": "這是問題", "answers": "這是答案" }, ]
說明:
默認的 代理 是 "socks5://127.0.0.1:1080" 自定義 可使用 --proxy 指定
kbai 搜索數(shù)據(jù)
搜索問題(源碼執(zhí)行)
go run ./ search --msg "網(wǎng)關(guān)是什么"
回答
the answer to the knowledge base:
在kubernetes中,網(wǎng)關(guān)通常指的是ingress(入 口)資源對象。ingress是一種kubernetes api對象,用于配置和管理集群中的http和https流量入口。它充當(dāng)了從集群外部訪問集群內(nèi)部服務(wù)的入口點results of chatgpt answers with reference answers:
,同時提供負載均衡、ssl/tls終止和基于域名的路由等功能。ingress資源對象定義了一組規(guī)則,這些規(guī)則指定了通過特定http路徑或主機名將請求路由到后端服務(wù)的方式??梢允褂貌煌膇ngress控制器實現(xiàn)這些規(guī)則,如nginx、traefik等。這樣就可以在集群中創(chuàng)建多個ingress資源對象來管理不同的流量入口。only chatgpt answers:
網(wǎng)關(guān)是一種網(wǎng)絡(luò)設(shè)備,用于連接兩個或多個不同類型的網(wǎng)絡(luò),以便實現(xiàn)數(shù)據(jù)以不同協(xié)議進行傳遞和轉(zhuǎn)換。網(wǎng)關(guān)起到了連接不同網(wǎng)絡(luò)之間的橋梁作用,將兩個或多個網(wǎng)絡(luò)互相連接起來,并負責(zé)數(shù)據(jù)的路由和轉(zhuǎn)發(fā)。網(wǎng)關(guān)可以是硬件設(shè)備,如路由器,也可以是軟件程序,如互聯(lián)網(wǎng)網(wǎng)關(guān)。網(wǎng)關(guān)通常用于連接本地網(wǎng)絡(luò)與互聯(lián)網(wǎng),使得局域網(wǎng)中的計算機能夠訪問互聯(lián)網(wǎng)上的資源。除了連接不同網(wǎng)絡(luò)的功能,網(wǎng)關(guān)還可以實現(xiàn)安全性、負載均衡、數(shù)據(jù)過濾等功能。
- 第一個是知識庫的回答(the answer to the knowledge base):
- 第二個 是結(jié)合知識庫 chatgpt 的回答(results of chatgpt answers with reference answers)
- 第三個 僅chatgpt 回答
可以看出 直接問chatgpt,得到的答案可能跟k8s無關(guān),結(jié)合k8s本地知識庫,可以讓回答偏向 數(shù)據(jù)集設(shè)定的主題
如果直接搜索 與知識庫無關(guān)或違規(guī)問題,將搜索不到任務(wù)數(shù)據(jù)
go run ./ search --msg "蘋果不洗能吃嗎" rearch term violation or exceeding category
kabi golang 實現(xiàn) ai知識庫導(dǎo)入原理
導(dǎo)入
- 接入 qdrant 和 openai cleint
- 解釋原始知識庫數(shù)據(jù) 為 q(問) a(答)
- 將 問題 經(jīng)過 openai embedding 得到向量+答案存入 qdrant
以下是 kbai go 導(dǎo)入邏輯代碼
qdrantclient := qdrant.newqdrantclient(configflags.qdrant, configflags.collection, configflags.vectorsize) defer qdrantclient.close() aiclient, err := ai.newaiclient(configflags.proxy, configflags.apikey) if err != nil { return err } if err = qdrantclient.createcollection(configflags.collection, configflags.vectorsize); err != nil { return err } qas, err := converttoqas(datafile) if err != nil { return err } points := []*pb.pointstruct{} logger.infow("import", "data", qas) qpslenth := len(qas) for i, qa := range qas { embedding, err := aiclient.simplegetvec(qa.questions) if err != nil { logger.errorw("simplegetvec", "err", err, "question", qa.questions, "index", i, "total", qpslenth) return err } point := buildpoint(qa.questions, qa.answers, embedding) points = append(points, point) }
搜索
- 問題搜索,通過 openai embedding 得到向量
- 根據(jù)向量 從 qdrant 中搜索相似度大于0.8的數(shù)據(jù)
- 根據(jù) qdrant 里的知識庫答案(參考答案) + 從 chatgpt 提問 得到擴展知識
以下是 kbai go 搜索代碼邏輯
qdrantclient := qdrant.newqdrantclient(configflags.qdrant, configflags.collection, configflags.vectorsize) defer qdrantclient.close() aiclient, err := ai.newaiclient(configflags.proxy, configflags.apikey) if err != nil { return err } vector, err := aiclient.simplegetvec(msg) if err != nil { return err } points, err := qdrantclient.search(vector) if err != nil { logger.errorw("qdrant search fail", "err", err) return err } if len(points) == 0 { fmt.println("rearch term violation or exceeding category") return nil // return errors.new("rearch term violation or exceeding category") } // score less than 0.8, rearch term violation or exceeding category if points[0].score < 0.8 { fmt.println("rearch term violation or exceeding category") return nil // return errors.new("rearch term violation or exceeding category") }
以上就是golang cobra使用chatgpt qdrant實現(xiàn)ai知識庫的詳細內(nèi)容,更多關(guān)于golang cobra ai知識庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Golang如何優(yōu)雅判斷interface是否為nil
這篇文章主要為大家詳細介紹了Golang如何優(yōu)雅判斷interface是否為nil的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解下2024-01-01