【Chatbot】2:中文聊天机器人的实现

前言:

上一篇【聊天机器人】1:DeepQA使用自己的数据集做chatbot上传后,收到了好多伙伴支持,在这里表示感谢。上一篇也遗留了一个问题——介于DeepQA是一个以英文语料为场景的聊天机器人,在中文场景应用中得到的结果却不尽人意。于是经过多方查找及资料整理,今天给大家分享一个以自己制作的语料集作为背景数据集的中文聊天机器人,源码也是无偿奉上供大家参考,感谢大家支持。

-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

本文源码下载——请下载,文末也有源码
特别注意:本博文用的数据集很少,使用时候一定要拓展数据集

-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

一、伪代码解析

1.1、模型构造

聊天机器人大多都是采用seq2seq结构,更细化的说可以指RNN网络或者LSTM网络。模型构造这个函数就是利用TensorFlow框架定义网络模型的结构,如果你对RNN网络或者LSTM网络不是很了解,我这里有一篇自己写的入门级的讲解——【深度学习】6:RNN递归神经网络原理、与MNIST数据集实现数字识别,就可以知道下面RNN网络是怎样识别一句话,其中的cell是怎样的工作原理了。

def get_model(feed_previous=False):"""构造模型"""learning_rate = tf.Variable(float(init_learning_rate), trainable=False, dtype=tf.float32)learning_rate_decay_op = learning_rate.assign(learning_rate * 0.9)encoder_inputs = []decoder_inputs = []target_weights = []for i in range(input_seq_len):encoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="encoder{0}".format(i)))for i in range(output_seq_len + 1):decoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="decoder{0}".format(i)))for i in range(output_seq_len):target_weights.append(tf.placeholder(tf.float32, shape=[None], name="weight{0}".format(i)))# decoder_inputs左移一个时序作为targetstargets = [decoder_inputs[i + 1] for i in range(output_seq_len)]cell = tf.contrib.rnn.BasicLSTMCell(size)# 这里输出的状态我们不需要outputs, _ = seq2seq.embedding_attention_seq2seq(encoder_inputs,decoder_inputs[:output_seq_len],cell,num_encoder_symbols=num_encoder_symbols,num_decoder_symbols=num_decoder_symbols,embedding_size=size,output_projection=None,feed_previous=feed_previous,dtype=tf.float32)# 计算加权交叉熵损失loss = seq2seq.sequence_loss(outputs, targets, target_weights)# 梯度下降优化器opt = tf.train.GradientDescentOptimizer(learning_rate)# 优化目标:让loss最小化update = opt.apply_gradients(opt.compute_gradients(loss))# 模型持久化saver = tf.train.Saver(tf.global_variables())return encoder_inputs, decoder_inputs, target_weights, outputs, loss, update, saver, learning_rate_decay_op, learning_rate

1.2、训练数据集加载

先看一下我自己做的问答集,question中的每一个问题依次对应answer中的一个答案,两个文件组成一个问答对构成训练集,
注意:questionanswer的行数必须相同,不然会报错,且不能出现空行
注意:数据集一定要根据需要进行扩充
这里写图片描述
下面的代码就是通过path地址,读取两个数据集中的数据,做一定的必要处理(必要处理在下——第三个小标题),合并到一个train_set中返回:

def get_train_set():"""得到训练问答集"""global num_encoder_symbols, num_decoder_symbolstrain_set = []with open('./samples/question', 'r', encoding='utf-8') as question_file:with open('./samples/answer', 'r', encoding='utf-8') as answer_file:while True:question = question_file.readline()answer = answer_file.readline()if question and answer:# strip()方法用于移除字符串头尾的字符question = question.strip()answer = answer.strip()# 得到分词IDquestion_id_list = get_id_list_from(question)answer_id_list = get_id_list_from(answer)if len(question_id_list) > 0 and len(answer_id_list) > 0:answer_id_list.append(EOS_ID)train_set.append([question_id_list, answer_id_list])else:breakreturn train_set

1.3、必要处理——构造样本数据

