使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

这篇具有很好参考价值的文章主要介绍了使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

文章博客地址:套路猿-使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

流程

使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

  1. 将数据集 通过 openai embedding 得到向量+组装payload,存入 qdrant
  2. 用户进行问题搜索,通过 openai embedding 得到向量,从 qdrant 中搜索相似度大于0.8的数据
  3. 从 qdrant 中取出相似度高的数据
  4. 将获取到的QA,组装成 prompt 向chatgpt进行提问,得到回答

向量数据库 qdrant

  • qdrant 是一个开源的向量搜索引擎,支持多种向量距离计算方式
  • 官方文档:https://qdrant.tech/documentation/quick_start/
  • 本节 介绍 qdrant 都是基于官方文档的例子,如已熟悉可以直接阅读下一节 [数据导入k8s知识库]

安装 qdrant

docker 安装

docker pull qdrant/qdrant && \
docker run -p 6333:6333 -p 6334:6334 qdrant/qdrant

collection 说明

collection 是 qdrant 中的一个概念,类似于 mysql 中的 database,用于区分不同的数据集合
官方文档:https://qdrant.tech/documentation/collections/#collections
collection 下面是 collection 字段说明,以创建 collection 为例

PUT /collections/{collection_name}
{
    "name": "example_collection",
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

name: collection 名称
vectors: 向量的配置
size: 向量的维度
distance: 向量的距离计算方式,Cosine(余弦距离), Euclidean(欧式距离),Dot product(点积)
如果需要将 openai embedding 后 存入 qdrant,需要将 size 设置为 1536openai embedding

插入数据

这个是官网 http add point 的例子,可以看到 payload 是可以存储任意的 json 数据,这个数据可以用于后续的过滤

curl -L -X PUT 'http://localhost:6333/collections/test_collection/points?wait=true' \
    -H 'Content-Type: application/json' \
    --data-raw '{
        "points": [
          {"id": 1, "vector": [0.05, 0.61, 0.76, 0.74], "payload": {"city": "Berlin" }},
          {"id": 2, "vector": [0.19, 0.81, 0.75, 0.11], "payload": {"city": ["Berlin", "London"] }},
          {"id": 3, "vector": [0.36, 0.55, 0.47, 0.94], "payload": {"city": ["Berlin", "Moscow"] }},
          {"id": 4, "vector": [0.18, 0.01, 0.85, 0.80], "payload": {"city": ["London", "Moscow"] }},
          {"id": 5, "vector": [0.24, 0.18, 0.22, 0.44], "payload": {"count": [0] }},
          {"id": 6, "vector": [0.35, 0.08, 0.11, 0.44]}
        ]
    }'
  • id:唯一
  • vector:向量,可在HuggingFace 找相应的模型训练,获取,也可以 openai embedding 得到
  • payload:任意的自定义 json 数据

搜索数据

这是 qdrant 官方搜索数据的例子

curl -L -X POST 'http://localhost:6333/collections/test_collection/points/search' \
    -H 'Content-Type: application/json' \
    --data-raw '{
        "vector": [0.2,0.1,0.9,0.7],
        "limit": 3
    }'

vector:向量,通过 openai embedding 得到
limit:返回的数据条数

数据导入k8s知识库

// 模拟数据集 question:answer
var questions = []string{
	"什么是Kubernetes中的Deployment?",
	"Kubernetes中的Service有什么作用?",
}

var answers = []string{
	"Deployment是Kubernetes中用于管理应用程序副本的资源对象。它提供了副本的声明性定义,可以实现应用程序的部署、扩展和更新。",
	"Service用于定义一组Pod的访问方式和网络策略。它为Pod提供了一个稳定的网络地址,并可以实现负载均衡、服务发现和内部通信。",
}

