ChatGLM-6B源码解析 之 web_demo.py

这篇具有很好参考价值的文章主要介绍了ChatGLM-6B源码解析 之 web_demo.py。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()

"""Override Chatbot.postprocess"""


def postprocess(self, y):
    if y is None:
        return []
    for i, (message, response) in enumerate(y):
        y[i] = (
            None if message is None else mdtex2html.convert((message)),
            None if response is None else mdtex2html.convert(response),
        )
    return y


gr.Chatbot.postprocess = postprocess


def parse_text(text):
    """copy from https://github.com/GaiZhenbiao/ChuanhuChatGPT/"""
    lines = text.split("\n")
    lines = [line for line in lines if line != ""]
    count = 0
    for i, line in enumerate(lines):
        if "```" in line:
            count += 1
            items = line.split('`')
            if count % 2 == 1:
                lines[i] = f'<pre><code class="language-{items[-1]}">'
            else:
                lines[i] = f'<br></code></pre>'
        else:
            if i > 0:
                if count % 2 == 1:
                    line = line.replace("`", "\`")
                    line = line.replace("<", "&lt;")
                    line = line.replace(">", "&gt;")
                    line = line.replace(" ", "&nbsp;")
                    line = line.replace("*", "&ast;")
                    line = line.replace("_", "&lowbar;")
                    line = line.replace("-", "&#45;")
                    line = line.replace(".", "&#46;")
                    line = line.replace("!", "&#33;")
                    line = line.replace("(", "&#40;")
                    line = line.replace(")", "&#41;")
                    line = line.replace("$", "&#36;")
                lines[i] = "<br>"+line
    text = "".join(lines)
    return text


def predict(input, chatbot, max_length, top_p, temperature, history):
    chatbot.append((parse_text(input), ""))
    for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,
                                               temperature=temperature):
        chatbot[-1] = (parse_text(input), parse_text(response))       

        yield chatbot, history


def reset_user_input():
    return gr.update(value='')


def reset_state():
    return [], []


with gr.Blocks() as demo:
    gr.HTML("""<h1 align="center">ChatGLM</h1>""")

    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)
            with gr.Column(min_width=32, scale=1):
                submitBtn = gr.Button("Submit", variant="primary")
        with gr.Column(scale=1):
            emptyBtn = gr.Button("Clear History")
            max_length = gr.Slider(0, 4096, value=2048, step=1.0, label="Maximum length", interactive=True)
            top_p = gr.Slider(0, 1, value=0.7, step=0.01, label="Top P", interactive=True)
            temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)

    history = gr.State([])

    submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history], [chatbot, history],
                    show_progress=True)
    submitBtn.click(reset_user_input, [], [user_input])

    emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)

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

