AI 影评家: 用 Hugging Face 模型打造一个电影评分机器人

本文为社区成员 Jun Chen 为 百姓 AI 和 Hugging Face 联合举办的黑客松所撰写的教程文档,欢迎你阅读今天的第二条推送了解和参加本次黑客松活动。文内含有较多链接,我们不再一一贴出,请在文末阅读原文处点击查看渲染后的 Notebook 文件。

随着人工智能和大模型 ChatGPT 的持续火爆,越来越多的个人和创业者都想并且可以通过自己创建人工智能 APP 来探索这个新兴领域的机会。只要你有一个想法,你就可以通过各种开放社区和资源实现一些简单功能,满足特定领域或者用户的需求。

试想现在有一部新的电影刚刚上线了,我们和朋友在家热烈的讨论着这部新的电影,这些都是非常有价值的电影评价的信息,不过估计这个时候很少有人会特地去登陆自己的豆瓣账号再去发表这些刚刚的评论,如果有一个电影评论机器人可以自动收集这些评论并且根据评论打分,然后自动上传到制定的电影评论网站呢?再比如,我们在某个餐厅吃饭,我们只用对着手机说几句话,我们的评分就自动上传到大众点评呢?我们来试试如何实现这样一个小小的机器人吧!

在本教程中,我们将探索如何使用 Hugging Face 资源来 Finetune 一个模型且构建一个电影评分机器人。我们将向大家展示如何整合这些资源,让你的聊天机器人具备总结评论并给出评分的功能。我们会用通俗易懂的语言引导你完成这个有趣的项目!

为了可以简单的说明实现的步骤,我们简化这个【电影打分机器人】的实现方法:

  1. App 直接收集来自 inputtext 作为输入,有兴趣的小伙伴们可以研究一下如何接入到语音,Whisper to ChatGPT 是一个很有好的例子。

  2. App 不会实现自动上传评价到特定网站。

第一步: 训练电影评价打分模型

首先我们需要一个可以看懂评论且给评论打分的模型,这个例子选用的是利用数据集 IMDb 微调 DistilBERT,微调后的模型可以预测一个电影的评论是正面的还是负面的且给出评分(五分满分)。

当然大家可以根据各自的需求找到不同的数据集来 Finetune 模型,也可以使用不同的基础模型,Hugging Face 上提供了很多可选项。

本任务使用或间接使用了下面模型的架构:

ALBERT, BART, BERT, BigBird, BigBird-Pegasus, BLOOM, CamemBERT, CANINE, ConvBERT, CTRL, Data2VecText, DeBERTa, DeBERTa-v2, DistilBERT, ELECTRA, ERNIE, ErnieM, ESM, FlauBERT, FNet, Funnel Transformer, GPT-Sw3, OpenAI GPT-2, GPT Neo, GPT-J, I-BERT, LayoutLM, LayoutLMv2, LayoutLMv3, LED, LiLT, Longformer, LUKE, MarkupLM, mBART, Megatron-BERT, MobileBERT, MPNet, MVP, Nezha, Nyströmformer, OpenAI GPT, OPT, Perceiver, PLBart, QDQBert, Reformer, RemBERT, RoBERTa, RoBERTa-PreLayerNorm, RoCBert, RoFormer, SqueezeBERT, TAPAS, Transformer-XL, XLM, XLM-RoBERTa, XLM-RoBERTa-XL, XLNet, X-MOD, YOSO

# Transformers installation
! pip install transformers datasets evaluate
# To install from source instead of the last release, comment the command above and uncomment the following one.
# ! pip install git+https://github.com/huggingface/transformers.git

在使用本示例前请安装如下库文件:

pip install transformers datasets evaluate

我们建议登陆 Hugging Face 账户进行操作,这样就可以方便的上传和分享自己创建的模型。当有弹框时请输入个人的 token 。根据下图找到我们自己的 Hugging Face Tokens。

87fb3ff8aae52bcb2b14876718a95306.png
from huggingface_hub import notebook_loginnotebook_login()
Token is valid.
Your token has been saved in your configured git credential helpers (store).
Your token has been saved to /root/.cache/huggingface/token
Login successful

加载 IMDb 数据集

开始从 Datasets 库中加载 IMDb 数据集 🤗 :

