在大模型的训练和推理的过程中有个对话template,需要训练的时候保持对齐,baichuan2的对话template具体实现参考baichuan2 对话模板定义,里面的model.generation_config.user_token_id通过baichuan2的tokenizer encode之后解码后为<reserved_106>
, model.generation_config.assistant_token_id通过baichuan2的tokenizer encode之后解码后为<reserved_107>
通过代码
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation.utils import GenerationConfig
from colorama import Fore, Style
model_dir='./Baichuan2-13B-Chat/' # 本地路径
model = AutoModelForCausalLM.from_pretrained(
model_dir,
revision="v2.0",
torch_dtype=torch.float16,
device_map="auto",
trust_remote_code=True,
load_in_8bit=True,
)
model.generation_config = GenerationConfig.from_pretrained( # 等价于config = AutoConfig.from_pretrained(model_dir)放到上面
model_dir,
revision="v2.0",
)
tokenizer = AutoTokenizer.from_pretrained(
model_dir,
revision="v2.0",
use_fast=False,
trust_remote_code=True
)
messages = []
while True:
prompt = input(Fore.GREEN + Style.BRIGHT + "\n用户:" + Style.NORMAL)
messages.append({"role": "user", "content": prompt}) # 历史叠加
response = model.chat(tokenizer, messages)
print(response)
if torch.backends.mps.is_available():
torch.mps.empty_cache()
messages.append({"role": "assistant", "content": response})
通过debug单步调试,分析baichuan2 message转input tokens
这样给定一段对话:
[{'role': 'user', 'content': '你好呀'},
{'role': 'assistant', 'content': '你好!很高兴见到你。请问有什么我可以帮助你的吗?'},
{'role': 'user', 'content': '你能干嘛'},
{'role': 'assistant', 'content': '作为一个大语言模型,我可以通过自然语言交互的方式为你提供以下服务'},
{'role': 'user', 'content': '回答宝马和大众的区别吗'}]
通过对话模板就变成这个样子:
<reserved_106>你好呀
<reserved_107>你好!很高兴见到你。请问有什么我可以帮助你的吗?
<reserved_106>你能干嘛
<reserved_107>作为一个大语言模型,我可以通过自然语言交互的方式为你提供以下服务:
<reserved_106>回答宝马和大众的区别吗<reserved_107>
相当于用<reserved_106>
区别user,用<reserved_107>
区分assistant
参考文章:
https://zhuanlan.zhihu.com/p/655565397
https://blog.csdn.net/muyao987/article/details/133345573