0


ChatGLM2-6B源码解析 web_demo.py

  1. from transformers import AutoModel, AutoTokenizer
  2. import gradio as gr
  3. import mdtex2html
  4. tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
  5. model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
  6. model = model.eval()
  7. """Override Chatbot.postprocess"""
  8. def postprocess(self, y):
  9. if y is None:
  10. return []
  11. for i, (message, response) in enumerate(y):
  12. y[i] = (
  13. None if message is None else mdtex2html.convert((message)),
  14. None if response is None else mdtex2html.convert(response),
  15. )
  16. return y
  17. gr.Chatbot.postprocess = postprocess
  18. def parse_text(text):
  19. """copy from https://github.com/GaiZhenbiao/ChuanhuChatGPT/"""
  20. lines = text.split("\n")
  21. lines = [line for line in lines if line != ""]
  22. count = 0
  23. for i, line in enumerate(lines):
  24. if "```" in line:
  25. count += 1
  26. items = line.split('`')
  27. if count % 2 == 1:
  28. lines[i] = f'<pre><code class="language-{items[-1]}">'
  29. else:
  30. lines[i] = f'<br></code></pre>'
  31. else:
  32. if i > 0:
  33. if count % 2 == 1:
  34. line = line.replace("`", "\`")
  35. line = line.replace("<", "&lt;")
  36. line = line.replace(">", "&gt;")
  37. line = line.replace(" ", "&nbsp;")
  38. line = line.replace("*", "&ast;")
  39. line = line.replace("_", "&lowbar;")
  40. line = line.replace("-", "&#45;")
  41. line = line.replace(".", "&#46;")
  42. line = line.replace("!", "&#33;")
  43. line = line.replace("(", "&#40;")
  44. line = line.replace(")", "&#41;")
  45. line = line.replace("$", "&#36;")
  46. lines[i] = "<br>"+line
  47. text = "".join(lines)
  48. return text
  49. def predict(input, chatbot, max_length, top_p, temperature, history, past_key_values):
  50. chatbot.append((parse_text(input), ""))
  51. for response, history, past_key_values in model.stream_chat(tokenizer, input, history, past_key_values=past_key_values,
  52. return_past_key_values=True,
  53. max_length=max_length, top_p=top_p,
  54. temperature=temperature):
  55. chatbot[-1] = (parse_text(input), parse_text(response))
  56. yield chatbot, history, past_key_values
  57. def reset_user_input():
  58. return gr.update(value='')
  59. def reset_state():
  60. return [], [], None
  61. with gr.Blocks() as demo:
  62. gr.HTML("""<h1 align="center">ChatGLM2-6B</h1>""")
  63. chatbot = gr.Chatbot()
  64. with gr.Row():
  65. with gr.Column(scale=4):
  66. with gr.Column(scale=12):
  67. user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(
  68. container=False)
  69. with gr.Column(min_width=32, scale=1):
  70. submitBtn = gr.Button("Submit", variant="primary")
  71. with gr.Column(scale=1):
  72. emptyBtn = gr.Button("Clear History")
  73. max_length = gr.Slider(0, 32768, value=8192, step=1.0, label="Maximum length", interactive=True)
  74. top_p = gr.Slider(0, 1, value=0.8, step=0.01, label="Top P", interactive=True)
  75. temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)
  76. history = gr.State([])
  77. past_key_values = gr.State(None)
  78. submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history, past_key_values],
  79. [chatbot, history, past_key_values], show_progress=True)
  80. submitBtn.click(reset_user_input, [], [user_input])
  81. emptyBtn.click(reset_state, outputs=[chatbot, history, past_key_values], show_progress=True)
  82. demo.queue().launch(share=False, inbrowser=True)

这是一个使用Hugging Face的transformers库和gradio库搭建的机器人聊天程序的Python代码,模型预训练的版本为"THUDM/chatglm2-6b",而且使用了mdtex2html来把markdown格式转化为HTML格式。我会逐行解释它的含义:

1-3: 导入必要的模块。

  1. transformers

是Hugging Face发布的处理NLP任务的库,提供了大量的预训练模型和相关工具。

  1. gradio

是一个创建快速demo用户界面的库,可以让模型快速地在web页面上进行展示和交互。

  1. mdtex2html

用来将markdown格式的文本转化为HTML格式。

5-6: 从 Hugging Face 模型库中加载了一个预训练的模型及其相应的词条化器(tokenizer),模型的名字是 "THUDM/chatglm2-6b"。

  1. trust_remote_code=True

是指示允许从远程代码中加载特殊的tokenizer或model代码。

7: 把模型放在CUDA上,这会让模型运行在GPU上,加快运算速度。

