手把手教你搭建微信聊天机器人系列(三):搭建对接文心一言(ERNIE-Bot大模型)接口的微信聊天机器人

这篇具有很好参考价值的文章主要介绍了手把手教你搭建微信聊天机器人系列(三):搭建对接文心一言(ERNIE-Bot大模型)接口的微信聊天机器人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        上一章介绍了eggjs+wechaty搭建一个简单的微信聊天机器人,只是实现了简单的回复,这一章我们将对接ERNIE-Bot接口,实现智能回复。

access_token的请求

config.default.js配置

        我们在上一章代码基础上进行调整,首先我们要加入access_token的请求逻辑。第一章我们说过,请求需要使用应用对应的API Key,Secret Key作为入参。eggjs规定了配置的写法,我们可以将其配置在config/config.default.js里面。

自建微信聊天机器人,chatgpt,文心一言,机器人,node.js,chatgpt

//配置ernie
	config.ernie = {
		client_id: '填入您的API Key', //API Key
		client_secret: '填入您的Secret Key',//Secret Key
		access_token: '',//先置空,后续由程序填充
		expire_day: 30 //access_token过期时长(天)
	}

ernie.js定义getAccessToken

        我们在app/service目录增加ernie.js。

自建微信聊天机器人,chatgpt,文心一言,机器人,node.js,chatgpt

        ernie.js文件专门用来和ERNIE-Bot接口进行交互,代码如下:

const {
	Service
} = require('egg');


class ErnieService extends Service {
	async getAccessToken() {
		console.log('===================ErnieService getAccessToken=====================');
		let ctx = this.ctx;

		try {
			const res = await ctx.curl(
				`https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${ctx.app.config.ernie.client_id}&client_secret=${ctx.app.config.ernie.client_secret}`, {
					method: 'GET',
					rejectUnauthorized: false,
					data: {},
					headers: {},
					timeout: 30000,
					contentType: 'json',
					dataType: 'json',
				})
			console.log(res)

			if (res.data.access_token) {
				ctx.app.config.ernie.access_token = res.data.access_token;
				console.log('access_token', ctx.app.config.ernie.access_token)
			}

		} catch (error) {
			console.log(error)
		}
	}
}

module.exports = ErnieService;

我们按eggjs的service的写法,定义了一个方法,用来请求access_token,但是这样写并不能执行,我们需要有个逻辑,在应用启动完毕后会调用这个方法。

app.js执行getAccessToken

        我们在根目录增加app.js。

自建微信聊天机器人,chatgpt,文心一言,机器人,node.js,chatgpt

app.js代码如下:

module.exports = app => {

	app.beforeStart(async () => {
		// 应用会等待这个函数执行完成才启动
		console.log("==app beforeStart==");
	});

	app.ready(async () => {
		console.log("==app ready==");
		let ctx = app.createAnonymousContext();
		ctx.service.ernie.getAccessToken(); //请求AccessToken
	})

	app.beforeClose(async () => {
		console.log("==app beforeClose==");
	})
};

我们执行命令npm run dev启动项目,看到最终会打印出access_token,有了access_token我们继续开发接口请求函数sendMsg。

对话请求

ernie.js定义sendMsg

sendMsg函数用于调用ERNIE-Bot会话接口,传入对话内容并返回对话结果。在class ErnieService中加入以下代码:

	async sendMsg(msg) {
		console.log('===================ErnieService sendMsg=====================');
		let ctx = this.ctx;
		try {
			const res = await ctx.curl(
				`https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions?access_token=${ctx.app.config.ernie.access_token}`, {
					method: 'POST',
					rejectUnauthorized: false,
					data: {
						"messages": msg
					},
					timeout: 30000,
					contentType: 'json',
					dataType: 'json',
				})
			console.log(res)
	
			if (res.data) {
				return res.data;
			}
			return null;
		} catch (error) {
			console.log(error)
			return null;
		}
	}

wechat.js

我们在wechat.js中,将原先的逻辑调整一下,主要是改两个地方,

