asp做微网站设计,正规教育培训机构,只做鱼网站,傻瓜式网站开发工具文章目录 前言ChatGPT Api简析Chatfunction call Embeddings 制作机器人上下文向量数据库 更多场景介绍扩展阅读 前言
什么是大模型#xff1f; 大型语言模型#xff08;LLM#xff09;是一种深度学习模型#xff0c;它使用大量数据进行预训练#xff0c;并能够通过提示工… 文章目录 前言ChatGPT Api简析Chatfunction 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文档中文版。我们重点介绍其中的Chat、Embeddings两个接口。
建议如果对chatGPT的api比较熟悉可以跳过这一部分。或者在浏览后面的代码部分感到困惑时再返回来参考。
Chat
这个是聊天接口的urlhttps://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要扮演什么角色。此时应该用这个参数。、assistantchat 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节点下的内容是我们要获取的具体参数如name和orderNo。这两个节点下的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导入 dependencygroupIdcom.theokanning.openai-gpt3-java/groupIdartifactId{api|client|service}/artifactIdversionversion/version /dependency使用grdle导入 implementation com.theokanning.openai-gpt3-java:api|client|service:version
使用起来呢也是非常简单配置好你的api key就可以直接用了。只需要调用chat completion接口就能实现自己的聊天机器人了。
上下文
携带上下文的方式也很简单只需要将自己要输入的和大模型返回的都放入那个ListChatMessage就可以了。不过需要注意一点不同的模型允许携带的最大上下文是不同的对于gpt3.5-turbo只能携带4096个token这就意味着不能将所有的历史上下文都带上。并且携带越多的上下文资费也会越多。
由上下文问题我们想到了一个解决办法就是使用前面提到的向量。通常来说即便用户需要使用上下文也一般都在3-5论历史对话中选取。这样我们首先想到的是只携带3-5论历史对于多余的内容就按时间先后顺序删除掉。但是还有另外一种情况比如我希望让大模型结合我给出的文档内容我当然不想每次对话都将文档里的内容全部携带上并且对于较长的文档来说也没有办法全部携带。另外对于长文档提问也具有局部性往往只会用到文档的一小部分内容。
使用向量就能很好的解决这个问题。首先将我们的文档内容调用向量接口进行向量化然后存入到我们的数据库中。当想要问问题时先将问题向量化然后去库中对比取取最接近的几条数据交给大模型参考再返回我们对应问题的答案。
向量数据库
直接使用关系型数据库是很难来保存向量的因此我们考虑直接使用向量数据库。这种专门存储向量的数据库不仅能提供存储的功能一般还有比较相似的功能。比如我们可以让它返回库中和一段指定文本最相似的前三个并且必须高于某个分数。
向量数据库有很多这里我们介绍一下milvus这是它的地址。安装等步骤就不再介绍了按照文档的步骤做就可以了具体的使用方式在文档里也有比较详细的说明。
安装完后我们就可以是用它来实现我们上面提到了存储向量的功能l。
更多场景介绍
其实我们算是介绍了大模型的两个应用场景一个是作为聊天机器人需要注意的是要想连续对话就需要携带上下文。另外一个是文档的问答助手需要用到向量数据库来作为仓库存储我们的文档内容。
除此之外聊天型的大模型还可以有很多的应用呢比如能够进行文本内容总结文本信息提取文章摘要生成等等。总之大模型对于语言处理能力还是很强的。可以发挥一些想象力来将大模型融入到生活中提高我们的工作效率和提供生活便捷。
扩展阅读
文章主要是介绍的使用ChatGPT的api来完成我们还可以部署自己的大模型来实现前面提到的场景。现在有一些开源的大模型能以“比较”低的成本继续本地化部署使用。虽然由于参数量较小无法媲美ChatGPT但总归是数据掌握在自己手里而且有些场景下费用会更低。
目前比较流行开源的大模型有
ChatGLM2 这是一个由清华大学联合智谱AI开源的模型github地址。通义千问 由阿里巴巴开源的大模型Llama2 meta公司开源的大模型不过对中文的支持较差moss-moon 复旦大学根据流浪地球中moss的灵感起名也是一个不错的大模型
除了开源模型外还有一些商业模型比如科大讯飞的星火大模型百度的文心一言等。感性的同学可以去网上搜一下截至目前为止有一些还在内测阶段需要申请才可能允许使用。