写一个 ChatGPT token 编解码 Node.js 服务【含源码】

背景介绍

最近做了一个 ChatGPT 相关的项目 - Ai 玩伴,这是一个微信小程序。Ai 玩伴是基于OpenAI 的 GPT-3.5 语言模型,搭建富有性格特色的「Ai 玩伴」智能聊天机器人。它可以陪你聊天、陪你玩、为你解答各种问题,具体功能可以微信中搜索【Ai 玩伴】进行功能体验。如果想要了解 Ai 玩伴小程序相关的开发历程,我可以在下一篇博客中进行分享。

关于 token

token 是 ChatGPT 中的一个重要的概念。了解过 ChatGPT 的老玩家都知道,
ChatGPT 在 API 处理用户输入的内容之前,会先将内容转化成 token。我们可以简单的把 token 理解成字符,但是 token 的分割并不是严格意义上的一个单词,它的与实际字符数对应关系如下:

1 token ~= 4 英文字符
1 token ~= 3/4 个字
100 token ~= 75 个单词

更多 token 相关说明可以参考官方提供的这篇文章 **What are tokens and how to count them?。**同时,官方还提供一个 token 解析的在线工具(Tokenizer tool),帮助你更加直观的了解 token 的转化过程。具体页面如下:

在这里插入图片描述

由于 Ai 玩伴小程序采用了和官方一样的计费模式,所以我们需要对用户输入的内容进行分词处理,然后计算分词数量进行计费。在分词过程中我们需要保证和官方的分词算法保持一致,这就给我们的开发实践提出的不小的难题。经过一段时间的调研,我们发现 **gpt-3-encoder 这个 npm 包能够完美解决我们的问题。

gtp-3-encoder 是对 GPT-2/GPT-3 编解码的基础库,是用 javascript 实现的。原版是使用 Python 实现的。gpt-3-encoder 通过使用字符匹配编码的方式,将用户的输入内容转化为 OpenAI model 能够识别的一串数字。例如:【中国】两个字在经过 encode 之后会转化成 [40792,32368,121]。

下面我们就来看看在实际的项目中如何使用。

项目开发

环境准备

检查 node 环境

$ node -v
v16.18.1

$ npm -v
8.19.2

初始化项目

# 新建项目目录
$ mkdir chat-gpt-node && cd chat-gpt-node

# 初始化 package.json
$ npm init -y

安装依赖

$ npm i express gpt-3-encoder body-parser

依赖说明

  1. express:极简、高效的 Node.js web 框架;
  2. body-parser:Node.js body 转化中间件,能够将 body 中的内容转化为 js 对象;
  3. gpt-3-encoder:GPT-2/GPT-3 编解码库。

核心代码

const express = require('express');
const bodyParser = require('body-parser');
const { encode, decode } = require('gpt-3-encoder');

const app = express();

// 使用 bodyParser 中间件
app.use(
	bodyParser.json({
		type: 'application/json',
	})
);

/**
 * 将字符串转化成 token
 */
app.post('/encode', (req, res) => {
	try {
		// 编码核心逻辑
		const token = encode(req.body.str);
		res.send({
			code: 0,
			message: 'success',
			data: token,
		});
	} catch (error) {
		console.error('encode-failed: ', error);
	}
});

/**
 * token 解码
 */
app.post('/decode', (req, res) => {
	try {
		// 解码核心逻辑
		const decoded = decode(req.body.data);
		res.send({
			code: 0,
			message: 'success',
			data: decoded,
		});
	} catch (error) {
		console.error('encode-failed: ', error);
	}
});

app.listen(1234, '0.0.0.0', function () {
	console.log('dataServer running at port 1234');
});

运行

启动 express 服务,在命令行执行命令:

$ node index.js

当看到命令行输出如下内容后,表示服务已经正常启动:

dataServer running at port 1234

验证

使用 curl 进行验证

在命令行执行命令:

$ curl -H "Content-Type: application/json" -X POST -d '{"str": "中国"}'  http://localhost:1234/encode

当看到命令行输出如下内容后,表示解码成功:

{"code":0,"message":"success","data":[40792,32368,121]}

使用 postman 进行验证

如果看到如下内容,则表示服务正常。
在这里插入图片描述

部署

使用 pm2 启动 Node.js 服务:

$ pm2 start index.js

同样可以使用上述验证方法进行验证。

可以通过在命令行执行下列命令,查看 Node 服务运行状态:

$ pm2 list

总结

通过本这篇文章的学习,我们了解到了 ChatGPT 中的一个核心概念 token。通过官方提供的工具,我们能直观的体会 token 的转化过程。

通过 gpt-3-encoder 的使用,我们可以在 Node 服务中能够对用户的输入进行编码,将用户的输入内容转化成和官方一样的 token 序列,帮助我们完成相关的需求功能。

关于 gpt-3-encoder 更多的内容就留给你进行探索了。如果有什么问题,欢迎在评论区进行友好交流。

Ai 玩伴项目用到的 gpt-encode-node 工程源码可以在附件中进行下载。

附件:gpt-encode-node 源码

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
好的,以下是一个使用koa+json+jwt+token实现的简单图书管理系统后端服务器代码示例: ```javascript const Koa = require('koa'); const bodyParser = require('koa-bodyparser'); const jwt = require('jsonwebtoken'); const app = new Koa(); const books = []; // 存储书籍信息 // JWT 密钥 const secret = 'mysecret'; // 用户信息 const users = [ { username: 'admin', password: 'admin' } ]; // 登录接口 app.use(bodyParser()); app.use(async ctx => { const { username, password } = ctx.request.body; const user = users.find(u => u.username === username && u.password === password); if (user) { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }); ctx.body = { status: 'success', message: '登录成功', token }; } else { ctx.body = { status: 'fail', message: '用户名或密码错误' }; } }); // token 验证中间件 function authMiddleware(ctx, next) { const { authorization } = ctx.request.headers; if (authorization && authorization.startsWith('Bearer ')) { const token = authorization.substring(7); try { const decoded = jwt.verify(token, secret); ctx.state.user = decoded; return next(); } catch (err) { ctx.status = 401; ctx.body = { status: 'fail', message: 'token已过期或无效' }; } } else { ctx.status = 401; ctx.body = { status: 'fail', message: '缺少Authorization头或格式不正确' }; } } // 获取书籍列表 app.use(authMiddleware); app.use(async ctx => { ctx.body = { status: 'success', data: books }; }); // 新增书籍 app.use(bodyParser()); app.use(authMiddleware); app.use(async ctx => { const { title, author } = ctx.request.body; const book = { title, author }; books.push(book); ctx.body = { status: 'success', message: '添加成功' }; }); // 启动服务器 app.listen(3000, () => { console.log('Server is running on port 3000'); }); ``` 该代码实现了以下接口: 1. 登录接口 POST /login,用于验证用户身份并返回一个JWT token。 2. 获取书籍列表接口 GET /books,需要在请求头中带上JWT token。 3. 新增书籍接口 POST /books,需要在请求头中带上JWT token,并在请求体中带上title和author字段。 在使用该代码前,请确保安装了koa、koa-bodyparser和jsonwebtoken这三个依赖。另外,该代码中的用户信息和书籍信息都是存储在内存中的,实际应用中应该使用持久化存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanbaofengs

请我喝一杯冰可乐吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值