1、我们在之前的代码中经常有看到ctx这个变量,可以通过他获取配置文件的参数值。但Service文件中的ctx的获取只能通过app.js调用Service中函数的方式来获得。所以我们将机器人初始化的操作定义在startBot()方法中,由app.js来执行这个方法,就可以接收到ctx的值。

2、原先回复是直接扔回用户发的信息的,现在将其对接到ernie.js中的sendMsg方法。

wechat.js全部代码如下:

const {
	Service
} = require('egg');


const {
	WechatyBuilder,
	ScanStatus
} = require("wechaty");
const qrcode = require("qrcode-terminal");

let ctx;
let wechaty;
let startStatus = false;

const onMessage = async (message) => {
	console.log(`收到消息: ${message}`);
	if (message.type() === wechaty.Message.Type.Text) {
		const userMsg = await message.text();

		try {
			let msgRecord = [{
				"role": "user",
				"content": userMsg
			}];
			let res = await ctx.service.ernie.sendMsg(msgRecord);
			if (res) {
				if (res.error_code) {
					message.say(JSON.stringify(res));
					console.log(`报错: ${JSON.stringify(res)}`);
				} else {
					if (res.result) {
						message.say(res.result);
						console.log(`回复: ${res.result}`);
					}
				}
			}
		} catch (error) {
			console.log(error);
			message.say(JSON.stringify(error));
		}
	}
};

const onLogout = (user) => {
	console.log(`用户 ${user} 退出成功`);
};
const onLogin = async (user) => {
	console.log(`用户 ${user} 登录成功`);
};
const onError = console.error;
const onScan = (code, status) => {
	// status: 2代表链接等待调用,3代表链接已打开,这个链接实际上是提供一个登录的二维码供扫描
	if (status === ScanStatus.Waiting) {
		// status: 2代表等待,3代表扫码完成
		qrcode.generate(code, {
			small: true
		}, console.log)
	}
};

class WechatService extends Service {
	async startBot() {
		console.log('===================WechatService startBot=====================');
		ctx = this.ctx;
		if (startStatus && wechaty) {
			if (wechaty.isLoggedIn) {
				await wechaty.logout();
			}
			await wechaty.stop();
			startStatus = false;
			wechaty = null;
		}
		wechaty = await WechatyBuilder.build();
		wechaty
			.on("scan", onScan)
			.on("login", onLogin)
			.on("logout", onLogout)
			.on("error", onError)
			.on("message", onMessage);
		await wechaty.start();
		startStatus = true;
	}
}

module.exports = WechatService;

app.js执行startBot

在AccessToken请求后加入初始化BOT

app.ready(async () => {
		console.log("==app ready==");
		let ctx = app.createAnonymousContext();
		await ctx.service.ernie.getAccessToken(); //请求AccessToken
		await ctx.service.wechat.startBot(); //初始化BOT
	})

自建微信聊天机器人,chatgpt,文心一言,机器人,node.js,chatgpt

至此,我们已经实现了一次会话的功能。多轮对话的功能等下一章再详述。

本章完整代码在这里​​​​​​​下载。运行前请配置好config/config.default.js里面config.ernie下的client_id和client_secret配置项。文章来源地址https://www.toymoban.com/news/detail-771406.html