这段代码的主要目标是使用预训练的ChatGPT模型("THUDM/chatglm-6b")来构建一个基于web的交互式聊天机器人。以下是对代码中每行或每个代码块的解释:

  1. 导入必要的库:

     

    pythonCopy code

    from transformers import AutoModel, AutoTokenizer

  2. import gradio as gr

  3. import mdtex2html

    transformers是一个NLP库,提供了很多预训练模型。AutoModelAutoTokenizer是用来自动加载对应的模型和tokenizer的方法gradio是用于构建交互式UI的库,而mdtex2html是将markdown转换为html的工具

  4. 加载预训练模型和tokenizer:

     

    pythonCopy code

    tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda() model = model.eval()

    这些代码行加载了名为"THUDM/chatglm-6b"的预训练模型和它的tokenizer。half()方法将模型的数据类型转换为半精度浮点型,这可以在GPU上加快计算速度。cuda()方法将模型移动到GPU上。model.eval()设置模型为评估模式。

  1. 重写Chatbot.postprocess方法:

     

    pythonCopy code

    def postprocess(self, y): if y is None: return [] for i, (message, response) in enumerate(y): y[i] = ( None if message is None else mdtex2html.convert((message)), None if response is None else mdtex2html.convert(response), ) return y gr.Chatbot.postprocess = postprocess

    这部分代码重写了gr.Chatbotpostprocess方法,将输入的消息和机器人的回复从markdown格式转化为html格式。

  2. 定义parse_text函数:

     

    pythonCopy code

    def parse_text(text): ... return text

    这个函数处理输入的文本,例如替换特定的字符和添加HTML标签。

  3. 定义predict函数:

     

    pythonCopy code

    def predict(input, chatbot, max_length, top_p, temperature, history): ...

    这个函数使用预训练的模型生成聊天机器人的回复。它接收一些参数,如输入文本、聊天记录、生成的最大长度、生成概率阈值和生成的"温度"。

  4. 定义reset_user_inputreset_state函数:

     

    pythonCopy code

    def reset_user_input(): return gr.update(value='') def reset_state(): return [], []

    这些函数用于重置用户的输入和聊天机器人的状态。

  5. 创建一个Gradio UI界面:

     

    pythonCopy code

    with gr.Blocks() as demo: ... demo.queue().launch(share=False, inbrowser

  1. 创建一个Gradio UI界面 (续):

     

    pythonCopy code

    with gr.Blocks() as demo:
        gr.HTML("""<h1 align="center">ChatGLM</h1>""")
    
        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)
                with gr.Column(min_width=32, scale=1):
                    submitBtn = gr.Button("Submit", variant="primary")
            with gr.Column(scale=1):
                emptyBtn = gr.Button("Clear History")
                max_length = gr.Slider(0, 4096, value=2048, step=1.0, label="Maximum length", interactive=True)
                top_p = gr.Slider(0, 1, value=0.7, step=0.01, label="Top P", interactive=True)
                temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)
    
        history = gr.State([])
    
        submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history], [chatbot, history], show_progress=True)
        submitBtn.click(reset_user_input, [], [user_input])
    
        emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)
    
    demo.queue().launch(share=False, inbrowser=True)
    

    这部分代码使用Gradio库来创建一个web界面,该界面包括输入框(user_input)、提交按钮(submitBtn)、清空按钮(emptyBtn)以及用于控制模型的一些滑动条。在界面中,你可以输入文字,然后点击提交按钮使机器人生成回应。清空按钮则用来清空聊天历史和模型状态。

    history = gr.State([])这行代码创建了一个State对象,用来保存聊天历史

    submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history], [chatbot, history], show_progress=True)这行代码连接提交按钮的点击事件和predict函数。当你点击提交按钮时,会调用predict函数,并将输入框中的文字、聊天机器人对象、滑动条的值以及聊天历史作为参数传入。

    submitBtn.click(reset_user_input, [], [user_input])这行代码连接提交按钮的点击事件和reset_user_input函数,所以当你点击提交按钮后,输入框中的文字会被清空。

    emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True)这行代码连接清空按钮的点击事件和reset_state函数,所以当你点击清空按钮后,聊天机器人的历史和状态会被清空。

    demo.queue().launch(share=False, inbrowser=True)这行代码将界面部署到本地的web服务器,并在浏览器中打开share=False表示不与其他人分享这个界面,inbrowser=True表示在当前的浏览器中打开这个界面

已经解释了整段代码,为了让你更好地理解,我将重述一下这段代码的主要功能:

这个脚本创建了一个使用预训练模型"THUDM/chatglm-6b"的聊天机器人,用户可以在web界面上与它进行交互。用户可以输入消息,然后机器人会根据消息内容生成回应。

具体来说,以下是用户在界面上可以进行的操作:

  1. 输入消息:用户可以在文本框中输入消息,然后点击"Submit"按钮将消息发送给机器人。

  2. 控制模型:用户可以使用滑动条来控制模型的几个参数,包括生成的最大长度("Maximum length")、生成的概率阈值("Top P")以及生成的"温度"("Temperature")。

  3. 清空历史:用户可以点击"Clear History"按钮来清空聊天历史和模型状态。

除此之外,该脚本还做了一些额外的处理,例如将输入和输出的文本从markdown格式转化为html格式,以及在生成回应之后自动清空输入框。文章来源地址https://www.toymoban.com/news/detail-815379.html

