LangChain大模型应用落地实践(二):使用LLMs模块接入自定义大模型,以ChatGLM为例

angChain版本:0.0.147 ;(没想到第二更LangChain已经更新到147了)

一、国内外大模型发布现状

图1 大模型时间线(2023-arxiv-A Survey of Large Language Models)

模型名称企业/高校发布时间
ERNIE Bot(文心一言)百度2023年3月
ChatGLM清华大学2023年3月
通义千问阿里2023年4月
MOSS复旦大学2023年4月

从图1中可以看出,大模型时代的起始最早可以追溯到2019年Google推出的T5大模型,直到ChatGPT在22年底推出,23年初开放测试后爆火。至此,真正进入大模型的高速发展时期。

2023年4月,OpenAI API进一步封锁国内用户的使用,身边挺多朋友的OpenAI账号被封。因此,我们的目光陆续转移到国内的大模型。国内的大语言模型主要包括了上表中的几个,其中清华大学发布的ChatGLM-6B是比较平民的大模型版本,在保证一定的效果的基础上也支持单卡部署,是很好的实验Baseline。

从ChatGLM Github[ChatGLM-6B, Github]的介绍中可以知道,其硬件需求一张RTX3090就能满足。

量化等级最低GPU现存(推理)最低GPU显存(高效参数微调)
FP1613GB14GB

二、LLMs接入OpenAI

虽然OpenAI API的使用已经越来越困难,但我还是循例写一下这部分的接入。

在OpenAI官网注册,获得对应的API key。

2.1 Python环境依赖

pip install langchain==0.0.147
pip install openai==0.27.4

2.2 使用LangChain调用GPTs

import osfrom langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAI# global environment
os.environ["OPENAI_API_KEY"] = "sk-*********************************"# llm initialization
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)while True:human_input = input("(human): ")human_input = [HumanMessage(content=human_input)]ai_output = llm(human_input)print(f"(ai): {ai_output.content}")

访问如果需要代理,可以通过openai包进行配置,代码如下所示:

import osimport openaifrom langchain.schema import HumanMessage
from langchain.chat_models import ChatOpenAIopenai.proxy = {"http": "{proxy_ip}:{port}"
}# global environment
os.environ["OPENAI_API_KEY"] = "sk-*********************************"# llm initialization
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)while True:human_input = input("(human): ")human_input = [HumanMessage(content=human_input)]ai_output = llm(human_input)print(f"(ai): {ai_output.content}")

三、LLMs接入ChatGLM

ChatGLM是清华大学团队推出的平民大模型,使用RTX3090单卡即可部署,代码库开源,是目前大模型的最佳平替。

3.1 ChatGLM 本地部署

开发环境准备

requirements.txt:

  • 从ChatGLM代码库中复制它的requirements.txt下来;
  • 参考:https://github.com/THUDM/ChatGLM-6B/blob/main/requirements.txt;
pip install -r requirements.txt

模型文件准备

方法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:点赞+收藏+关注,并评论,我会私信分享模型文件的百度云盘链接;

模型本地调用

一切准备就绪后,我们可以通过下列代码在本地测试ChatGLM;(记得根据实际情况修改使用的显卡参数:CUDA_VISIBLE_DEVICES)

import osfrom transformers import AutoTokenizer, AutoModelos.environ["CUDA_VISIBLE_DEVICES"] = "2"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()
human_input = "你好"
response, history = model.chat(tokenizer, human_input, history=[])print(f"Human: {human_input}")
print(f"AI: {response}")

运行后可以得到模型的下列输出:

Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████| 8/8 [00:07<00:00,  1.07it/s]
AI: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。

模型服务调用(基于Flask)

模型服务代码如下