到了这里,关于手把手教你搭建微信聊天机器人系列(三):搭建对接文心一言(ERNIE-Bot大模型)接口的微信聊天机器人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你,本地RabbitMQ服务搭建(windows)

    前面已经对RabbitMQ介绍了很多内容,今天主要是和大家搭建一个可用的RabbitMQ服务端,方便后续进一步实操与细节分析 跟我们跑java项目,要装jdk类似。rabbitMQ是基于Erlang开发的,因此安装rabbitMQ服务器之前,需要先安装Erlang环境。 【PS: 我已经上传了对应资源,windows可直接下载

    2024年02月14日
    浏览(51)
  • 手把手教你搭建自己本地的ChatGLM

    如果能够本地自己搭建一个ChatGPT的话,训练一个属于自己知识库体系的人工智能AI对话系统,那么能够高效的处理应对所属领域的专业知识,甚至加入职业思维的意识,训练出能够结合行业领域知识高效产出的AI。这必定是十分高效的生产力工具,且本地部署能够保护个人数

    2024年02月03日
    浏览(73)
  • 手把手教你5分钟搭建RabbitMq开发环境

    演示环境 1、使用Vagrant 和 VirtualBox创建linux虚拟机 不知道Vagrant怎么使用的可以看这里。 ①在cmd窗口执行命令 vagrant init generic/centos7 ,初始化linux启动环境 ②执行启动命令 vagrant up 启动Linux虚拟机 ③修改当前目录的Vagrantfile文件,为虚拟机配置内网ip,后面登录的时候会用到

    2023年04月12日
    浏览(59)
  • 手把手教你搭建一个Minecraft 服务器

    这次,我们教大家如何搭建一个我的世界服务器 首先,我们来到这个网站 MCVersions.net - Minecraft Versions Download List MCVersions.net offers an archive of Minecraft Client and Server jars to download, for both current and old releases! https://mcversions.net/   在这里,我们点击对应的版本,从左到右依次是稳定版

    2024年02月09日
    浏览(58)
  • 手把手教你搭建ARM32 QEMU环境

    我们知道嵌入式开发调试就要和各种硬件打交道,所以学习就要专门购买各种开发版,浪费资金,开会演示效果还需要携带一大串的板子和电线,不胜其烦。然而Qemu的使用可以避免频繁在开发板上烧写版本,如果进行的调试工作与外设无关,仅仅是内核方面的调试,Qemu模拟

    2024年02月19日
    浏览(58)
  • 手把手教你搭建 Webpack 5 + React 项目

    在平时工作中,为减少开发成本,一般都会使用脚手架来进行开发,比如 create-react-app 。脚手架都会帮我们配置好了 webpack,但如果想自己搭建 webpack 项目要怎么做呢?这边文章将介绍如何使用 webpack 5 来搭建 react 项目,项目地址在文末。 1.1 Webpack 的好处 试想在不使用任何打

    2024年02月08日
    浏览(44)
  • 手把手教你接入网站微信支付

    小摊小贩们在线下交易一般无需接入微信支付,只需要向别人出示自己的付款码就行。为什么?因为一手交钱,一手交货,你不付钱,人家不会给你商品。 但在网上,要实现无人值守,别人扫码付了款,平台得自动知道,然后再发货。所以必须接入微信支付。 微信支付必须

    2024年02月07日
    浏览(46)
  • Pytorch:手把手教你搭建简单的全连接网络

     红色的点就是我在sinx函数上取的已知点作为网络的训练点。  训练过程如上,时间我这里设置的比较简单,除了分钟,之后的时间没有按照60进制规定。 可以看到收敛的还是比较好的。 这里红色的点为训练用的数据,蓝色为我们的预测曲线,可以看到整体上拟合的是比较好

    2024年02月07日
    浏览(54)
  • 手把手教你搭建内网穿透服务器

    有时候我们需要把外网可以访问自己的内网,比如在微信公众号开发调用接口时为了方便调试就需要配置回调地址或者是想把自己的nas可以在不在家就能访问,这时候就需要内网穿透。使用内网穿透主要有几种方式,1.使用内网穿透服务商提供的服务,但是这种需要付费,免

    2024年04月23日
    浏览(49)
  • 手把手教你在Windows下搭建Vue开发环境

    最近有小伙伴不会Vue环境的部署,小孟亲自测试了下,大家有需要的可以按照下面的学习。 如果想看视频的,也可以看视频的教程: https://www.bilibili.com/video/BV1if4y1X7BS/?spm_id_from=333.788.recommend_more_video.-1vd_source=e64f225fc5daf048d2687502cb23bb3b 在Windows下搭建Vue开发环境: 官网https://n

    2024年02月08日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包