func main() {
// 第一步:自己创建 一个collection:  kubernetes
	var err error
	err = qdrant.Collection("kubernetes").Create(1536)
	if err != nil {
		log.Fatalln("创建collection出错:", err.Error())
	}

	points := []*pb.PointStruct{}
	// 批量 进行BuildQdrantPoint
	for index, question := range questions {
		if index < 9 {
			continue
		}
		p, err := BuildQdrantPoint(question, answers[index])
		if err != nil {
			log.Fatalln("创建point出错:", err.Error())
		}
		fmt.Println(p.Id)
		points = append(points, p)

	}
	err = qdrant.FastQdrantClient.CreatePoints("kubernetes", points)
	if err != nil {
		log.Fatalln("批量创建point出错:", err.Error())
	}
}
  • 模拟数据集,将数据集导入到 k8s 知识数据库中
  • BuildQdrantPoint 函数是将问题和答案转换成 qdrant 的 point
  • 其中 vector 是通过 openai embedding 得到的,这里使用的是 openai embedding

搜索数据

代码实现

import (
	"fmt"

	myai "embedding-knowledge-base/ai"
	"embedding-knowledge-base/qdrant"
)

func main() {
	prompt := "什么是Kubernetes中的DaemonSet?"
	// prompt := "苹果不削皮能吃吗"
	p_vec, err := myai.SimpleGetVec(prompt)
	if err != nil {
		panic(err)
	}
	points, err := qdrant.FastQdrantClient.Search("kubernetes", p_vec)
	if err != nil {
		panic(err)
	}

	fmt.Printf("用户的问题是:%s\n", prompt)
	if points[0].Score < 0.8 {
		fmt.Println("违规问题或者超纲问题")
		return
	}
	answer := points[0].Payload["answers"].GetStringValue()
	fmt.Printf("知识库答案是:%s\n", answer)
	tmpl := "question: %s\n" + "reference answer: %s\n"
	finalPrompt := fmt.Sprintf(tmpl, prompt, points[0].Payload["question"].GetStringValue(), answer)
	fmt.Println("------------------------")
	fmt.Printf("结合知识库参考答案:chatgpt的回答是:%s\n", myai.K8sChat(finalPrompt))
	// 不结合知识库参考答案
	fmt.Printf("不依赖本地知识库, chatgpt的直接回答是:%s\n", myai.K8sChat(prompt))
}
  • 通过 prompt 搜索qdrant 知识库,如果相似度小于 0.8,有可能是用户乱提问,或问知识库无关的问题,直接返回
  • 取相似度度大于 0.8,则取第一条数据,组装成promot向gpt进行提问,得到回答
  • 具体的实现可以参考 main.go 的代码

示例

  1. 问无关的问题,比如:苹果不削皮能吃吗
    使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库
    可以看到 相似度太低,提示违规问题或者超纲问题
  2. 问k8s 本地知识库的问题,比如:什么是Kubernetes中的Deployment?
    使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库
  3. 问k8s本地知识库的问题,但单独向chatgpt提问,得到的答案 并不是已定与k8s相关,比如问 网关是什么
    使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库
  • 可以看到,红线部分,是直接将用户问题 向 chatgpt 请求 得到的答案,跟k8s无关
  • 红线前面的回答:是正确的,结合k8s本地知识库,可以让回答偏向 数据集设定的主题

示例源码地址及使用

源码地址:embedding-knowledge-base
进入根目录,将目录 ai/common.go 的 以下 const改成自己的文章来源地址https://www.toymoban.com/news/detail-473819.html

    SocksProxy = "socks5://127.0.0.1:1080"
	AIKey      = "your api key"

docker 安装 qdrant

make install-qdrant

数据集导入qdrant

  • 导入 adrant,我这边就是模拟 了十几条k8s相关的问题,在 prebuild/prebuild.go
  • 更多的数据集,需要自己用脚本抓取,然后导入qdrant
make import-qdrant

搜索

make search

