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

2023-09-22 00:49:42

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

流程

  1. 将数据集 通过 openai embedding 得到向量+组装payload,存入 qdrant
  2. 用户进行问题搜索,通过 openai embedding 得到向量,从 qdrant 中搜索相似度大于0.8的数据
  3. 从 qdrant 中取出数据得到参考答案
  4. 将问题标题+参考答案,组装成promot 向gpt进行提问,得到偏向于 已有知识库设定的扩展知识回答

kabi 知识库的导入和搜索

仓库地址: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")
			}

更多推荐

【多尺度无监督:Pansharpening】

Mun-GAN:AMultiscaleUnsupervisedNetworkforRemoteSensingImagePansharpening(Mun-GAN:一种多尺度无监督遥感图像泛锐化网络)在遥感图像融合中,全色锐化是一种遥感图像融合方法,旨在融合全色(PAN)图像和多光谱(MS)图像,以产生高分辨率的MS(H

ClickHouse(15)ClickHouse合并树MergeTree家族表引擎之GraphiteMergeTree详细解析

GraphiteMergeTree该引擎用来对Graphite数据(图数据)进行瘦身及汇总。对于想使用ClickHouse来存储Graphite数据的开发者来说可能有用。如果不需要对Graphite数据做汇总,那么可以使用任意的ClickHouse表引擎;但若需要,那就采用GraphiteMergeTree引擎。它能减

主打低功耗物联网国产替代,纵行科技ZT1826芯片以速率和灵敏度出圈

在低功耗物联网领域,国产替代的趋势越演越烈。9月20日,纵行科技在“IOTE2023深圳·物联网通信技术与应用高峰论坛”发表了“自主原创AdvancedM-FSK®调制技术助力国产替代和泛在物联”的演讲,并推出了ZT1826芯片,以“更低功耗、更低成本、更高性能”为差异化优势,想在低功耗物联网赛道上开辟出一条“国产替代

C4BUILDER—用于构建C4模型图的Web项目

c4builder是什么?c4builder:字面理解是产生C4架构图的构建器。c4builder是一个轻量级的nodejscli工具,用于仅使用文本构建、维护和共享软件体系结构项目。c4builder是一种架构设计工具,可以帮助开发人员和架构师描述和可视化软件系统的架构,包括系统的组件、关系、依赖和交互。它基于C4模

Git错误解决:如何处理“could not determine hash algorithm“问题

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

帆软BI开发-Day2-趋势图的多种变形

前言:在BI数据展示中,条形图、趋势图无疑是使用场景非常多的两种图形。与条形图不同的是,趋势图更能反馈出一定的客观规律和未来的趋势走向,因此用于作为预警和判异的业务场景,但实际业务场景的趋势图可没你想的那么简单,今天我们一起来讨论下怎么在帆软上实现复杂的趋势图的需求吧。一、自我介绍-趋势图1、自我介绍帆软趋势图是一种基

CSS的var()函数用法与JS获取css函数变量值的方法

项目场景我们常在项目里见到这种写法。<template><divid="dashboardLayout":style="styleCSSVariable"></div></template>可以看到,根元素这里使用了一个名为styleCSSVariable的CSS集。这里的实现是:getstyleCSSVariable

机器视觉检测在流水线上的技术应用

机器视觉在流水线上的应用机器视觉系统的主要功能可以简单概括为:定位、识别、测量、缺陷检测等。相对于人工或传统机械方式而言,机器视觉系统具有速度快、精度高、准确性高等一系列优点。随着工业现代化发展,机器视觉已经广泛应用于各大领域。为企业及用户提供更优的产品品质及完美解决方案。流水线视觉检测是机器视觉应用最多的场合,流水线

视觉检测系统可以检测太阳能电池片哪些方面的缺陷?

近年来,随着全球工业化进程的不断加快,能源与环境危机成为一个亟待解决的问题。为此,太阳能作为一种清洁可再生的能源,现已被广泛应用于各领域。太阳能电池片作为太阳能转换为电能的核心载体,其质量的好坏决定着电能的转换效率。在从硅片到太阳能电池片的生产过程中会产生污点、破损等各种缺陷,需要进行多重检测工序。手动检测效率低下,容

unordered_set和unordered_map的封装

目录一、前言二、容器的使用1、unordered_map2、unordered_set​编辑三、哈希表的改造1、结点2、哈希表的迭代器*构造函数*重载**重载->*重载++*重载!=和==3、哈希表的析构4、unordered_map的[]实现5、修改后的哈希表四、unordered_set的实现五、unordered

NSS [NISACTF 2022]is secret

NSS[NISACTF2022]issecret原题是[CISCN2019_华东南赛区]Double_Secret开题蒙蔽。猜测是/secret路由,猜对了。GET提交参数?secret=1,这里应该是一个注入点。看了一下network,后端语言是python2,不确定是哪种漏洞,所有想到的都测一遍,最后在测SSTI时

热文推荐