使用Java和ChatGPT Api来创建自己的大模型聊天机器人

文章目录

  • 前言
  • ChatGPT Api简析
    • Chat
      • function call
    • Embeddings
  • 制作机器人
    • 上下文
    • 向量数据库
  • 更多场景介绍
    • 扩展阅读

前言

什么是大模型?

大型语言模型(LLM)是一种深度学习模型,它使用大量数据进行预训练,并能够通过提示工程解决各种下游任务。LLM 的出发点是建立一个适用于自然语言处理的基础模型,通过预训练和提示工程的方式实现模型在新的数据分布和任务上的强大泛化能力。LLM 旨在解决自然语言处理中的一些关键问题,例如文本分类、命名实体识别、情感分析等。
LLM 由多个主要组件组成,包括图像编码器、提示编码器和掩码解码器。图像编码器主要用于对输入图像进行编码,以便将其转换为可供模型处理的格式。提示编码器用于将不同类型的提示(如点、框、文本和掩码)表示为模型可以理解的形式。掩码解码器则将图像编码器和提示编码器生成的嵌入映射到分割掩码。
LLM 的训练过程涉及多个步骤,包括预训练、提示工程和微调。在预训练阶段,模型在大量无监督数据上进行训练,以学习自然语言处理中的基本模式和规律。在提示工程阶段,模型根据特定任务的提示进行调整,以使其能够解决该任务。最后,在微调阶段,模型在少量标注数据上进行训练,以进一步优化其性能。
LLM 的优点在于其强大的泛化能力和适用性。由于它们在大量数据上进行预训练,因此它们可以轻松地适应新的数据集和任务,并且只需要很少的微调数据。此外,LLM 还可以应用于多种自然语言处理任务,例如文本分类、命名实体识别、情感分析等。
然而,LLM 也存在一些缺点。首先,由于它们在大量数据上进行预训练,因此它们需要大量的计算资源和时间。其次,LLM 的训练和部署可能需要大量的内存和计算资源,这可能会限制它们的实际应用。

上面一段话是我询问大模型后,大模型给出的一个回答。

大模型英文缩写LLM,全程是Large Language Model(大语言模型)。根据我的理解,大模型就是参数量规模很大的一个语言模型。ChatGPT等大模型的体验效果就是,能很好地进行对话交互,感觉它是一个很聪明“机器人”,有时候甚至根本就感觉不出来它是“机器人”。

这篇文章我们就来介绍一下如何使用chatGPT的Api来构建一个属于自己的大模型聊天机器人。

ChatGPT Api简析

首先来介绍一下chatGPT该如何使用。OpenAI除了给提供了网页的直接交互体验外,还提供了一套完整的API接口,这也是我们能够制造自己机器人的前提。使用这套API接口就能实现和OpenAI能力一样的效果了。这里贴一个需要魔法的官网:官网API文档 和一个不需要的国内网站:API文档中文版。我们重点介绍其中的ChatEmbeddings两个接口。

建议:如果对chatGPT的api比较熟悉,可以跳过这一部分。或者在浏览后面的代码部分感到困惑时再返回来参考。

Chat

这个是聊天接口的url:https://api.openai.com/v1/chat/completions

参数格式是这样的:

{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "Hello!"}]
}

响应体格式是这样的:

{"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"choices": [{"index": 0,"message": {"role": "assistant","content": "  Hello there, how may I assist you today?",},"finish_reason": "stop"}],"usage": {"prompt_tokens": 9,"completion_tokens": 12,"total_tokens": 21}
}

对于请求参数来说,需要在其中的messages里添加内容。role参数描述的是角色,分为system(用于系统指示,比如指示chat gpt要扮演什么角色。此时应该用这个参数。)、assistant(chat gpt返回消息的标识,说明这个message是chat gpt响应的。)、user(一般用户进行对话时应该使用这个角色参数。)和function(下文分析)。content里要放的内容文本,这里就不再多解释了。

