分类 项目 下的文章

前言

发现两个多月没写文章了,不过考试月也没啥好写的。

最近大模型这么火,正好有个项目用到,于是便水一篇教程吧。

此篇教程为 科大讯飞的星火大模型 部署教程,部署完成后即可与智能助手进行聊天。

这里是关于部署到服务器端,如果有其他需求可以查看官方文档。

 

大模型简介

大语言模型 (英语:large language model,LLM) 是一种语言模型,由具有许多参数(通常数十亿个权重或更多)的人工神经网络组成,使用自监督学习半监督学习对大量未标记文本进行训练[1]。大型语言模型在2018年左右出现,并在各种任务中表现出色[2]

尽管这个术语没有正式的定义,但它通常指的是参数数量在数十亿或更多数量级的深度学习模型[3]。大型语言模型是通用的模型,在广泛的任务中表现出色,而不是针对一项特定任务(例如情感分析、命名实体识别或数学推理)进行训练[2]

尽管在预测句子中的下一个单词等简单任务上接受过训练,但发现具有足够训练和参数计数的神经语言模型可以捕获人类语言的大部分句法和语义。 此外大型语言模型展示了相当多的关于世界的常识,并且能够在训练期间“记住”大量事实[2]

参考资料:llm - 搜索 (wikipedia.org)

 

部署

API领取

首先前往科大讯飞的星火大模型官网 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 (xfyun.cn)

进行注册,然后领取大模型的API

这里选择 API免费试用 ,然后进入如下页面

选择第一个 个人免费包免费试用 。等到领取成功后,后台会有如下界面

这里的 APPIDAPISecretAPIKey 就是接口信息,后面会用到。

 

Linux SDK 下载

进入上面页面后,点击 Linux SDK 右边的下载按钮。将会下载SDK包,感兴趣的也可以点击文档查看使用教程

下载完成后传到服务器,使用解压命令解压包

unzip Spark3.0_Linux_SDK_v1.1.zip

然后进入解压出来的包 Spark3.0_Linux_SDK_v1.1 , 里面应该包含如下文件

root@echofree:/opt# cd Spark3.0_Linux_SDK_v1.1/
root@echofree:/opt/Spark3.0_Linux_SDK_v1.1# ls
build  include  lib  src

 

动态库配置

进入 lib 目录,里面会有一个相关的调用库

root@echofree:/opt/Spark3.0_Linux_SDK_v1.1# cd lib/
root@echofree:/opt/Spark3.0_Linux_SDK_v1.1/lib# ls
libSparkChain.so

这里为了方便点,直接采用暴力方法,将库文件 libSparkChain.so 复制到 /usr/lib

cp libSparkChain.so /usr/lib

 

API接口配置

进入 src 目录,会有一个 demo.cpp 文件,进入此文件,修改如下信息

int initSDK()
{
    // 全局初始化
    SparkChainConfig *config = SparkChainConfig::builder();
    config->appID("appID")        // 你的appid
        ->apiKey("apiKey")        // 你的apikey
        ->apiSecret("apiSecret"); // 你的apisecret
        // ->logLevel(0)
        // ->logPath("./aikit.log");
    int ret = SparkChain::init(config);
    printf(RED "\ninit SparkChain result:%d" RESET,ret);
    return ret;
}

将这里的 三个API配置信息改为自己的即可。

 

demo测试

配置完成后就要测试连接了,使用 GNU 编译套件进行编译,命令如下

g++ -Iinclude src/demo.cpp -o demo -lSparkChain -lstdc++ -lpthread

如果你会 Makefile 的话,也可以复制下面的进行编译

CC = g++
CFLAGS = -Iinclude
LIBS = -lSparkChain -lstdc++ -lpthread
SRC = src/server.cpp
OUTPUT = demo

all: $(OUTPUT)

$(OUTPUT): $(SRC)
	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)

clean:
	rm -f $(OUTPUT)

如果一切正常,文件夹下会生成一个可执行文件 demo

root@echofree:/opt/Spark3.0_Linux_SDK_v1.1# ls
build  demo  files  include  lib  src

运行看看

