无聊写个 chatgpt 玩玩!这不得试一试 openai 的聊天和绘画功能

news2024/11/15 4:36:18

chatgpt 最近很火。使用 chatgpt 问一些问题还是很有用的。比如面试题,面试题的答案。简直不要太爽。

不过闲来无事,也使用 openai 提供的api ,写了几个小页面,可以进行聊天,和绘画。

项目放在 github 上了:https://github.com/wtdsn/chat-draw-by-openai

先看看页面吧!

image.png image.png

ok ,话不多说,说说整个过程吧

API 文档

地址 :https://platform.openai.com/docs/api-reference

可以看到,openai 提供了许多的 api 。它甚至提供了 openai 的 npm 包 。并且给了一些使用例子。

当然可以直接使用 openai 提供的 node 模块。可以省去一堆麻烦事。

在node 中怎么使用,看文档就可以了

调用这些 api ,需要一个 apikey 。需要注册 openai 账号。
注册后在 : https://platform.openai.com/account/api-keys 生成 apikey ,并且把它记下来就可以了。

不过这些 api 接口并不是免费的。请求会消耗一些 token ,这些 token 是花钱的。当然新用户有 5美元。能用很久

项目搭建

此项目的搭建呢!我使用了 vite 。不得不说 , vite 确实方便。

项目结构

key.txt 我记录了 apikey 。 github 中没有,丢上去就失效!

image.png

我写了三个页面

entry.html : 入口页面。输入 apikey ,然后选择去聊天或者去生成图画。

index.html : 聊天页面

draw.html : 生成图画页面

具体的一些 css ,或者如何生成聊天内容。具体就看 js 文件就行了

使用服务端推送

我注意到,chatgpt 回复的内容,是一点一点生成的。但是它可不是故意的。而是这样子用户感知上会比较快。
如果等全部内容都回复完再显示,可能需要等上好几秒。

在 chat 的api中,提供了一个 stream 参数 。那么服务端在回复的时候,是使用服务端推送的,也就是数据是一点一点推送过来的。而不是一次性返回!这样子可以快速的渲染出一些回复的内容,而不需要等待全部生成完再渲染

具体可以了解一下 :EventSource

不过, fetch api 可以处理返回的流数据。倒也不用使用 EventSource 了。

使用例子

FetchH 类 , 对 fetch 进行封装。这里参考了 axios 的一些思路。在请求时,就可以避免重复的配置

class FetchH {
  constructor(url, config = {}) {
    if (typeof url === 'string') {
      config.url = url
    } else if (typeof url === 'object') {
      config = url
    }
    this.config = config
  }

  request(body) {
    // 合并请求参数
    let d = {
      ...this.config.body,
      ...body
    }

    return fetch(this.config.url, {
      method: this.config.method,
      headers: this.config.headers,
      body: JSON.stringify(d)
    })
  }
}

// 返回函数,可直接调用
function createFetchH(url, config) {
  let fh = new FetchH(url, config)
  return (fh.request).bind(fh)
}

// 创建 fetch
fetchH = createFetchH('https://api.openai.com/v1/chat/completions', {
    method: "POST",
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer ' + apiKey,
    },
    body: {
      model: "gpt-3.5-turbo",
      temperature: 0.3,
      stream: true,
      max_tokens: 1000
    }
})

sendMsg 发送请求 (有删减)

async function sendMsg() {
  fetchH({ messages: chatStack })
    .then(res => {
      // 获取 reader
      return res.body.getReader()
    })
    .then(reader => {
      // 读取内容
      return getStream(reader)
    })
}

getStream 读取数据