如果我们将所有的数据不加处理直接放入同一个train_set中返回,程序是无法区别哪些是问题哪些是答案、问题的长度读取到哪答案的长度读取到哪——我们需要给问题和答案做一些小标记:
①、我们事先定义好输入、输出的长度,这样读取的长度、输出的长度就固定下来了,程序只需每次通过固定长度就可以取出想要的数据;
②、对于输入长度超标的数据,我们只能选择截断原有的输入——不过我们可以增大输入序列长度啊,这样不就不会被截断了
③、对于长度不够输出序列长度的输出,我们采用末尾添0,保证所有的输入、输出长度都相同;

GO_ID = 1              # 输出序列起始标记
EOS_ID = 2             # 结尾标记
PAD_ID = 0             # 空值填充0
batch_num = 1000       # 参与训练的问答对个数
input_seq_len = 25         # 输入序列长度
output_seq_len = 50        # 输出序列长度

上面就是定义输入、输出序列长度,以及起始标记、结束填充,下面就是构造样本数据函数代码

def get_samples(train_set, batch_num):"""构造样本数据:传入的train_set是处理好的问答集batch_num:让train_set训练集里多少问答对参与训练# train_set = [[[5, 7, 9], [11, 13, 15, EOS_ID]], [[7, 9, 11], [13, 15, 17, EOS_ID]], [[15, 17, 19], [21, 23, 25, EOS_ID]]]"""raw_encoder_input = []raw_decoder_input = []if batch_num >= len(train_set):batch_train_set = train_setelse:random_start = random.randint(0, len(train_set)-batch_num)batch_train_set = train_set[random_start:random_start+batch_num]# 添加起始标记、结束填充for sample in batch_train_set:raw_encoder_input.append([PAD_ID] * (input_seq_len - len(sample[0])) + sample[0])raw_decoder_input.append([GO_ID] + sample[1] + [PAD_ID] * (output_seq_len - len(sample[1]) - 1))encoder_inputs = []decoder_inputs = []target_weights = []for length_idx in range(input_seq_len):encoder_inputs.append(np.array([encoder_input[length_idx] for encoder_input in raw_encoder_input], dtype=np.int32))for length_idx in range(output_seq_len):decoder_inputs.append(np.array([decoder_input[length_idx] for decoder_input in raw_decoder_input], dtype=np.int32))target_weights.append(np.array([0.0 if length_idx == output_seq_len - 1 or decoder_input[length_idx] == PAD_ID else 1.0 for decoder_input in raw_decoder_input], dtype=np.float32))return encoder_inputs, decoder_inputs, target_weights

1.4、训练过程

训练过程就是激活TensorFlow框架,往模型中feed数据,并得到训练的loss,最后是保存参数

def train():"""训练过程"""train_set = get_train_set()with tf.Session() as sess:encoder_inputs, decoder_inputs, target_weights, outputs, loss, update, saver, learning_rate_decay_op, learning_rate = get_model()sess.run(tf.global_variables_initializer())# 训练很多次迭代,每隔100次打印一次loss,可以看情况直接ctrl+c停止previous_losses = []for step in range(epochs):sample_encoder_inputs, sample_decoder_inputs, sample_target_weights = get_samples(train_set, batch_num)input_feed = {}for l in range(input_seq_len):input_feed[encoder_inputs[l].name] = sample_encoder_inputs[l]for l in range(output_seq_len):input_feed[decoder_inputs[l].name] = sample_decoder_inputs[l]input_feed[target_weights[l].name] = sample_target_weights[l]input_feed[decoder_inputs[output_seq_len].name] = np.zeros([len(sample_decoder_inputs[0])], dtype=np.int32)[loss_ret, _] = sess.run([loss, update], input_feed)if step % 100 == 0:print('step=', step, 'loss=', loss_ret, 'learning_rate=', learning_rate.eval())#print('333', previous_losses[-5:])if len(previous_losses) > 5 and loss_ret > max(previous_losses[-5:]):sess.run(learning_rate_decay_op)previous_losses.append(loss_ret)# 模型参数保存saver.save(sess, './model/'+ str(epochs)+ '/demo_')#saver.save(sess, './model/' + str(epochs) + '/demo_' + step)

1.5、预测过程

预测过程就是读取model文件夹下的参数文件进行预测