root@echofree:/opt/Spark3.0_Linux_SDK_v1.1# ./demo

######### llm Demo #########

init SparkChain result:0
######### 同步调用 #########

syncOutput: assistant:Hello

syncOutput: assistant:こんにちは

######### 异步调用 #########
0:assistant:Hello:myContext
2:assistant::myContext
tokens:1 + 5 = 6
0:assistant:こ:myContext
1:assistant:んに:myContext
1:assistant:ちは (:myContext
1:assistant:Konnichi:myContext
2:assistant:wa):myContext
tokens:12 + 10 = 22

很好,配置完成!

 

加点互动

下面就要给他加互动功能了,毕竟大模型不能进行交互聊天,那还要他做什么

修改 demo.cpp 文件,内容如下

记得修改下 API信息哦

#include "../include/sparkchain.h"
#include <iostream>
#include <string>
#include <atomic>
#include <unistd.h>
#include <regex>

#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define RED "\033[31m"
#define RESET "\033[0m"

using namespace SparkChain;
using namespace std;

// async status tag
static atomic_bool finish(false);
// result cache
string final_result = "";

class SparkCallbacks : public LLMCallbacks
{
    void onLLMResult(LLMResult *result, void *usrContext)
    {
        int status = result->getStatus();
        printf(GREEN "%d:%s:%s:%s \n" RESET, status, result->getRole(), result->getContent(), usrContext);
        final_result += string(result->getContent());
        if (status == 2)
        {
            printf(GREEN "tokens:%d + %d = %d\n" RESET, result->getCompletionTokens(), result->getPromptTokens(), result->getTotalTokens());
            finish = true;
        }
    }

    void onLLMEvent(LLMEvent *event, void *usrContext)
    {
        printf(YELLOW "onLLMEventCB\n  eventID:%d eventMsg:%s\n" RESET, event->getEventID(), event->getEventMsg());
    }

    void onLLMError(LLMError *error, void *usrContext)
    {
        printf(RED "onLLMErrorCB\n errCode:%d errMsg:%s \n" RESET, error->getErrCode(), error->getErrMsg());
        finish = true;
    }
};

int initSDK()
{
    // 全局初始化
    SparkChainConfig *config = SparkChainConfig::builder();
    config->appID("appID")        // 你的appid
        ->apiKey("apiKey")        // 你的apikey
        ->apiSecret("apiSecret"); // 你的apisecret
        // ->logLevel(0)
        // ->logPath("./aikit.log");
    int ret = SparkChain::init(config);
    printf(RED "\ninit SparkChain result:%d" RESET,ret);
    return ret;
}

void syncLLMTest()
{
	cout << "\n######### 同步调用 #########" << endl;
	// 配置大模型参数
	LLMConfig *llmConfig = LLMConfig::builder();
	llmConfig->domain("generalv3");
	llmConfig->url("ws(s)://spark-api.xf-yun.com/v3.1/chat");

	Memory* window_memory = Memory::WindowMemory(5);
	LLM *syncllm = LLM::create(llmConfig, window_memory);

	// Memory* token_memory = Memory::TokenMemory(500);
	// LLM *syncllm = LLM::create(llmConfig,token_memory);

	int i = 0;
	//const char* input = "";
	while (1)
	{
		char input[256]; // 定义一个足够大的字符数组来接收用户输入

		printf("请输入问题 (输入 'q' 退出):");
		scanf("%s", input);

		if (strcmp(input, "q") == 0) {
			break; // 如果输入是 'q',则退出循环
		}

		// 同步请求
		LLMSyncOutput *result = syncllm->run(input);
		if (result->getErrCode() != 0)
		{
			printf(RED "\nsyncOutput: %d:%s\n\n" RESET, result->getErrCode(), result->getErrMsg());
			continue;
		}
		else
		{
			printf(GREEN "\nsyncOutput: %s:%s\n" RESET, result->getRole(), result->getContent());
		}

	}
	// 垃圾回收
	if (syncllm != nullptr)
	{
		LLM::destroy(syncllm);
	}
}


