部署一个本地的聊天机器人-基于ChatGLM3

部署一个本地的聊天机器人-基于ChatGLM3

预备

理论上来说

  1. 8G及以上显存的英伟达GPU

笔者的设备

  1. RTX 4060Ti (16G显存)
  2. Archlinux
  3. Python 3.10.10
  4. ChatGLM3 代码版本 33953b119e7

开整

下载ChatGLM3

ChatGLM3 是智谱AI几周前才开源的模型, 6B大小的话只是个人用的话算是完全免费的. 这个相比之前的2感觉是prompt优化了一些(不过也复杂了一些), 可以直接用来让机器人调用工具等等

需要下载两个仓库, 一个是代码库一个是模型库, 下面的命令不需要代理也可以直接执行

git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

git clone https://mirror.ghproxy.com/https://github.com/THUDM/ChatGLM3

运行

我本地用gradio 3.50.2web_demo有点问题, 所以微改了一下自带的web_demo

diff --git a/basic_demo/web_demo.py b/basic_demo/web_demo.py
index a6e4e19..b30d834 100644
--- a/basic_demo/web_demo.py
+++ b/basic_demo/web_demo.py
@@ -5,7 +5,8 @@ import mdtex2html
 from utils import load_model_on_gpus
 import torch
 
-MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
+# MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
+MODEL_PATH = os.path.expanduser("~/Github/chatglm3-6b")
 TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
 DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'
 
@@ -21,6 +22,7 @@ else: # CPU, Intel GPU and other GPU can use Float16 Precision Only
 
 """Override Chatbot.postprocess"""
 
+chat_postprocess = gr.Chatbot.postprocess
 def postprocess(self, y):
     if y is None:
         return []
@@ -29,10 +31,9 @@ def postprocess(self, y):
             None if message is None else mdtex2html.convert((message)),
             None if response is None else mdtex2html.convert(response),
         )
-    return y
+    return chat_postprocess(self, y)
 
-
-gr.Chatbot.postprocess = postprocess
+# gr.Chatbot.postprocess = postprocess
 
 
 def parse_text(text):
@@ -75,7 +76,7 @@ def predict(input, chatbot, max_length, top_p, temperature, history, past_key_va
                                                                 return_past_key_values=True,
                                                                 max_length=max_length, top_p=top_p,
                                                                 temperature=temperature):
-        chatbot[-1] = (parse_text(input), parse_text(response))
+        chatbot[-1] = (parse_text(input), response)
 
         yield chatbot, history, past_key_values
 
@@ -90,13 +91,12 @@ def reset_state():
 
 with gr.Blocks() as demo:
     gr.HTML("""<h1 align="center">ChatGLM3-6B</h1>""")
-
+    gr.ChatInterface
     chatbot = gr.Chatbot()
     with gr.Row():
         with gr.Column(scale=4):
             with gr.Column(scale=12):
-                user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(
-                    container=False)
+                user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10, container=False)
             with gr.Column(min_width=32, scale=1):
                 submitBtn = gr.Button("Submit", variant="primary")
         with gr.Column(scale=1):
@@ -108,10 +108,11 @@ with gr.Blocks() as demo:
     history = gr.State([])
     past_key_values = gr.State(None)
 
+    # submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history, past_key_values],
+    #                 [chatbot, history, past_key_values])
     submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history, past_key_values],
-                    [chatbot, history, past_key_values], show_progress=True)
-    submitBtn.click(reset_user_input, [], [user_input])
+                    [chatbot, history, past_key_values]).then(reset_user_input, [], [user_input], queue=False)
 
-    emptyBtn.click(reset_state, outputs=[chatbot, history, past_key_values], show_progress=True)
+    emptyBtn.click(reset_state, outputs=[chatbot, history, past_key_values], queue=False)
 
-demo.queue().launch(share=False, server_name="127.0.0.1", server_port=8501, inbrowser=True)
+    demo.queue().launch(share=False, server_name="127.0.0.1", server_port=8501, inbrowser=True)

跑了一下结果也是非常的棒, 生成速度还蛮快的, 非常的丝滑

看看效果
img

posted on 2023-11-26 23:45  梦原兄  阅读(686)  评论(0编辑  收藏  举报

导航