对于响应体来说,前面的一堆都可以忽略,重点还是看messages节点,我们只要取到了messages里的消息就够了。

function call

有些时候我们除了和大模型交互外,还希望来点别的东西。比如,我自己数据库里的一些内容,这个大模型总没办法知道的吧?例如,我有一些客户的订单信息,希望当客户在和大模型对话的之后能查到自己的订单相关的内容,这时候要怎么做呢?

首先能确定的是,肯定需要借助外界的力量。我们希望当用户询问订单相关信息时,大模型能够根据我们提供的信息,去我们的数据库中进行查询操作。但是我需要声明一下,让大模型去数据库查询是做不到的。大模型只是相当于一个大脑,单纯有脑子的话,既不能吃饭也不能走路。但是呢,脑子可以下达指令啊!我们希望大模型在识别到客户想要查询订单信息时,告诉我们一下就行,然后我们自己查询完数据库,再把相关的信息告诉大模型,这样不就简介地解决了这个问题吗。

在介绍我们的主角function call之前,先说一下如果没有它该怎么做:我们会给出一个system指令,“当客户想要查询订单信息时,询问客户的姓名和订单号”。我们通过客户的姓名和订单号就能确认出客户的订单信息了。然后这个时候大模型会主动地去询问客户的姓名和订单号。当获取到这两个信息以后,我们再给出一个system指令“将姓名和订单号按照json格式返回,示例如下:{“name”: “张三”, “orderNo”: “0001”}”。这样,我们就能获取到大模型返回的格式化数据了(想想如果不是格式化的数据会怎么样?即便正确返回了信息,我们也根本没有办法去识别)。随后我们将json数据进行解析,然后去数据库里查询,再将查询到的结果给出一个system指令:“客户的订单信息是:买了xxx,在xxx时间,发货地址是xxx”。到这里,大模型就完成了与客户的“外界交流”。

上面的过程一看就是很麻烦的,好在OpenAI给我们开放出了这个function call接口。用function call将上面的例子实现一下就是:

 {"name": "findOrder","description": "通过客户的姓名和订单号,查询客户订单的详细信息。","parameters": {"type": "object","properties": {"name": {"type": "string","description": "客户的姓名"},"orderNo": {"type": "number","description": "客户的订单号"}},"required": ["name", "orderNo"],},}

大脑需要借助这个函数调用来得到这个能力。其中,description是对函数调用的说明,告诉大模型该什么时候来执行这个函数调用。properties节点下的内容是我们要获取的具体参数,如nameorderNo。这两个节点下的description是对参数的说明。是不是和我们开发语言中的函数调用非常的相似?只是将参数和函数的作用的注释告诉了大模型。当大模型根据函数的描述,觉得需要的时候就会进行执行,返回:

{"role": "assistant","function_call": {"name": "findOrder","arguments": "{"name": "张三", "orderNo": "0001"}"}
}

注意哦,这两个属性应该是大模型询问用户后得到的信息。

Embeddings

再介绍一个重量级接口Embeddings。

这个接口是输入一段文本,输出这段文本的向量。使用这个api只能用指定的模型,比如text-embedding-ada-002,这个是专门用来文本转向量的模型。返回结果类似这样的:

{"object": "list","data": [{"object": "embedding","embedding": [0.018990106880664825,-0.0073809814639389515,.... (1024 floats total for ada)0.021276434883475304,],"index": 0}],"model": "text-similarity-ada:002"
}

那么什么是向量呢?其实就是字面意思,向量。我们可以把文本按照一定的规则在三维空间中表示,那么每个文本就都有它在这个规则下对应的向量。比如我要定义:”你好“的向量是[1,0,0],”你好啊“的向量是[1,0,1],比你好多一个啊。当然实际要比这个复杂的多,通过api返回的结果也可见一斑。不过通俗的理解,就是将一段文本用数字进行表示了。有了这个数字,我们就可以根据文本在空间中向量距离由多进来判断这两个文本有多相似了。