from datasets import load_datasetimdb = load_dataset("imdb")
Downloading builder script:   0%|          | 0.00/4.31k [00:00<?, ?B/s]
Downloading metadata:   0%|          | 0.00/2.17k [00:00<?, ?B/s]
Downloading readme:   0%|          | 0.00/7.59k [00:00<?, ?B/s]
Downloading and preparing dataset imdb/plain_text to /root/.cache/huggingface/datasets/imdb/plain_text/1.0.0/d613c88cf8fa3bab83b4ded3713f1f74830d1100e171db75bbddb80b3345c9c0...
Downloading data:   0%|          | 0.00/84.1M [00:00<?, ?B/s]
Generating train split:   0%|          | 0/25000 [00:00<?, ? examples/s]
Generating test split:   0%|          | 0/25000 [00:00<?, ? examples/s]
Generating unsupervised split:   0%|          | 0/50000 [00:00<?, ? examples/s]
Dataset imdb downloaded and prepared to /root/.cache/huggingface/datasets/imdb/plain_text/1.0.0/d613c88cf8fa3bab83b4ded3713f1f74830d1100e171db75bbddb80b3345c9c0. Subsequent calls will reuse this data.0%|          | 0/3 [00:00<?, ?it/s]

检查一下数据是否载入成功:

imdb["test"][0]
{'text': 'I love sci-fi and am willing to put up with a lot. Sci-fi movies/TV are usually underfunded, under-appreciated and misunderstood. I tried to like this, I really did, but it is to good TV sci-fi as Babylon 5 is to Star Trek (the original). Silly prosthetics, cheap cardboard sets, stilted dialogues, CG that doesn\'t match the background, and painfully one-dimensional characters cannot be overcome with a \'sci-fi\' setting. (I\'m sure there are those of you out there who think Babylon 5 is good sci-fi TV. It\'s not. It\'s clichéd and uninspiring.) While US viewers might like emotion and character development, sci-fi is a genre that does not take itself seriously (cf. Star Trek). It may treat important issues, yet not as a serious philosophy. It\'s really difficult to care about the characters here as they are not simply foolish, just missing a spark of life. Their actions and reactions are wooden and predictable, often painful to watch. The makers of Earth KNOW it\'s rubbish as they have to always say "Gene Roddenberry\'s Earth..." otherwise people would not continue watching. Roddenberry\'s ashes must be turning in their orbit as this dull, cheap, poorly edited (watching it without advert breaks really brings this home) trudging Trabant of a show lumbers into space. Spoiler. So, kill off a main character. And then bring him back as another actor. Jeeez! Dallas all over again.','label': 0}

在这个数据集中有两个字段:

  • text: 电影评论。

  • label: 0 或者 1。0 代表负面评价、1 代表正面评价。

输入数据预处理

这一步是加载 DistilBERT tokenizer,并创建一个预处理函数来预处理 text,且保证输入不会大于 DistilBERT 的最长输入要求:

from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
def preprocess_function(examples):return tokenizer(examples["text"], truncation=True)
Downloading (…)okenizer_config.json:   0%|          | 0.00/28.0 [00:00<?, ?B/s]
Downloading (…)lve/main/config.json:   0%|          | 0.00/483 [00:00<?, ?B/s]
Downloading (…)solve/main/vocab.txt:   0%|          | 0.00/232k [00:00<?, ?B/s]
Downloading (…)/main/tokenizer.json:   0%|          | 0.00/466k [00:00<?, ?B/s]

使用 🤗 Datasets map 函数把预处理函数应用到整个数据集中。我们还可以使用 batched=True 来加速 map:

tokenized_imdb = imdb.map(preprocess_function, batched=True)

使用 DataCollatorWithPadding 来生成数据包,这样动态的填充数据包到最大长度能够更加节省资源。

from transformers import DataCollatorWithPaddingdata_collator = DataCollatorWithPadding(tokenizer=tokenizer)

模型评测函数

选择一个合适的测评指标是至关重要的。大家可以直接调用库函数 🤗 Evaluate 里的各种测评指标。在这个例子中,我们使用了accuracy,了解更多请 查看文档快速上手:

import evaluateaccuracy = evaluate.load("accuracy")
Downloading builder script:   0%|          | 0.00/4.20k [00:00<?, ?B/s]

这里我们需要定义一个可以 计算 指标的函数:

