【DataWhale | 大模型】大模型技术实践内测

写在前面 / 链接留档

代码和结果解析

baseline

步骤1:更新或安装所需环境

1
2
!pip install --upgrade modelscope requests urllib3 tqdm pandas
!apt update > /dev/null; apt install aria2 git-lfs axel -y > /dev/null

步骤2:下载数据集

1
!axel -n 12 -a https://ai-contest-static.xfyun.cn/2024/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E8%83%BD%E5%8A%9B%E8%AF%84%E6%B5%8B%EF%BC%9A%E4%B8%AD%E6%96%87%E6%88%90%E8%AF%AD%E9%87%8A%E4%B9%89%E4%B8%8E%E8%A7%A3%E6%9E%90%E6%8C%91%E6%88%98%E8%B5%9B/test_input.csv

步骤3:构建模型(使用Qwen1.5-4B模型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from modelscope import AutoModelForCausalLM, AutoTokenizer

# 指定加载模型的设备
device = "cuda" # the device to load the model onto

# 加载预训练的模型和tokenizer
model = AutoModelForCausalLM.from_pretrained(
"qwen/Qwen1.5-4B-Chat",
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("qwen/Qwen1.5-4B-Chat")

# 定义提示信息
prompt = "hello"

# 构建聊天消息列表
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]

# 使用tokenizer将聊天消息转换为模型输入格式
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)

# 将输入文本转换为模型所需的tensor格式并加载到指定设备
model_inputs = tokenizer([text], return_tensors="pt").to(device)

# 生成回复
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)

# 提取生成的回复部分
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

# 解码生成的回复并移除特殊标记
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

步骤4:读取数据集

1
2
import pandas as pd
test = pd.read_csv('./test_input.csv', header=None)
1
2
3
4
5
6
# 查看数据集大小
print(f"数据集的大小为: {test.shape[0]}\n前50条数据如下:\n")

# 查看前50条赛事数据集(赛题要求根据每行句子,给出5个可能匹配的成语)
for test_prompt in test[0].values[:50]:
print(test_prompt)
  • 单元格输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
数据集的大小为: 2972
前50条数据如下:

双方心往一处想,意志坚定。
两端都极为艰难,难以作出决定。
雄浑深远的意旨。细腻微妙。高超巧妙。
描述水流湍急,且快速且深远。
避免被引诱做出不道德或可疑的行为。
肘部肩窝。比喻事物发生于身边。
他张开嘴巴,吞咽着口水。
仅见一面,不足以深入了解。
向四处散发施舍,同时手中拿着碗盆。
比喻把装备脱下,放下武器。
对于任何战役,都要一败涂地。
阴谋真相已经昭然于众。
比喻因为无能为力而写下了好文章。
古代文人士大夫经常举行诗歌朗诵会。
不能形容为不高兴,只能说明没劲儿。
表现得举止端庄,很有教养。
1.洗刷兵器2.喂养战马3.准备作战
关注生命垂危者,关怀濒危者。
比喻面对挑战,坚韧不拔地前行。
过去的科举考试中被选拔为进士的称号。
相似程度极高或相差无几。
比喻不断地补充、堆砌和延伸。
以安逸快乐的生活和劳动为重。
她仍然每天教导她的儿子。
犹以火为耕,比喻原始、简朴的农耕方式。
指困境中处于不利地位。
搜集和研究其内在道理。
没有任何人帮助和支持。
这位作者的文章风格与自己非常相似。
国力强大,军事力量已经停止。
相互勾结维持;相互利用。
比喻进程飞快,日行千里。
只有一个目的,追求利润。
务必谨慎对待,慎重处理事务。
无法言表,只能感慨万千。
形容气势磅礴的文章风格。
根据贡献的大小给予奖励。
让国家蒙羞,民众蒙难。
形容有权势的人极其残忍和无礼。
坚决要求再次向某人强调。
采取措施;采取办法;采取行动;实行
心中充满了疑惑,还没有找到解答。
累累罪行,遍历无穷。形容罪恶极重。
形容人的容貌清爽俊雅,风度翩翩。
辞掉本职工作去做其他的事情。
秦汉时期,勋位至高者都佩戴金印和紫绶。
创立独特的风格,与众不同。
到处都是冰雪覆盖的环境,形容严冬天气。
旧事物被废弃;为了新事物而采取措施。
①向人行礼。②用作哀悼词或祭奠语。

步骤5:输出成语

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from tqdm import tqdm
import os

i = 1
# 假设 test 是一个 DataFrame
# 遍历测试数据集的第一项的值,目的是生成与给定句子最相关的五个成语
for test_prompt in tqdm(test[0].values, total=len(test[0].values), desc="处理进度"):
i = i + 1
# 构造提示信息,要求模型输出与句子最相关的五个成语
prompt = f"列举与下面句子最相关的五个成语。只需要输出五个成语,不需要有其他的输出,写在一行中:{test_prompt}"

