| import gradio as gr |
|
|
|
|
|
|
|
|
| |
| |
| |
| |
| |
|
|
|
|
|
|
|
|
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| import torch |
|
|
|
|
| class ChatClient: |
| def __init__(self, model_path): |
| """ |
| 初始化客户端,加载模型和分词器到 GPU(如果可用)。 |
| """ |
| self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| print(f"Using device: {self.device}") |
|
|
| self.tokenizer = AutoTokenizer.from_pretrained(model_path) |
| self.model = AutoModelForCausalLM.from_pretrained(model_path).to(self.device) |
| self.model.eval() |
|
|
| def chat_completion(self, messages, max_tokens, stream=False, temperature=1.0, top_p=1.0): |
| """ |
| 生成对话回复。 |
| """ |
| |
| input_text = messages |
| print(input_text) |
| |
| inputs = self.tokenizer(input_text, return_tensors='pt').to(self.device) |
|
|
| |
| gen_kwargs = { |
| "max_length": inputs['input_ids'].shape[1] + max_tokens, |
| "temperature": temperature, |
| "top_p": top_p, |
| "do_sample": True |
| } |
|
|
| |
| output_sequences = self.model.generate(**inputs, **gen_kwargs) |
|
|
| |
| result_text = self.tokenizer.decode(output_sequences[0], skip_special_tokens=True) |
|
|
| yield result_text |
|
|
| |
| model_path = 'model/v3/' |
| client = ChatClient(model_path) |
|
|
|
|
|
|
|
|
|
|
|
|
| def respond( |
| message, |
| history: list[tuple[str, str]], |
| system_message, |
| max_tokens, |
| temperature, |
| top_p, |
| ): |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| messages = system_message + message |
|
|
|
|
| response = "" |
|
|
| for message in client.chat_completion( |
| messages, |
| max_tokens=max_tokens, |
| stream=True, |
| temperature=temperature, |
| top_p=top_p, |
| ): |
| token = message.choices[0].delta.content |
|
|
| response += token |
| yield response |
|
|
| """ |
| For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface |
| """ |
| demo = gr.ChatInterface( |
| respond, |
| additional_inputs=[ |
| gr.Textbox(value="Yahoo!ショッピングについての質問を回答してください。", label="System message"), |
| gr.Slider(minimum=1, maximum=2048, value=512, step=1, label="Max new tokens"), |
| gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"), |
| gr.Slider( |
| minimum=0.1, |
| maximum=1.0, |
| value=0.95, |
| step=0.05, |
| label="Top-p (nucleus sampling)", |
| ), |
| ], |
| ) |
|
|
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|