【AI达人特训营】PaddleNLP实现聊天问答匹配

【飞桨领航团】AI达人特训营:PaddleNLP实现聊天问答匹配

1. 项目背景

本项目是ai达人特训营的选题,目测该选题来自这个比赛:房产行业聊天问答匹配

背景: 贝壳找房是以技术驱动的品质居住服务平台,“有尊严的服务者、更美好的居住”,是贝壳的使命。在帮助客户实现更美好的居住过程中,客户会和服务者(房产经纪人)反复深入交流对居住的要求,这个交流发生在贝壳APP上的IM中。
IM交流是双方建立信任的必要环节,客户需要在这个场景下经常向服务者咨询许多问题,而服务者是否为客户提供了感受良好、解答专业的服务就很重要,贝壳平台对此非常关注。因此,需要准确找出服务者是否回答了客户的问题,并进一步判断回答得是否准确得体,随着贝壳平台规模扩大,需要AI参与这个过程。

任务:
赛题任务:给定IM交流片段,片段包含一个客户问题以及随后的经纪人若干IM消息,从这些随后的经纪人消息中找出一个是对客户问题的回答。
任务要点:

数据来自一个IM聊天交流过程;选取的客户问题之前的聊天内容不会提供;提供客户问题之后的经纪人发送的内容;如果在这些经纪人发送内容之间原本来穿插了其他客户消息,不会提供;这些经纪人发送内容中有0条或多条对客户问题的回答,把它找出来。

结果:

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

说明:比赛已经比较久了,现在只能获取长期公开赛的评分排名,而且没什么人,不过用来学习文本匹配思路还是不错的。

2. 数据集

2.1 数据说明

一共有三份数据:训练集、测试集和提交示例。

训练集包含客户问题文件和经纪人回复两个文件,涉及6000段对话(有标签答案)。

测试集包含客户问题文件和经纪人回复两个文件,涉及14000段对话(无标签答案)。

2.2 数据示例

解压训练集和测试集

In [1]

!unzip data/data144231/train.zip -d ./data && unzip data/data144231/test.zip -d ./data

       

Archive:  data/data144231/train.zip   creating: ./data/train/  inflating: ./data/train/train.query.tsv    inflating: ./data/train/train.reply.tsv  Archive:  data/data144231/test.zip   creating: ./data/test/  inflating: ./data/test/test.query.tsv    inflating: ./data/test/test.reply.tsv

       

查看数据示例

In [2]

import pandas as pdtrain_query = pd.read_csv("data/train/train.query.tsv", sep='t', header=None)train_query.columns = ['query_id', 'sentence']# query 文件有 2 列,分别是问题 Id 和客户问题,同一对话 Id 只有一个问题,已脱敏print(train_query.head())train_reply = pd.read_csv("data/train/train.reply.tsv", sep='t', header=None)train_reply.columns = ['query_id', 'reply_id', 'sentence', 'label']# reply 文件有 4 列,分别是:# 对话id,对应客户问题文件中的对话 id # 经纪人回复 Id,Id 对应真实回复顺序# 经纪人回复内容,已脱敏# 经纪人回复标签,1 表示此回复是针对客户问题的回答,0 相反print(train_reply.head())# 训练集文件结构与测试集相同,只不过 reply 文件没有回复标签test_query = pd.read_csv("data/test/test.query.tsv", sep='t', header=None, encoding='gb18030')test_query.columns = ['query_id', 'sentence']print(test_query.head())test_reply = pd.read_csv("data/test/test.reply.tsv", sep='t', header=None, encoding='gb18030')test_reply.columns = ['query_id', 'reply_id', 'sentence']print(test_reply.head())

       

   query_id            sentence0         0            采荷一小是分校吧1         1                毛坯吗?2         2  你们的佣金费大约是多少和契税是多少。3         3             靠近川沙路嘛?4         4      这套房源价格还有优惠空间吗?   query_id  reply_id                     sentence  label0         0         0  杭州市采荷第一小学钱江苑校区,杭州市钱江新城实验学校。      11         0         1                           是的      02         0         2                         这是5楼      03         1         0                   因为公积金贷款贷的少      04         1         1                           是呢      0   query_id      sentence0         0  东区西区?什么时候下证?1         1          小学哪个2         2          看哪个?3         3     面积多少,什么户型4         4    什么时候能够看房呢?   query_id  reply_id      sentence0         0         0        我在给你发套1         0         1     您看下我发的这几套2         0         2    这两套也是金源花园的3         0         3           价钱低4         0         4  便宜的房子,一般都是顶楼

       