import numpy as npdef compute_metrics(eval_pred):predictions, labels = eval_predpredictions = np.argmax(predictions, axis=1)return accuracy.compute(predictions=predictions, references=labels)

训练模型

在开始训练前,需要定义一个id到标签和标签到id的 map

id2label = {0: "NEGATIVE", 1: "POSITIVE"}
label2id = {"NEGATIVE": 0, "POSITIVE": 1}

如果不熟悉如何使用 Trainer 来训练模型, 可以查看更详细的教程!

好了,一切已经准备就绪!我们可以使用 AutoModelForSequenceClassification 加载 DistilBERT 模型:

from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainermodel = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=2, id2label=id2label, label2id=label2id
)
Downloading pytorch_model.bin:   0%|          | 0.00/268M [00:00<?, ?B/s]Some weights of the model checkpoint at distilbert-base-uncased were not used when initializing DistilBertForSequenceClassification: ['vocab_layer_norm.bias', 'vocab_transform.bias', 'vocab_transform.weight', 'vocab_projector.weight', 'vocab_layer_norm.weight', 'vocab_projector.bias']
- This IS expected if you are initializing DistilBertForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing DistilBertForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
Some weights of DistilBertForSequenceClassification were not initialized from the model checkpoint at distilbert-base-uncased and are newly initialized: ['pre_classifier.bias', 'classifier.weight', 'classifier.bias', 'pre_classifier.weight']
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.

接下来只有三步需要完成:

  1. 在 TrainingArguments 中定义模型超参,只有 output_dir 参数是必须的。我们可以设置 push_to_hub=True 来直接上传训练好的模型(如果已经登陆了Hugging Face)。在每一个训练段,Trainer 都会评测模型的 accuracy 和保存此节点。

  2. 传入超参数,模型,数据集和评测函数到 Trainer。

  3. 调用 train() 来微调模型。

