- 将数据集 通过 openai embedding 失去向量+组装payload,存入 qdrant
- 用户进行问题搜寻,通过 openai embedding 失去向量,从 qdrant 中搜寻类似度大于0.8的数据
- 从 qdrant 中取出数据失去参考答案
将问题题目+参考答案,组装成promot 向gpt进行发问,失去偏差于 已有知识库设定的扩大常识答复
kbai 知识库的导入和搜寻
仓库地址:https://github.com/webws/embedding-knowledge-base
kabi 是应用 golang 基于 openai chatgpt embedding + qdrant 实现知识库的导入和问答
❯ kabi -ha local knowledge base, based on chatgpt and qdrantusage: 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.
启动向量数据库
qdrant 是一个开源的向量搜索引擎,反对多种向量间隔计算形式
docker 运行 qdrant
docker run --rm -p 6334:6334 qdrant/qdrant
kbai库导入数据到知识库
clone 源码运行(后续提供二进制文件)
git clone https://github.com/webws/embedding-knowledge-base.gitcd ./embedding-knowledge-base
这里应用的测试数据是k8s相干的知识库,实在数据需本人筹备
1.设置 openai apikey
export apikey=xxx
2.导入知识库(源码运行)
go run ./ import --datafile ./example/data.json
data.json 数据格式如下,为 实在数据需本人筹备
[ { "questions": "这是问题", "answers": "这是答案" },]
阐明:
默认的 代理 是 "socks5://127.0.0.1:1080" 自定义 可应用 --proxy 指定
kbai 搜寻数据
搜寻问题(源码执行)
go run ./ search --msg "网关是什么"
答复
the answer to the knowledge base:在kubernetes中,网关通常指的是ingress(入 口)资源对象。ingress是一种kubernetes api对象,用于配置和治理集群中的http和https流量入口。它充当了从集群内部拜访集群外部服务的入口点results of chatgpt answers with reference answers:,同时提供负载平衡、ssl/tls终止和基于域名的路由等性能。ingress资源对象定义了一组规定,这些规定指定了通过特定http门路或主机名将申请路由到后端服务的形式。能够应用不同的ingress控制器实现这些规定,如nginx、traefik等。这样就能够在集群中创立多个ingress资源对象来治理不同的流量入口。only chatgpt answers:网关是一种网络设备,用于连贯两个或多个不同类型的网络,以便实现数据以不同协定进行传递和转换。网关起到了连贯不同网络之间的桥梁作用,将两个或多个网络相互连接起来,并负责数据的路由和转发。网关能够是硬件设施,如路由器,也能够是软件程序,如互联网网关。网关通常用于连贯本地网络与互联网,使得局域网中的计算机可能拜访互联网上的资源。除了连贯不同网络的性能,网关还能够实现安全性、负载平衡、数据过滤等性能。
- 第一个是知识库的答复(the answer to the knowledge base):
- 第二个 是联合知识库 chatgpt 的答复(results of chatgpt answers with reference answers)
- 第三个 仅chatgpt 答复
能够看出 间接问chatgpt,失去的答案可能跟k8s无关,联合k8s本地知识库,能够让答复偏差 数据集设定的主题
如果间接搜寻 与知识库无关或违规问题,将搜寻不到工作数据
go run ./ search --msg "苹果不洗能吃吗"rearch term violation or exceeding category
kabi golang 实现 ai知识库导入原理
导入
- 接入 qdrant 和 openai cleint
- 解释原始知识库数据 为 q(问) a(答)
- 将 问题 通过 openai embedding 失去向量+答案存入 qdrant
以下是 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 } 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 失去向量
- 依据向量 从 qdrant 中搜寻类似度大于0.8的数据
- 依据 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") }