function getStream(reader, textEl) {
  let ans = '', _role = ''
  // 文本转码
  const utf8Decoder = new TextDecoder("utf-8");

  return _getStream()

  // 读取流数据
  function _getStream() {
    return reader.read().then(function (result) {
      // 如果数据已经读取完毕,直接返回
      if (result.done) {
        return {
          role: _role,
          content: ans
        }
      }

      let { role, content } = parseText(utf8Decoder.decode(result.value))
      if (role) {
        _role = role
      }
      if (content) {
        ans += content
      }

      // 逐步添加文字
      requestAnimationFrame(() => {
        textEl.innerHTML = parse(ans)
        scroll()
      })

      // 还有数据,继续读取
      return _getStream();
    })
  }
}

parseText 解析文本 , 获取后的数据是字符串。可能有多个 data , 进行进行分割

function parseText(text) {
  let info = {
    content: ''
  }
  // 默认以 \ndata 进行分割 (可能有问题)
  text.split(/\n(?=data:)/).forEach(v => {
    if (v === 'data: [DONE]\n\n') {
      return ''
    }

    let { role, content } = JSON.parse(v.slice(6)).choices[0].delta
    if (role) {
      info.role = role
    }

    if (content) {
      info.content += content
    }
  })
  return info
}

依赖包

文本的显示,使用了 marked 库。它可以把 markdown 的字符串内容转换成 html 格式的字符串。

还使用了节流 。节流使用了 utils-h 。当然这个包还提供了许多的工具函数。有兴趣可以去了解了解

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

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

相关文章

cmake和cmake install学习

cmake 设置cmake的C/C编译标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11)add_library生成的默认是静态库还是动态库 https://blog.csdn.net/HandsomeHong/article/details/122401900 add_library()命令生成的默认库类型取决于第二个参数。如果第二个参数是STATI…

python-day3

第003天 函数和模块的使用 定义函数 在python中可以使用def关键字来定义函数,和变量一样每个函数也有一个名字,而且命名规则和变量的命名规则是一致的。在函数名后面的圆括号中可以放置传递给函数的参数,程序中函数的参数就是相当于数学上…

企业级信息系统开发学习笔记05 初探Spring AOP

文章目录 一、学习目标二、Spring AOP(一)AOP基本含义(二)AOP基本作用(三)AOP和OOP对比(四)AOP使用方式(五)AOP基本概念 三、采用配置方法使用AOP&#xff08…

STM32实验-高级定时器输出指定个数PWM

STM32F103ZET6中有TIM1,TIM8两个高级定时器,每一定时器都有 1、一个16位向上、向下、向上/下自动装载计数器 2、一个16位预分频器和四个独立从输入输出通道 3、每一个通道都可用于输入捕获、输出比较、PWM和单脉冲模式(除了基本定时器,高级定…

Cesium-源码修改-gltf增加纹理贴图改变3dtiles外观

一、需求 Cesium支持加载gltf和3dtiles等三维数据模型,实现了很好的封装,往往只需要给一个uri就能加载模型文件,并实现贴图渲染等。但是好的封装带来的问题是如果开发者想要自定义贴图,那该怎么办?不得不从源码入手。 …

条码控件Aspose.BarCode入门教程(6):如何在C# 中生成GS1-128 条码

Aspose.BarCode for .NET 是一个功能强大的API,可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能,以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

三、Golang环境搭建及打包和工具链

一、环境搭建 从https://golang.google.cn/dl/下载安装即可 新建GO_HOME 系统环境变量,指向go的安装目录 在终端输入go dev即可测试有无安装成功 二、包 所有Go程序的程序都会组织成若干组文件,每组文件被称为一个包。每个包的代码都可以作为很小的复用…

webpack 5 实战(1)

一、为什么使用webpack 个人将前端开发分为三个阶段: 1.1 Web1.0 Web1.0前端主要工作: 前端主要编写静态页面对于JavaScript的使用,主要是进行表单验证和动画效果制作 1.2 Web2.0之AJAX 伴随着AJAX的诞生,前端的工作模式也发…

什么牌子的蓝牙耳机音质最好?盘点2023音质最好的蓝牙耳机

近几年,蓝牙耳机在日常生活中的出现频率越来越高,不管是运动、听歌、追剧、玩游戏等等都能看到蓝牙耳机的身影。接下来,我来给大家盘点几款音质好的蓝牙耳机,感兴趣的朋友可以了解一下。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

使用 WSL 在 Windows 上安装 Linux提示无法解析服务器的名称或地址及0x80370114问题解决

开发人员可以通过WSL在windows电脑上安装Linux发行版,并可以直接在电脑上使用Linux应用程序、实用程序和Bash命令行工具等。 先决条件 必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 才能使用以下命令…

结合企业实践来规范你的Git commit(含插件使用指南)

🏆 文章目标:了解通用的Git commit规范,并在企业的团队内部进行实践。 🍀 如何规范你的Git commit(理论结合企业的实践) ✅ 创作者:Jay… 🎉 个人主页:Jay的个人主页 &am…

论文学习——数据挖掘技术在水文数据分析中的应用

文章目录0 引言1 数据挖掘技术及工具1.1 什么是数据挖掘?1.2 数据挖掘的过程?1.3 常用的数据挖掘技术1.4 ODM2 水文数据分析系统功能设计3 系统实现与应用3.1 数据获取与清理3.2 模型建立4 结语2012年12月 计算机工程与设计 0 引言 洪水是现实生活中频发…

数据结构_第十三关(3):归并排序

目录 归并排序 1.基本思想: 2.原理图: 1)分解合并 2)数组比较和归并方法: 3.代码实现(递归方式): 归并排序的非递归方式 原理: 情况1: 情况2&#…

