Skip to content

Commit acb6300

Browse files
authored
Init
1 parent 9c39d53 commit acb6300

File tree

2 files changed

+115
-1
lines changed

2 files changed

+115
-1
lines changed

README.md

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,16 @@
11
# BaoZaoAI
2-
基于Qwen-2.5-1.5B 进行DPO fine-tuning后,意外说真话的AI暴躁哥
2+
基于Qwen-2.5-1.5B-Instruct 进行DPO fine-tuning后,意外说真话的AI暴躁哥
3+
4+
## 使用说明和风险提示
5+
这是一个基于LLM的聊天应用,旨在展示模型的对话生成能力。在使用前,请仔细阅读以下说明和风险提示。
6+
## 用法说明
7+
- 启动应用:运行demo.py文件,启动Streamlit应用。在浏览器中访问Streamlit提供的本地地址,开始与暴躁AI哥对话。
8+
- 输入问题:在聊天界面的输入框中输入你的问题或指令。
9+
- 接收回复:暴躁AI哥会以一种独特的、可能带有挑衅性的方式回复你的问题。
10+
- 查看历史:你可以在聊天界面中查看之前的对话历史。
11+
## 风险提示
12+
- 脏话风险:请注意,这个模型在训练过程中使用了包含脏话的数据。因此,在使用过程中,模型可能会生成包含不雅语言的回复。我们强烈建议在公共场合或敏感环境中谨慎使用。
13+
- 内容责任:虽然模型的回复可能具有挑衅性或不适当,但请记住,这些回复是由模型生成的,不代表开发者的观点或立场。用户应对自己的使用行为负责。
14+
- 遵守法律法规:在使用过程中,请确保遵守当地的法律法规,尊重他人的权利和感受。
15+
## 技术细节
16+
使用DPO基于Qwen-2.5-1.5B-Instruct模型,基于[脏话数据集](https://huggingface.co/datasets/MLZoo/DPO-bad-boy-chinese-for-Qwen2.5)进行fine-tuning。

demo.py

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
from threading import Thread
2+
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer, TextStreamer
3+
from transformers.generation.stopping_criteria import StoppingCriteria
4+
import streamlit as st
5+
6+
# 初始化模型和tokenizer
7+
@st.cache_resource
8+
def load_model():
9+
model_name = "MLZoo/Qwen2.5-1.5B-Instruct-DPO-bad-boy"
10+
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")
11+
model = AutoModelForCausalLM.from_pretrained(model_name)
12+
return model, tokenizer
13+
14+
model, tokenizer = load_model()
15+
16+
class StopOnTokens(StoppingCriteria):
17+
def __init__(self, stop_ids):
18+
self.stop_ids = stop_ids
19+
20+
def __call__(self, input_ids, scores, **kwargs):
21+
# 检查最后一个生成的token是否是停止token
22+
for stop_id in self.stop_ids:
23+
if input_ids[0][-1] == stop_id:
24+
return True
25+
return False
26+
27+
def generate_response_streaming(chat_history):
28+
# 构建对话历史
29+
messages = [{"role": "system", "content": "你是一个没素质的人,请用暴躁的语气回复我,尽量多说一些。"}]
30+
# 添加历史对话
31+
for msg in chat_history:
32+
messages.append({
33+
"role": "user" if msg["role"] == "user" else "assistant",
34+
"content": msg["content"]
35+
})
36+
37+
input_text = tokenizer.apply_chat_template(messages, tokenize=False)
38+
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
39+
40+
# 使用 streamer 进行生成
41+
streamer = TextIteratorStreamer(tokenizer, skip_special_tokens=True)
42+
43+
# 设置生成参数
44+
generation_kwargs = {
45+
"inputs": inputs["input_ids"],
46+
"max_length": 2048, # 增加最大长度以支持更长的对话
47+
"temperature": 0.7,
48+
"top_p": 0.9,
49+
"do_sample": True,
50+
"streamer": streamer,
51+
"stopping_criteria": [StopOnTokens([tokenizer.eos_token_id])],
52+
}
53+
54+
# 在单独的线程中进行生成
55+
thread = Thread(target=model.generate, kwargs=generation_kwargs)
56+
thread.start()
57+
58+
# 实时输出生成的文本
59+
token_counts = 0
60+
61+
# 创建一个空的占位符
62+
message_placeholder = st.empty()
63+
full_response = ""
64+
65+
for new_text in streamer:
66+
if token_counts < 4:
67+
token_counts += 1
68+
continue
69+
full_response += new_text
70+
# 更新显示的文本
71+
message_placeholder.markdown(full_response + "▌")
72+
73+
# 显示完整的回复
74+
message_placeholder.markdown(full_response)
75+
return full_response
76+
77+
# Streamlit界面设置
78+
st.title("暴躁AI哥 🤖")
79+
st.write("我是DPO train出来的暴躁AI哥,有什么问题尽管问我!")
80+
81+
# 初始化聊天历史
82+
if "messages" not in st.session_state:
83+
st.session_state.messages = []
84+
85+
# 显示聊天历史
86+
for message in st.session_state.messages:
87+
with st.chat_message(message["role"]):
88+
st.markdown(message["content"])
89+
90+
# 接收用户输入
91+
if prompt := st.chat_input("在这里输入你的问题..."):
92+
# 添加用户消息到聊天历史
93+
st.session_state.messages.append({"role": "user", "content": prompt})
94+
with st.chat_message("user"):
95+
st.markdown(prompt)
96+
97+
# 生成助手回复
98+
with st.chat_message("assistant"):
99+
response = generate_response_streaming(st.session_state.messages)
100+
st.session_state.messages.append({"role": "assistant", "content": response})

0 commit comments

Comments
 (0)