赞
踩
LangChain是一个强大的工具,用于构建由语言模型(LLM)驱动的应用程序,它提供了与多种不同语言模型交互的标准接口。在本书前面的内容中,绝大多数LangChain例子都是基于OpenAI的ChatGPT模型实现的,其实LangChain可以适配并使用我们的国产模型。在本章的内容中,将详细讲解使用LangChain操作国产模型的知识。
ChatGLM 是由智谱AI推出的一系列大模型,这些模型基于大规模预训练技术,具备强大的自然语言处理能力。因为ChatGLM已经开源了包括 ChatGLM-6B在内的多个模型版本,为了降低大家的学习成本,本书将以ChatGLM-6B为例介绍LangChain操作ChatGLM的知识。
1. ChatGLM介绍
ChatGLM-6B是ChatGLM大模型系列中的一个开源模型(开源地址https://github.com/THUDM/ChatGLM-6B),这个模型基于General Language Model (GLM)架构,拥有62亿参数,并且特别针对中文进行了优化。ChatGLM-6B在1:1比例的中英语料上训练了1T的token量,兼具双语能力,并且通过模型量化技术,可以在消费级的显卡上进行本地部署,INT4量化级别下最低只需6GB显存。
ChatGLM系列大模型包括但不限于对话生成、智能问答等任务,而LangChain可以适配并使用这些模型。ChatGLM的基本信息如下所示:
2. 准备开发环境
建议直接参考ChatGLM-6B开源地址中的配置文件https://github.com/THUDM/ChatGLM-6B/blob/main/requirements.txt:
- protobuf
- transformers==4.27.1
- cpm_kernels
- torch>=1.10
- gradio
- mdtex2html
- sentencepiece
- accelerate
通过如下命令安装所需要的库:
pip install -r requirements.txt
3. 准备模型文件
在目前的就似乎条件下,可以通过如下三种方法准备文件:
(1)直接从huggingface模型仓库拉取模型文件,这种方法的缺点是需要先安装Git LFS,拉取速度很慢。
git clone https://huggingface.co/THUDM/chatglm-6b
(2)从huggingface模型残酷拉取模型实现,然后从清华仓库下载模型参数文件,然后替换到chatglm-6b文件夹中。
- GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b
- # 下载模型参数文件...
- mv chatglm-6b/* THUDM/chatglm-6b/
(3)通过使用transformers库中的类AutoTokenizer和类AutoModel,自动实现ChatGLM-6B模型和分词器的下载及加载工作。
- import os
- from transformers import AutoTokenizer, AutoModel
- tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
- model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
请看下面的实例,演示了实用第三种方法调用ChatGLM-6B模型进行对话的过程。
实例7-1:使用自定义的LLM返回输入信息中的前n个字符(源码路径:codes\7\qing.py)
实例文件qing.py的具体实现代码如下所示。
- import os
- from transformers import AutoTokenizer, AutoModel
-
- # 指定使用编号为0的GPU
- os.environ["CUDA_VISIBLE_DEVICES"] = "0"
-
- # 加载分词器和模型
- tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
- model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
-
- # 将模型发送到GPU,并设置为评估模式
- model = model.to('cuda') # 这将模型移动到默认的GPU上
- model = model.eval()
-
- # 将模型转换为半精度
- model.half()
- human_input = "你好"
- response, history = model.chat(tokenizer, human_input, history=[])
-
- print(f"Human: {human_input}")
- print(f"AI: {response}")
上述代码的目的是使用库transformers从Hugging Face模型库中加载并运行一个名为"THUDM/chatglm-6b"的预训练对话模型,以下是代码的详细步骤和功能:
(1)环境设置:os.environ["CUDA_VISIBLE_DEVICES"] = "0":这行代码设置了环境变量,指定程序只能看到编号为0的GPU。如果你的系统中有多个GPU,这可以用来决定哪个GPU用于模型的推理或训练。
(2)加载分词器和模型
(3)准备模型进行推理
(4)model.half():将模型转换为半精度(float16),这可以减少模型在GPU上的内存占用,允许更大的模型或批量大小,但也需要硬件和深度学习框架支持半精度运算。
(5)生成对话响应
(6)打印结果:最后,代码打印输出了用户的输入和AI生成的回答响应。执行后会输出:
- Loading checkpoint shards: 100%|██████████| 8/8 [00:38<00:00, 4.87s/it]
- Human: 你好
AI: 你好��!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
4. 模型服务调用接口
在大模型开发应用中,模型服务调用接口(API)扮演着至关重要的角色,主要体现在以下几个方面:
在实际应用中,模型服务调用接口通常是通过HTTP协议实现的,使用RESTful或GraphQL等风格。这些接口可以返回JSON、XML或其他格式的数据,以便于客户端处理。通过精心设计API,可以提高大模型的可用性、灵活性和整体的用户体验。
请看下面的例子,使用Flask技术实现了一个简单的模型服务调用接口。在这个Web应用中,使用库transformers加载了一个预训练的对话模型ChatGLM-6B,并提供了一个HTTP端点来接收用户的输入并返回模型的响应。
实例7-2:使用Flask实现一个简单的模型服务调用接口(源码路径:codes\7\diao.py)
实例文件diao.py的具体实现代码如下所示。
- import os
- import json
- from flask import Flask, request, jsonify
- from transformers import AutoTokenizer, AutoModel
-
- # 系统参数
- os.environ["CUDA_VISIBLE_DEVICES"] = "0"
-
- # 加载分词器和模型
- tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
- model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
- model = model.to('cuda') # 将模型发送到GPU
- model = model.eval() # 将模型设置为评估模式
- model.half() # 将模型转换为半精度
-
- app = Flask(__name__)
-
- @app.route("/", methods=["GET"])
- def root():
- ""“根路由响应。”""
- return "这是主页."
-
- @app.route("/chat", methods=["POST"])
- def chat():
- """处理聊天请求."""
- # 从POST请求中获取JSON数据
- data = request.json
- human_input = data.get("human_input", "")
-
- # 从模型生成响应
- response, _ = model.chat(tokenizer, human_input, history=[])
-
- # 创建一个结果字典
- result = {
- "human_input": human_input,
- "ai_response": response
- }
-
- # 将响应作为JSON返回
- return jsonify(result)
-
- if __name__ == "__main__":
- app.run(host="127.0.0.1", port=8595, debug=False)
上述代码的实现流程如下所示:
(1)设置环境变量:使用os.environ指定程序只能看到编号为0的GPU,这样模型训练或推理时只会使用这个GPU。
(3)初始化Flask应用:创建一个Flask应用实例。
(4)定义路由和视图函数,使用@app.route装饰器定义两个路由:
(5)聊天视图函数 (chat())
(6)运行Flask应用:使用app.run()启动Flask应用,监听127.0.0.1的8595端口,不开启调试模式。
(8)客户端请求处理:当客户端(如Web浏览器、API测试工具或自定义脚本)发送POST请求到/chat端点时,Flask应用将处理这个请求,并返回AI的响应。
执行实例文件diao.py后会输出:
- Loading checkpoint shards: 100%|██████████| 8/8 [00:48<00:00, 6.12s/it]
- * Serving Flask app 'diao'
- * Debug mode: off
- * Running on http://127.0.0.1:8595
打开一个新的命令行窗口(例如CMD或curl),然后运行以下命令:
curl -X POST -H "Content-Type: application/json" -d "{\"human_input\": \"你好\"}" http://127.0.0.1:8595/chat
上述命令会向Flask应用发送一个JSON格式的POST请求,请求体包含一个键为human_input,值为“你好”的字符串。按下回车键后会获得ChatGLM-6B的回复信息,完整的执行过程如下:
- C:\Users\37197>curl -X POST -H "Content-Type: application/json" -d "{\"human_input\": \"你好\"}" http://127.0.0.1:8595/chat
- {"response": "你好声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/805085?site推荐阅读
相关标签
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。