void uninitSDK()
{
    // 全局逆初始化
    SparkChain::unInit();
}

int main(int argc, char const *argv[])
{
    cout << "\n######### llm Demo #########" << endl;
    // 全局初始化
    int ret = initSDK();
    if (ret != 0)
    {
        cout << "initSDK failed:" << ret << endl;
        return -1;
    }

    syncLLMTest(); // 同步调用
   

    // 退出
    uninitSDK();

    return 0;
}

如果你仔细观察,会发现少了一部分代码。

星火大模型的接口调用给了两种方式,一种是同步,一种是异步

 

这里我用的是同步,所有文字都输出完,才会打印在终端。

正常的大模型,应该都是异步调用,即慢慢打印出来,这里留给读者自己修改了。

下面看下运行效果

root@echofree:/opt/Spark3.0_Linux_SDK_v1.1# ./demo

######### llm Demo #########

init SparkChain result:0
######### 同步调用 #########
请输入问题 (输入 'q' 退出):徐州天气怎么样

syncOutput: assistant:今天徐州市的天气是多云,气温在3℃到11℃之间,有点冷。东风4-5级,湿度为53%。空气质量良好,PM2.5指数为60。在这样的天气条件下,适宜旅游、钓鱼和户外运动,但要注意保暖。同时,感冒较易发生,请注意保持干净整洁的环境和清新流通的空气。
请输入问题 (输入 'q' 退出):你是什么

syncOutput: assistant:您好,我是科大讯飞研发的认知智能大模型,我的名字叫讯飞星火认知大模型。我可以和人类进行自然交流,解答问题,高效完成各领域认知智能需求。
请输入问题 (输入 'q' 退出):q
root@echofree:/opt/Spark3.0_Linux_SDK_v1.1#

效果还是不错的。

 

整点花活

既然一切都配置ok了,那肯定得进行应用开发了,这里来个小demo

这里是使用 Qt 开发的一个非常质朴的聊天界面,也就是开头所说的项目中正好用到大模型的地方。由于时间紧张,技术能力有限,就直接搬上去了。

具体原理就是使用 Linux的 socket多线程 与界面进行通信。服务器端负责接收客户端的信息并进行回复。

后续

由于技术有限,并且考试月繁忙,等到有空闲时间了,再写个单独的交互界面。

--> 前言发现两个多月没写文章了,不过考试月也没啥好写的。最近大模型这么火,正好有个项目用到,于是便水一篇教程吧。此篇教程为 科大讯飞的星火大模型 部署教程,部署完成后即可与智能助手进行聊天。这里是关于部署到服务器端,如果有其他需求可以查看官方文档。 大模型简介大语言模型 (英语:large language model,LLM) 是一种语言模型,由具有许多参数(通常数十亿个权重或更多)...

前言

这篇文章是关于ESP32的一个小Demo,名称为 智能垃圾桶

涉及到的模块为 SG90舵机和HC-SR04超声波, 使用的编程烧录软件为 Arduino

一开始打算直接扔在ESP32基础教程 – Echo (liveout.cn)这篇文章里,不做过多介绍,因为这个小Demo只用到了舵机和超声波模块。

后来感觉模块虽少,但是涉及到的知识其实挺多的,有PWM、外部中断(硬件)、硬件定时器和二值信号量,所以就单独写了一篇文章。

如果想要再进化一下,可以尝试添加摄像头模块,进行深度学习,分别垃圾种类,这方面还没涉及到,就不多说了。

如果十分感兴趣,可以参考此篇文章:STEAM案例 | 《智能垃圾桶》项目的设计 - 知乎 (zhihu.com)

PS:这个Demo非本人原创,我加了些注释额外代码,并且整理优化成了此篇文章,相关链接会在文章结尾部分给出。

 

接线图

 

Demo流程

超声波模块每隔200ms发出一次信号进行测距,如果测量到的物体距离在范围内,则信号为 open_semaphore

舵机旋转打开盖子,板载灯变亮,串口打印相关信息。

当打开盖子时,记录打开时间,并启动计时器进行定时检测,即每隔500ms进行检测。

