golang cobra使用chatgpt qdrant實(shí)現(xiàn)ai知識(shí)庫(kù)
- 將數(shù)據(jù)集 通過(guò) openai embedding 得到向量+組裝payload,存入 qdrant
- 用戶進(jìn)行問(wèn)題搜索,通過(guò) openai embedding 得到向量,從 qdrant 中搜索相似度大于0.8的數(shù)據(jù)
- 從 qdrant 中取出數(shù)據(jù)得到參考答案
將問(wèn)題標(biāo)題+參考答案,組裝成promot 向gpt進(jìn)行提問(wèn),得到偏向于 已有知識(shí)庫(kù)設(shè)定的擴(kuò)展知識(shí)回答
kbai 知識(shí)庫(kù)的導(dǎo)入和搜索
倉(cāng)庫(kù)地址:https://github.com/webws/embedding-knowledge-base
kabi 是使用 golang 基于 openai chatgpt embedding + qdrant 實(shí)現(xiàn)知識(shí)庫(kù)的導(dǎo)入和問(wèn)答
? 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.
啟動(dòng)向量數(shù)據(jù)庫(kù)
qdrant 是一個(gè)開源的向量搜索引擎,支持多種向量距離計(jì)算方式
docker 運(yùn)行 qdrant
docker run --rm -p 6334:6334 qdrant/qdrant
kbai庫(kù)導(dǎo)入數(shù)據(jù)到知識(shí)庫(kù)
clone 源碼運(yùn)行(后續(xù)提供二進(jìn)制文件)
git clone https://github.com/webws/embedding-knowledge-base.git cd ./embedding-knowledge-base
這里使用的測(cè)試數(shù)據(jù)是k8s相關(guān)的知識(shí)庫(kù),真實(shí)數(shù)據(jù)需自己準(zhǔn)備
1.設(shè)置 openai apikey
export apikey=xxx
2.導(dǎo)入知識(shí)庫(kù)(源碼運(yùn)行)
go run ./ import --datafile ./example/data.json
data.json 數(shù)據(jù)格式如下,為 真實(shí)數(shù)據(jù)需自己準(zhǔn)備
[ { "questions": "這是問(wèn)題", "answers": "這是答案" }, ]
說(shuō)明:
默認(rèn)的 代理 是 "socks5://127.0.0.1:1080" 自定義 可使用 --proxy 指定
kbai 搜索數(shù)據(jù)
搜索問(wèn)題(源碼執(zhí)行)
go run ./ search --msg "網(wǎng)關(guān)是什么"
回答
the answer to the knowledge base:
在kubernetes中,網(wǎng)關(guān)通常指的是ingress(入 口)資源對(duì)象。ingress是一種kubernetes api對(duì)象,用于配置和管理集群中的http和https流量入口。它充當(dāng)了從集群外部訪問(wèn)集群內(nèi)部服務(wù)的入口點(diǎn)results of chatgpt answers with reference answers:
,同時(shí)提供負(fù)載均衡、ssl/tls終止和基于域名的路由等功能。ingress資源對(duì)象定義了一組規(guī)則,這些規(guī)則指定了通過(guò)特定http路徑或主機(jī)名將請(qǐng)求路由到后端服務(wù)的方式??梢允褂貌煌膇ngress控制器實(shí)現(xiàn)這些規(guī)則,如nginx、traefik等。這樣就可以在集群中創(chuàng)建多個(gè)ingress資源對(duì)象來(lái)管理不同的流量入口。only chatgpt answers:
網(wǎng)關(guān)是一種網(wǎng)絡(luò)設(shè)備,用于連接兩個(gè)或多個(gè)不同類型的網(wǎng)絡(luò),以便實(shí)現(xiàn)數(shù)據(jù)以不同協(xié)議進(jìn)行傳遞和轉(zhuǎn)換。網(wǎng)關(guān)起到了連接不同網(wǎng)絡(luò)之間的橋梁作用,將兩個(gè)或多個(gè)網(wǎng)絡(luò)互相連接起來(lái),并負(fù)責(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)中的計(jì)算機(jī)能夠訪問(wèn)互聯(lián)網(wǎng)上的資源。除了連接不同網(wǎng)絡(luò)的功能,網(wǎng)關(guān)還可以實(shí)現(xiàn)安全性、負(fù)載均衡、數(shù)據(jù)過(guò)濾等功能。
- 第一個(gè)是知識(shí)庫(kù)的回答(the answer to the knowledge base):
- 第二個(gè) 是結(jié)合知識(shí)庫(kù) chatgpt 的回答(results of chatgpt answers with reference answers)
- 第三個(gè) 僅chatgpt 回答
可以看出 直接問(wèn)chatgpt,得到的答案可能跟k8s無(wú)關(guān),結(jié)合k8s本地知識(shí)庫(kù),可以讓回答偏向 數(shù)據(jù)集設(shè)定的主題
如果直接搜索 與知識(shí)庫(kù)無(wú)關(guān)或違規(guī)問(wèn)題,將搜索不到任務(wù)數(shù)據(jù)
go run ./ search --msg "蘋果不洗能吃嗎" rearch term violation or exceeding category
kabi golang 實(shí)現(xiàn) ai知識(shí)庫(kù)導(dǎo)入原理
導(dǎo)入
- 接入 qdrant 和 openai cleint
- 解釋原始知識(shí)庫(kù)數(shù)據(jù) 為 q(問(wèn)) a(答)
- 將 問(wèn)題 經(jīng)過(guò) 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) }
搜索
- 問(wèn)題搜索,通過(guò) openai embedding 得到向量
- 根據(jù)向量 從 qdrant 中搜索相似度大于0.8的數(shù)據(jù)
- 根據(jù) qdrant 里的知識(shí)庫(kù)答案(參考答案) + 從 chatgpt 提問(wèn) 得到擴(kuò)展知識(shí)
以下是 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實(shí)現(xiàn)ai知識(shí)庫(kù)的詳細(xì)內(nèi)容,更多關(guān)于golang cobra ai知識(shí)庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn)
本文主要介紹了Go?結(jié)構(gòu)體序列化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01詳解Golang如何優(yōu)雅判斷interface是否為nil
這篇文章主要為大家詳細(xì)介紹了Golang如何優(yōu)雅判斷interface是否為nil的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2024-01-01Go語(yǔ)言標(biāo)準(zhǔn)錯(cuò)誤error全面解析
Go語(yǔ)言中的錯(cuò)誤處理是通過(guò)內(nèi)置的error接口來(lái)實(shí)現(xiàn)的,其中errorString和wrapError是兩種常見的錯(cuò)誤類型實(shí)現(xiàn)方式,errorString通過(guò)errors.New()方法實(shí)現(xiàn),而wrapError則通過(guò)fmt.Errorf()方法實(shí)現(xiàn),支持錯(cuò)誤的嵌套和解析2024-10-10golang進(jìn)程在docker中OOM后hang住問(wèn)題解析
這篇文章主要介紹了golang進(jìn)程在docker中OOM后hang住問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10