OpenAI Embedding:快速实现聊天机器人(二)

news2024/11/25 4:25:40

theme: orange

本文正在参加「金石计划」

接上文OpenAI Embedding:快速实现聊天机器人(一)有讲到聊天机器人的一些概念,这篇开始讲讲这个聊天机器人的架构和流程。

总架构图

这里我参照一个现成的架构图来讲如何实现,其是基于Azure多个相关云服务实现的Q\&A问答系统(Azure OpenAI Embeddings QnA)。

image.png

在这个场景中,Azure OpenAI 服务从文档中创建嵌入向量Embedding。为了回答用户的问题,它检索最相关的文档,然后使用 GPT-3 提取问题对应匹配答案。

知识数据准备

image.png

Knowledge BaseAzure Translator 整个流程都是在讲如何处理知识数据,最终得到多条合理大小长度以及逻辑自洽的文本。需要注意的是在流程中额外用到了Azure 提供的认知服务和翻译服务,咱们不用关心。在实践过程中,记住一点,最初你手上有大量长短不一相关业务的知识文本,咱们要想办法预处理。包括控制文本长度、移除不必要的标点符号、用滑动窗口算法增加文本之间的关联性。

滑动窗口算法增加文本之间的关联性,即增加上下文关系。可能有些朋友不清楚,举个例子,下面我用苏轼的诗句《赏花归》来解释下:

赏花归去马如飞, 去马如飞酒力微。 酒力微醒时已暮, 醒时已暮赏花归。

该后一句诗的前四个字,是对前一句最后四个字的重复,最后一句的最后四个字,又是对第一句前四个字的重复,这样便上下承接,前后关联。咱们即使将这句诗拆成四句分别去计算Embedding向量,但是GPT在处理文本关系的时候仍然能够将其关联起来,其在后面的章节fine-tuning 模型训练时特别有用。

核心Embedding存储和搜索

image.png

图上这块就是咱们要讲的的核心,使用上面预处理的文本得到的文本集合,分别使用Azure OpenAI Servicetext-embedding-ada-002模型,将每个文本转化为一个1536维的Embedding向量,并存储在Redis数据库中。

需要特别注意的是,此Redis数据库除了具备自身缓存的能力外,还额外安装了Redis Search Module,以支持使用数据时的向量相似度搜索。如果你不想使用Redis,还可以选择Postgresql;甚至你可以选择在存储在csv中,当需要向量相似度搜索时,将数据加载到内存中,然后使用一些库函数,比如余弦相似度算法进行遍历后比较查询。

用户提出问题和获取答案

image.png

最后一块流程是用户的使用场景。用户提出问题,使用Azure Embedding 模型将问题转换成Embedding 向量,然后到 Redis 数据库进行相似度查询,返回Top K最相似的文本,再加上原始问题构建一个新的Prompt,使用Azure OpenAIGPT-3.5/Text-davinci模型进行文本加工和提炼,用户便能得到最贴切的答案。

构建出的新Prompt的格式参考如下:\ text1,text2...textK。基于上面的内容,假如你是一个智能客服xx,请回答问题:question?


提示:虽然上面提到的是Azure OpenAI,没有讲到原生的OpenAI,但实际上两者在本质上并无区别,只是Azure OpenAI在合规安全、企业级解决方案等方面更加完善些。我在后面的章节将会持续使用Azure OpenAI来完成例子的讲解。

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

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

相关文章

香港进出口报关指南

由于香港优越的地理位置和政策支持,大部分外贸货物通过香港出口到世界各地。与内地海关相比,香港报关更简单快捷。司机可根据内地舱单填写一份香港进/出口舱单(俗称司机纸)进出香港海关,并在货物抵港后14天内申报。 香港进出口报关需要提供哪…

单机/集群/热备/磁盘阵列(RAID)的区别详解

一、单机部署(stand-alone) 单个服务器,只有一个饮水机提供服务,服务只部署一份。 二、集群部署(cluster) 服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有…

MySQL连接空闲时间超过8小时报错原因与延伸知识

1 错误原因 1.1 两个参数 MySQL服务端两个参数控制连接超时时间: wait_timeoutinteractive_timeout1.1.1 如何查看 show global variables like interactive_timeout show global variables like wait_timeout 复制代码 1.1.2 含义与区别 wait_timeout&#xf…

JAVA System.nanoTime()与GO time.Now().UnixNano()区别

JAVA System.nanoTime() public static void main(String[] args) {long nano System.nanoTime();System.out.println(nano);} 输出:701863191254000,这个值有点奇怪,System.currentTimeMillis()不是System.nanoTime()的1000000倍。 这个值…

【springcloud开发教程】路由网关——zuul

官方资料:https://github.com/Netflix/zuul/ 什么是Zuul? Zuul包含了两个主要的功能:路由和过滤 路由功能将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预&#…