def predict():"""预测过程"""with tf.Session() as sess:encoder_inputs, decoder_inputs, target_weights, outputs, loss, update, saver, learning_rate_decay_op, learning_rate = get_model(feed_previous=True)saver.restore(sess, './model/'+str(epochs)+'/demo_')sys.stdout.write("you ask>> ")sys.stdout.flush()input_seq = sys.stdin.readline()while input_seq:input_seq = input_seq.strip()input_id_list = get_id_list_from(input_seq)if (len(input_id_list)):sample_encoder_inputs, sample_decoder_inputs, sample_target_weights = seq_to_encoder(' '.join([str(v) for v in input_id_list]))input_feed = {}for l in range(input_seq_len):input_feed[encoder_inputs[l].name] = sample_encoder_inputs[l]for l in range(output_seq_len):input_feed[decoder_inputs[l].name] = sample_decoder_inputs[l]input_feed[target_weights[l].name] = sample_target_weights[l]input_feed[decoder_inputs[output_seq_len].name] = np.zeros([2], dtype=np.int32)# 预测输出outputs_seq = sess.run(outputs, input_feed)# 因为输出数据每一个是num_decoder_symbols维的,因此找到数值最大的那个就是预测的id,就是这里的argmax函数的功能outputs_seq = [int(np.argmax(logit[0], axis=0)) for logit in outputs_seq]# 如果是结尾符,那么后面的语句就不输出了if EOS_ID in outputs_seq:outputs_seq = outputs_seq[:outputs_seq.index(EOS_ID)]outputs_seq = [wordToken.id2word(v) for v in outputs_seq]print("chatbot>>", " ".join(outputs_seq))else:print("WARN:词汇不在服务区")sys.stdout.write("you ask>>")sys.stdout.flush()input_seq = sys.stdin.readline()

-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

二、源码说明

2.1、模型训练

点击demo_test.py文件,依次点击:runEdit Configuration,出现如下窗口:
这里写图片描述
在以上Parameters中填入以下内容train,确定后再运行demo_test.py文件;

train

在面板中得到如下训练信息:
这里写图片描述

训练结束后,可以在model文件夹下看到生成的模型参数,如下所示:
这里写图片描述
到这里,训练就结束了。

2.2、模型测试

点击demo_test.py文件,依次点击:runEdit Configuration,出现如下窗口:
这里写图片描述
将以上Parameters中填入的内容train换成任意一个字符,点击OK后再运行demo_test.py文件,进入如下人机交互式:
这里写图片描述
-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

三、源码展示