如果检测到盖子关闭时间超过了阈值,则重置打开时间,并设置二值信号量状态为关闭。

得到关闭 close_semaphore 信号后,舵机转动进行关盖。

 

 

 

代码部分

代码需要用到的库: ESP32Servo

主体部分

#include "sonar.h"
#include "cover.h"
#include "servo.h"
int ledPin = 2;//板载灯
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; // 自旋锁

// 打开盖子
void open_cover()
{
  bool shouldAct = false; // 开盖行为
  
  /*
     临界区是一段代码片段,用于在多任务环境下保护共享资源,以确保对资源的访问不会被并发任务中断或干扰。
     临界区的作用是提供一种互斥机制,使得同一时间只有一个任务可以访问共享资源,避免并发访问导致的数据竞争和不一致性。
  */
  portENTER_CRITICAL(&mux); // 进入临界区
  if (openTime == 0) // 打开时间为0时
    shouldAct = true;
  openTime = micros(); // 记录当前打开盖子的时间
  portEXIT_CRITICAL(&mux);  // 离开临界区

  if (shouldAct)
    servo.write(145); // 舵机旋转145,即开盖°
}

void close_cover()
{
  servo.write(0); // 舵机为0°,即关盖
}

void setup() {
  pinMode(ledPin,OUTPUT); //输出模式
  Serial.begin(115200);
  sonar_init(&mux); // 超声波模块初始化
  cover_detect_init(&mux); // 初始化盖子检测相关的设置
  servo_init(); // 舵机初始化
  close_cover(); // 刚开始为盖上盖子状态
}

void loop() {
  // 超声波有信号回来
  if (xSemaphoreTake(open_semaphore, 0) == pdTRUE) // 打开信号为true
  {
    Serial.println("open"); // 串口打印信息
    open_cover();
    digitalWrite(ledPin, HIGH); // 灯亮
  }

  if (xSemaphoreTake(close_semaphore, 0) == pdTRUE) // 关闭信号为true
  {
    Serial.println("close");
    close_cover();
    digitalWrite(ledPin, LOW); // 灯灭
  }
}

关盖处理

cover.h

#pragma once //预处理指令,用于确保头文件只被编译一次

#include <freertos/FreeRTOS.h>
#include <esp32-hal-timer.h>
#include <freertos/semphr.h>

extern volatile unsigned long openTime;
extern volatile SemaphoreHandle_t close_semaphore;

void cover_detect_init(portMUX_TYPE *mux);

cover.cpp

#include "cover.h"

hw_timer_t *cover_timer = NULL; // 定时器
static portMUX_TYPE *_mux = NULL;
volatile SemaphoreHandle_t close_semaphore; // 关盖信号量
volatile unsigned long openTime = 0; // 打开盖子的时间

// 中断服务程序ISR:检测盖子是否关闭
void IRAM_ATTR close_detect()
{
  portENTER_CRITICAL_ISR(_mux);
  auto now = micros();
  if (openTime != 0 && (now - openTime) >= 4000000) // 打开盖子时间大于等于4s则关闭
  { 
    openTime = 0;
    xSemaphoreGiveFromISR(close_semaphore, NULL);
  }
  portEXIT_CRITICAL_ISR(_mux);
}

void cover_detect_init(portMUX_TYPE *mux)
{
  _mux = mux;
  close_semaphore = xSemaphoreCreateBinary();

  // 检测到关闭部分,0.5秒检测一次
  cover_timer = timerBegin(2, 80, true);  // 初始化计时器2,分频系数80,使能中断
  timerAttachInterrupt(cover_timer, close_detect, true);  // 附加中断处理函数 close_detect 到计时器
  timerAlarmWrite(cover_timer, 500000, true);  // 设置计时器的定时时间为500000微秒(0.5秒),并使能重复触发
  timerAlarmEnable(cover_timer);  // 启动计时器
}

舵机模块

servo.h

#pragma
#include <ESP32Servo.h>

extern Servo servo;

void servo_init();

servo.cpp

#include "myservo.h"

// 舵机部分
Servo servo;
int minUs = 500;
int maxUs = 2500;
int servoPin = 13;