Ubuntu环境安装指定版本的docker 和一键卸载dockerdocker-compose

一、环境 我的linux系统是Ubuntu 22.04 二、开始安装 卸载旧版 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本: $ sudo apt-get remove docker docker-engine docker-ce docker.io更新apt包索引 $ sudo apt-get update安装以下…

基础工业工程(易树平、郭伏)——第四章 程序分析

第四章 程序分析 第一节 程序分析概述 一、程序分析的概念、特点及目的 1.程序分析的概念 程序分析是一种重要的生产管理工具,它是依照工作流程,从第一个工作地到最后一个工作地,全面地分析有无多余、重复、不合理的作业&…

【单片机/普中A2】学习笔记3-数码管

数码管主要概念 参考文献:点击前往 数码管分类 字形重叠数码管:将不同数字、字母与符号重叠,需要用到那个就显示那个 分段式数码管:最常见的数码管,按照笔画来显示,主要有七段式和八段式数码管 点矩阵式…

JavaScript 代码整洁之道

文章目录概述篇变量篇函数篇注释篇异常处理篇复杂判断函数篇重构篇参考资料概述篇 书写能让人读懂的代码使用英语编写代码团队协作 制定通用的规则,依靠工具让团队的代码风格保持统一,要让代码看起来是由一个人编写的,消除个人的代码风格。…

这么好看的客服组件,还是觉得接入ChatGPT,把它放在博客中那就完美了

我们在使用ChatGPT时,它的返回方式是采用流式回复。感觉这个效果不错。之前做的全都是的等全部结果请求完成,再一次性返回给用户。今天就通过流式回复的效果重写之前的程序。 前端 前端采用一个网页版的客服组件,整体的效果如下:…

小白学Pytorch系列- -torch.distributions API Transforms (2)

小白学Pytorch系列- -torch.distributions API Transforms (2) AbsTransform AffineTransform 通过逐点仿射映射进行转换yloc⁡scale xy\operatorname{loc}\text { scale } \times xyloc scale x loc (Tensor or float) : 位置参数scale (Tensor or float) : 尺度参数event…

k8s Deployment

一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod rs v1控制三个pod,删除一个pod,在rs v2上重新建立一个,依次类推,直到全部都是由rs v2控制,如果rs v2有问题,还可以…

Spark on Yarn(client和cluster模式,spark-shell 和 spark-submit 的区别,WorldCount实现与理解)

文章目录Spark on Yarn两种模式clientclusterspark-shell 和 spark-submit 的区别的理解spark-shellspark-submitWorldCount实现IDEA本地实现On Yarn 实现WorldCount图解Spark on Yarn spark on yarn 的两种模式是指 spark 应用程序的 driver 进程(负责控制和协调整…

JAVA8的Optional类,还用 != null 判空?

在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user.getAddress().getProvince(); 这种写法,在…

springboot整合mybatis(idea)

从idea新建项目 选择spring启动* help、mvnw 文件可以删除 springBoot3.0需要的最小JDK是JDK17,当低于17的时候会报错。 改成2.7.6 新建控制层Controller、Mapper层和Model文件夹 必须在springBoot启动项下面新建,不然无法识别。 允许XML进入target…

Java - 泛型

一、什么是泛型? 一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。如果要编写可以应用于多种类型的 代码,这种刻板的限制对代码的束缚就会很大。----- 来源《Java编程思想》对泛型的介绍。 泛型是在JDK1.5…

初次使用yolov8遇到的问题

记录第一次使用yolo8跑自己的数据; 首先将官方文档看一下,大概捉摸了2个小时,地址:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > CoreML > TFLite 获得了基本的一些了解&#x…

$\Beta$分布推导与可视化

$\Gamma$函数 $\Gamma$函数(Gamma函数)是阶乘函数在实数和复数域的扩展。对于正整数$n$,阶乘函数表示为$n! 1 \times 2 \times ... \times n$。然而,这个定义仅适用于正整数。Gamma函数的目的是将阶乘扩展到实数和复数域,从而计算实数和复数…

代码随想录【链表】--->删除倒数第N个节点、链表相交、环形链表

⭐️代码随想录⭐️ 数组篇: 二分查找 移除数组 有序数组的平方 长度最小的数组 螺旋矩阵 链表篇: 链表移除 设计链表 反转链表 交换链表中的节点 文章目录19. 删除链表的倒数第 N 个结点思路代码面试题 02.07. 链表相交思路代码142. 环形链表 II思路判断链表有环确…

ARM 制作简易的根文件系统

一、根文件系统概述 1、为什么需要根文件系统 (1) init 进程这个应用程序,在根文件系统上。 (2) 根文件系统提供了根目录:/。 (3) 内核启动后的应用层配置(/etc 目录),在根文件系统上。几乎可以认为:发行版 内核 rootfs。 …