3. ERNIE 系列模型

原文:

ERNIE: Enhanced Representation through Knowledge IntegrationERNIE 2.0: A Continual Pre-training Framework for Language UnderstandingERNIE 3.0: Large-scale Knowledge Enhanced Pre-training for Language Understanding and Generation

ERNIE 1.0

首先对原始的MLM任务进行改进,引入了Entity-level masking和Phrase-level masking,帮助模型学习更多的词汇短语知识,这个任务也成为了后续中文预训练模型的标配:

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

Entity-level masking 和 Phrase-level masking

同时引入了DLM(Dialogue Language Model)对NSP任务进行了优化,在预测Mask token的同时判断输入的多轮对话(QRQ、QRR、QQR三种模式)是否真实。

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

Dialogue Language Model

ERNIE 2.0

首先是框架上的闭环化,把各种下游任务持续加入模型中提升效果:

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

ERNIE 2.0

其次引入更多预训练任务,细节参见原论文。

ERNIE 3.0

3.0版本首先延续了之前有效的预训练任务。

其次3.0版本提出了海量无监督文本与大规模知识图谱的平行预训练方法 (Universal Knowledge-Text Prediction)。将5千万知识图谱三元组与4TB大规模语料中相关的文本组成pair,同时输入到预训练模型之中进行联合掩码训练:

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

Universal Knowledge-Text Prediction

语料库 4TB,我的天!!!

小鸽子助手 小鸽子助手

一款集成于WPS/Word的智能写作插件

小鸽子助手 55 查看详情 小鸽子助手

结构上,ERNIE 3.0框架分为两层。第一层是通用语义表示网络,该网络学习数据中的基础和通用的知识。第二层是任务语义表示网络,该网络基于通用语义表示,学习任务相关的知识。在学习过程中,任务语义表示网络只学习对应类别的预训练任务,而通用语义表示网络会学习所有的预训练任务。

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

ERNIE 3.0模型框架

本项目使用 3.0 版本预训练模型。

4. 解题思路

由于回答是不连续的,所以可以将问题和答案一一对应,组成 query-reply-pair,然后进行文本分类,分别判断是否是针对问题的回答。

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

虽然对话是不连续的,但是是同一个对话,不同的回答可能相互支撑,提供部分信息,所以,第二种思路就是将同一个问题的所有回答都拼接在当前回答后面,然后同时对每一个回答进行判断。

【AI达人特训营】PaddleNLP实现聊天问答匹配 - 创想鸟        

在思路 2 的基础上,还可以把 [CLS] 对应的输出拿出来,预测所有候选 reply 中是否存在可以匹配的回答。

本项目采用思路 1 作为 baseline 。

5. Talk is cheap, show me the code

首先安装最新版本的 paddlenlp

In [ ]

!pip install paddlenlp --upgrade

   

上述安装过程可能会报错,大概是parl包的版本依赖问题,对于本项目来说无伤大雅。

训练、测试代码都写在 query_reply_pair.py 文件中,有详细注释。

注意:

你可能需要在 main() 中的 args 列表下,修改训练参数。为了便于展示结果,避免输出信息过长,下面的结果是在 num_train_epochs = 0.5 的参数下输出的,为了更好的结果,这里可能需要修改,项目开头展示的成绩是 num_train_epochs = 5.0 的结果。

运行脚本:

In [4]

!python query_reply_pair.py

       

