当前位置:   article > 正文

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

from langchain.llms import 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环境依赖

  1. pip install langchain==0.0.147
  2. pip install openai==0.27.4

2.2 使用LangChain调用GPTs

  1. import os
  2. from langchain.schema import HumanMessage
  3. from langchain.chat_models import ChatOpenAI
  4. # global environment
  5. os.environ["OPENAI_API_KEY"] = "sk-*********************************"
  6. # llm initialization
  7. llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
  8. while True:
  9. human_input = input("(human): ")
  10. human_input = [HumanMessage(content=human_input)]
  11. ai_output = llm(human_input)
  12. print(f"(ai): {ai_output.content}")

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

  1. import os
  2. import openai
  3. from langchain.schema import HumanMessage
  4. from langchain.chat_models import ChatOpenAI
  5. openai.proxy = {
  6. "http": "{proxy_ip}:{port}"
  7. }
  8. # global environment
  9. os.environ["OPENAI_API_KEY"] = "sk-*********************************"
  10. # llm initialization
  11. llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
  12. while True:
  13. human_input = input("(human): ")
  14. human_input = [HumanMessage(content=human_input)]
  15. ai_output = llm(human_input)
  16. print(f"(ai): {ai_output.content}")

三、LLMs接入ChatGLM

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

3.1 ChatGLM 本地部署

开发环境准备

requirements.txt:

pip install -r requirements.txt

模型文件准备

方法1:直接从huggingface模型仓库拉取模型文件(需要先安装Git LFS,拉取速度很慢,不建议);

git clone https://huggingface.co/THUDM/chatglm-6b

方法2:从huggingface模型残酷拉取模型实现,然后从清华仓库下载模型参数文件,然后替换到chatglm-6b文件夹中;

  1. GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b
  2. # 下载模型参数文件...
  3. mv chatglm-6b/* THUDM/chatglm-6b/

方法3:点赞+收藏+关注,并评论,我会私信分享模型文件的百度云盘链接;

模型本地调用

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

  1. import os
  2. from transformers import AutoTokenizer, AutoModel
  3. os.environ["CUDA_VISIBLE_DEVICES"] = "2"
  4. tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
  5. model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
  6. model = model.eval()
  7. human_input = "你好"
  8. response, history = model.chat(tokenizer, human_input, history=[])
  9. print(f"Human: {human_input}")
  10. print(f"AI: {response}")

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

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

模型服务调用(基于Flask)

模型服务代码如下

  1. import os
  2. import json
  3. from flask import Flask
  4. from flask import request
  5. from transformers import AutoTokenizer, AutoModel
  6. # system params
  7. os.environ["CUDA_VISIBLE_DEVICES"] = "2"
  8. tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
  9. model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
  10. model.eval()
  11. app = Flask(__name__)
  12. @app.route("/", methods=["POST", "GET"])
  13. def root():
  14. """root
  15. """
  16. return "Welcome to chatglm model."
  17. @app.route("/chat", methods=["POST"])
  18. def chat():
  19. """chat
  20. """
  21. data_seq = request.get_data()
  22. data_dict = json.loads(data_seq)
  23. human_input = data_dict["human_input"]
  24. response, _ = model.chat(tokenizer, human_input, history=[])
  25. result_dict = {
  26. "response": response
  27. }
  28. result_seq = json.dumps(result_dict, ensure_ascii=False)
  29. return result_seq
  30. if __name__ == "__main__":
  31. app.run(host="0.0.0.0", port=8595, debug=False)

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

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

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

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

3.2 使用LangChain调用ChatGLM

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

答案是:LLMs模块。

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

  • _call:模型调用的主要逻辑,输入用户字符串,输出模型生成的字符串;
  • _identifying_params:返回模型的描述信息,通常返回一个字典,字典中包括模型的主要参数;
  1. import time
  2. import logging
  3. import requests
  4. from typing import Optional, List, Dict, Mapping, Any
  5. import langchain
  6. from langchain.llms.base import LLM
  7. from langchain.cache import InMemoryCache
  8. logging.basicConfig(level=logging.INFO)
  9. # 启动llm的缓存
  10. langchain.llm_cache = InMemoryCache()
  11. class ChatGLM(LLM):
  12. # 模型服务url
  13. url = "http://127.0.0.1:8595/chat"
  14. @property
  15. def _llm_type(self) -> str:
  16. return "chatglm"
  17. def _construct_query(self, prompt: str) -> Dict:
  18. """构造请求体
  19. """
  20. query = {
  21. "human_input": prompt
  22. }
  23. return query
  24. @classmethod
  25. def _post(cls, url: str,
  26. query: Dict) -> Any:
  27. """POST请求
  28. """
  29. _headers = {"Content_Type": "application/json"}
  30. with requests.session() as sess:
  31. resp = sess.post(url,
  32. json=query,
  33. headers=_headers,
  34. timeout=60)
  35. return resp
  36. def _call(self, prompt: str,
  37. stop: Optional[List[str]] = None) -> str:
  38. """_call
  39. """
  40. # construct query
  41. query = self._construct_query(prompt=prompt)
  42. # post
  43. resp = self._post(url=self.url,
  44. query=query)
  45. if resp.status_code == 200:
  46. resp_json = resp.json()
  47. predictions = resp_json["response"]
  48. return predictions
  49. else:
  50. return "请求模型"
  51. @property
  52. def _identifying_params(self) -> Mapping[str, Any]:
  53. """Get the identifying parameters.
  54. """
  55. _param_dict = {
  56. "url": self.url
  57. }
  58. return _param_dict
  59. if __name__ == "__main__":
  60. llm = ChatGLM()
  61. while True:
  62. human_input = input("Human: ")
  63. begin_time = time.time() * 1000
  64. # 请求模型
  65. response = llm(human_input, stop=["you"])
  66. end_time = time.time() * 1000
  67. used_time = round(end_time - begin_time, 3)
  68. logging.info(f"chatGLM process time: {used_time}ms")
  69. print(f"ChatGLM: {response}")

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

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

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

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

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

Reference

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/129715?site
推荐阅读
相关标签
  

闽ICP备14008679号