1.前言
这是一个2024年的比赛赛题,很有意思的中文成语释义与解析,考验大家构建开源模型PepLine的能力。
2024 iFLYTEK A.I.开发者大赛-讯飞开放平台https://challenge.xfyun.cn/topic/info?type=interpretation-challenge&option=ssgy&ch=dw24_tjsmU3https://challenge.xfyun.cn/topic/info?type=interpretation-challenge&option=ssgy&ch=dw24_tjsmU3https://challenge.xfyun.cn/topic/info?type=interpretation-challenge&option=ssgy&ch=dw24_tjsmU3
https://challenge.xfyun.cn/topic/info?type=interpretation-challenge&option=ssgy&ch=dw24_tjsmU3 尝试着更换了QWEN2-7B、GLM4等模型来完成,并且切换了后端推理的方式。借着这次第四课讲解的解码策略,正好把当时的几个代码都拿出来改改并分享代码思路。
以下代码:MindNLP_workhub/4th/enhanced at main · B3DDD/MindNLP_workhub
2.Baseline
步骤0:环境
这次环境是阿里云人工智能平台PAI-DSW(有免费试用3个月的优惠,可以试用A10阿里云免费试用 - 阿里云)。
- ecs.gn7i-c8g1.2xlarge:NVIDIA A10 --30GB显存
- modelscope:1.22.0-pytorch2.5.1-gpu-py310-cu124-ubuntu22.04
步骤1:更新或安装所需环境
!pip install --upgrade modelscope requests urllib3 tqdm pandas mindspore mindnlp
!apt update > /dev/null; apt install aria2 git-lfs axel -y > /dev/null
-
pip install --upgrade: 这个命令用于升级已安装的Python包到最新版本。--upgrade选项告诉pip检查并安装最新版本的指定包。 -
modelscope: ModelScope 是一个由阿里巴巴达摩院开源的模型即服务(MaaS)平台,旨在简化机器学习模型的使用流程,提供多种预训练模型,涵盖计算机视觉、自然语言处理、语音识别等多个领域。它集成了众多开源AI模型,涵盖了多个领域,开发者可以轻松找到满足自己需求的模型。ModelScope,开发者只需一行代码即可调用AI模型,极大地简化了模型调用过程。用户可以通过SDK或者WEB端的方式上传数据集,通过ModelScope或者公开Host托管。这是国内最大的大模型托管社区,类比为国内版hugging face.在这次代码中用来导入和运行大模型。 -
requests: Python的requests包是一个非常流行的HTTP请求库,广泛用于网络爬虫、API交互等场景。它简化了HTTP请求的复杂性,提供了简洁而强大的API,使得开发者可以轻松地发送HTTP请求并处理响应。 -
urllib3: urllib3 是一个功能强大且易于使用的 Python HTTP 客户端库,广泛应用于 Python 生态系统中。它提供了许多 Python 标准库 urllib 所不具备的重要特性,如线程安全、连接池管理、客户端 SSL/TLS 验证、文件分部编码上传、自动重试、支持压缩编码、支持 HTTP 和 SOCKS 代理等 -
tqdm: tqdm是一个快速、可扩展的Python进度条库,广泛用于在Python长循环中添加进度提示信息。它可以帮助用户监测程序运行的进度,估计运行时长,并且在调试时也非常有用。tqdm的主要功能是通过封装任意的迭代器来显示进度条,用户只需在循环中使用tqdm(iterator)即可。这次代码中是用来做进度条的。 -
pandas: Pandas 是一个强大的 Python 数据分析工具包,广泛应用于数据科学和数据分析领域。它提供了高效、灵活且易于使用的数据结构,旨在简化数据处理和分析任务。
在这次代码中发挥了以下作用
数据导入/导出:支持从多种文件格式(如 CSV、Excel、SQL、JSON 等)导入和导出数据。
数据清洗:提供丰富的函数和方法来处理缺失数据、重复数据和异常值。
-
apt update:apt update是一个用于更新软件包列表的命令,它在 Debian 和 Ubuntu 系统中广泛使用。这个命令的主要功能是从远程软件仓库获取最新的软件包元数据,并更新本地的软件包数据库。通过执行apt update,系统可以确保在安装或升级软件包时,使用的是最新的可用版本。 -
/dev/null: 这个操作符将命令的输出重定向到/dev/null,即丢弃输出。这样可以避免在终端中显示更新过程中的详细信息。 -
apt install aria2 git-lfs axel -y: 这个命令用于安装指定的软件包。-y选项表示自动确认安装,不需要用户输入确认信息。-
aria2: Aria2 是一个轻量级的多协议、多源命令行下载工具,支持 HTTP/HTTPS、FTP、SFTP、BitTorrent 和 Metalink 协议。它可以通过内置的 JSON-RPC 和 XML-RPC 接口进行操作,非常适合用于批量下载和管理下载任务。 -
git-lfs: Git LFS(Large File Storage)是一个Git扩展,专门用于处理大型文件,如音频、视频、图像或任何其他二进制大文件。它通过将这些大文件存储在外部系统而不是Git仓库本身来优化性能,从而显著减小了Git仓库的大小,同时也保留了对大文件的版本控制能力。 -
axel: Python包之axel是一个用于加速文件下载的工具,它通过同时下载文件的不同部分并合并它们来提高下载速度。这个包是Axel命令行工具的Python实现,旨在帮助用户通过多线程下载来加速文件传输。
-
步骤2:下载数据集
!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
下载比赛的文档:由2972条中文通俗介绍的句子组成,每条句子对应一个成语单词。
步骤3:构建模型(使用Qwen1.5-4B模型)
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]
这是通过魔搭社区modelscope来构建大模型的代码:
https://www.modelscope.cn/models/Qwen/Qwen1.5-4B-Chat
采用模型卡给出的代码示例构建大模型,格式就按范例复制就行。代码基本都是从modelscope或者transformer、openvino等库调用大模型的几个主要功能模块分词器、生成器、解码器,申明模型、设备、信息模板、参数、prompt等,最后得到一个包含诸多信息的返回值,从中选取主要回答部分,并输出回答。
步骤4:读取数据集
import pandas as pd
test = pd.read_csv('./test_input.csv', header=None)
从pandas类里拿出pd工具,这个用来读取表格test_input.csv里的2972条短句,然后全部赋值给test。
下面步骤5 就是主要操作test列表了。
步骤5:输出成语
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() != '']
# 如果有效成语数量恰好为5,则停止循环
if len(words) == 5:
break
# 如果生成的成语列表长度不满足要求(即20个字符),则使用默认成语列表
if len(' '.join(words).strip()) != 24:
words = ['同舟共济'] * 5
# 将最终的成语列表写入提交文件
with open('submit.csv', 'a+') 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每个循环里把test拿出对应的一个短句子{test_prompt},放进{prompt}里输出给大模型。
2大模型处理好后{response},除去标点符号,提取四字成语{words}(这一步是后面出现大量空白行的原因)
3判断成语不足5个就直接用五个”同舟共济“替代,足够就写入《submit.csv》
4循环500次,时间够就循环2972次(实际数目缺1,这里应该填2973)
5tqdm显示进度条,print汇报阶段性成果和最终完成
3.更改模型和后端推理
使用Qwen2-7B-Instruct
from modelscope import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto
model = AutoModelForCausalLM.from_pretrained(
"qwen/Qwen2-7B-Instruct",
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("qwen/Qwen2-7B-Instruct")
prompt = "Give me a short introduction to large language model."
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"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]
在魔搭社区Notebook的GPU环境中使用,通过modelscope构建模型流水线,这是个适合国内环境的代码。
使用GLM-4-9B-Chat模型(transformer后端)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
import torch
#device = "auto" # the device to load the model onto多卡分配:在AutoModelForCausalLM加载预训练模型时,加入device_map="auto",自动分配可用显存。
#设置可见显存:在python文件外部加入CUDA_VISIBLE_DEVICES=1,2,指定特定的显卡。
tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4-9b-chat", trust_remote_code=True)
query = "列举与下面句子最相关的五个成语。只需要输出五个成语,不需要有其他的输出,写在一行中:比喻因为无能为力而写下了好文章。"
inputs = tokenizer.apply_chat_template([{"role": "user", "content": query}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
)
inputs = inputs.to(device)
model = AutoModelForCausalLM.from_pretrained(
"THUDM/glm-4-9b-chat",
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
trust_remote_code=True
).to(device).eval()
gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
这篇适合国外环境从Huggingface社区获取模型权重,使用GoogleColab来运行,使用GLM4-9B-CHAT模型来做这个任务。使用Transformer进行后端推理,需要使用A100(40GB)单显卡实例。推理很慢要差不多25小时,花费75个计算单元。
THUDM/glm-4-9b-chat · Hugging Facehttps://huggingface.co/THUDM/glm-4-9b-chathttps://huggingface.co/THUDM/glm-4-9b-chathttps://huggingface.co/THUDM/glm-4-9b-chat
https://huggingface.co/THUDM/glm-4-9b-chat
使用GLM-4-9B-Chat(vLLM后端推理)
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
# GLM-4-9B-Chat-1M
# max_model_len, tp_size = 1048576, 4
# GLM-4-9B-Chat
# 如果遇见 OOM 现象,建议减少max_model_len,或者增加tp_size
max_model_len, tp_size = 131072, 1
model_name = "THUDM/glm-4-9b-chat"
prompt = [{"role": "user", "content": "你好"}]
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
llm = LLM(
model=model_name,
tensor_parallel_size=tp_size,
max_model_len=max_model_len,
trust_remote_code=True,
enforce_eager=True,
# GLM-4-9B-Chat-1M 如果遇见 OOM 现象,建议开启下述参数
# enable_chunked_prefill=True,
# max_num_batched_tokens=8192
)
stop_token_ids = [151329, 151336, 151338]
sampling_params = SamplingParams(temperature=0.95, max_tokens=1024, stop_token_ids=stop_token_ids)
inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
print(outputs[0].outputs[0].text)
使用vLLM进行后端推理,需要使用多张A100(40GB)实例。我目前没有足够多显卡的条件测试,只要进行多次对话就爆显存(Out of memory),max_tokens参数已经优化到底了。
THUDM/glm-4-9b-chat · Hugging Face
使用API调用glm-4-flash
#同步调用
from zhipuai import ZhipuAI
client = ZhipuAI(api_key=" ") # 请填写您自己的APIKey 去智谱官网开个账号,充个20块钱就OK了,或者用免费的模型
response = client.chat.completions.create(
model="glm-4-flash", # 请填写您要调用的模型名称
messages=[
{"role": "user", "content": "你是一个中文文学大师,你的任务是用成语来描述中文语句。"},
{"role": "assistant", "content": "列举与下面句子最相关的五个成语。只需要输出五个成语,不需要有其他的输出,写在一行中:双方心往一处想,意志坚定。"},
{"role": "user", "content": "你是一个中文文学大师,你的任务是用成语来描述中文语句。"},
{"role": "assistant", "content": "列举与下面句子最相关的五个成语。只需要输出五个成语,不需要有其他的输出,写在一行中:双方心往一处想,意志坚定。"},
{"role": "user", "content": "列举与下面句子最相关的五个成语。只需要输出五个成语,不需要有其他的输出,写在一行中:双方心往一处想,意志坚定。"}
],
)
print("总消耗Tokens:",response.usage.total_tokens)
response = response.choices[0].message.content
print(response)
使用官方API进行大模型交互,速度较快约1小时完成,不足0.1计算单元。
4.不同解码策略的生成表现分析
改解码策略,实际上就是改model.generate()函数内的参数。以下是采用QWEN2-7B-Instruct模型,并更改解码策略后的表现:
Greedy: Select the best probable token at a time|贪心:一次选择最可能的标记
# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=50,
num_beams=1,
do_sample=False
)
| 成语描述 | 正确答案 | 输出答案 |
| 双方心往一处想,意志坚定。 | 同心同德 | 一 心 一 意 同 舟 共 济 坚 定 不 移 齐 心 协 力 志 同 道 合 |
| 两端都极为艰难,难以作出决定。 | 进退维谷 | 左 右 为 难 , 进 退 维 谷 , 骑 虎 难 下 , 腹 背 受 敌 , 四 面 楚 歌 |
| 雄浑深远的意旨。细腻微妙。高超巧妙。 | 高深莫测 | 深 意 远 旨 , 细 腻 入 微 , 妙 手 偶 得 , 巧 夺 天 工 , 高 瞻 远 瞩 |
| 描述水流湍急,且快速且深远。 | 一泻千里 | 一 泻 千 里 波 涛 汹 涌 深 不 可 测 急 流 勇 进 惊 涛 骇 浪 |
| 避免被引诱做出不道德或可疑的行为。 | 洁身自好 | 防 微 杜 渐 洁 身 自 好 明 哲 保 身 正 人 君 子 自 律 自 省 |
| 肘部肩窝。比喻事物发生于身边。 | 肘腋之患 | 近 在 咫 尺 触 手 可 及 防 微 杜 渐 未 雨 绸 缪 祸 福 相 依 |
| 他张开嘴巴,吞咽着口水。 | 垂涎欲滴 | 垂 涎 欲 滴 |
| 仅见一面,不足以深入了解。 | 一面之缘 | 一 见 如 故 缘 木 求 鱼 浮 光 掠 影 走 马 观 花 浅 尝 辄 止 |
| 向四处散发施舍,同时手中拿着碗盆。 | 沿门托钵 | 四 散 施 舍 , 手 捧 碗 盆 。 |
Beam Search: Select the best probable response|波束搜索:选择最可能的响应
num_beams=3
# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
num_beams=3,# 5 已经超显存了
no_repeat_ngram_size=2,
num_return_sequences=3,
do_sample=False,
length_penalty=1.0,
)
| 成语描述 | 正确答案 | 输出答案 |
| 双方心往一处想,意志坚定。 | 同心同德 | 心 心 相 印 , 志 同 道 合 , 坚 定 不 移 , 齐 心 协 力 , 一 往 无 |
| 两端都极为艰难,难以作出决定。 | 进退维谷 | 左 右 为 难 , 进 退 维 谷 , 骑 虎 难 下 , 腹 背 受 敌 , 四 |
| 雄浑深远的意旨。细腻微妙。高超巧妙。 | 高深莫测 | 深 意 远 旨 , 细 腻 入 微 , 妙 手 偶 得 , 巧 夺 天 工 , 高 |
| 描述水流湍急,且快速且深远。 | 一泻千里 | 一 泻 千 里 , 波 涛 汹 涌 , 深 不 可 测 , 急 流 勇 进 , 惊 涛 |
| 避免被引诱做出不道德或可疑的行为。 | 洁身自好 | 防 微 杜 渐 洁 身 自 好 明 哲 保 身 正 人 先 正 己 |
| 肘部肩窝。比喻事物发生于身边。 | 肘腋之患 | 近 在 咫 尺 , 触 手 可 及 , 防 微 杜 渐 , 未 雨 绸 缪 , |
| 他张开嘴巴,吞咽着口水。 | 垂涎欲滴 | 口 干 舌 燥 垂 涎 欲 滴 张 口 结 舌 吞 吞 吐 吐 |
| 仅见一面,不足以深入了解。 | 一面之缘 | 一 见 如 故 一 面 之 缘 窥 豹 一 斑 浮 光 掠 影 走 |
| 向四处散发施舍,同时手中拿着碗盆。 | 沿门托钵 | 四 海 为 家 , 施 惠 无 疆 , 手 无 寸 铁 , 盆 满 钵 满 , |
num_beams=4
# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
num_beams=4,# 5 已经超显存了
no_repeat_ngram_size=2,
num_return_sequences=4,
do_sample=False,
length_penalty=1.0,
)
| 成语描述 | 正确答案 | 输出答案 |
| 双方心往一处想,意志坚定。 | 同心同德 | 心 心 相 印 , 志 同 道 合 , 坚 定 不 移 , 齐 心 协 力 , 一 往 无 |
| 两端都极为艰难,难以作出决定。 | 进退维谷 | 左 右 为 难 , 进 退 维 谷 , 骑 虎 难 下 , 腹 背 受 敌 , 四 |
| 雄浑深远的意旨。细腻微妙。高超巧妙。 | 高深莫测 | 深 意 远 旨 , 细 腻 入 微 , 妙 手 偶 得 , 巧 夺 天 工 , 高 |
| 描述水流湍急,且快速且深远。 | 一泻千里 | 急 流 勇 进 , 一 泻 千 里 , 波 涛 汹 涌 , 深 不 可 测 , 瞬 息 |
| 避免被引诱做出不道德或可疑的行为。 | 洁身自好 | 防 微 杜 渐 洁 身 自 好 明 哲 保 身 正 人 先 正 己 |
| 肘部肩窝。比喻事物发生于身边。 | 肘腋之患 | 近 在 咫 尺 , 触 手 可 及 , 防 微 杜 渐 , 未 雨 绸 缪 , |
| 他张开嘴巴,吞咽着口水。 | 垂涎欲滴 | 口 干 舌 燥 垂 涎 欲 滴 张 口 结 舌 吞 吞 吐 吐 |
| 仅见一面,不足以深入了解。 | 一面之缘 | 一 见 如 故 一 面 之 缘 窥 豹 一 斑 浮 光 掠 影 走 |
| 向四处散发施舍,同时手中拿着碗盆。 | 沿门托钵 | 四 海 为 家 , 施 惠 无 疆 , 手 无 寸 铁 , 盆 满 钵 满 , |
Temperature: Shrink or enlarge probabilities|温度:缩小或扩大概率
# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
do_sample=True,
temperature=0.6,
)
| 成语描述 | 正确答案 | 输出答案 |
| 双方心往一处想,意志坚定。 | 同心同德 | 一 心 一 意 同 舟 共 济 坚 定 不 移 心 齐 力 倍 众 志 成 城 |
| 两端都极为艰难,难以作出决定。 | 进退维谷 | 左 右 为 难 , 进 退 维 谷 , 骑 虎 难 下 , 腹 背 受 敌 , 四 |
| 雄浑深远的意旨。细腻微妙。高超巧妙。 | 高深莫测 | 深 意 远 旨 , 细 腻 入 微 , 妙 手 偶 得 , 巧 夺 天 工 , 精 |
| 描述水流湍急,且快速且深远。 | 一泻千里 | 一 泻 千 里 波 涛 汹 涌 深 不 可 测 急 流 勇 进 瞬 息 |
| 避免被引诱做出不道德或可疑的行为。 | 洁身自好 | 防 微 杜 渐 洁 身 自 好 明 哲 保 身 正 人 君 子 |
| 肘部肩窝。比喻事物发生于身边。 | 肘腋之患 | 近 在 咫 尺 触 手 可 及 防 微 杜 渐 未 雨 绸 缪 |
| 他张开嘴巴,吞咽着口水。 | 垂涎欲滴 | 垂 涎 欲 滴 " |
| 仅见一面,不足以深入了解。 | 一面之缘 | 一 见 如 故 缘 木 求 鱼 浮 光 掠 影 浅 尝 辄 止 |
| 向四处散发施舍,同时手中拿着碗盆。 | 沿门托钵 | 四 散 施 舍 , 手 无 寸 铁 , 空 手 而 归 , 一 无 所 有 , 两 手 |
Top-K Sampling: Select top probable K tokens|Top-K 采样:选择最可能的 K 个 token
# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
do_sample=True,
temperature=0.6,
top_k=50
)
| 成语描述 | 正确答案 | 输出答案 |
| 双方心往一处想,意志坚定。 | 同心同德 | 一 心 一 意 同 舟 共 济 坚 定 不 移 齐 心 协 力 志 同 道 合 |
| 两端都极为艰难,难以作出决定。 | 进退维谷 | 左 右 为 难 , 进 退 维 谷 , 骑 虎 难 下 , 腹 背 受 敌 , 四 |
| 雄浑深远的意旨。细腻微妙。高超巧妙。 | 高深莫测 | 深 意 远 旨 , 细 腻 入 微 , 妙 手 偶 得 , 巧 夺 天 工 , 高 |
| 描述水流湍急,且快速且深远。 | 一泻千里 | 一 泻 千 里 波 涛 汹 涌 深 不 可 测 急 流 勇 进 奔 腾 |
| 避免被引诱做出不道德或可疑的行为。 | 洁身自好 | 洁 身 自 好 , 防 微 杜 渐 ; 明 辨 是 非 , 固 守 本 心 ; |
| 肘部肩窝。比喻事物发生于身边。 | 肘腋之患 | 近 在 咫 尺 , 触 手 可 及 , 防 微 杜 渐 , 未 雨 绸 缪 , |
| 他张开嘴巴,吞咽着口水。 | 垂涎欲滴 | 垂 涎 欲 滴 口 水 直 流 馋 涎 欲 滴 望 眼 欲 穿 馋 |
| 仅见一面,不足以深入了解。 | 一面之缘 | 一 见 如 故 一 目 了 然 浅 尝 辄 止 浮 光 掠 影 |
| 向四处散发施舍,同时手中拿着碗盆。 | 沿门托钵 | 四 散 施 舍 , 手 中 持 盆 |
Nucleus Sampling: Dynamically choose the number of K (sort of)|核采样Top-P:动态选择K的数量
# 生成回答,限制最大生成长度
generated_ids = model.generate(
model_inputs.input_ids,
do_sample=True,
temperature=0.6,
top_k=50,
top_p=0.9
)
| 成语描述 | 正确答案 | 输出答案 |
| 双方心往一处想,意志坚定。 | 同心同德 | 一 心 一 意 同 舟 共 济 坚 定 不 移 心 照 不 宣 志 同 道 合 |
| 两端都极为艰难,难以作出决定。 | 进退维谷 | 骑 虎 难 下 进 退 两 难 左 右 为 难 腹 背 受 敌 四 |
| 雄浑深远的意旨。细腻微妙。高超巧妙。 | 高深莫测 | 深 意 远 旨 细 致 入 微 神 妙 绝 伦 |
| 描述水流湍急,且快速且深远。 | 一泻千里 | 一 泻 千 里 , 波 涛 汹 涌 , 深 不 可 测 , 急 流 勇 进 , 惊 涛 |
| 避免被引诱做出不道德或可疑的行为。 | 洁身自好 | 洁 身 自 好 , 明 辨 是 非 , 防 微 杜 渐 , 正 人 君 子 , 心 |
| 肘部肩窝。比喻事物发生于身边。 | 肘腋之患 | 近 在 咫 尺 触 手 可 及 防 微 杜 渐 未 雨 绸 缪 |
| 他张开嘴巴,吞咽着口水。 | 垂涎欲滴 | 望 梅 止 渴 , 垂 涎 三 尺 " |
| 仅见一面,不足以深入了解。 | 一面之缘 | 一 见 如 故 一 目 了 然 浅 尝 辄 止 浮 光 掠 影 |
| 向四处散发施舍,同时手中拿着碗盆。 | 沿门托钵 | 四 海 为 家 , 广 散 施 舍 , 手 无 寸 铁 , 空 有 其 名 |
在这个任务中看, Beam_search策略表现比较不错,采样的表现也尚可。实际调优中,可以尝试混合策略以提高准确率。
昇思打卡营:中文成语解析的模型与解码策略

被折叠的 条评论
为什么被折叠?