void servo_init()
{
  // 舵机
  ESP32PWM::allocateTimer(1);
  servo.setPeriodHertz(50);
  servo.attach(servoPin, minUs, maxUs);
}

超声波模块

sonar.h

#pragma once
#include <freertos/FreeRTOS.h>
#include <esp32-hal-timer.h>
#include <freertos/semphr.h>

extern volatile SemaphoreHandle_t open_semaphore; // 信号量
void sonar_init(portMUX_TYPE *mux);

sonar.cpp

#include "sonar.h"

volatile SemaphoreHandle_t open_semaphore; // 信号量

// 超声波测距部分
const int trigPin = 17; 
const int echoPin = 18;
int distance = 0;

static portMUX_TYPE *_mux = NULL;
hw_timer_t *sonar_timer = NULL; // 定时器
volatile unsigned long startTime = 0; // 发出超声波时间
volatile unsigned long endTime = 0; // 收到超声波时间

// 硬件定时器ISR
void IRAM_ATTR ping()
{
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
}

// ECHO 引脚ISR
void IRAM_ATTR changeISR() 
{
  auto now = micros(); // 当前时间
  auto state = digitalRead(echoPin);

  portENTER_CRITICAL_ISR(_mux);
  if (state) // 高电平,即刚发出超声波
    startTime = now;
  else
    endTime = now;
// 变成低电平时表示已经收到回声
// 如果 < 10cm 就发信号开盖
  if (!state) {
    auto t = endTime - startTime;
    auto dis = t * 0.01715;
    if (dis <= 10)
    {
      xSemaphoreGiveFromISR(open_semaphore, NULL); // 给一个开盖信号量发送信号
    }
  }
  portEXIT_CRITICAL_ISR(_mux);
}

void sonar_init(portMUX_TYPE* mux)
{
  _mux = mux;
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  open_semaphore = xSemaphoreCreateBinary();

  //测距定时器部分
  sonar_timer = timerBegin(0, 80, true);
  timerAttachInterrupt(sonar_timer, ping, true);
  timerAlarmWrite(sonar_timer, 200000, true); // 定时时间为 0.2s

  // echo引脚的中断
  attachInterrupt(digitalPinToInterrupt(echoPin), changeISR, CHANGE);

  // 开始周期测量
  timerAlarmEnable(sonar_timer);
}

相关链接

Demo教程视频:ESP32之智能垃圾桶制作讲解—哔哩哔哩_bilibili

GitHub仓库:https://github.com/PGwind/esp32project

ESP32代码记录:ESP32基础教程 – Echo (liveout.cn)

PS:写程序难免会有问题,而且国内的ChatGPT访问受限

这里就给个朋友搭建的链接吧:chuanwen智能

 

--> 前言这篇文章是关于ESP32的一个小Demo,名称为 智能垃圾桶涉及到的模块为 SG90舵机和HC-SR04超声波, 使用的编程烧录软件为 Arduino。一开始打算直接扔在ESP32基础教程 – Echo (liveout.cn)这篇文章里,不做过多介绍,因为这个小Demo只用到了舵机和超声波模块。后来感觉模块虽少,但是涉及到的知识其实挺多的,有PWM、外部中断(硬件)、硬件定时器和二值...

前言

最近逛大型同性恋交友社区(GitHub)时偶然发现了一款开源的网易云美化插件(BetterNCM),具体美化效果如下

而且此插件发展已经挺成熟的了,于是便想写篇安装教程。

不过插件已经有了成熟的文档,这里就当推荐了。

这里插一嘴,是否封号有带观察哦,当然也可以等我体验一个月

项目

相关链接

  1. GitHub地址:https://github.com/MicroCBer/BetterNCM
  2. 安装地址:https://microblock.cc/betterncm
  3. 用户文档:https://v2e2npdz15.feishu.cn/docx/UZkSd9d46o4fVOxaPNBcGXSenme

使用须知

BetterNCM是一个由一群热爱网易云音乐的云村村友开发的PC版网易云音乐扩展插件,可以提供非常丰富的自定义功能扩展增强能力。