import os
import jsonfrom flask import Flask
from flask import request 
from transformers import AutoTokenizer, AutoModel# system params
os.environ["CUDA_VISIBLE_DEVICES"] = "2"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.eval()app = Flask(__name__)@app.route("/", methods=["POST", "GET"])
def root():"""root"""return "Welcome to chatglm model."@app.route("/chat", methods=["POST"])
def chat():"""chat"""data_seq = request.get_data()data_dict = json.loads(data_seq)human_input = data_dict["human_input"]response, _ = model.chat(tokenizer, human_input, history=[])result_dict = {"response": response}result_seq = json.dumps(result_dict, ensure_ascii=False)return result_seqif __name__ == "__main__":app.run(host="0.0.0.0", port=8595, debug=False)

服务启动后可以得到以下日志:

Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 8/8 [00:07<00:00,  1.03it/s]* Serving Flask app 'chatglm_server'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:8595* Running on http://10.158.99.12:8595
Press CTRL+C to quit

使用POST请求Flask服务可以得到以下返回

$ curl -d '{"human_input": "你好"}' http://127.0.0.1:8595/chat
{"response": "你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"}

3.2 使用LangChain调用ChatGLM

在2.1小节我们已经看到了LangChain直接调用OpenAI接口的示例,本小节我们来介绍一下我们如果有自己的大语言模型,该如何接入LangChain,以便后续跟LangChain的其他模块协同。

答案是:LLMs模块。

我们使用LLMs模块封装ChatGLM,请求我们的模型服务,主要重构两个函数:

  • _call:模型调用的主要逻辑,输入用户字符串,输出模型生成的字符串;
  • _identifying_params:返回模型的描述信息,通常返回一个字典,字典中包括模型的主要参数;
import time
import logging
import requests
from typing import Optional, List, Dict, Mapping, Anyimport langchain
from langchain.llms.base import LLM
from langchain.cache import InMemoryCachelogging.basicConfig(level=logging.INFO)
# 启动llm的缓存
langchain.llm_cache = InMemoryCache()class ChatGLM(LLM):# 模型服务urlurl = "http://127.0.0.1:8595/chat"@propertydef _llm_type(self) -> str:return "chatglm"def _construct_query(self, prompt: str) -> Dict:"""构造请求体"""query = {"human_input": prompt}return query@classmethoddef _post(cls, url: str,query: Dict) -> Any:"""POST请求"""_headers = {"Content_Type": "application/json"}with requests.session() as sess:resp = sess.post(url, json=query, headers=_headers, timeout=60)return respdef _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:"""_call"""# construct queryquery = self._construct_query(prompt=prompt)# postresp = self._post(url=self.url,query=query)if resp.status_code == 200:resp_json = resp.json()predictions = resp_json["response"]return predictionselse:return "请求模型" @propertydef _identifying_params(self) -> Mapping[str, Any]:"""Get the identifying parameters."""_param_dict = {"url": self.url}return _param_dictif __name__ == "__main__":llm = ChatGLM()while True:human_input = input("Human: ")begin_time = time.time() * 1000# 请求模型response = llm(human_input, stop=["you"])end_time = time.time() * 1000used_time = round(end_time - begin_time, 3)logging.info(f"chatGLM process time: {used_time}ms")print(f"ChatGLM: {response}")

使用LLM模块封装我们的模型接口的一个好处是有利于后续跟LangChain的其他模块协同,在这里给大家举一个LangChain Cache的例子,LangChain给LLM模块配置了Cache,如果同一个问题被第二次提问,模型可以快速给出答案。

启动Cache,需要在脚本中增加这两行代码即可:

from langchain.cache import InMemoryCache# 启动llm的缓存
langchain.llm_cache = InMemoryCache()

启动Cache后,ChatGLM的访问效果如下所示,当第二次请求模块同一个问题时,模块处理用户问题所用的时间少了一个数量级:

Human: 你好
INFO:root:chatGLM process time: 993.685ms
ChatGLM: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
Human: 你好
INFO:root:chatGLM process time: 0.116ms
ChatGLM: 你好 !我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。

Reference

  • [ChatGLM-6B, Github] https://github.com/THUDM/ChatGLM-6B
  • [Survey of LLM, arxiv, 2023] A Survey of Large Language Models

一起学AI,关注我 持续更新中

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60028.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI再度升级,IT业一片哀鸿遍野:程序员真的要失业了吗?