到了这里,关于ChatGLM-6B源码解析 之 web_demo.py的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 聊聊 从源码来看ChatGLM-6B的模型结构

    基于ChatGLM-6B第一版,要注意还有ChatGLM2-6B以及ChatGLM3-6B ChatGLM是transformer架构的神经网络模型,因此从transformer结构入手,分析其源码结构。 transformer结构: 转载请备注出处:https://www.cnblogs.com/zhiyong-ITNote/ ChatGLM-6B的位置编码采用的旋转位置编码(RoPB)实现。其源码: ChatGLM-6B采用

    2024年02月03日
    浏览(42)
  • 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)

    ChatGLM-6B模型结构代码解析(单机版) ​ 本文介绍ChatGLM-6B的模型结构,代码来自https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py。 相关博客 【自然语言处理】【长文本处理】RMT:能处理长度超过一百万token的Transformer 【自然语言处理】【大模型】MPT模型结构源码解析(单机

    2024年02月06日
    浏览(53)
  • 解锁ChatGLM-6B的潜力:优化大语言模型训练,突破任务困难与答案解析难题

    LLM(Large Language Model)通常拥有大量的先验知识,使得其在许多自然语言处理任务上都有着不错的性能。 但,想要直接利用 LLM 完成一些任务会存在一些答案解析上的困难,如规范化输出格式,严格服从输入信息等。 因此,在这个项目下我们参考 ChatGLM-Tuning 的代码,尝试对大

    2024年02月11日
    浏览(43)
  • 在矩池云使用ChatGLM-6B & ChatGLM2-6B

    ChatGLM-6B 和 ChatGLM2-6B都是基于 General Language Model (GLM) 架构的对话语言模型,是清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同发布的语言模型。模型有 62 亿参数,一经发布便受到了开源社区的欢迎,在中文语义理解和对话生成上有着不凡的表现。 ChatGLM-6B 可以在消费级的显卡

    2024年02月14日
    浏览(51)
  • ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集实战

    介绍 ChatGLM-6B是开源的文本生成式对话模型,基于General Language Model(GLM)框架,具有62亿参数,结合模型蒸馏技术,实测在2080ti显卡训练中上(INT4)显存占用 6G 左右, 优点 :1.较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13GB 的显存进行推理,结合模型量化技术,一需求可以进一步

    2024年02月12日
    浏览(59)
  • 【Linux】【chatGLM-6B】如何从huggingface上下载chatGLM-6B模型于centos系统

    从 https://github.com/git-lfs/git-lfs/releases 这个网址上选择以下框框中的内容进行下载 tar -zxvf git-lfs-linux-amd64-v2.12.1.tar.gz sudo ./install.sh 输入如下代码开始下载: git lfs clone https://huggingface.co/chatglm-6b 直接git clone下载的文件都特别小,不像是完整版的

    2024年02月12日
    浏览(71)
  • ChatGLM2-6B

    ChatGLM2-6B 项目基本情况 GitHub:https://github.com/THUDM/ChatGLM2-6B/tree/main 参考:https://mp.weixin.qq.com/s/11jCCeOpg1YbABIRLlnyvg 主要贡献 更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预

    2024年02月15日
    浏览(46)
  • ChatGLM2-6B 部署

    这是ChatGLM2-6B 部署的阅读笔记,主要介绍了ChatGLM2-6B模型的部署和一些原理的简单解释。 它是单卡开源的对话模型。 充分的中英双语预训练 较低的部署门槛 FP16半精度下,需要至少13G的显存进行推理,甚至可以进一步降低到10G(INT8)和6G(INT4) 更长的序列长度 ChatGLM-6B 序列长度达

    2024年02月09日
    浏览(55)
  • ChatGLM-6B+LangChain实战

    目标:原始使用ChatGLM-6B可接受的文字长度有限,打算结合LangChain实现长文本生成摘要. 方法: step1:自定义一个GLM继承LangChain中的langchain.llms.base.LLM,load自己的模型. step2:使用LangChain的mapreduce的方法,对文本分块,做摘要,输出结果. 使用的机器资源:T4显卡(16G显存) 附参

    2024年02月16日
    浏览(33)
  • ChatGLM-6B阿里云部署

    重点关注指标:CPU、内存、GPU、GPU驱动  类型 OS CPU 内存 GPU 机器配置 ubuntu_20_04_x64 16核 125G NVIDIA A100 80G   git git-lfs(大文件管理) python 3.10.7(如果已经安装了python其他版本,不用再安装此版本) 下载解压源码 此时终端内输入: python -V 出现 Python 3.10.7表示python安装成功。 下载模型

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包