golang cobra使用chatgpt qdrant实现ai知识库

 更新时间:2023年09月24日 10:11:27   作者:莫大  
这篇文章主要为大家介绍了golang cobra使用chatgpt qdrant实现ai知识库,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  • 将数据集 通过 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 -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:
网关是一种网络设备,用于连接两个或多个不同类型的网络,以便实现数据以不同协议进行传递和转换。网关起到了连接不同网络之间的桥梁作用,将两个或多个网络互相连接起来,并负责数据的路由和转发。网关可以是硬件设备,如路由器,也可以是软件程序,如互联网网关。网关通常用于连接本地网络与互联网,使得局域网中的计算机能够访问互联网上的资源。除了连接不同网络的功能,网关还可以实现安全性、负载均衡、数据过滤等功能。

  • 第一个是知识库的回答(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")
            }

以上就是golang cobra使用chatgpt qdrant实现ai知识库的详细内容,更多关于golang cobra ai知识库的资料请关注脚本之家其它相关文章!

相关文章

  • golang框架中跨服务的最佳通信协议和工具

    golang框架中跨服务的最佳通信协议和工具

    在 go 框架中实现跨服务通信的最佳实践包括使用 grpc(适用于低延迟高吞吐量)、http 客户端(适用于 restful api)和消息队列(适用于异步解耦通信),在选择通信方式时,应考虑服务交互模式、性能要求和部署环境等因素
    2024-06-06
  • go语言beego框架web开发语法笔记示例

    go语言beego框架web开发语法笔记示例

    这篇文章主要为大家介绍了go语言beego框架web开发语法笔记示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang通过http访问外部网址的操作方法

    golang通过http访问外部网址的操作方法

    这篇文章主要介绍了golang通过http访问外部网址的操作方法,分为 get方式访问外部的接口,Post方式请求外部接口,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • golang实现http server提供文件下载功能

    golang实现http server提供文件下载功能

    这篇文章主要介绍了golang实现http server提供文件下载功能,本文给大家简单介绍了Golang的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Go标准库strconv实现string类型与其他基本数据类型之间转换

    Go标准库strconv实现string类型与其他基本数据类型之间转换

    这篇文章主要为大家介绍了Go标准库strconv实现string类型与其他基本数据类型之间转换示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Go存储基础使用direct io方法实例

    Go存储基础使用direct io方法实例

    这篇文章主要介绍了Go存储基础之如何使用direct io方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • golang强制类型转换和类型断言

    golang强制类型转换和类型断言

    这篇文章主要介绍了详情介绍golang类型转换问题,分别由介绍类型断言和类型转换,这两者都是不同的概念,下面文章围绕类型断言和类型转换的相关资料展开文章的详细内容,需要的朋友可以参考以下
    2021-12-12
  • Go 依赖注入库wire基本使用

    Go 依赖注入库wire基本使用

    本文主要介绍了Go 依赖注入库wire基本使用,使用Wire工具简化依赖初始化的过程,通过依赖注入,代码更加模块化、可测试,并减少了各模块之间的耦合,增强了可维护性,Wire工具自动生成依赖代码,使开发更加高效
    2026-03-03
  • golang beyla采集trace程序原理源码解析

    golang beyla采集trace程序原理源码解析

    beyla支持通过ebpf,无侵入的、自动采集应用程序的trace信息,本文以golang的nethttp为例,讲述beyla对trace的采集的实现原理,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2024-02-02
  • Go Java算法之单词搜索示例详解

    Go Java算法之单词搜索示例详解

    这篇文章主要为大家介绍了Go Java算法之单词搜索示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论