# 初始化一个长度为5的列表,填充默认成语“同舟共济”
words = ['同舟共济'] * 5

# 构建聊天消息格式,用于提示模型进行生成
messages = [
{"role": "user", "content": prompt},
]
# 应用聊天模板对消息进行处理,准备模型输入
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 对输入文本进行编码,准备模型输入数据
model_inputs = tokenizer([text], return_tensors="pt").to(device)

# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
# 提取模型输出,去除输入部分
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

# 解码模型输出,去除特殊标记
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]

# 清理回答文本,确保格式统一
response = response.replace('\n', ' ').replace('、', ' ')
# 提取回答中的成语,确保每个成语长度为4且非空
words = [x for x in response.split() if len(x) == 4 and x.strip() != '']



# 如果生成的成语列表长度不满足要求(即20个字符),则使用默认成语列表
if len(' '.join(words).strip()) != 24:
words = ['同舟共济'] * 5

# 将最终的成语列表写入提交文件
with open('submit.csv', 'a+', encoding='utf-8') as up:
up.write(' '.join(words) + '\n')


# 查看阶段性结果
if i % 50 == 0:
tqdm.write(f"大模型第{i}次返回的结果是:\n {response}\n")
tqdm.write(f"submit.cvs第{i}行输出结果:\n {words}\n")

# 为了尽快拿到结果,我们暂时仅获得500个结果(如果有时间的话,可以删除这两行)
if i == 500:
break

print('submit.csv 已生成')
  • 单元格输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
大模型第50次返回的结果是:
革故鼎新 与时俱进 因势利导 扬长避短 新陈代谢

submit.cvs第50行输出结果:
['革故鼎新', '与时俱进', '因势利导', '扬长避短', '新陈代谢']

处理进度: 3%|▎ | 99/2972 [01:22<36:26, 1.31it/s] 大模型第100次返回的结果是:
非常感谢您的邀请,但我已经决定离开座位。

submit.cvs第100行输出结果:
['同舟共济', '同舟共济', '同舟共济', '同舟共济', '同舟共济']

处理进度: 5%|▌ | 149/2972 [01:59<42:03, 1.12it/s] 大模型第150次返回的结果是:
1. 一目了然 2. 明白易懂 3. 显而易见 4. 情至义尽 5. 不言而喻

submit.cvs第150行输出结果:
['一目了然', '明白易懂', '显而易见', '情至义尽', '不言而喻']

处理进度: 7%|▋ | 199/2972 [02:39<36:28, 1.27it/s] 大模型第200次返回的结果是:
社会动荡 人心惶惶 世风日下 道德沦丧 民不聊生。

submit.cvs第200行输出结果:
['同舟共济', '同舟共济', '同舟共济', '同舟共济', '同舟共济']

处理进度: 8%|▊ | 249/2972 [03:17<43:39, 1.04it/s] 大模型第250次返回的结果是:
1. 表里不一 2. 张扬跋扈 3. 龙飞凤舞 4. 粗枝大叶 5. 装腔作势

submit.cvs第250行输出结果:
['表里不一', '张扬跋扈', '龙飞凤舞', '粗枝大叶', '装腔作势']

处理进度: 10%|█ | 298/2972 [03:55<32:41, 1.36it/s]

README.md

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
---
license: Apache License 2.0

---

数据集文件元信息以及数据文件,请浏览“数据集文件”页面获取。

当前数据集卡片使用的是默认模版,数据集的贡献者未提供更加详细的数据集介绍,但是您可以通过如下GIT Clone命令,或者ModelScope SDK来下载数据集

#### 下载方法

:modelscope-code[]{type="sdk"}
:modelscope-code[]{type="git"}


