621 字
3 min
从零接触代码模型:第一次让 UniXcoder 读取 C 代码
2026-09-06

概览#

该系列文章用于跟踪信安作品的模型训练入门相关

特别鸣谢:G老师、英俊潇洒于学长

环境初步搭建#

使用的是Ubuntu系统,并以此为基础创建虚拟环境

mkdir -p ~/projects/vuln-ai
cd ~/projects/vuln-ai
python3 -m venv .venv
source .venv/bin/activate

接着升级基础工具

pip install -U pip setuptools wheel

然后先安装最基础的一组

pip install torch transformers datasets scikit-learn pandas matplotlib

这一组的作用如下

torch → 深度学习框架
transformers → Hugging Face 模型库
datasets → 数据集处理
scikit-learn → 指标计算
pandas → 表格数据处理
matplotlib → 画图

第一次加载UniXcoder tokenizer#

在项目目录新建

mkdir -p src
nano src/test_tokenizer.py

写入代码

from transformers import AutoTokenizer
model_name = "microsoft/unixcoder-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
code = """
void f(char *input)
{
char buf[8];
strcpy(buf, input);
}
"""
tokens = tokenizer.tokenize(code)
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print("原始代码:")
print(code)
print("\nTokens:")
print(tokens)
print("\nToken IDs:")
print(token_ids)
print("\nToken数量:")
print(len(tokens))

保存后运行并查看结果

原始代码:
void f(char *input)
{
char buf[8];
strcpy(buf, input);
}
Tokens: ['Ċ', 'void', 'Ġf', '(', 'char', 'Ġ*', 'input', ')', 'Ċ', '{', 'Ċ', 'ĠĠĠ', 'Ġchar', 'Ġbuf', '[', '8', '];', 'Ċ', 'ĠĠĠ', 'Ġstrcpy', '(', 'buf', ',', 'Ġinput', ');', 'Ċ', '}', 'Ċ']
Token IDs: [317, 895, 412, 126, 1285, 426, 1376, 127, 317, 209, 317, 377, 1108, 2200, 177, 142, 823, 317, 377, 16542, 126, 1091, 130, 1586, 388, 317, 211, 317]
Token数量: 28

不难看出,Unicoder在读这段代码时,是先将原代码按模型自己的子词规则切为若干部分,转化为token,再将token映射为对应的数字来输入并处理

接下来新建py文件并写入

nano src/test_encode.py
from transformers import AutoTokenizer
model_name = "microsoft/unixcoder-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
code = """
void f(char *input)
{
char buf[8];
strcpy(buf, input);
}
"""
encoded = tokenizer(
code,
truncation=True,
max_length=512,
padding="max_length",
return_tensors="pt"
)
print("input_ids shape:")
print(encoded["input_ids"].shape)
print("\nattention_mask shape:")
print(encoded["attention_mask"].shape)
print("\n前40个 input_ids:")
print(encoded["input_ids"][0][:40])
print("\n前40个 attention_mask:")
print(encoded["attention_mask"][0][:40])

运行后看到

input_ids shape:
torch.Size([1, 512])
attention_mask shape:
torch.Size([1, 512])
前40个 input_ids:
tensor([ 0, 317, 895, 412, 126, 1285, 426, 1376, 127, 317, 209, 317, 377, 1108, 2200, 177, 142, 823, 317, 377, 16542, 126, 1091, 130, 1586, 388, 317, 211, 317, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
前40个 attention_mask:
tensor([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, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

torch.Size 的1 代表一个样本,512 代表每条样本统一整理成 512 个 token 位置,而 attention_mask 后面这么多 0 也是因为原样本只有 28 个 token,所以后面部分基本上都是填充的 padding,0 代表的是无关紧要的 padding,1 则是模型需要认真看的内容,这就是“padding + mask”的配合工作

从零接触代码模型:第一次让 UniXcoder 读取 C 代码
https://blog.leeshang.top/posts/vuln-ai/模型训练/
作者
leeshang
发布于
2026-09-06
License
CC BY-NC-SA 4.0