8: 把模型设定为评估模式(eval mode),在这种模式下,模型中的某些层(如 Dropout 或 BatchNorm)的行为会与训练模式有所不同。

10-19: 定义了一个

  1. postprocess

函数,它是为了对模型的输出进行后处理。在这个函数中,它会将每一条聊天信息和相应的回复转化为HTML格式。它将此函数绑定到gradio的Chatbot类的后处理函数上。

21-42:

  1. parse_text

函数用于处理用户的输入。它主要是处理markdown的代码部分,并把它们转化为HTML格式。

44-52:

  1. predict

函数接受用户的输入和一些模型参数,它首先把用户的输入添加到聊天记录中,然后用模型生成回复,最后返回聊天记录和新的历史记录。

54-56: 定义了两个函数来重置用户的输入和模型的状态。

58-89: 在这部分中,它用

  1. gradio

创建了一个用户界面。这个界面包括一个聊天机器人,一个用户输入框,一个提交按钮,一个清空历史按钮,以及一些滑块用于控制模型的参数。

91: 启动这个用户界面。

  1. share=False

表示这个界面不会被分享,

  1. inbrowser=True

表示这个界面会在浏览器中打开。

总的来说,这是一个使用预训练的模型来生成对话的聊天机器人的程序,它有一个简单的用户界面,用户可以通过这个界面和机器人进行交流。

我会继续分析此代码中的一些关键部分:

  1. AutoTokenizer.from_pretrained

  1. AutoModel.from_pretrained

方法从预训练的模型库中加载了一个模型及其对应的词条化器。它们能够自动地识别模型的类型,并加载相应的模型和词条化器。

  1. model.cuda()

将模型加载到GPU上进行计算。这个操作是在PyTorch中进行的,其目的是利用GPU进行更快的计算。这只有在你的机器上有可用的Nvidia GPU,并且你的PyTorch版本支持CUDA时才会有效。

  1. gr.Chatbot.postprocess = postprocess

这行代码将定义的

  1. postprocess

函数绑定到

  1. gr.Chatbot

类的

  1. postprocess

方法。这使得我们可以修改

  1. gr.Chatbot

的行为,以便于使用

  1. mdtex2html.convert

函数处理消息和回应,从而将markdown格式的文本转化为HTML格式。

函数

  1. parse_text

是用于处理输入的文本,主要是处理markdown的代码部分,并把它们转化为HTML格式。

函数

  1. predict

是这个程序的核心部分。它使用了模型进行预测,生成聊天机器人的回应。

最后,这个程序使用

  1. gradio

库来创建一个用户界面。这个界面包括一个聊天机器人,一个用户输入框,一个提交按钮,一个清空历史按钮,以及一些滑块用于控制模型的参数。用户可以通过这个界面和聊天机器人进行交流。

整体来看,这个程序是一个基于预训练模型和gradio库的聊天机器人。它能够处理用户的输入,生成聊天机器人的回应,并通过用户界面和用户进行交互。

  1. reset_user_input

  1. reset_state

函数被设计用来重置用户输入和清空模型的状态。它们主要被绑定到了前端的按钮上,当用户点击这些按钮时,会触发相应的函数。

接下来,这个脚本使用

  1. gr.Blocks()

来创建一个应用的界面。在这个界面中,

  1. gr.Chatbot()

实例化了一个聊天机器人,

  1. gr.Textbox()

实例化了一个输入框,用户可以在里面输入文本,然后点击

  1. gr.Button()

实例化的提交按钮,这会触发绑定到按钮上的函数,把用户的输入提交到聊天机器人,并接收聊天机器人的回应。另外,

  1. gr.Slider()

实例化了一些滑块,用于调整模型的参数。

  1. gr.State([])

  1. gr.State(None)

实例化了两个状态对象,这些对象用于保存聊天的历史记录和模型的内部状态。这些状态在每次预测时都会更新。

然后,

  1. submitBtn.click()

  1. emptyBtn.click()

将前面定义的函数绑定到了按钮的点击事件上。当用户点击这些按钮时,会触发绑定到按钮上的函数。

最后,

  1. demo.queue().launch(share=False, inbrowser=True)

启动了这个应用。用户可以在浏览器中访问这个应用,并与聊天机器人进行交互。

这个脚本实现了一个完整的基于预训练模型的聊天机器人应用,包括用户界面和模型的预测逻辑。它展示了如何使用Hugging Face的transformers库和gradio库来实现一个可交互的机器学习应用。


本文转载自: https://blog.csdn.net/sinat_37574187/article/details/131404024
版权归原作者 AI生成曾小健 所有, 如有侵权,请联系我们删除。

“ChatGLM2-6B源码解析 web_demo.py”的评论:

还没有评论