3.1、demo_test.py文件

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
# -*- 2018/07/31;14:23
# -*- python3.5
import sys
import numpy as np
import tensorflow as tf
from tensorflow.contrib.legacy_seq2seq.python.ops import seq2seq
import word_token
import jieba
import randomsize = 8               # LSTM神经元size
GO_ID = 1              # 输出序列起始标记
EOS_ID = 2             # 结尾标记
PAD_ID = 0             # 空值填充0
min_freq = 1           # 样本频率超过这个值才会存入词表
epochs = 2000          # 训练次数
batch_num = 1000       # 参与训练的问答对个数
input_seq_len = 25         # 输入序列长度
output_seq_len = 50        # 输出序列长度
init_learning_rate = 0.5     # 初始学习率wordToken = word_token.WordToken()# 放在全局的位置,为了动态算出 num_encoder_symbols 和 num_decoder_symbols
max_token_id = wordToken.load_file_list(['./samples/question', './samples/answer'], min_freq)
num_encoder_symbols = max_token_id + 5
num_decoder_symbols = max_token_id + 5def get_id_list_from(sentence):"""得到分词后的ID"""sentence_id_list = []seg_list = jieba.cut(sentence)for str in seg_list:id = wordToken.word2id(str)if id:sentence_id_list.append(wordToken.word2id(str))return sentence_id_listdef get_train_set():"""得到训练问答集"""global num_encoder_symbols, num_decoder_symbolstrain_set = []with open('./samples/question', 'r', encoding='utf-8') as question_file:with open('./samples/answer', 'r', encoding='utf-8') as answer_file:while True:question = question_file.readline()answer = answer_file.readline()if question and answer:# strip()方法用于移除字符串头尾的字符question = question.strip()answer = answer.strip()# 得到分词IDquestion_id_list = get_id_list_from(question)answer_id_list = get_id_list_from(answer)if len(question_id_list) > 0 and len(answer_id_list) > 0:answer_id_list.append(EOS_ID)train_set.append([question_id_list, answer_id_list])else:breakreturn train_setdef get_samples(train_set, batch_num):"""构造样本数据:传入的train_set是处理好的问答集batch_num:让train_set训练集里多少问答对参与训练"""raw_encoder_input = []raw_decoder_input = []if batch_num >= len(train_set):batch_train_set = train_setelse:random_start = random.randint(0, len(train_set)-batch_num)batch_train_set = train_set[random_start:random_start+batch_num]# 添加起始标记、结束填充for sample in batch_train_set:raw_encoder_input.append([PAD_ID] * (input_seq_len - len(sample[0])) + sample[0])raw_decoder_input.append([GO_ID] + sample[1] + [PAD_ID] * (output_seq_len - len(sample[1]) - 1))encoder_inputs = []decoder_inputs = []target_weights = []for length_idx in range(input_seq_len):encoder_inputs.append(np.array([encoder_input[length_idx] for encoder_input in raw_encoder_input], dtype=np.int32))for length_idx in range(output_seq_len):decoder_inputs.append(np.array([decoder_input[length_idx] for decoder_input in raw_decoder_input], dtype=np.int32))target_weights.append(np.array([0.0 if length_idx == output_seq_len - 1 or decoder_input[length_idx] == PAD_ID else 1.0 for decoder_input in raw_decoder_input], dtype=np.float32))return encoder_inputs, decoder_inputs, target_weightsdef seq_to_encoder(input_seq):"""从输入空格分隔的数字id串,转成预测用的encoder、decoder、target_weight等"""input_seq_array = [int(v) for v in input_seq.split()]encoder_input = [PAD_ID] * (input_seq_len - len(input_seq_array)) + input_seq_arraydecoder_input = [GO_ID] + [PAD_ID] * (output_seq_len - 1)encoder_inputs = [np.array([v], dtype=np.int32) for v in encoder_input]decoder_inputs = [np.array([v], dtype=np.int32) for v in decoder_input]target_weights = [np.array([1.0], dtype=np.float32)] * output_seq_lenreturn encoder_inputs, decoder_inputs, target_weightsdef get_model(feed_previous=False):"""构造模型"""learning_rate = tf.Variable(float(init_learning_rate), trainable=False, dtype=tf.float32)learning_rate_decay_op = learning_rate.assign(learning_rate * 0.9)encoder_inputs = []decoder_inputs = []target_weights = []for i in range(input_seq_len):encoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="encoder{0}".format(i)))for i in range(output_seq_len + 1):decoder_inputs.append(tf.placeholder(tf.int32, shape=[None], name="decoder{0}".format(i)))for i in range(output_seq_len):target_weights.append(tf.placeholder(tf.float32, shape=[None], name="weight{0}".format(i)))# decoder_inputs左移一个时序作为targetstargets = [decoder_inputs[i + 1] for i in range(output_seq_len)]cell = tf.contrib.rnn.BasicLSTMCell(size)# 这里输出的状态我们不需要outputs, _ = seq2seq.embedding_attention_seq2seq(encoder_inputs,decoder_inputs[:output_seq_len],cell,num_encoder_symbols=num_encoder_symbols,num_decoder_symbols=num_decoder_symbols,embedding_size=size,output_projection=None,feed_previous=feed_previous,dtype=tf.float32)# 计算加权交叉熵损失loss = seq2seq.sequence_loss(outputs, targets, target_weights)# 梯度下降优化器opt = tf.train.GradientDescentOptimizer(learning_rate)# 优化目标:让loss最小化update = opt.apply_gradients(opt.compute_gradients(loss))# 模型持久化saver = tf.train.Saver(tf.global_variables())return encoder_inputs, decoder_inputs, target_weights, outputs, loss, update, saver, learning_rate_decay_op, learning_ratedef train():"""训练过程"""train_set = get_train_set()with tf.Session() as sess:encoder_inputs, decoder_inputs, target_weights, outputs, loss, update, saver, learning_rate_decay_op, learning_rate = get_model()sess.run(tf.global_variables_initializer())# 训练很多次迭代,每隔100次打印一次loss,可以看情况直接ctrl+c停止previous_losses = []for step in range(epochs):sample_encoder_inputs, sample_decoder_inputs, sample_target_weights = get_samples(train_set, batch_num)input_feed = {}for l in range(input_seq_len):input_feed[encoder_inputs[l].name] = sample_encoder_inputs[l]for l in range(output_seq_len):input_feed[decoder_inputs[l].name] = sample_decoder_inputs[l]input_feed[target_weights[l].name] = sample_target_weights[l]input_feed[decoder_inputs[output_seq_len].name] = np.zeros([len(sample_decoder_inputs[0])], dtype=np.int32)[loss_ret, _] = sess.run([loss, update], input_feed)if step % 100 == 0:print('step=', step, 'loss=', loss_ret, 'learning_rate=', learning_rate.eval())#print('333', previous_losses[-5:])if len(previous_losses) > 5 and loss_ret > max(previous_losses[-5:]):sess.run(learning_rate_decay_op)previous_losses.append(loss_ret)# 模型参数保存saver.save(sess, './model/'+ str(epochs)+ '/demo_')#saver.save(sess, './model/' + str(epochs) + '/demo_' + step)def predict():"""预测过程"""with tf.Session() as sess:encoder_inputs, decoder_inputs, target_weights, outputs, loss, update, saver, learning_rate_decay_op, learning_rate = get_model(feed_previous=True)saver.restore(sess, './model/'+str(epochs)+'/demo_')sys.stdout.write("you ask>> ")sys.stdout.flush()input_seq = sys.stdin.readline()while input_seq:input_seq = input_seq.strip()input_id_list = get_id_list_from(input_seq)if (len(input_id_list)):sample_encoder_inputs, sample_decoder_inputs, sample_target_weights = seq_to_encoder(' '.join([str(v) for v in input_id_list]))input_feed = {}for l in range(input_seq_len):input_feed[encoder_inputs[l].name] = sample_encoder_inputs[l]for l in range(output_seq_len):input_feed[decoder_inputs[l].name] = sample_decoder_inputs[l]input_feed[target_weights[l].name] = sample_target_weights[l]input_feed[decoder_inputs[output_seq_len].name] = np.zeros([2], dtype=np.int32)# 预测输出outputs_seq = sess.run(outputs, input_feed)# 因为输出数据每一个是num_decoder_symbols维的,因此找到数值最大的那个就是预测的id,就是这里的argmax函数的功能outputs_seq = [int(np.argmax(logit[0], axis=0)) for logit in outputs_seq]# 如果是结尾符,那么后面的语句就不输出了if EOS_ID in outputs_seq:outputs_seq = outputs_seq[:outputs_seq.index(EOS_ID)]outputs_seq = [wordToken.id2word(v) for v in outputs_seq]print("chatbot>>", " ".join(outputs_seq))else:print("WARN:词汇不在服务区")sys.stdout.write("you ask>>")sys.stdout.flush()input_seq = sys.stdin.readline()if __name__ == "__main__":if sys.argv[1] == 'train':train()else:predict()