[2022-06-22 10:04:10,523] [    INFO] - using `logging_steps` to initialize `eval_steps` to 100[2022-06-22 10:04:10,523] [    INFO] - ============================================================[2022-06-22 10:04:10,523] [    INFO] -      Model Configuration Arguments      [2022-06-22 10:04:10,523] [    INFO] - paddle commit id              :590b4dbcdd989324089ce43c22ef151c746c92a3[2022-06-22 10:04:10,523] [    INFO] - export_model_dir              :None[2022-06-22 10:04:10,523] [    INFO] - model_name_or_path            :ernie-3.0-medium-zh[2022-06-22 10:04:10,524] [    INFO] - [2022-06-22 10:04:10,524] [    INFO] - ============================================================[2022-06-22 10:04:10,524] [    INFO] -       Data Configuration Arguments      [2022-06-22 10:04:10,524] [    INFO] - paddle commit id              :590b4dbcdd989324089ce43c22ef151c746c92a3[2022-06-22 10:04:10,524] [    INFO] - max_seq_length                :128[2022-06-22 10:04:10,524] [    INFO] - test_query_path               :data/test/test.query.tsv[2022-06-22 10:04:10,524] [    INFO] - test_reply_path               :data/test/test.reply.tsv[2022-06-22 10:04:10,524] [    INFO] - train_query_path              :data/train/train.query.tsv[2022-06-22 10:04:10,524] [    INFO] - train_reply_path              :data/train/train.reply.tsv[2022-06-22 10:04:10,524] [    INFO] - raw train dataset example: {'query': '东区西区?什么时候下证?', 'reply': '我在给你发套'}.[2022-06-22 10:04:11,911] [    INFO] - We are using  to load 'ernie-3.0-medium-zh'.[2022-06-22 10:04:11,911] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-3.0-medium-zh/ernie_3.0_medium_zh_vocab.txt[2022-06-22 10:04:11,934] [    INFO] - We are using  to load 'ernie-3.0-medium-zh'.[2022-06-22 10:04:11,934] [    INFO] - Already cached /home/aistudio/.paddlenlp/models/ernie-3.0-medium-zh/ernie_3.0_medium_zh.pdparamsW0622 10:04:11.936193  1093 gpu_context.cc:278] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1W0622 10:04:11.939395  1093 gpu_context.cc:306] device: 0, cuDNN Version: 7.6.feature train dataset example: {'input_ids': [1, 481, 1535, 7, 96, 10, 59, 225, 940, 2, 1852, 404, 99, 481, 1535, 131, 7, 96, 18, 958, 409, 2485, 225, 121, 4, 1852, 404, 99, 958, 409, 102, 257, 79, 412, 18, 225, 12043, 2], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 'label': 1}.[2022-06-22 10:04:16,960] [    INFO] - ============================================================[2022-06-22 10:04:16,960] [    INFO] -     Training Configuration Arguments    [2022-06-22 10:04:16,960] [    INFO] - paddle commit id              :590b4dbcdd989324089ce43c22ef151c746c92a3[2022-06-22 10:04:16,961] [    INFO] - _no_sync_in_gradient_accumulation:True[2022-06-22 10:04:16,961] [    INFO] - adam_beta1                    :0.9[2022-06-22 10:04:16,961] [    INFO] - adam_beta2                    :0.999[2022-06-22 10:04:16,961] [    INFO] - adam_epsilon                  :1e-08[2022-06-22 10:04:16,961] [    INFO] - current_device                :gpu:0[2022-06-22 10:04:16,961] [    INFO] - dataloader_drop_last          :False[2022-06-22 10:04:16,961] [    INFO] - dataloader_num_workers        :4[2022-06-22 10:04:16,961] [    INFO] - device                        :gpu[2022-06-22 10:04:16,961] [    INFO] - disable_tqdm                  :False[2022-06-22 10:04:16,961] [    INFO] - do_eval                       :True[2022-06-22 10:04:16,961] [    INFO] - do_export                     :False[2022-06-22 10:04:16,961] [    INFO] - do_predict                    :True[2022-06-22 10:04:16,961] [    INFO] - do_train                      :True[2022-06-22 10:04:16,961] [    INFO] - eval_batch_size               :128[2022-06-22 10:04:16,961] [    INFO] - eval_steps                    :100[2022-06-22 10:04:16,961] [    INFO] - evaluation_strategy           :IntervalStrategy.STEPS[2022-06-22 10:04:16,961] [    INFO] - fp16                          :False[2022-06-22 10:04:16,961] [    INFO] - fp16_opt_level                :O1[2022-06-22 10:04:16,961] [    INFO] - gradient_accumulation_steps   :1[2022-06-22 10:04:16,961] [    INFO] - greater_is_better             :True[2022-06-22 10:04:16,962] [    INFO] - ignore_data_skip              :False[2022-06-22 10:04:16,962] [    INFO] - label_names                   :None[2022-06-22 10:04:16,962] [    INFO] - learning_rate                 :5e-05[2022-06-22 10:04:16,962] [    INFO] - load_best_model_at_end        :True[2022-06-22 10:04:16,962] [    INFO] - local_process_index           :0[2022-06-22 10:04:16,962] [    INFO] - local_rank                    :-1[2022-06-22 10:04:16,962] [    INFO] - log_level                     :-1[2022-06-22 10:04:16,962] [    INFO] - log_level_replica             :-1[2022-06-22 10:04:16,962] [    INFO] - log_on_each_node              :True[2022-06-22 10:04:16,962] [    INFO] - logging_dir                   :work/query_reply_pair/runs/Jun22_10-04-10_jupyter-532817-4195533[2022-06-22 10:04:16,962] [    INFO] - logging_first_step            :False[2022-06-22 10:04:16,962] [    INFO] - logging_steps                 :100[2022-06-22 10:04:16,962] [    INFO] - logging_strategy              :IntervalStrategy.STEPS[2022-06-22 10:04:16,962] [    INFO] - lr_scheduler_type             :SchedulerType.LINEAR[2022-06-22 10:04:16,962] [    INFO] - max_grad_norm                 :1.0[2022-06-22 10:04:16,962] [    INFO] - max_steps                     :-1[2022-06-22 10:04:16,962] [    INFO] - metric_for_best_model         :accuracy[2022-06-22 10:04:16,962] [    INFO] - minimum_eval_times            :None[2022-06-22 10:04:16,962] [    INFO] - no_cuda                       :False[2022-06-22 10:04:16,962] [    INFO] - num_train_epochs              :0.5[2022-06-22 10:04:16,962] [    INFO] - optim                         :OptimizerNames.ADAMW[2022-06-22 10:04:16,962] [    INFO] - output_dir                    :work/query_reply_pair/test[2022-06-22 10:04:16,962] [    INFO] - overwrite_output_dir          :False[2022-06-22 10:04:16,962] [    INFO] - past_index                    :-1[2022-06-22 10:04:16,962] [    INFO] - per_device_eval_batch_size    :128[2022-06-22 10:04:16,962] [    INFO] - per_device_train_batch_size   :128[2022-06-22 10:04:16,963] [    INFO] - prediction_loss_only          :False[2022-06-22 10:04:16,963] [    INFO] - process_index                 :0[2022-06-22 10:04:16,963] [    INFO] - remove_unused_columns         :True[2022-06-22 10:04:16,963] [    INFO] - report_to                     :['visualdl'][2022-06-22 10:04:16,963] [    INFO] - resume_from_checkpoint        :None[2022-06-22 10:04:16,963] [    INFO] - run_name                      :test[2022-06-22 10:04:16,963] [    INFO] - save_on_each_node             :False[2022-06-22 10:04:16,963] [    INFO] - save_steps                    :100[2022-06-22 10:04:16,963] [    INFO] - save_strategy                 :IntervalStrategy.STEPS[2022-06-22 10:04:16,963] [    INFO] - save_total_limit              :2[2022-06-22 10:04:16,963] [    INFO] - scale_loss                    :32768[2022-06-22 10:04:16,963] [    INFO] - seed                          :42[2022-06-22 10:04:16,963] [    INFO] - should_log                    :True[2022-06-22 10:04:16,963] [    INFO] - should_save                   :True[2022-06-22 10:04:16,963] [    INFO] - train_batch_size              :128[2022-06-22 10:04:16,963] [    INFO] - warmup_ratio                  :0.0[2022-06-22 10:04:16,963] [    INFO] - warmup_steps                  :0[2022-06-22 10:04:16,963] [    INFO] - weight_decay                  :0.0[2022-06-22 10:04:16,963] [    INFO] - world_size                    :1[2022-06-22 10:04:16,963] [    INFO] - [2022-06-22 10:04:16,964] [    INFO] - ***** Running training *****[2022-06-22 10:04:16,965] [    INFO] -   Num examples = 17268[2022-06-22 10:04:16,965] [    INFO] -   Num Epochs = 1[2022-06-22 10:04:16,965] [    INFO] -   Instantaneous batch size per device = 128[2022-06-22 10:04:16,965] [    INFO] -   Total train batch size (w. parallel, distributed & accumulation) = 128[2022-06-22 10:04:16,965] [    INFO] -   Gradient Accumulation steps = 1[2022-06-22 10:04:16,965] [    INFO] -   Total optimization steps = 67.5[2022-06-22 10:04:16,965] [    INFO] -   Total num train samples = 8634.0100%|███████████████████████████████████████████| 67/67 [00:17<00:00,  4.40it/s][2022-06-22 10:04:34,326] [    INFO] - Training completed. {'train_runtime': 17.4487, 'train_samples_per_second': 494.821, 'train_steps_per_second': 3.84, 'train_loss': 0.352832708785783, 'epoch': 0.4963}100%|███████████████████████████████████████████| 67/67 [00:17<00:00,  3.84it/s][2022-06-22 10:04:34,416] [    INFO] - Saving model checkpoint to work/query_reply_pair/test[2022-06-22 10:04:36,894] [    INFO] - tokenizer config file saved in work/query_reply_pair/test/tokenizer_config.json[2022-06-22 10:04:36,895] [    INFO] - Special tokens file saved in work/query_reply_pair/test/special_tokens_map.json***** train metrics *****  epoch                    =     0.4963  train_loss               =     0.3528  train_runtime            = 0:00:17.44  train_samples_per_second =    494.821  train_steps_per_second   =       3.84[2022-06-22 10:04:36,898] [    INFO] - ***** Running Evaluation *****[2022-06-22 10:04:36,898] [    INFO] -   Num examples = 4317[2022-06-22 10:04:36,898] [    INFO] -   Pre device batch size = 128[2022-06-22 10:04:36,898] [    INFO] -   Total Batch size = 128[2022-06-22 10:04:36,898] [    INFO] -   Total prediction steps = 34100%|███████████████████████████████████████████| 34/34 [00:02<00:00, 12.31it/s]***** eval metrics *****  epoch                   =     0.4963  eval_accuracy           =     0.8826  eval_loss               =      0.283  eval_runtime            = 0:00:03.21  eval_samples_per_second =   1344.038  eval_steps_per_second   =     10.585[2022-06-22 10:04:40,112] [    INFO] - ***** Running Prediction *****[2022-06-22 10:04:40,112] [    INFO] -   Num examples = 53757[2022-06-22 10:04:40,112] [    INFO] -   Pre device batch size = 128[2022-06-22 10:04:40,112] [    INFO] -   Total Batch size = 128[2022-06-22 10:04:40,112] [    INFO] -   Total prediction steps = 420100%|█████████████████████████████████████████| 420/420 [00:51<00:00, 11.37it/s]***** test metrics *****  test_runtime            = 0:00:52.06  test_samples_per_second =   1032.496  test_steps_per_second   =      8.067100%|█████████████████████████████████████████| 420/420 [00:52<00:00,  7.95it/s]

       