考虑到工具性质,BetterNCM 将永远是完全开源免费的自由软件,所以如果你是从任何地方发现有任何人在售卖本工具,请立刻要求退款并举报商家!

作为一群爱好者,我们不会也没办法为你因为从其它途径购买本工具造成的损失负责!

如果你也希望为BetterNCM贡献代码,欢迎前来BetterNCM的Github开源仓库

具体步骤

  1. 查看用户文档,了解下具体功能,是否为自己所需,文档地址:https://v2e2npdz15.feishu.cn/docx/UZkSd9d46o4fVOxaPNBcGXSenme
  2. 接着查看文档安装教程,点击安装地址:https://microblock.cc/betterncm
  3. 进入网易云,点击插件图标,下载相关插件,也可以将GitHub上的美化插件移到此插件目录下

主题推荐

GitHub地址:https://github.com/solstice23/refined-now-playing-netease

一个美化网易云音乐播放界面的 BetterNCM 插件

效果如下

ps:此主题为Argon主题作者另一个开源项目

评价

有得就有失,虽然美化后很好看,但是需要牺牲一部分性能,这里推荐有独显的笔记本安装哦。

 

--> 前言最近逛大型同性恋交友社区(GitHub)时偶然发现了一款开源的网易云美化插件(BetterNCM),具体美化效果如下而且此插件发展已经挺成熟的了,于是便想写篇安装教程。不过插件已经有了成熟的文档,这里就当推荐了。这里插一嘴,是否封号有带观察哦,当然也可以等我体验一个月项目相关链接GitHub地址:https://github.com/MicroCBer/BetterNCM安装地址:htt...

前言

最近有不少小伙伴询问我个人主页是如何搭建的,于是便写了这个文章教程,效果如下

