1. 手动拼接对话历史
如果你使用的模型或分词器不支持 apply_chat_template
,可以手动将对话历史拼接成一个字符串,然后传递给分词器。
示例代码:
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型和分词器
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 定义聊天历史
chat_history = [
"用户:你好,最近怎么样?",
"助手:我很好,谢谢!有什么可以帮你的吗?",
"用户:我想了解一下量子计算。"
]
# 手动拼接对话历史
formatted_input = "\n".join(chat_history)
# 分词并生成模型输入
inputs = tokenizer(formatted_input, return_tensors="pt")
# 生成回复
outputs = model.generate(**inputs, max_length=100)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("模型的回复:")
print(response)
2. 使用 ConversationalPipeline
Hugging Face 提供了 ConversationalPipeline
,专门用于处理多轮对话。它会自动管理对话历史并生成回复。
示例代码:
from transformers import pipeline
# 加载对话管道
chatbot = pipeline("conversational", model="microsoft/DialoGPT-medium")
# 定义初始对话
chat_history = [
{"role": "user", "content": "你好,最近怎么样?"},
{"role": "assistant", "content": "我很好,谢谢!有什么可以帮你的吗?"},
]
# 添加新消息
new_message = {"role": "user", "content": "我想了解一下量子计算。"}
chat_history.append(new_message)
# 生成回复
response = chatbot(chat_history)
print("模型的回复:")
print(response)
3. 使用 ChatGPT
风格的模板
如果你使用的是类似 ChatGPT 的模型,可以按照特定的模板格式拼接对话历史。例如,OpenAI 的 ChatGPT 模型通常使用以下格式:
用户:你好,最近怎么样?
助手:我很好,谢谢!有什么可以帮你的吗?
用户:我想了解一下量子计算。
示例代码:
from transformers import AutoTokenizer, AutoModelForCausalLM
# 加载模型和分词器
model_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 定义聊天历史
chat_history = [
"用户:你好,最近怎么样?",
"助手:我很好,谢谢!有什么可以帮你的吗?",
"用户:我想了解一下量子计算。"
]
# 拼接对话历史
formatted_input = "\n".join(chat_history)
# 分词并生成模型输入
inputs = tokenizer(formatted_input, return_tensors="pt")
# 生成回复
outputs = model.generate(**inputs, max_length=100)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("模型的回复:")
print(response)
4. 使用 DialoGPT
或 BlenderBot
的专用方法
某些模型(如 DialoGPT
或 BlenderBot
)有专门的工具或方法处理多轮对话。
示例代码(DialoGPT):
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载 DialoGPT 模型和分词器
model_name = "microsoft/DialoGPT-medium"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 定义聊天历史
chat_history_ids = None
user_input = "你好,最近怎么样?"
# 循环处理多轮对话
for _ in range(3): # 假设进行 3 轮对话
# 将用户输入添加到聊天历史
new_input_ids = tokenizer.encode(user_input + tokenizer.eos_token, return_tensors="pt")
chat_history_ids = torch.cat([chat_history_ids, new_input_ids], dim=-1) if chat_history_ids is not None else new_input_ids
# 生成回复
chat_history_ids = model.generate(chat_history_ids, max_length=1000, pad_token_id=tokenizer.eos_token_id)
# 解码回复
response = tokenizer.decode(chat_history_ids[:, -1:][0], skip_special_tokens=True)
print(f"助手:{response}")
# 模拟用户输入
user_input = input("用户:")
5. 使用 OpenAI API 的聊天模式
如果你使用的是 OpenAI 的 GPT 模型(如 GPT-3.5 或 GPT-4),可以直接使用 OpenAI API 的聊天模式。
示例代码:
import openai
# 设置 OpenAI API 密钥
openai.api_key = "your-api-key"
# 定义聊天历史
chat_history = [
{"role": "user", "content": "你好,最近怎么样?"},
{"role": "assistant", "content": "我很好,谢谢!有什么可以帮你的吗?"},
{"role": "user", "content": "我想了解一下量子计算。"}
]
# 调用 OpenAI API
response = openai.ChatCompletion.create(
model="gpt-4", # 或 "gpt-3.5-turbo"
messages=chat_history
)
# 输出模型的回复
print(response['choices'][0]['message']['content'])
总结
- 手动拼接:适合简单的对话格式。
ConversationalPipeline
:适合 Hugging Face 模型的多轮对话。- 专用模型方法:如 DialoGPT 或 BlenderBot,适合特定模型。
- OpenAI API:适合使用 GPT-3.5 或 GPT-4 的聊天模式。
根据你的需求选择合适的工具和方法!如果你有更多问题,欢迎继续提问。