制作机器人

有了上面的基础就可以动手制作自己的聊天机器人了。上面的api介绍过了,再介绍一个java封装的api包:github地址。
使用maven导入:

   <dependency><groupId>com.theokanning.openai-gpt3-java</groupId><artifactId>{api|client|service}</artifactId><version>version</version>       </dependency>

使用grdle导入:
implementation 'com.theokanning.openai-gpt3-java:<api|client|service>:<version>

使用起来呢也是非常简单,配置好你的api key就可以直接用了。只需要调用chat completion接口就能实现自己的聊天机器人了。

上下文

携带上下文的方式也很简单,只需要将自己要输入的和大模型返回的都放入那个List<ChatMessage>就可以了。不过需要注意一点,不同的模型允许携带的最大上下文是不同的,对于gpt3.5-turbo只能携带4096个token,这就意味着不能将所有的历史上下文都带上。并且,携带越多的上下文,资费也会越多。

由上下文问题,我们想到了一个解决办法,就是使用前面提到的向量。通常来说,即便用户需要使用上下文,也一般都在3-5论历史对话中选取。这样,我们首先想到的是只携带3-5论历史,对于多余的内容就按时间先后顺序删除掉。但是还有另外一种情况,比如我希望让大模型结合我给出的文档内容,我当然不想每次对话都将文档里的内容全部携带上,并且对于较长的文档来说,也没有办法全部携带。另外,对于长文档提问也具有局部性,往往只会用到文档的一小部分内容。

使用向量就能很好的解决这个问题。首先将我们的文档内容调用向量接口进行向量化,然后存入到我们的数据库中。当想要问问题时,先将问题向量化,然后去库中对比,取取最接近的几条数据交给大模型参考,再返回我们对应问题的答案。

向量数据库

直接使用关系型数据库是很难来保存向量的,因此我们考虑直接使用向量数据库。这种专门存储向量的数据库不仅能提供存储的功能,一般还有比较相似的功能。比如我们可以让它返回库中和一段指定文本最相似的前三个,并且必须高于某个分数。

向量数据库有很多,这里我们介绍一下milvus,这是它的地址。安装等步骤就不再介绍了,按照文档的步骤做就可以了,具体的使用方式在文档里也有比较详细的说明。

安装完后,我们就可以是用它来实现我们上面提到了存储向量的功能l。

更多场景介绍

其实我们算是介绍了大模型的两个应用场景:一个是作为聊天机器人,需要注意的是要想连续对话就需要携带上下文。另外一个是文档的问答助手,需要用到向量数据库来作为仓库存储我们的文档内容。

除此之外,聊天型的大模型还可以有很多的应用呢,比如能够进行文本内容总结,文本信息提取,文章摘要生成等等。总之,大模型对于语言处理能力还是很强的。可以发挥一些想象力来将大模型融入到生活中,提高我们的工作效率和提供生活便捷。

扩展阅读

文章主要是介绍的使用ChatGPT的api来完成,我们还可以部署自己的大模型来实现前面提到的场景。现在有一些开源的大模型,能以“比较”低的成本继续本地化部署使用。虽然由于参数量较小,无法媲美ChatGPT,但总归是数据掌握在自己手里,而且有些场景下费用会更低。

目前比较流行开源的大模型有:

  • ChatGLM2 这是一个由清华大学联合智谱AI开源的模型,github地址。
  • 通义千问 由阿里巴巴开源的大模型
  • Llama2 meta公司开源的大模型,不过对中文的支持较差
  • moss-moon 复旦大学根据流浪地球中moss的灵感起名,也是一个不错的大模型

除了开源模型外,还有一些商业模型,比如科大讯飞的星火大模型,百度的文心一言等。感性的同学可以去网上搜一下,截至目前为止有一些还在内测阶段,需要申请才可能允许使用。

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

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

相关文章

python中的matplotlib画折线图(数据分析与可视化)

