关于人工智能:golang-结合-cobra-使用-chatgpt-qdrant-实现-ai知识库-cli-流程

40次阅读

共计 3949 个字符,预计需要花费 10 分钟才能阅读完成。

  1. 将数据集 通过 openai embedding 失去向量 + 组装 payload, 存入 qdrant
  2. 用户进行问题搜寻, 通过 openai embedding 失去向量, 从 qdrant 中搜寻类似度大于 0.8 的数据
  3. 从 qdrant 中取出数据失去参考答案
  4. 将问题题目 + 参考答案, 组装成 promot 向 gpt 进行发问, 失去偏差于 已有知识库设定的扩大常识答复

    kbai 知识库的导入和搜寻

    仓库地址:https://github.com/webws/embedding-knowledge-base

kabi 是应用 golang 基于 openai chatgpt embedding + qdrant 实现知识库的导入和问答

❯ 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.

启动向量数据库

qdrant 是一个开源的向量搜索引擎, 反对多种向量间隔计算形式

docker 运行 qdrant

docker run --rm -p 6334:6334 qdrant/qdrant

kbai 库导入数据到知识库

clone 源码运行 (后续提供二进制文件)

git clone https://github.com/webws/embedding-knowledge-base.git

cd ./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:
网关是一种网络设备,用于连贯两个或多个不同类型的网络,以便实现数据以不同协定进行传递和转换。网关起到了连贯不同网络之间的桥梁作用,将两个或多个网络相互连接起来,并负责数据的路由和转发。网关能够是硬件设施,如路由器,也能够是软件程序,如互联网网关。网关通常用于连贯本地网络与互联网,使得局域网中的计算机可能拜访互联网上的资源。除了连贯不同网络的性能,网关还能够实现安全性、负载平衡、数据过滤等性能。
  1. 第一个是知识库的答复 (the answer to the knowledge base):
  2. 第二个 是联合知识库 chatgpt 的答复 (results of chatgpt answers with reference answers)
  3. 第三个 仅 chatgpt 答复

能够看出 间接问 chatgpt, 失去的答案可能跟 k8s 无关, 联合 k8s 本地知识库, 能够让答复偏差 数据集设定的主题

如果间接搜寻 与知识库无关或违规问题, 将搜寻不到工作数据

go run ./ search --msg "苹果不洗能吃吗"
rearch term violation or exceeding category

kabi golang 实现 ai 知识库导入原理

导入

  1. 接入 qdrant 和 openai cleint
  2. 解释原始知识库数据 为 q(问) a(答)
  3. 将 问题 通过 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)
            }

搜寻

  1. 问题搜寻, 通过 openai embedding 失去向量
  2. 依据向量 从 qdrant 中搜寻类似度大于 0.8 的数据
  3. 依据 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")
            }

正文完
 0