training_args = TrainingArguments(output_dir="my_awesome_model",learning_rate=2e-5,per_device_train_batch_size=16,per_device_eval_batch_size=16,num_train_epochs=2,weight_decay=0.01,evaluation_strategy="epoch",save_strategy="epoch",load_best_model_at_end=True,push_to_hub=True,
)trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_imdb["train"],eval_dataset=tokenized_imdb["test"],tokenizer=tokenizer,data_collator=data_collator,compute_metrics=compute_metrics,
)trainer.train()
Cloning https://huggingface.co/chenglu/my_awesome_model into local empty directory.
WARNING:huggingface_hub.repository:Cloning https://huggingface.co/chenglu/my_awesome_model into local empty directory.
/usr/local/lib/python3.9/dist-packages/transformers/optimization.py:391: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warningwarnings.warn(
You're using a DistilBertTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
EpochTraining LossValidation LossAccuracy
10.2387000.1889980.927600
20.1512000.2334570.93096
TrainOutput(global_step=3126, training_loss=0.20756478166244613, metrics={'train_runtime': 3367.9454, 'train_samples_per_second': 14.846, 'train_steps_per_second': 0.928, 'total_flos': 6561288258498624.0, 'train_loss': 0.20756478166244613, 'epoch': 2.0})

训练结束后大家就可以通过 push_to_hub() 方法 上传模型到 Hugging Face 上了,这样所有人都可以看见并且使用你的模型了。

第二步:模型上传到 Hugging Face

trainer.push_to_hub()
remote: Scanning LFS files of refs/heads/main for validity...        
remote: LFS file scan complete.        
To https://huggingface.co/YOURUSERNAME/my_awesome_modelbeedd7e..07a7f56  main -> mainWARNING:huggingface_hub.repository:remote: Scanning LFS files of refs/heads/main for validity...        
remote: LFS file scan complete.        
To https://huggingface.co/YOURUSERNAME/my_awesome_modelbeedd7e..07a7f56  main -> mainTo https://huggingface.co/YOURUSERNAME/my_awesome_model07a7f56..94dee6f  main -> mainWARNING:huggingface_hub.repository:To https://huggingface.co/YOURUSERNAME/my_awesome_model07a7f56..94dee6f  main -> main'https://huggingface.co/YOURUSERNAME/my_awesome_model/commit/07a7f56bd4c32596537816ff2fed565f29468f17'

大家可以在 PyTorch Notebook或者 TensorFlow Notebook 查看更加详细的关于如何微调模型的教程。

第三步:创建自己的 App

恭喜大家已经获得了自己的模型!下面我们可以在 Hugging Face 中创建一个自己的 App 了。

创建新的 Hugging Face Space 应用

! pip install gradio torch

在 Spaces 主页上点击 Create new Space

添加 App 逻辑

app.py 文件中接入以下代码:

import gradio as gr
from transformers import pipeline
import torchid2label = {0: "NEGATIVE", 1: "POSITIVE"}
label2id = {"NEGATIVE": 0, "POSITIVE": 1}# 导入 HuggingFace 模型 我们刚刚训练好而且上传成功的模型 chjun/my_awesome_model
classifier = pipeline("sentiment-analysis", model="chjun/my_awesome_model")# input:输入文本
def predict(inputs):label_score = classifier(inputs)scaled = 0if label_score[0]["label"] == "NEGATIVE":scaled = 1 - label_score[0]["score"]else:scaled = label_score[0]["score"]# 解码返回值得到输出return round(scaled * 5)with gr.Blocks() as demo:review = gr.Textbox(label="用户评论。注:此模型只使用了英文数据 Finetune")output = gr.Textbox(label="颗星")submit_btn = gr.Button("提交")submit_btn.click(fn=predict, inputs=review, outputs=output, api_name="predict")    demo.launch(debug=True)

成功运行后,大家应该可以看见下面类似的界面:

0c43929eee9eddf3e5539e25e8abe0f9.png

注意,我们需要把必须的库文件放在 requirements.txt 中,例如这个 App 需要:

gradio
torch
transformers

另外,由于我们在示范中只跑了 2 个 epoch,所以最终模型 accuracy 不高。大家可以根据自己的情况调整超参和训练时长。

上传到 Hugging Face Spaces

$git add app.py
$git commit -m "Add application file"
$git push

而且 app.py 以及 requirements.txt 文件,都可以在 Hugging Face Hub 的界面上直接操作,如下图:

79d7683377a6a857a5ba2cad1fd64c42.png

第四步: 完成机器人开发

现在,你已经创建了一个能够根据电影评论给电影打分的机器人。当你向机器人提问时,它会使用 Hugging Face 的模型进行情感分析,根据情感分析结果给出一个评分。

chjun/movie_rating_bot 是根据以上教程完成的一个机器人 App,大家也可以直接复制这一个 Space 应用,并在此基础上更改开发。

点击 submit,与你的 AI 伙伴互动吧!这个项目仅仅是一个起点,你可以根据自己的需求和兴趣进一步完善这个聊天机器人,使其具备更多有趣的功能。

第五步: 接入 BaixingAI 机器人广场

还有更激动人心的一步,我们可以把机器人接口根据 BaixingAI 机器人广场需求 扩展,让我们自己创建的机器人可以去和其他机器人交流对话,以下是代码示范:

import gradio as gr
from transformers import pipeline
import torch# 导入 HuggingFace 模型 我们刚刚训练好而且上传成功的模型 chjun/my_awesome_model
classifier = pipeline("sentiment-analysis", model="chjun/my_awesome_model")# input:输入文本
def predict(user_review, qid, uid):label_score = classifier(user_review)scaled = 0if label_score[0]["label"] == "NEGATIVE":scaled = 1 - label_score[0]["score"]else:scaled = label_score[0]["score"]# 解码返回值得到输出return str(round(scaled * 5))# user_review: 用户评价
# qid:当前消息的唯一标识。例如 `'bxqid-cManAtRMszw...'`。由平台生成并传递给机器人,以便机器人区分单个问题(写日志、追踪调试、异步回调等)。同步调用可忽略。  
# uid:用户的唯一标识。例如`'bxuid-Aj8Spso8Xsp...'`。由平台生成并传递给机器人,以便机器人区分用户。可被用于实现多轮对话的功能。  
demo = gr.Interface(fn=predict,inputs=["text","text","text"],outputs="text",)demo.launch()

更多详情请参考 Hugging Face 上 baixing 的 Spaces:
https://hf.co/baixing

未来已来,各位 Hackathon 参赛者们都是探索者,预祝大家一切顺利!

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

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

相关文章

思否黑马圆满收官,28 支队伍创意使用 Jina AI 三款 AIGC 装备!

上周末&#xff0c;杭州被 AI 热潮所沸腾&#xff01;SegmentFault AI Hackathon 杭州站暨思否 11 周年特别活动在 G5 创投中心拉开帷幕&#xff0c;超过 30 支团队参加了 32 小时的极限编程挑战&#xff0c;他们的产品展示直击评委的心&#xff0c;其中 28 支队伍得到了 Jina …

BUAA-2023软件工程团队项目——选题和需求分析

BUAA MapForum 项目这个作业属于哪个课程2023北航敏捷软件工程这个作业的要求在哪里团队项目-选题和需求分析我在这个课程的目标是学习并实践软件工程开发的方法论。在把握整体流程和内容要素的基础上实践细节&#xff0c;培养开发技术、开发思维、团队协作等能力。这个作业在…

2023年,请不要忽略!图神经网络(GNN)这一匹黑马!

点击下方“AINLPer“&#xff0c;关注我吧 更多干货&#xff0c;第一时间送达 引言 虽然在过去的几个月里&#xff0c;「ChatGPT以及扩散模型(Diffusion Models)等生成式AI一直是人们关注的焦点&#xff0c;但也请不要忽略图神经网络(GNN)的迅速发展」。经过近几年的发展&#…

AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?

GPT等AI大模型震撼来袭&#xff0c;基于RPA的超级自动化仍是最佳落地载体 对话弘玑CPO贾岿&#xff0c;深入了解国产RPA厂商对AI大模型的探索与实践 文/王吉伟 关于RPA已死的说法&#xff0c;在中国RPA元年&#xff08;2019年&#xff09;投资机构疯狂抢项目之时就已经有了。…

巧用提示词释放chatgpt的潜力

得益于 ChatGPT 和其他大型语言模型&#xff0c;提示词工程学&#xff08;Prompt Engineering&#xff09;像风一样已迅速成为我们生活的一部分。这是一个全新的非常受欢迎的领域。也就是说&#xff0c;现在是提高您的技能并在提示词工程学方面变得更好的最佳时机。 如果您想知…

【人工智能】只需要1分钟,GPT就帮我生成了思维导图

自从人工智能横空而出&#xff0c;它在人们的生活中产生了巨大的影响。尤其在企业办公领域&#xff0c;借助人工智能的力量&#xff0c;能够迅速产出丰富多样的内容&#xff0c;无论对于企业还是个人都具有重要的帮助。 想象一下&#xff0c;通过与人工智能的合作&#xff0c;您…

Pandas + ChatGPT:交互式数据分析!

Python Pandas是一个为Python编程提供数据操作和分析功能的开源工具包。这个库已经成为数据科学家和分析师的必备工具。它提供了一种有效的方法来管理结构化数据(Series和DataFrame)。 在人工智能领域&#xff0c;Pandas经常用于机器学习和深度学习过程的预处理步骤。Pandas通过…

计算机专业英语口语app,强烈推荐4款学英语必备的英语口语APP

我们大家都学了这么多年英语了&#xff0c;从小学到大学&#xff0c;但大多数人基本上学的都是应试类型的&#xff0c;甚至是哑巴英语。别人问你一句“How are you?”&#xff0c;你只会回答“I’m fine, thank you. And you?” 其他回答都想不起来。要是发音好也就算了&…

自学英语的手机软件哪个好,负基础

我是一名英语过了大学六级的学生&#xff0c;学英语用软件是学不会的&#xff0c;分享一些方法你参考一下吧 学习英语前的第一步&#xff1a;建立英语思维 为什么大家学英语学得这么累&#xff0c;最后依然对英语糊糊涂涂&#xff1f;原因只有一个——就是我们的学习能力太差…

Linux查询出口IP

查询的方式是通过Linux的curl访问查询ip的网站进行查询 具体步骤&#xff1a; 1.查询查询ip网站的ip 2.配置Linux的hosts文件 在/etc中的hosts文件增加上面的域名和ip&#xff08;注意&#xff1a;是ifconfig&#xff0c;不是ipconfig&#xff09; 3.在ssh命令下执行 curl ifc…

为什么百度查到的ip和ipconfig查到的不一样?公网IP和私网IP 有什么区别?

一、查询 我们分别在百度搜ip查询&#xff0c;查询到本机的ip如左图&#xff0c;再利用ipconfig查询到自身ip如右图。 我们能看到这两个地址是不同的&#xff0c;那么不是说&#xff0c;每个主机都只有一个ip地址么&#xff0c;为什么我们查到的两个Ip地址不一样呢&#xff1f…

AI开源路在何方丨2023智源大会精彩回顾

导读 当下&#xff0c;AI开源已经成为了人类开源创新的主战场&#xff0c;是超大规模人类智力协同的最佳组织形式。得益于开源协作持续不断地推进&#xff0c;AI在这个时代飞速发展。可以说如果没有开源社区建设&#xff0c;就不会有今天人工智能的成就。 在2023智源大会AI开源…

洞见数字时代的创新原力,数云原力大会暨 2023TECH 第五届数字中国技术年会开幕

4 月 25 日&#xff0c;神州控股、神州信息、神州数码集团共同主办的数云原力大会暨 2023TECH 第五届数字中国技术年会隆重开幕。开幕式上&#xff0c;数百位投身并关注数字技术、数字产业发展的学者、技术专家、从业者、行业用户齐聚一堂&#xff0c;围绕云原生、数字原生、大…

洞见数字时代的创新原力,数云原力大会暨2023TECH第五届数字中国技术年会开幕

4月25日&#xff0c;神州控股、神州信息、神州数码集团共同主办的数云原力大会暨2023TECH第五届数字中国技术年会开幕。开幕式上&#xff0c;数百位投身并关注数字技术、数字产业发展的学者、技术专家、从业者、行业用户齐聚一堂&#xff0c;围绕云原生、数字原生、大数据、金融…

车载微信要来了?马化腾:正研发纯语音交互接口

作者 | Just 出品 | AI科技大本营&#xff08;公众号ID&#xff1a;rgznai100&#xff09; 去年腾讯提出“AI in All”战略之后&#xff0c;马化腾又发布了超级大脑。 5 月 23 日&#xff0c;在广州举行的腾讯“云未来”峰会上&#xff0c;马化腾指出&#xff0c;超级大脑是一个…

联手百度腾讯,恒大汽车押注智能化

作者 | 周继凤 编辑 | 黎明 来源 | 深燃(shenrancaijing) 造车开始进入下半场了。 越来越多的巨头玩家入局抢夺市场。比如&#xff0c;苹果公司被传出将在2021年9月发布首款电动车Apple Car&#xff0c;阿里与浦东新区共同投资打造的高端智能纯电汽车项目“智己汽车”已正式亮…

腾讯车联发布TAI3.0:三步实现汽车智能进化,2个月快速上车

6月24日&#xff0c;“2020腾讯智慧出行新品发布会”在线上举行&#xff0c;全新升级的TAI3.0生态车联网正式亮相&#xff0c;并在新款哈弗F7上进行了真实驾车场景的功能展示。 据介绍&#xff0c;TAI3.0包含两个车载APP——腾讯随行和腾讯爱趣听&#xff0c;以及一个生态开放…

字节有点飘了,现在阿里员工跳槽字节不受待见

上一篇&#xff1a;对不起&#xff0c;实在扛不住了。。。 字节现在厉害了&#xff0c;不愧为宇宙第一大厂。 阿里员工现在跳槽字节被鄙视&#xff0c;阿里经历竟然是减分项。 据某互联网大厂HR发文透漏&#xff1a;现在阿里跳字节真的不受待见&#xff0c;背景是负加成。 他举…

定了!2023年工资发放时间标准

推荐阅读&#xff1a;16 款 ChatGPT 工具&#xff0c;太炸裂了&#xff01; 劳动法规定公司需要按月支付工资&#xff0c;一旦工资发放日期不合法&#xff0c;公司将会面临巨额赔偿&#xff01; 最近&#xff0c;知乎就有这样一个案例案例&#xff1a;“深圳一公司 20 号发上月…

什么是伪原创?SEO伪原创该怎么做

伪原创是指在原有的文章或内容基础上进行修改或调整&#xff0c;以产生看起来是全新内容的文章&#xff0c;但实际上并没有创造新的价值。多数情况下&#xff0c;伪原创的目的是为了在文章相对原创的情况下&#xff0c;提高搜索引擎的排名。 一、高质量伪原创 做好伪原创&#…