先导包&#xff08;必须安装了numpy 、pandas 和matplotlib才能导包&#xff09;&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt核心代码&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.se…

用keil的时候没有安装对应MCU的库,以STM32F103F为例

安装keil的时候没有用到这个芯片就没有安装对应的库。重新安装之后遇到的几个坑&#xff1a; 打开keil显示没有这个型号&#xff0c;解决方法是安装对应的库。STM32F103F要安装Keil.STM32F1xx_DFP.2.4.1.pack。 安装完库之后&#xff0c;点击Option for target&#xff0c;查看…

机器学习-使用 XGBoost 时间序列预测能源消耗

简而言之&#xff0c;时间序列预测是根据以前的历史数据预测未来值的过程。目前使用时间序列预测的最热门领域之一是加密货币市场&#xff0c;人们希望预测比特币或以太坊等流行加密货币的价格在未来几天甚至更长时间内将如何波动。另一个现实世界的案例是能源消耗预测。尤其是…

智能井盖传感器,物联网智能井盖系统

随着城市人口的不断增加和城市化进程的不断推进&#xff0c;城市基础设施的安全和可靠性变得愈发重要&#xff0c;城市窨井盖作为城市基础设施重要组成部分之一&#xff0c;其安全性事关城市安全有序运行和居民生产生活安全保障。 近年来&#xff0c;各地都在加强城市窨井盖治理…

HTTPS 中间人攻击

HTTPS 中间人攻击 中间人攻击过程 通讯过程 客户端——中间人——服务器 过程如下 服务器向客户端发送公钥攻击者截获公钥&#xff0c;保留在自己手上然后攻击者自己生成一个【伪造的】公钥&#xff0c;发给客户端客户端收到【伪造的】公钥后&#xff0c;利用【伪造的】公…

软考高级系统架构设计师系列论文八十六:论企业应用集成

软考高级系统架构设计师系列论文八十六:论企业应用集成 一、企业应用集成相关知识点二、摘要三、正文四、总结一、企业应用集成相关知识点 软考高级系统架构设计师系列之:企业集成平台技术的应用和架构设计二、摘要 2022年10月,我参加了***车站综合信息平台项目的开发,承…

【2023新教程】树莓派定时自动拍照并上传腾讯云对象存储COS

1 换源 仅适用于Release date: May 3rd 2023、Debian version: 11 (bullseye)这个树莓派OS版本&#xff0c;其他版本不保证有效。 首先使用如下命令&#xff0c;查看自己树莓派的架构。 uname -a结果如下&#xff1a; 如果红圈处显示为aarch64&#xff0c;使用命令sudo na…

【TypeScript】声明文件

在 TypeScript 中&#xff0c;声明文件&#xff08;Declaration Files&#xff09;用于描述已有 JavaScript 代码库的类型信息&#xff0c;以便在 TypeScript 项目中使用这些代码库时获得类型支持。 当你在 TypeScript 项目中引用外部 JavaScript 模块或库时&#xff0c;可能会…

设计模式之组合模式(Composite)的C++实现

1、组合模式的提出 在软件开发过程中&#xff0c;使用者Client过多依赖所操作对象内部的实现结构&#xff0c;如果对象内部的实现结构频繁发生变化&#xff0c;则使用者的代码结构将要频繁地修改&#xff0c;不利于代码地维护和扩展性&#xff1b;组合模式可以解决此类问题。组…

mybatis升级到mybatis-plus

升级plus mybatis升级到mybatis-plus&#xff0c;两个共存 之前依赖只有mybatis,没有plus 做法&#xff1a; 排除mybatis部门依赖&#xff0c;添加新的plus 修改之后的依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-b…

【蔚来汽车】蔚来20220713第三题-旅游规划 <模拟、滑动窗口>

【蔚来汽车】蔚来20220713第三题-旅游规划 牛牛对 n 个城市旅游情况进行了规划&#xff0c;已知每个城市有两种属性 x 和 y &#xff0c;其中 x 表示去第 i 号城市的花费&#xff0c;y 表示在第 i 号城市游玩后会得到的开心值。   现在牛牛希望从中挑选出一些城市去游玩&…