3.2、word_token.py文件

# -*- coding:utf-8 -*-
# -*- author:zzZ_CMing  CSDN address:https://blog.csdn.net/zzZ_CMing
# -*- 2018/07/31;14:23
# -*- python3.5
import sys
import jiebaclass WordToken(object):def __init__(self):# 最小起始id号, 保留的用于表示特殊标记self.START_ID = 4self.word2id_dict = {}self.id2word_dict = {}def load_file_list(self, file_list, min_freq):"""加载样本文件列表,全部切词后统计词频,按词频由高到低排序后顺次编号并存到self.word2id_dict和self.id2word_dict中file_list = [question, answer]min_freq: 最小词频,超过最小词频的词才会存入词表"""words_count = {}for file in file_list:with open(file, 'r', encoding='utf-8') as file_object:for line in file_object.readlines():line = line.strip()seg_list = jieba.cut(line)for str in seg_list:if str in words_count:words_count[str] = words_count[str] + 1else:words_count[str] = 1sorted_list = [[v[1], v[0]] for v in words_count.items()]sorted_list.sort(reverse=True)for index, item in enumerate(sorted_list):word = item[1]if item[0] < min_freq:breakself.word2id_dict[word] = self.START_ID + indexself.id2word_dict[self.START_ID + index] = wordreturn indexdef word2id(self, word):# 判断word是不是字符串if not isinstance(word, str):print("Exception: error word not unicode")sys.exit(1)if word in self.word2id_dict:return self.word2id_dict[word]else:return Nonedef id2word(self, id):id = int(id)if id in self.id2word_dict:return self.id2word_dict[id]else:return None

