在 Hugging Face 的 transformers 库中,GPT(Generative Pre-trained Transformer)类的模型有两个常用的生成文本的方法:generate
和 chat
。这两个方法在使用上有一些区别。通常公司发布的 LLM 模型会有一个基础版本,还会有一个 Chat 版本。比如,Qwen-7B(基础版本)和 Qwen-7B-Chat(Chat 版本)。
1. model.generate()方法
generate
方法是模型的原生方法,用于生成文本。- 通常用于批量生成文本数据,可以根据特定的输入和条件生成一组文本。
- 使用时需要传递一些参数,如
max_length
(生成文本的最大长度)、num_beams
(束搜索的数量,用于增强生成的多样性)等。
函数说明
- 主要参数包括:
- input_ids: 启动生成的输入token ID的张量。
- max_length: (可选)生成文本的最大长度。
- min_length: (可选)生成文本的最小长度。
- do_sample: (可选)是否在每一步进行概率采样来选择下一个token。
- temperature: (可选)调节随机性的温度参数。
- top_k: (可选)每一步中考虑的最高概率token的数量。
- top_p: (可选)进行nucleus sampling时使用的累积概率阈值。
- num_beams: (可选)波束搜索中使用的波束数。
- no_repeat_ngram_size: (可选)禁止生成中重复出现的n-gram大小。
- 其他生成特定的参数。
- 输出结果为:
- 生成的token ID序列。通常这些token ID可以用分配的tokenizer解码为文本。
代码样例
这里以 ChatGLM-6B
模型为例,模型文件已下载至本地路径。
from transformers import AutoTokenizer, AutoModelForCausalLM
device = "cuda:0"
# 直接加载模型
model_path = "./model/chatglm-6b"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, device_map=device)
text = 'What is machine learning?'
inputs = tokenizer(text, return_tensors="pt").to(device)
outputs = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
输出结果:
Machine learning is a subfield of artificial intelligence that involves the use of algorithms to learn from data, without being explicitly programmed. It allows computers to identify patterns and make predictions based on large amounts of information, which can be used for a
2. model.chat()方法
- chat 方法是一个高级的便捷方法,通常用于模拟对话。
- 提供了更简单的用户交互方式,以模拟对话流程,尤其在聊天式应用中更为方便。
- 它内部调用了 generate 方法,但提供了更加简化的输入输出接口。
函数说明
def chat(self, tokenizer, query: str, history: List[Tuple[str, str]] = None, max_length: int = 2048, num_beams=1, do_sample=True, top_p=0.7, temperature=0.95, logits_processor=None, **kwargs):
主要参数为:
- tokenizer:分词器
- query:用户输入的待查询内容,类型为str
- history:对话历史,类型为List
代码样例
from transformers import AutoTokenizer, AutoModelForCausalLM
device = "cuda:0"
# 直接加载模型
model_path = "./model/chatglm-6b"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True, device_map=device)
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
输出结果:
你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。
3. model.stream_chat()方法
在大模型的对话应用中,函数 model.stream_chat()
可实现对话的流式输出处理。
下面的实现代码来自ChatGLM-6B官方仓库:https://github.com/THUDM/ChatGLM-6B/blob/main/cli_demo.py
for response, history in model.stream_chat(tokenizer, query, history=history):
if stop_stream:
stop_stream = False
break
else:
count += 1
if count % 8 == 0:
os.system(clear_command)
print(build_prompt(history), flush=True)
signal.signal(signal.SIGINT, signal_handler)
总结
总体来说,generate
方法更加灵活,适用于更多的生成任务,而 chat
方法则提供了更高级别、更易于使用的接口,适用于聊天式应用中。选择使用哪个方法通常取决于你的具体需求和使用场景。