test_input.csv(节选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
双方心往一处想,意志坚定。
两端都极为艰难,难以作出决定。
雄浑深远的意旨。细腻微妙。高超巧妙。
描述水流湍急,且快速且深远。
避免被引诱做出不道德或可疑的行为。
肘部肩窝。比喻事物发生于身边。
他张开嘴巴,吞咽着口水。
仅见一面,不足以深入了解。
向四处散发施舍,同时手中拿着碗盆。
比喻把装备脱下,放下武器。
对于任何战役,都要一败涂地。
阴谋真相已经昭然于众。
比喻因为无能为力而写下了好文章。
古代文人士大夫经常举行诗歌朗诵会。
不能形容为不高兴,只能说明没劲儿。
表现得举止端庄,很有教养。
1.洗刷兵器2.喂养战马3.准备作战
关注生命垂危者,关怀濒危者。
比喻面对挑战,坚韧不拔地前行。
过去的科举考试中被选拔为进士的称号。
相似程度极高或相差无几。
比喻不断地补充、堆砌和延伸。
以安逸快乐的生活和劳动为重。
她仍然每天教导她的儿子。
犹以火为耕,比喻原始、简朴的农耕方式。
指困境中处于不利地位。
搜集和研究其内在道理。
没有任何人帮助和支持。
这位作者的文章风格与自己非常相似。

submit.csv(节选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
深沉含蓄 清晰晓畅 精炼准确 天马行空 高屋建瓴
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
望梅止渴 垂涎欲滴 狼吞虎咽 馋猫偷腥 饥肠辘辘
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
遍地开花 四面楚歌 五谷丰登 七零八落 三头六臂
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
一败涂地 惨败而归 全军覆没 寸土不让 重蹈覆辙
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
无能为力 徒劳无功 枉费心机 纸上谈兵 笔走龙蛇
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
洗刷兵器 喂养战马 准备作战 装备器械 集结队伍
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
安土重迁 乐在其中 养生保健 津津有味 忙里偷闲
教育子女 学业有成 父母之爱 承前启后 师道尊严
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
同舟共济 同舟共济 同舟共济 同舟共济 同舟共济
一拍即合 如出一辙 如获至宝 如日中天 相得益章

知识点学习记录

Tokenizer

  • Tokenizer是自然语言处理(NLP)中的一种工具或算法,用于将文本分割成更小的单元,这些单元被称为tokens(标记)

  • 这些 tokens可以是单词、子词、字符,甚至是特定的短语

  • TokenizationNLP中的一个基本步骤,为后续的文本处理任务(如词性标注、命名实体识别、情感分析、机器翻译等)提供基础。

主要功能

  1. 文本分割

    • 将输入的文本字符串分割成一个个独立的 token

      例如,句子 “Hello, world!”

      可以被分割成 [“Hello”, “,”, “world”, “!”]。

  2. 规范化

    • tokens进行一些预处理,如转换为小写、去除标点符号等

      例如,将 “Hello, World!” 转换为 [“hello”, “world”]。

  3. 子词分割

    • 有些 tokenizer会将单词进一步分割成子词,特别是对于词汇量较大的语言(如中文、日文)

      例如,BERT 使用 WordPiece 分词器

      将 “unhappy” 分割成 [“un”, “hap”, “py”]。

常见的 Tokenizer 类型

  1. 基于规则的 Tokenizer

    • 使用预定义的规则来分割文本

      例如,使用空格、标点符号等作为分隔符

  2. 基于统计的 Tokenizer

    • 使用统计方法来确定最佳的分词方式

      例如,使用最大匹配算法、条件随机场(CRF)等

  3. 基于模型的 Tokenizer

    • 使用机器学习模型来预测最佳的分词方式

      例如,WordPiece、Byte-Pair Encoding (BPE) 等

应用示例

  1. 词性标注

    • 在进行词性标注时,首先需要将文本分割成单词或子词

      例如,句子 “The cat is on the mat.” 可能被分割成 [“The”, “cat”, “is”, “on”, “the”, “mat”, “.”]

  2. 命名实体识别

    • 在识别命名实体时,需要将文本分割成有意义的单元

      例如,句子 "Apple is looking at buying U.K. startup for 1billion"可能被分割成[“Apple”,“is”,“looking”,“at”,“buying”,“U.K.”,“startup”,“for”,"1billion"可能被分割成[“Apple”,“i**s”,“lookin**g”,“a**t”,“buying”,“U.K.”,“startup”,“f**or”,“1”, “billion”]

  3. 情感分析

    • 在进行情感分析时,需要将文本分割成单词或短语,以便进行特征提取。

      例如,句子 “I love this movie!”

      可能被分割成 [“I”, “love”, “this”, “movie”, “!”]

常用的 Tokenizer 工具

  1. NLTK(Natural Language Toolkit)
    • Python 中的一个流行 NLP 库,提供了多种分词器。
    • 例如,nltk.word_tokenize
  2. spaCy
    • 另一个强大的 NLP 库,提供了高效且准确的分词器。
    • 例如,spacy.tokenizer
  3. Hugging Face Transformers
    • 提供了许多预训练模型的分词器,支持多种语言和模型。
    • 例如,BertTokenizerRobertaTokenizer 等。

总结

  • Tokenizer 是 NLP 中的一个关键组件,负责将文本分割成更小的单元,为后续的文本处理任务提供基础。不同的 tokenizer 有不同的特点和适用场景,选择合适的 tokenizer 可以显著提升 NLP 任务的效果

可能的改进方法

  • 更换模型

    现在的模型是Qwen1.5:4B

    • 更换为其他模型 / 参数更大的 / 版本更新的模型
  • 调整baseline

  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信