到了这里,关于使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DevOps基于k8s发布系统的实现

    首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里。 在微服务、DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情。虽然市面上目前已经存在了比较成熟的自动化构建工具,比如jekines,还有一些商业公司推出的自动化构建工具

    2023年04月09日
    浏览(39)
  • k8s 基于MutatingWebhookConfiguration实现node超卖和sidecar注入

    源码在:https://github.com/Seaiii/MutatingWebhook我写了几个脚本,可以直接运行。 MutatingWebhookConfiguration 是 Kubernetes 中的一种资源对象,用于配置 Mutating Admission Webhook。Mutating Admission Webhook 是一种 Kubernetes 的扩展机制,用于在对象被持久化到 etcd 存储之前,对其进行动态修改或补充。

    2024年02月12日
    浏览(25)
  • 基于k8s job设计与实现CI/CD系统

    方案一:Jenkins+k8s+CICD 方案二:kaniko+k8s job+CICD CICD 基于K8s Job设计流水线 CI方案 工具镜像 云原生镜像打包工具 kaniko的使用 与Jenkins对比  可用性与易用性 Jenkins存在Master调度瓶颈 企业研发流程的自定义 添加自定义流程 代码合并漏了的问题 CI系统:drone ci CI系统:argo cd 设计方

    2024年02月12日
    浏览(40)
  • Kubernetes(k8s)实战:使用k8s+jenkins实现CICD

    CIDI(Continuous Integration,Continuous Delivery Deployment),持续集成,持续部署,持续发布。 也就是说,在本地开发完代码之后,push到远程仓库,然后代码打包、部署的这个过程完全是自动化完成的。 但是我们不要进入一个误区,CICD并不意味着一定就是这一套流程,只要实现了代

    2024年02月12日
    浏览(41)
  • 基于k8s搭建mysql5.7主从集群实现读写分离

    一,准备工作 1,拥有一个运行中的k8s集群 2,拥有一个ceph分布式存储集群,此mysql集群基于ceph块存储,部署方案可参考我前面的rook部署ceph方案 二,集群搭建 1,创建存储类storageclass       将此 StorageClass 定义保存为 storageclass.yaml : 创建存储类   2,MySQL 部署包含一个 Con

    2024年02月08日
    浏览(33)
  • Golang之selenium+k8s部署玩转模拟手机页面监控

    随着互联网的快速发展,用户更多的会去通过手机端去接触我们开发的产品。我们可以通过微服务,中间件,网络,甚至基于日志对我们的平台稳定性进行监控,当出现告警时,我们可以及时准确的定位系统出现的问题。 然而,当我们对底层能力做好监控时,我们并不能确保

    2024年02月04日
    浏览(41)
  • Kubectl-AI: 一款 OpenAI GPT 自动生成应用 K8s yaml神器

    首页: 官网 下载安装 kubectl-ai需要OpenAI API密钥或Azure OpenAI服务 API密钥和端点以及有效的Kubernetes配置 OpenAI和Azure OpenAI,您可以使用以下环境变量: 支持以下模型: code-davinci-002 text-davinci-003 gpt-3.5-turbo-0301(Azure的部署必须命名为gpt-35-turbo-0301) gpt-3.5-turbo gpt-35-turbo-0301 开始测试

    2024年02月03日
    浏览(43)
  • 基于K8s环境·使用ArgoCD部署Jenkins和静态Agent节点

    今天是「DevOps云学堂」与你共同进步的第  47 天 第⑦期DevOps实战训练营· 7月15日已开营 实践环境升级基于K8s和ArgoCD 本文节选自第⑦期DevOps训练营 , 对于训练营的同学实践此文档依赖于基础环境配置文档, 运行K8s集群并配置NFS存储。实际上只要有个K8s集群并安装好Ingress、

    2024年02月15日
    浏览(34)
  • golang/云原生/Docker/DevOps/K8S/持续 集成/分布式/etcd 教程

    3-6个月帮助学员掌握golang后端开发岗位必备技术点 教程时长: 150+小时 五大核心专栏,原理+源码+案例分析+项目实战直击工作岗位 golang:解决go语言编程问题 工程组件:解决golang工程化问题 分布式中间件:解决技术栈单一及分布式开发问题 云原生:解决云原生分布式部署及监

    2024年02月07日
    浏览(64)
  • 最后的组合:K8s 1.24 基于 Hekiti 实现 GlusterFS 动态存储管理实践

    知识点 定级: 入门级 GlusterFS 和 Heketi 简介 GlusterFS 安装部署 Heketi 安装部署 Kubernetes 命令行对接 GlusterFS 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同) 主机名 IP CPU 内存 系统盘 数据盘 用途 ks-master-0 192.168.9.91 2 4 50 100 KubeSphere/k8s-master ks-master-1 192.168.9.92 2 4 5

    2024年02月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包