训练结果可视化:

点击页面最左侧一列菜单栏中的 数据模型可视化 ,添加 logdir 然后启动服务,就可以看到训练过程的 loss 曲线等信息。

log 文件会保存在类似 work/query_reply_pair/runs/Jun22_10-01-49_jupyter-532817-4195533 这样的路径下面。

由于上面训练过程只跑了 0.5 个 epoch,曲线基本只有一个点,这里就不进行展示了。

测试集预测结果保存在 work/query_reply_pair/test/test_labels.tsv 文件中,你可以直接点开看一下结果。

In [7]

import pandas as pdfile_path = "work/query_reply_pair/test/test_labels.tsv"df = pd.read_csv(file_path, sep='t')df.head()

       

          query         reply  label0  东区西区?什么时候下证?        我在给你发套      01  东区西区?什么时候下证?     您看下我发的这几套      02  东区西区?什么时候下证?    这两套也是金源花园的      03  东区西区?什么时候下证?           价钱低      04  东区西区?什么时候下证?  便宜的房子,一般都是顶楼      0

               

生成竞赛提交文件:

In [8]

import pandas as pdsample_submit_path = "data/data144231/sample_submission.tsv"submit_path = "submit.tsv"submit = pd.read_csv(sample_submit_path, sep='t', header=None)submit.columns = ['query_id', 'reply_id', 'label']test_labels = pd.read_csv(file_path, sep='t')label = test_labels['label']submit['label'] = labelsubmit.to_csv(submit_path, sep='t', header=None, index=None)

   

