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

news2024/11/23 23:45:56

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")
			}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter笔记:用于ORM的Floor框架简记

Flutter笔记 用于ORM的Floor框架简记 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/133377191 【介绍】&#xff1a;最近想找用于Dart和Flutter的ORM框架&#xff0c;偶然间发现了Floor&#xff0c;觉得还不错&#xff0c;做一些记录。 1. Floor 框…

likeadmin和fastapi的bug

以下内容写于2023年8月11日 bug 1 请求体 - 多个参数 - FastAPI (tiangolo.com)中“请求体中的单一值”处&#xff0c;选python3.6&#xff0c;接口示例代码是 from typing import Unionfrom fastapi import Body, FastAPI from pydantic import BaseModel from typing_exte…

26662-2011 磁粉制动器 阅读笔记

声明 本文是学习GB-T 26662-2011 磁粉制动器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了磁粉制动器(以下简称制动器)的术语&#xff0c;技术要求&#xff0c;试验方法&#xff0c;检验规则&#xff0c;标志、包装、运 输和…

【项目实战】单数据源多数据库实现多租户

文章目录 前言多租户的四种实现方案单数据源多数据库实现思路代码实现 总结 前言 多租户&#xff08;Multi-Tenancy&#xff09;是一种软件架构设计模式&#xff0c;旨在使单个应用程序可以同时为多个租户&#xff08;如不同组织、用户或客户&#xff09;提供服务&#xff0c;…

Python 小爬虫入门 -- 爬取专栏文章标题保存到 CSV 文件中

爬取专栏文章标题保存到 CSV 文件中目标分析网页代码及理解代码段一代码段二成果展示爬取专栏文章标题保存到 CSV 文件中 目标 从一个网页上抓取数据,并保存到一个 CSV 文件中。 具体是爬取 微机系统与接口上机实验_TD PITE型 专栏里的所有 文章标题 并 保存到 csv 文件 中…

估计、偏差和方差

一、介绍 统计领域为我们提供了很多工具来实现机器学习目标&#xff0c;不仅可以解决训练集上的任务&#xff0c;还可以泛化。基本的概念&#xff0c;例如参数估计、偏差和方差&#xff0c;对于正式地刻画泛化、欠拟合和过拟合都非常有帮助。 二、参数估计 参数估计 是统计学…

35 LRU缓存

LRU缓存 题解1 双map&#xff08;差2个testcases&#xff09;题解2 哈希表双向链表&#xff08;参考&#xff09;题解3 STL:listunordered_map 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正…

通讯网关软件016——利用CommGate X2Access实现OPC数据转储Access

本文介绍利用CommGate X2ACCESS实现从OPC Server读取数据并转储至ACCESS数据库。CommGate X2ACCESS是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现从OPC Server读取数据并转储至ACCESS…

【前段基础入门之】=>CSS 常用的字体文本属性

导读&#xff1a; 这一章&#xff0c;主要分享一些 CSS 中的一些&#xff0c;常用的 字体和文本方面的属性。 文章目录 字体属性字体大小字体族字体风格字体粗细字体复合写法 文本属性文本间距文本修饰文本缩进文本水平对齐行高vertical-align 字体属性 字体大小 属性名&…

进入Linux的世界

了解Linux的历史 一、Linux发展史二、企业应用现状三、Linux操作系统的各种版本 一、Linux发展史 了解一下硅谷模式: 1945年——1991年是美苏冷战的时间&#xff0c;在这个环境背景下&#xff0c;计算机诞生了。 Linux的发展史&#xff1a; 查看Linux纯源代码 二、企业…

No144.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

完整的 pixel 6a 刷入 AOSP 源码过程记录

基础环境 虚拟机&#xff1a;VMware Workstation 16 Pro 16.0.0 build-16894299 Linux版本&#xff1a;ubuntu-16.04.7-desktop-amd64 设备&#xff1a;pixel 6a&#xff1b;代号&#xff1a;bluejay&#xff1b; 基础软件安装 安装 Git 命令&#xff1a;sudo apt install git …

ATA-M系列功率放大器——应用场景介绍

ATA-M系列是一款理想的单通道功率放大器。最大输出690Vrms电压&#xff0c;800VA功率&#xff0c;可驱动0~100%的阻性或非阻性负载。输出阻抗匹配多个档位可选&#xff0c;客户可根据测试需求调节。 图&#xff1a;ATA-M系列功率放大器 国产品牌安泰电子自主研发的ATA-M系列功率…

MySQL MMM高可用架构

MySQL MMM高可用架构一、MMM概述1、MMM简介2、MMM高可用架构3、MMM故障切换流程 二、MMM高可用双主双从架构部署1、配置主主复制&#xff08;master&#xff09;&#xff0c;主从复制&#xff08;slave&#xff09;1&#xff09;修改 Master1的MySQL配置文件2&#xff09;把配置…

Linux 压缩和解压

1、tar命令&#xff08;复杂&#xff09; 使用tar命令均可以进行压缩和解压缩的操作 语法&#xff1a;tar [-c -v -x -f -z -C] 参数1 参数2 ... 参数N -c&#xff0c;创建压缩文件&#xff0c;用于压缩模式 -v&#xff0c;显示压缩、解压过程&#xff0c;用于查看进度 -x&am…

redis查看耗时久的命令

redis查看耗时久的命令主要有两招&#xff1a;latency和slow log 【latency】 在Redis中&#xff0c;latency命令用于监视和测量Redis实例的延迟。 先进入redis: redis-cli -h 127.0.0.1 -p 24000[查看延迟监视器阈值] CONFIG GET latency-monitor-threshold这个值返回0&…

N9917A|是德科技keysight N9917A微波分析仪

181/2461/8938毫米波频率测量需要精确和谨慎。幸运的是&#xff0c;随着更多的毫米测试设备问世&#xff0c;工程挑战的难度略有下降。信号分析仪现已将同轴器件的直接覆盖范围扩大到110 GHz。这提供了低噪声、高精度和宽带宽的优势&#xff0c;使工程师能够专注于他们的设计和…

ESP32IDF出现Syntax Warning in cmake code at column 47报错

前言 &#xff08;1&#xff09;ESP32的资料还是挺难找的&#xff0c;遇到bug处理起来挺折磨人的。今天分享一个我遇到的bug&#xff0c;以及处理思路。 报错日志 &#xff08;1&#xff09;前天在些博客的时候&#xff0c;做测试发现了一个奇怪的bug&#xff0c;报错日志如下。…

Linux 本地 Docker Registry本地镜像仓库远程连接

目录 Linux 本地 Docker Registry本地镜像仓库远程连接 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程推送Docker Registry 6. 固定Docker Registry公网地址 Linux 本地 Docker Registry本地镜像仓库…

Linux Kernel 之十 虚拟化、VirtIO 架构及规范、VirtQueue VRing

VirtIO 是一种 IO 半虚拟化解决方案&#xff0c;它提供 Guest OS 与 Hypervisor 虚拟化设备之间的通信框架和编程接口。其主要的优势是能提高性能且减少跨平台带来的兼容性问题。本文重点结合 VirtIO 规范 1.1 版以及 Linux 中的源码来分析 VirtIO 框架。 本文是我自己学习虚拟…