ChatGLM集成LangChain工具的方法是什么

工具使用   发布日期:2023年05月01日   浏览次数:241

本篇内容主要讲解“ChatGLM集成LangChain工具的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ChatGLM集成LangChain工具的方法是什么”吧!

接入自己的LLM

参考官方文档# How to write a custom LLM wrapper,只需要集成

  1. LLM
方法,并且实现
  1. _call
方法即可。一个简单的自定义LLM如下:
  1. from langchain.llms.base import LLM
  2. from typing import Optional, List, Mapping, Any
  3. class CustomLLM(LLM):
  4. n:int
  5. @property
  6. def _llm_type(self) -> str:
  7. return "custom"
  8. def _call(self,prompt:str,stop:Optional[List[str]]=None) -> str:
  9. if stop is not None:
  10. raise ValueError("stop kwargs are not permitted")
  11. return prompt[:self.n]
  12. @property
  13. def _identifying_params(self) -> Mapping[str, Any]:
  14. """Get the identifying parameters."""
  15. return {"n": self.n}

上面虽然只是一个最简单的实现,但是进一步思考,如果有自己的LLM,是不是也可以通过类似的方式接入到LangChain的生态中呢?

正好最近也在搭建ChatGLM,于是在想是不是可以将ChatGLM加入到LangChain工具链中来,利用其提供的工具方便做更深入的研究。于是搜索了一番,果然有类似开源实现,比如thomas-yanxin/LangChain-ChatGLM-Webui,一种利用 ChatGLM-6B + langchain 实现的基于本地知识的 ChatGLM 应用。但是研究了一下代码,发现其是将ChatGLM-6B和LangChain部署在一起的。但是由于资源有限,目前只有少量的显卡,不能每个人都能部署一套ChatGLM。

进一步思考,是否ChatGLM也提供了类似于openai的api接口呢,只需要进行http调用就可以使用ChatGLM的能力?这样就可以将:ChatGLM和上层的应用解耦,每个人都可以在自己本地通过api调用来进行实验。

搭建ChatGLM的api

查阅ChatGLM-6B文档,也发现了其确实可以通过API方式提供服务。 具体如下:

  • 首先需要安装额外的依赖

    1. pip install fastapi uvicorn
    ,然后运行仓库中的 api.py:
    1. python api.py
  • 默认部署在本地的 8000 端口,通过 POST 方法进行调用

  1. curl -X POST "http://{your_host}:8000"
  2. -H 'Content-Type: application/json'
  3. -d '{"prompt": "你好", "history": []}'
  • 得到的返回值为

  1. {
  2. "response":"你好????!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。",
  3. "history":[["你好","你好????!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],
  4. "status":200,
  5. "time":"2023-03-23 21:38:40"
  6. }

封装ChatGLM的LLM

有了API之后,就可以参照上面的自定义LLM的方式封装ChatGLM了,具体代码如下:

  1. from langchain.llms.base import LLM
  2. from langchain.llms.utils import enforce_stop_tokens
  3. from typing import Dict, List, Optional, Tuple, Union
  4. import requests
  5. import json
  6. class ChatGLM(LLM):
  7. max_token: int = 10000
  8. temperature: float = 0.1
  9. top_p = 0.9
  10. history = []
  11. def __init__(self):
  12. super().__init__()
  13. @property
  14. def _llm_type(self) -> str:
  15. return "ChatGLM"
  16. def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
  17. # headers中添加上content-type这个参数,指定为json格式
  18. headers = {'Content-Type': 'application/json'}
  19. data=json.dumps({
  20. 'prompt':prompt,
  21. 'temperature':self.temperature,
  22. 'history':self.history,
  23. 'max_length':self.max_token
  24. })
  25. # print("ChatGLM prompt:",prompt)
  26. # 调用api
  27. response = requests.post("{your_host}/api",headers=headers,data=data)
  28. # print("ChatGLM resp:",response)
  29. if response.status_code!=200:
  30. return "查询结果错误"
  31. resp = response.json()
  32. if stop is not None:
  33. response = enforce_stop_tokens(response, stop)
  34. self.history = self.history+[[None, resp['response']]]
  35. return resp['response']

上面只是简单的调用ChatGLM API,让程序跑起来,当然也可以参照LangChain封装openai的方式来做更加复杂的封装,比如提供重试、限频退让重试等功能。

测试

  1. llm = ChatGLM()
  2. print(llm("你会做什么"))

输出如下:

ChatGLM prompt: 你会做什么
我是一个大型语言模型,被训练来回答人类提出的问题。我不能做任何实际的事情,只能通过文字回答问题。如果你有任何问题,我会尽力回答。

验证通过,可以通过封装的

  1. ChatGLM
类来访问
  1. ChatGLM API
。这样就可以将需要用到
  1. OpenAI
  1. LLM
类替换成自己封装的
  1. ChatGLM
了。

以上就是ChatGLM集成LangChain工具的方法是什么的详细内容,更多关于ChatGLM集成LangChain工具的方法是什么的资料请关注九品源码其它相关文章!