IT人员真的要失业了吗&#xff1f; 随着各个大厂已经相继传来裁员&#xff0c;降薪&#xff0c;减招的消息和ChatGPT等大型AI模型可以定制化写参考代码&#xff0c;甚至通过外接API直接帮助操作&#xff0c;IT人员似乎越来越不吃香了。 其实&#xff0c;ChatGPT有用的不是取代…

chatgpt赋能python:Python修改桌面壁纸:如何使用Python代码自动更改桌面背景

Python修改桌面壁纸: 如何使用Python代码自动更改桌面背景 在现代生活中&#xff0c;桌面壁纸已经成为个人电脑的一个非常重要的方面。它不仅可以改善我们的视觉体验&#xff0c;还可以提高我们的工作效率和生产力。许多人喜欢将他们的桌面壁纸与当前的季节或节日相匹配&#…

需求文档

产品设计是一个由抽象的概念到具体形象化的处理过程&#xff0c;通过文字或图像等方式将我们规划的产品需求展现出来。它将产品的某种目的或需求转换为一个具体的物理或工具的过程&#xff0c;把一种计划、规划设想、问题解决的方法&#xff0c;通过具体的操作&#xff0c;以理…

如何编写产品用户手册需求文档,才算合格的产品/运营

文档伴随着产品设计的整个生命周期&#xff0c;为什么这么说呢&#xff1f;产品立项时要制作“需求文档”以确保开发工作的稳步执行。 产品上线后需要设置“帮助文档”以方便用户了解产品和使用规则&#xff0c;在后期产品的运营中发挥着重要作用。 下面小编分别讲述这两种文…

产品经理基础——需求文档

了解市场→了解需求→产品设计→产品运营 产品设计&#xff1a;产品理念&#xff0c;产品方案及规划&#xff0c;产品架构设计&#xff0c;交互设计&#xff0c;原型及需求&#xff0c;项目管理&#xff0c;验收及发布&#xff0c;用户体验&#xff0c;实战点评。 综述&#…

产品需求文档模板,不用找了(附“简”例)【转】

&#xff08;转自&#xff1a;http://www.chanpin100.com/article/101751&#xff09; 记得自己在学习PRD文档撰写的时候&#xff0c;总希望能找到一份比较全面详细又易懂的模板。如果你也曾有相同的困恼或者尚未遇到满意的答案&#xff0c;或许本文可以提供不错的参考。 &am…

《预训练周刊》第66期:智源2022大模型创新论坛、 ChatGPT手把手debug代码、AI与物理的交融...

No.66 智源社区 预训练组 预 训 练 研究 观点 资源 活动 周刊订阅 告诉大家一个好消息&#xff0c;《预训练周刊》已经开启“订阅功能”&#xff0c;以后我们会向您自动推送最新版的《预训练周刊》。订阅方法&#xff1a; 方式1&#xff1a;扫描下面二维码&#xff0c;进入《预…

串口输出中文乱码

串口输出中文乱码 问题产生寻找问题产生的原因解决问题总结推荐两个串口助手&#xff1a; 问题产生 最近在使用OpenMV&#xff0c;但是由于没有转接板和软排线来连接串口&#xff0c;不过手上有一块STM32F4的开发板&#xff0c;于是就想到将其作为一个转接&#xff0c;通过其…

php JpGraph使用和中文乱码