《剑指大前端全栈工程师》--大前端时代全站式开发,直指大厂P7技术专家

【内容提要】 实力打造大前端时代,走在时代的钱端!   实战驱动教学,探索前端黑科技。紧跟企业实际技术选型,追求技术的实用性与前瞻性完美结合!   本书对大前端技术栈进行了全面的讲解,内容涉及HTML5CS…

AI产品铺天盖地,企业却用不上?

近年来,随着人工智能技术的飞速发展,越来越多的企业开始关注并尝试使用人工智能技术来提高业务效率和降低成本。然而,国内企业使用人工智能技术仍然存在一些困难和问题,主要原因如下: 国外产品不稳定或不安全 目前国内市场上存在许多国外的AI产品,例如ChatGPT、GPT-4等,但这些…

QT CTK控件 CTK开发(二)

CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。为医学成像提供一组统一的基本功能;促进代码和数据的交互及结合;避免重复开发;在工具包(医学成像)范围内不断扩展到新任务,而不会增加现有任务的负担;整合并适应成功的解决方案。 本专栏文章较为全面…

教你如何搭建物业-后勤管理系统,demo可分享

1、简介 1.1、案例简介 本文将介绍,如何搭建物业-后勤管理。 1.2、应用场景 该应用包含疫情上报、绿化、安保等管理功能。 2、设置方法 2.1、表单搭建 1)新建表单【返区登记】,字段设置如下: 名称类型名称类型姓名单行文本…

【历史上的今天】3 月 17 日:苹果起诉微软;CN 域名开放注册;赛博朋克之父出生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 3 月 17 日,在 1958 年的今天,我国第一台黑白电视机诞生。当时,我国电视机研制技术与日本基本处在同一起跑线,是…

四十六、docker-compose部署

一个项目肯定包含多个容器,每个容器都手动单独部署肯定费时费力。docker-compose可以通过脚本来批量构建镜像和启动容器,快速的部署项目。 使用docker-compose部署主要是编写docker-compose.yml脚本。 一、项目结构 不论是Dockerfile还是docker-compo…

如果你想从事人工智能职业,学习Python吧

人工智能并不会抢走你的工作,至少目前还不会。人工智能和机器学习(AI/ML)最好的应用是补充人类的创造力,而不是取代它。具有讽刺意味的是,最好的大型语言模型(LLMs)可能是通过使用受版权保护的人…