-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

源码链接

本文源码下载——请下载
还有一篇我的聊天机器人实现——【聊天机器人】1:DeepQA使用自己的数据集做chatbot
-------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【chatGPT4结对编程】chatGPT4教我做图像分类

开始接触深度学习 大语言模型火了之后&#xff0c;我也想过是否要加入深度学习的行业当中来&#xff0c;一开始的想法就是AI大模型肯定会被各大厂垄断&#xff0c;我们作为普通应用型软件工程师直接调用api就完事&#xff0c;另外对自己的学历也自卑(刚刚够线的二本&#xff0…

对比体验 ChatGPT,聊聊文心一言的优缺点

在昨天文心一言发布后&#xff0c;我第一时间拿到了体验的资格&#xff0c;但第一次使用后却不禁有些失望。他的逻辑能力极度缺乏、创造力也差点意思。不过&#xff0c;今天再次高强度使用后&#xff0c;却又让我对这款产品的想法有了些许改变。 前言 将 2023 年称为 AI 纪元…

聊聊 ChatGPT 的逻辑架构与赚钱模式

先讲讲 ChatGPT 这一波 AI 浪潮的技术架构&#xff0c;再聊聊一些已经被市场验证可行的个人盈利模型。 一图胜千言&#xff0c;上图囊括了当下 AI 生成式逻辑&#xff0c;不管哪个产品、框架还是产品都可以找到自己的位置&#xff0c;抽象出来后跟一般的技术架构也没什么两样&a…

ChatGPT-4:恐怖的AI再度进化,可识别图像内容

近日&#xff0c;OpenAI公司发布了一款新的AI技术——ChatGPT-4&#xff0c;它是一种基于自然语言处理的深度学习模型&#xff0c;可以识别图像内容并生成相应的文字描述。ChatGPT-4的发布&#xff0c;标志着人工智能技术再度进化&#xff0c;令人恐惧。 ChatGPT-4是OpenAI公…

ChatGPT再度封号; 英伟达市值暴涨超2000亿美元

&#x1f680; 英伟达市值暴涨超2000亿美元&#xff0c;或将成为第一家市值破万亿美元的芯片公司 摘要&#xff1a;英伟达市值在一天内暴涨超2000亿美元&#xff0c;即将成为第一家市值破万亿美元的芯片公司。这一涨幅创下历史最大单日涨幅纪录&#xff0c; 背后原因是英伟达…

百川智能发布开源中英文大模型;GitHub调查显示92%的程序员使用AI编码工具;第一季度中国云服务支出增长6%丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 百川智能发布开源中英文大模型 6月15日&#xff0c;百川智能公司推出了70亿参数量的中英文预训练大模型——baichuan-7B。baichuan-7B在C-Eval、AGIEval和Gaokao中文权威评测榜单上&#xff0c;超过了ChatGLM-6…

谷歌地图推出、暴雪公司成立 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 2 月 8 日&#xff0c;在 1999 年的今天&#xff0c;中国少年科学院成立。24 年前&#xff0c;来自北京、上海、江苏等地的 13 名少年科技爱好者从领导和专家的…

谁是全球芯片行业的“麒麟才子”?得之可得天下!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 自从半导体技术问世以来&#xff0c;美国一直是该行业的领先者。它在设计、制造和市场营销方面拥有深厚的技术和经验&#xff0c;在全球芯片市场中占据着重要地位。与此同时&#xff0c;中国在过去几十年里取得了巨大的发展…

3秒即可克隆人声,母亲险些被AI“女儿”诈骗100万美元!

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 破防了&#xff0c;接到“女儿”的求救电话&#xff0c;竟不能相信自己的耳朵&#xff01; 今年年初&#xff0c;美国亚利桑那州的 Jennifer DeStefano 就遇到了“耳听为虚”的骗局。 据…

GPT-4 挑战当老板,目标:用 100 美元生成 100000 美元!

作者 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 几周之前&#xff0c;品牌设计师兼作家 Jackson Greathouse Fall 的 Twitter 粉丝还不到 4000 人。 现如今&#xff0c;他已拥有 10.8 万的粉丝量&#xff0c;迅速吸粉的背后只因为他突发奇想——“我准…