[Echo's 个人主页 (liveout.cn)](https://liveout.cn/index/

 

项目地址

https://github.com/Tomotoes/HomePage

 

教程

1. 安装 node.js

首先,node.js 是啥子呢?这里简单解释下

Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。

科普地址:Node.js 教程 | 菜鸟教程 (runoob.com)

ubuntu 安装命令如下

sudo apt-get install -y nodejs

centos 安装命令如下

yum install -y nodejs

查看安装是否成功

node -v
//如果成功
v10.19.0

 

2. 安装 git

git 又是啥子呢?

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

科普地址:Git 教程 | 菜鸟教程 (runoob.com)

ubuntu 安装命令如下

sudo apt-get install git

centos 安装命令如下

yum -y install git-core

查看安装是否成功

git --version
//如果成功
git version 1.8.1.2

 

3. 部署项目

既然相关工具已经下载完成,下面就开始搭建吧!

首先通过 git 拉取项目仓库 (个人建议切换到opt目录)

//切换到opt目录
cd /opt

//拉取仓库
git clone https://github.com/Tomotoes/HomePage.git

拉取完成后进入项目目录

//进入项目目录 HomePage
cd HomePage

//npm 安装 Node.js 模块
npm install
npm run dev

进入目录后需要修改 相关配置,如 config.json

更多详细配置修改参考此文档:https://github.com/Tomotoes/HomePage/blob/master/README.zh_CN.md

修改完相关配置信息后执行以下命令

//生成项目文件到 dist 目录
npm run build

然后,你可以将dist目录部署到你喜欢的服务器托管商。

 

如果想通过菜单访问,可以讲dist文件放到博客根目录下面,菜单链接设置如下

https://域名/dist

这里的dist就是主页文件,你可以自己更改其名字,如index

通过 https://域名/index进行访问

 

结语

此教程可能存在相关错误,如有遇到,可进行留言。

 

--> 前言最近有不少小伙伴询问我个人主页是如何搭建的,于是便写了这个文章教程,效果如下[Echo's 个人主页 (liveout.cn)](https://liveout.cn/index/ 项目地址https://github.com/Tomotoes/HomePage 教程1. 安装 node.js首先,node.js 是啥子呢?这里简单解释下Node.js 是一个...

1. 开源地址

2. ChatGPT是什么

ChatGPT 是一种自然语言生成的聊天机器人模型,由OpenAI开发,它能够根据用户输入的文本内容,自动生成新的文本内容。它的名称来源于它所使用的技术—— GPT-3 架构,即生成式语言模型的第 3 代。

当用户在人机对话中向 ChatGPT 提问时,ChatGPT 可以根据用户的问题自动生成回答内容。比如下图,你让它写一段代码:

ChatGPT 的技术原理是基于深度学习和神经网络模型,通过大量的训练数据,学习人类语言的表达方式和语法规则,从而能够模拟人类语言的生成过程。通过这种方式,ChatGPT 可以较为自然地生成文本内容,并提供人机对话和自动回复等功能。

3. 项目介绍

通过调用ChatGPT的API,将QQ部署成机器人,实现ChaGPT的对话功能。

可以增加、删除管理员,并且重置

4. 项目要求

  • ChartGPT账号
  • QQ号
  • 服务器(安装JDK)
  • go-cqhttp_linux_arm64
  • AliceBot

5. 相关链接

B站视频教程【神仙教程】教你把全能ChatGPT变成QQ机器人_哔哩哔哩_bilibili

ChatGPT注册: 注册页面

短信平台在线接受短信的虚拟号码 - SMS-Activate 

go-cqhttp文档go-cqhttp基础教程文档

6. 项目部署

B站视频教程【神仙教程】教你把全能ChatGPT变成QQ机器人_哔哩哔哩_bilibili

部署

  1. 安装jdk1.8

    sudo apt-get install openjdk-8-jdk
  2. 下载运行go-cq 下载地址:https://docs.go-cqhttp.org/guide/quick_start.html#%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B

  3. 下载到服务器后使用

    tar -zxvf+压缩包(f后面有空格)

    进行解压

  4. 在解压目录下运行

    screen -S gocq
    ./go-cqhttp
  5. 第一次运行会先让你选连接方式,我们选择2:正向Websocket                                                                gocq在解压目录下生成config.yml,这时我们

    Ctrl+C
    nano config.yml //nano可以换成 vim

    拉到最下面找到address: 0.0.0.0:8080,把8080替换成9099,然后Ctrl+X,然后按Y,再回车一下保存

  6. 然后再次运行./go-cqhttp,完成登录后按Ctrl+A+D放到后台运行

  7. 执行jar包 先输入screen -S Alice 创建个会话

  8. 然后使用   

    java -jar -Xmx512m --clientBaseConfig.admin=管理员QQ --clientBaseConfig.robot=机器人QQ --clientBaseConfig.wakeUpWord=唤醒词 --clientBaseConfig.standbyWord=待机词 --clientBaseConfig.promptUpWord=提示词 --clientBaseConfig.robotName=机器人名称 --chatGPT.email=gpt邮箱 --chatGPT.password=gpt密码 --chatGPT.sessionToken=token --server.port=8080

  9. 运行后再使用Ctrl+A+D放到后台运行即可

机器人的所有操作指令(以下指令皆需唤醒机器人后再进行发送才能生效)

  • #reset chat    重置对话
  • #private        将机器人设为私有的,需要权限(默认就是私有)
  • #public         将机器人设为所有人可用
  • add @某人   添加一个拥有权限的使用者
  • del @某人    将某人从使用者列表移除

7. 常遇问题

期间遇到的情况以及解决方法

1. 运行脚本时候编码错误
解决:版本包不对,换一个

2. QQ登录安全环境检查
解决:先在本地下载exe程序,并且终端运行,然后生成的token文件上传到服务器

3.解压alice时候语法报错
解决:账号密码不能带有 ()

4. 最后启动时候报错:Port8080 was already in use

8080端口已经被使用了,换一个端口

--> [admonition]此教程已经失效!!![/admonition]1. 开源地址 GitHubFokersBoolean/AliceBot   GitHubMrs4s/go-cqhttp  2. ChatGPT是什么ChatGPT 是一种自然语言生成的聊天机器人模型,由OpenAI开发,它能够根据用户输入的文本内容,自动生成新的文本内容。它的名称来源于它所使用的技术—— GPT-3 架构...