A Survey on Large Language Models for Recommendation

本文是LLM系列的文章&#xff0c;针对《A Survey on Large Language Models for Recommendation》的翻译。 大模型用于推荐的综述 摘要1 引言2 建模范式和分类3 判别式LLM用于推荐4 生成式LLM用于推荐5 发现6 结论 摘要 大型语言模型&#xff08;LLM&#xff09;作为自然语言…

ChatGPT计算机科学与技术专业的本科毕业论文,2000字。论文查重率低于30%。

目录 摘要 Abstract 绪论 1.1 研究背景 1.2 研究目的和意义 2.1 ChatGPT技术概述 2.2 ChatGPT技术的优缺点分析 2.2.1 优点 2.2.2 缺点 摘要 本论文围绕ChatGPT展开&#xff0c;介绍了该技术的发展历程、特点及应用&#xff0c;分析了该技术的优缺点&#xff0c;提出了…

【IDEA配置创建类注释模板和方法模板教程】

IDEA配置创建类注释模板和方法模板教程 废话不多说直接上干货 废话不多说直接上干货 先看效果: 类: 方法: IDEA类注释模板 &#xff0c;配置步骤&#xff1b; 直接用模板: /*** description: ${description}* author: Lynn.OuYang* create: ${YEAR}-${MONTH}-${DAY} ${HOU…

uniapp 使用 mui-player 插件播放 m3u8/flv 视频流

在UniApp中使用mui-player插件播放M3U8/FLV视频流&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 安装mui-player插件 &#xff1a;在UniApp项目根目录下&#xff0c;使用命令行工具执行以下命令安装mui-player插件&#xff1a; npm install mui-player --save2. 在需…

期权分仓开户资金是否安全?具体保障措施有哪些?

网上关于期权分仓系统的真假一直都没有定论&#xff0c;两方人的争论也让很多没有接触过期权分仓系统的人摸不着头脑&#xff0c;那么期权分仓靠谱吗&#xff1f;资金在里面安全吗&#xff1f;下文为大家科普期权分仓开户资金是否安全?具体保障措施有哪些&#xff1f; 一、期权…

LLMs领域适应的预训练Pre-training for domain adaptation

到目前为止&#xff0c;我强调了在开发应用程序时&#xff0c;您通常会使用现有的LLM。这为您节省了大量时间&#xff0c;并可以更快地得到一个工作原型。 但是&#xff0c;有一种情况下&#xff0c;您可能会发现有必要从头开始预训练自己的模型。如果您的目标领域使用的词汇和…

【鞋服零售ERP】之要货申请单设计思路

引言 要货申请单在本系统中也是一张较为核心的单据&#xff0c;整体的思路是将其池化&#xff0c;解决收发货方业务简化&#xff0c;账务处理逻辑化的设计理念。首先鞋服零售ERP就是基于多组织的业务架构&#xff0c;多销售组织和店铺属性&#xff1b;其次是在零售如何在业处处…

开源容灾备份软件,开源cdp备份软件

数据的安全性和完整性面临着硬件问题、黑客攻击、人为错误等各种威胁。在这种环境下&#xff0c;开源容灾备份软件应运而生&#xff0c;通过提供自动数据备份和恢复&#xff0c;有效地保证了公司的数据安全。 一、开源容灾备份软件的定义和作用 开源容灾备份软件是一种基于开源…

zookeeper选举流程源码分析

zookeeper选举流程源码分析 选举的代码主要是在QuorumPeer.java这个类中。 它有一个内部枚举类&#xff0c;用来表示当前节点的状态。 public enum ServerState {LOOKING, FOLLOWING, LEADING, OBSERVING;}LOOKING: 当前节点在选举过程中 FOLLOWING&#xff1a;当前节点是从节…