GPT-4 已经可以独立创业了,感觉自己在追剧,一个人就是一家公司

Datawhale干货 编辑&#xff1a;大数据文摘&#xff0c;来源&#xff1a;CSDNnews 几周之前&#xff0c;品牌设计师兼作家 Jackson Greathouse Fall 的 Twitter 粉丝还不到 4000 人。 现如今&#xff0c;他已拥有 10.8 万的粉丝量&#xff0c;迅速吸粉的背后只因为他突发奇想—…

AI独立开发者:一周涨粉8万赚2W美元;推特#HustleGPT GPT-4创业挑战;即刻#AIHackathon创业者在行动 | ShowMeAI周刊

&#x1f440;日报&周刊合辑 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 这是ShowMeAI周刊的第7期。聚焦AI领域本周热点&#xff0c;及其在各圈层泛起的涟漪&#xff1b;拆解AI独立开发者的盈利案例&#xff0c;关注中美AIG…

一步一步把废旧的电脑变成一个高端的路由器,可优雅的访问最火的chatgpt,包含详细过程及快捷脚本(一)

一步一步把废旧的电脑变成一个高端的路由器,可优雅的访问最火的chatgpt,包含详细过程及快捷脚本。 1、准备 这里的电脑可以是笔记本电脑或者台式电脑,台式电脑如果没有无线网卡,可以自己到网上买一个外接无线网卡,USB接口的那种,大概30米左右,这样用起来更方便。之后通…

ChatGPT-4下周要来了

昨天的一则新闻引起了轰动&#xff0c;微软德国首席技术官 Andreas Braun 在最近一次名为“AI in Focus — Digital Kickoff”的活动中透露了这一消息。根据 Braun 的说法&#xff0c;“我们将在下周推出 GPT-4……我们将拥有多模态模型&#xff0c;它们将提供完全不同的可能性…

1月22号

https://acs.jxnu.edu.cn/problem/ICPCJX2020J 分离游戏 描述 爱丽丝和鲍勃喜欢切纸&#xff0c;但是他们只有一张新纸&#xff0c;他们都想要&#xff0c;但是他们不愿切开这张纸&#xff0c;所以他们决定通过游戏决定纸归属&#xff0c;爱丽丝找到了一张有N*M个网格的久方形…

苹果头显这把火,能点亮元宇宙暗夜吗?

编辑I王靖 撰文|赵晋杰 接任乔布斯12年后&#xff0c;库克终于迎来了真正属于自己的One more thing时刻&#xff0c;寄希望于用MR&#xff08;增强现实&#xff09;开启后iPhone时代。 在6月6日凌晨的苹果全球开发者大会&#xff08;WWDC&#xff09;上&#xff0c;这款MR设备被…

独家专访BlockCity区块城市徐志翔:DAO是未来元宇宙的核心

转载说明&#xff1a; 最近随着ChatGPT的出圈&#xff0c;整个AIGC领域倍受关注&#xff0c;唱衰媒体人的声音也开始不绝于耳&#xff0c;但看到这样有质量的长文&#xff0c;我想也不是每个媒体人都将会被AI替代吧。 本文来自前瞻《元宇宙观察》专栏记者采访&#xff0c;作…

穷途末路的阿里中台

观点| Mr.K 主笔| Wendy.L 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 对于关注K哥公众号多年的朋友来说&#xff0c;“中台”早就是老生常谈的东西了&#xff0c;如果你还不知道它是什么&#xff0c;可以看看之前的中台文章先恶补一下。 关于中台&#xff0c;这些年翻…

审视HR SaaS:谁在成为中国的 “IBM+ Workday”?

在国内的商业环境下&#xff0c;未来&#xff0c;梳理流程等咨询管理能力&#xff0c;或将成为HR SaaS厂商的重要竞争力&#xff0c;国内HR SaaS在“IBM Workday”的模式下&#xff0c;或将迎来新一轮增长。 作者|斗斗 编辑|皮爷 出品|产业家 2023年&#xff0c;HR SaaS 正式…

阿里云回应裁员7%,只是正常岗位优化;Bing将成为OpenAI默认搜索引擎;​nginx 1.25.0发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…