使用 在使用JpGraph的时候我一般是把它的类库放到了程序的根目录下面(解压之后的src中的文件&#xff0c;除了Examples文件夹之外)在用的时候只需要include就可以了 还可以将解压之后的src中的文件重命名为jpgraph,将它放到d盘&#xff0c;再在php.ini文件中添加到include_pat…

C++输出中文乱码解决方法

C 输出中文乱码问题 今天在写C时发现当cout中出现中文时&#xff0c;输出便会出现乱码&#xff0c;后来发现只需要加入如下语句就可以解决 system("chcp 65001");未加入之前&#xff1a; 可以看见出现了乱码&#xff0c;连下面那句英文的都没有输出&#xff01; 加…

PrintWriter printWriter 在网页输出显示中文,问号乱码解决方法

如图&#xff0c;当我们输入url后&#xff0c;运行Tomcat会出现问号乱码 只需要在上面添加一句 res.setContentType("text/html;charsetUTF-8"); 就行

编辑器写C语言输出中文乱码记录

记录 在写C语言时&#xff0c;有时候需要使用printf输出中文&#xff0c;如果使用IDE来写代码&#xff0c;例如使用VisualStudio&#xff0c;输出中文没有问题。但是当使用编辑器编译器的方式写代码&#xff0c;在这个环境下输出中文可能会遇到中文输出乱码。 环境 编辑器&a…

解决 PHP 输出中文乱码的问题

本文由荒原之梦原创&#xff0c;原文链接&#xff1a;http://zhaokaifeng.com/?p1340 解决 PHP 输出中文乱码的问题 问题描述 今天给导航狗(https://daohanggou.cn/)的 PHP 程序和数据库文件迁移了服务器, 但是迁移到新的服务器上之后 PHP 输出的中文和 PHP 输出的从 MySQL…

C语言输出中文乱码

因为MinGW是使用的UTF-8编码&#xff0c;而cmd是使用的GBK编码&#xff0c;所以会出现这种情况&#xff0c;输入数据为GBK&#xff0c;但是输出数据为UTF-8 如上图&#xff0c;修改之后就会成功输出中文字符串

BAT文件执行输出中文乱码

一、问题描述&#xff1a; BAT文件执行输出中文乱码&#xff1a; echo offecho 你好&#xff0c;世界pause二、原因分析&#xff1a; 出现乱码&#xff0c;极有可能是编码的问题 打开cmd在标题栏单击鼠标右键选择【属性】在属性-选项中可看到当前编码方式当前代码页936 然而…

Qt 应用程序输出中文乱码+UI界面输出中文乱码

本文的主要解决方法来自于博客&#xff08;Qt与MSVC中文乱码问题的解决方案_liuweilhy的博客-CSDN博客&#xff09;&#xff0c;特此鸣谢。 1.背景 今天心血来潮&#xff0c;将Qt编译器改为msvc 2019 64&#xff0c;应用程序中qdebug输出和界面输出的中文均出现乱码&#xff…

原创 | 一文读懂强化学习在动态规划领域的应用

作者&#xff1a;黄娘球本文约1600字&#xff0c;建议阅读5分钟 本文澄清易混淆基础概念、推导公式为主&#xff0c;回顾强化学习基础知识。 ChatGPT已成为继AlphaGo之后的社会现象级人工智能&#xff0c;引发了大模型研究的热潮。戴琼海院士提出&#xff0c;五年后大模型将成为…

LLM推理提速2.8倍,CMU提出投机式推理引擎,小模型撬动大模型高效推理

©作者 | 机器之心编辑部 来源 | 机器之心 近日&#xff0c;来自卡耐基梅隆大学&#xff08;CMU&#xff09;的 Catalyst Group 团队发布了一款「投机式推理」引擎 SpecInfer&#xff0c;可以借助轻量化的小模型来帮助大模型&#xff0c;在完全不影响生成内容准确度的情况下…

Python爬虫爬取各大热门短视频平台视频

1、开发工具 Python3.9 requests库 其他一些Python内置库 pycharm 2、第三方库 安装第三方库 pip install requests 3、实现思路 1、利用tkinter库实例化一个GUI界面&#xff0c;包含提示框、输入框、选择按钮、功能按钮。 2、用requests发送get请求&#xff0c;获得下…

短视频素材:17个视频网站,涨粉必上热门

2022年来了&#xff0c;加入短视频大军的人越来越多&#xff0c;但视频素材&#xff0c;视频制作一直是个门槛。 今天就给大家分享17个短视频素材网站&#xff01; 1、Coverr&#xff1a;&#xff08;https://coverr.co&#xff09; 很好很强大的免费视频素材网站&#xff0c…