探索使用网络安全知识,对开源基模型进行增强,评估是否能使基模型在网络安全领域表现出更好地专业度。
项目基于云起无垠SecGPT开源项目,在hugeface开源数据集的基础上,增加了自有预训练数据,进行增量预训练。
参考链接:
https://github.com/Clouditera/secgpt
预训练使用“安全书籍,安全知识库,安全论文,安全社区文章,漏洞库”等等安全内容,
https://huggingface.co/datasets/w8ay/security-paper-datasets?row=0
笔者增加了一份自己近10年以内的博客文章,
将上述格式转换为hugeface兼容格式,huggingface支持以下4种数据格式的数据集,只需要在load的时候设定格式就好了。
Data format | Loading script | Example |
CSV & TSV | csv | load_dataset("csv", data_files="my_file.csv") |
Text files | text | load_dataset("text", data_files="my_file.txt") |
JSON & JSON Lines | json | load_dataset("json", data_files="my_file.jsonl") |
Pickled DataFrames | pandas | load_dataset("pandas", data_files="my_dataframe.pkl") |
# -- coding: utf-8 --** import json import pandas as pd from datasets import load_dataset from datasets import Dataset, concatenate_datasets def prepare_cnblogs_data(): with open("./posts.json", 'r', encoding='utf-8') as file: data = json.load(file) original_json = list() for item in data: original_json.append( { "text": item['Body'], "category": "cnblogs" } ) print(original_json[0]) print(original_json[1]) with open("./posts_hugeface_dataset.json", 'w', encoding='utf-8') as file: # 将列表保存到文件,注意使用ensure_ascii=False参数 json.dump(original_json, file, ensure_ascii=False, indent=2) df = pd.DataFrame(original_json) df.to_pickle('./posts_hugeface_dataset.pkl') def prepare_security_paper_dataset(): dataset = load_dataset("w8ay/security-paper-datasets") df_train = dataset['train'].to_pandas() df_train.to_pickle('security_paper_dataset.pkl') def merge_dataset(): security_paper_dataset = load_dataset("pandas", data_files="security_paper_dataset.pkl")['train'].to_pandas() posts_hugeface_dataset = load_dataset("pandas", data_files="posts_hugeface_dataset.pkl")['train'].to_pandas() dataset_part1 = Dataset.from_pandas(security_paper_dataset) dataset_part2 = Dataset.from_pandas(posts_hugeface_dataset) combined_dataset = concatenate_datasets([dataset_part1, dataset_part2]) print(combined_dataset[0]) print(len(combined_dataset)) combined_dataset_df = pd.DataFrame(combined_dataset) combined_dataset_df.to_pickle('security_paper_and_posts_dataset.pickle') if __name__ == "__main__": prepare_security_paper_dataset() prepare_cnblogs_data() merge_dataset()
这里将多份本地pickle语料数据合并,
通过构造各类有监督安全能力数据集,让模型能了解各类安全指令。
有监督SFT数据集构建有几个注意点:
参考链接:
https://huggingface.co/w8ay/secgpt https://huggingface.co/datasets/TigerResearch/tigerbot-zhihu-zh-10k https://zhuanlan.zhihu.com/p/548355568 https://zhuanlan.zhihu.com/p/564816807 https://zhuanlan.zhihu.com/p/554678463 https://huggingface.co/datasets/w8ay/security-paper-datasets https://huggingface.co/w8ay/secgpt
基于Baichuan-13B (无道德限制,较好中文支持,显存资源占用小)
Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均取得同尺寸最好的效果。本次发布包含有预训练 (Baichuan-13B-Base) 和对齐 (Baichuan-13B-Chat) 两个版本。Baichuan-13B 有如下几个特点:
V100 * 8
启动训练,
参考链接:
https://huggingface.co/baichuan-inc/Baichuan-13B-Base https://huggingface.co/w8ay/secgpt https://zhuanlan.zhihu.com/p/554678463
模型结果的输出存在随机性,模型可能知道答案,但是随机后改变输出,这时候可以增加提示词让模型注意力集中。
也可以做RLHF强化学习,让模型输出多个结果,选择正确的那个,提升模型效果。
python3 webdemo.py --base_model baichuan-inc/Baichuan-13B-Base
python3 webdemo.py --base_model baichuan-inc/Baichuan-13B-Base --lora /data_vdb1/secgpt/output/epoch-0-step-2400
http://47.236.142.150:7860/
参考链接:
https://github.com/Clouditera/secgpt