根目录下 submit.tsv 文件就可以拿去提交啦,提交大概 0.75+ 的分数 (num_train_epochs = 5.0 的情况下)。

以上就是【AI达人特训营】PaddleNLP实现聊天问答匹配的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/740135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
windows10如何关闭特定应用程序的通知_windows10关闭应用程序通知方法
上一篇 2025年11月25日 14:45:46
IGN《忍者龙剑传4》试玩报告:是梦想中现代《忍龙》
下一篇 2025年11月25日 14:45:50

相关推荐

  • 控制台命令(Console Command)开发

    控制台命令是程序员日常工作中不可或缺的工具,它提高了开发效率并帮助理解和控制程序运行。1) 通过简单的文本输入,完成复杂任务,如文件管理和系统监控。2) 控制台命令可用于快速调试、测试代码和自动化重复工作。3) 开发控制台命令时需注意安全性和兼容性问题。4) 控制台命令可实现有趣功能,如监控服务器资…

    2026年9月21日
    100
  • 链路追踪(OpenTelemetry/Jaeger)集成

    要将opentelemetry和jaeger集成到java应用中,需按以下步骤操作:1.配置jaeger exporter,2.初始化opentelemetry,3.创建并管理span。通过这种方式,你可以有效地追踪和分析微服务间的调用链路,提升系统性能。 在现代微服务架构中,链路追踪已经成为诊断和…

    2026年9月21日
    000
  • Maingear电脑黑屏问题如何修复?专业级主机BIOS设置方法详尽

    Maingear电脑黑屏问题通常由BIOS设置、硬件接触不良或显示输出配置引起。首先应尝试进入BIOS,检查并调整显卡输出模式为PCIe/PEG,确保未误设为集成显卡;排查PCIe插槽模式兼容性,必要时切换为Gen3或Auto;若启动异常,可尝试切换UEFI/Legacy模式或恢复BIOS默认设置(…

    2026年9月21日
    000
  • 实测!Sora 2长视频优势大,Vidu Q2细节处理更胜一筹

    近日,AI视频工具领域的竞争愈发激烈。OpenAI推出的Sora 2刚刚登顶美区App Store榜单,国产新秀Vidu Q2便携重磅升级版本强势入局,引发广泛关注。不少从事自媒体创作与影视剪辑的朋友都在思考:这两款AI视频生成器,究竟谁更胜一筹?出于好奇,我亲自上手实测了一番,发现两者之间的差异更…

    用户投稿 2026年9月21日
    000
  • Java Stream 高效分组计数并获取Top N元素

    本文深入探讨了如何利用java stream api对数据进行高效的分组计数,并从中提取出现频率最高的top n元素。文章首先介绍了一种简洁的基于全排序的实现方式,该方法适用于数据集较小或top n值接近总数的情况。随后,针对大数据量和小型top n场景下的性能瓶颈,文章详细阐述了如何通过自定义`c…

    2026年9月21日
    000
  • mysql安装后如何优化配置文件

    答案:优化MySQL配置需先定位配置文件,再根据硬件和业务调整内存、InnoDB、连接等核心参数。具体包括设置innodb_buffer_pool_size为物理内存50%~70%,合理配置日志参数与连接数,启用慢查询日志,并使用工具辅助调优,避免过度配置,确保稳定高效。 MySQL 安装后,优化配…

    2026年9月21日
    000
  • 自定义协议与主流框架(如ThinkPHP)结合

    在thinkphp中实现自定义协议可以通过中间件机制。具体步骤包括:1. 创建中间件类customprotocolmiddleware,解析和验证请求的json格式和字段。2. 在应用配置文件中添加该中间件,使所有请求经过处理。通过这种方式,可以满足特定业务需求并提升应用的灵活性和可扩展性。 在开发…

    2026年9月21日
    000
  • mac怎么阻止特定app访问网络_Mac阻止应用访问网络方法

    可通过系统防火墙、hosts文件、第三方工具或pf防火墙阻止应用联网。首先,macOS内置防火墙可阻断入站连接,需在“系统设置-网络-防火墙”中添加应用并启用阻止;其次,编辑/etc/hosts文件,将目标域名指向127.0.0.1可屏蔽其网络访问,需刷新DNS缓存生效;再者,使用Little Sn…

    2026年9月21日
    000
  • VSCode的括号匹配功能如何自定义?

    可通过 settings.json 自定义括号高亮的边框和背景色;2. 用 editor.matchBrackets 控制是否启用高亮;3. 启用 bracketPairColorization 可为嵌套括号着色;4. 使用 Ctrl/Cmd + Shift + 快速跳转配对括号。 VSCode 的…

    2026年9月21日
    000
  • 马斯克xAI的Grok将推AI视频检测工具,能否破解深度伪造难题?

    随着ai视频生成技术飞速渗透网络,深度伪造内容不断扩散,网络信息真实性面临前所未有的挑战。在此背景下,马斯克的xai公司的grok模型即将推出一项关键升级,打造一款“真伪侦探”工具。 近日,马斯克在X平台回应网友担忧时表示,Grok即将获得识别AI生成视频并追踪其网络来源的能力,以此应对深度伪造内容…

    2026年9月21日
    000
  • AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作

    AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作

    答案:通过AI推文助手的节日模板、情感关键词、用户数据定制和多语言混合策略,可高效生成个性化祝福,增强受众情感连接。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您希望借助AI推文助手在节日期间传递温暖的祝福,同时增强与受众的情感连接…

    2026年9月21日 用户投稿
    000
  • 如何通过命令行参数启动VSCode?

    掌握VSCode命令行用法可提升开发效率,需先安装code命令到PATH,之后可用code .打开目录、code 文件名打开文件、code –diff比较文件、–disable-extensions排查问题,并支持别名与Shell结合使用。 通过命令行启动 VSCode 是一…

    2026年9月21日
    100
  • 如何基于Swoole开发自定义框架?

    基于swoole开发自定义框架可以通过以下步骤实现:1. 创建核心app类,初始化swoole服务器并定义回调函数;2. 实现路由功能,使用router类处理请求分发;3. 添加中间件支持,使用middleware类处理请求;4. 集成异步数据库操作,使用swoole的mysql协程客户端;5. 实…

    2026年9月21日
    000
  • 万人同时在线抽奖活动架构

    万人同时在线抽奖活动的系统架构应采用微服务架构、分布式数据库、redis缓存、区块链存储结果,并使用负载均衡和异步处理技术。具体包括:1.采用微服务架构和分布式数据库(如tidb)保证系统稳定性和可扩展性;2.使用redis处理抽奖逻辑,确保高效和随机性;3.将结果存入区块链,保证透明度和可验证性;…

    2026年9月21日
    000
  • 小可AI小程序入口链接_小可AI小程序官方地址

    小可AI小程序官方入口为https://xcx.xiaokeai.com.cn,用户可在社交平台搜索使用;平台支持多轮对话、文本生成、图像理解及语音转文字功能,界面简洁、响应迅速,具备历史记录查看与持续优化的智能算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    000
  • Linux文件和目录管理常见命令

    Linux文件和目录管理依赖于ls、cd、mkdir、rm、cp、mv等核心命令,用于浏览、创建、删除、复制和移动文件与目录;通过find、du、grep等命令可查找文件、定位大文件并清理磁盘空间;使用rename、mmv或脚本可实现批量重命名;为安全起见,应谨慎使用rm命令,推荐结合-i选项或使用…

    2026年9月21日
    000
  • 大数据量下的批量导入/导出优化

    在大数据环境下优化批量导入/导出的方法包括:1. 使用批处理技术分批导入/导出数据,减少系统资源压力;2. 采用数据流技术如apache kafka进行实时处理,降低内存占用;3. 利用并行处理技术分配任务到多个处理器或节点,提高处理速度;4. 通过性能监控和调优识别并解决瓶颈点,以提升整体效率。 …

    2026年9月21日
    200
  • 《忍者龙剑传4》明日发售 制作人谈亮点:经典与创新并存!

    白金工作室今日迎来《忍者龙剑传4》(ninja gaiden 4)制作人兼导演中尾裕治的特别公告,正式确认游戏将于10月21日(周二)全球上线。中尾在声明中详细介绍了本作的核心特色,强调在传承系列精髓的同时注入全新机制,为玩家打造既怀旧又充满惊喜的忍者冒险。 特色一:传承与进化的战斗系统 系列经典操…

    2026年9月21日
    000
  • mysqlmysql如何优化in条件大列表查询

    使用EXPLAIN和慢查询日志判断IN性能问题,type为ALL且possible_keys为空或rows过大说明需优化;JOIN在有索引时通常优于IN,尤其当列表值来自另一表时;大IN列表可拆分为多个小IN结合UNION ALL,或存入临时表后用JOIN提升效率。 优化 MySQL 中 IN 条件…

    2026年9月21日
    000
  • 拍摄更强了!vivo X200系列功能升级:舞台模式双视野录像来了

    10月15日,vivo正式公布x200系列功能迭代计划,影像系统与相册体验将迎来多项重磅升级。 据悉,全新的希区柯克式Live Photo功能将支持主体智能追踪,用户可一键实现流畅变焦效果,该功能预计从11月起逐步推送。 舞台模式双视野录制功能将于12月陆续上线, 用户可一键启动前后双摄,录制视频时…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信