ChatGLM?集成LangChain工具詳解
引言
最新一段時(shí)間一直在學(xué)習(xí)LangChain相關(guān)的文檔,發(fā)現(xiàn)LangChain提供了非常豐富的生態(tài),并且也可以讓業(yè)務(wù)非常方便的封裝自己的工具,接入到LangcChain的生態(tài)中,比如切換不同向量存儲(chǔ)(Vectorstores)、文件分片(Text Splitters)和文件加載器(Document Loaders)等。 本文將簡單介紹下如何將自己搭建的ChatGLM
集成進(jìn)LangChain工具鏈中,當(dāng)然如果有其他的自己搭建的LLM模型也可以采用類似的方式集成。
接入自己的LLM
參考官方文檔# How to write a custom LLM wrapper,只需要集成LLM
方法,并且實(shí)現(xiàn)_call
方法即可。一個(gè)簡單的自定義LLM如下:
from langchain.llms.base import LLM from typing import Optional, List, Mapping, Any class CustomLLM(LLM): n:int @property def _llm_type(self) -> str: return "custom" def _call(self,prompt:str,stop:Optional[List[str]]=None) -> str: if stop is not None: raise ValueError("stop kwargs are not permitted") return prompt[:self.n] @property def _identifying_params(self) -> Mapping[str, Any]: """Get the identifying parameters.""" return {"n": self.n}
上面雖然只是一個(gè)最簡單的實(shí)現(xiàn),但是進(jìn)一步思考,如果有自己的LLM,是不是也可以通過類似的方式接入到LangChain的生態(tài)中呢?
正好最近也在搭建ChatGLM,于是在想是不是可以將ChatGLM加入到LangChain工具鏈中來,利用其提供的工具方便做更深入的研究。于是搜索了一番,果然有類似開源實(shí)現(xiàn),比如thomas-yanxin/LangChain-ChatGLM-Webui,一種利用 ChatGLM-6B + langchain 實(shí)現(xiàn)的基于本地知識(shí)的 ChatGLM 應(yīng)用。但是研究了一下代碼,發(fā)現(xiàn)其是將ChatGLM-6B和LangChain部署在一起的。但是由于資源有限,目前只有少量的顯卡,不能每個(gè)人都能部署一套ChatGLM。
進(jìn)一步思考,是否ChatGLM也提供了類似于openai的api接口呢,只需要進(jìn)行http調(diào)用就可以使用ChatGLM的能力?這樣就可以將:ChatGLM和上層的應(yīng)用解耦,每個(gè)人都可以在自己本地通過api調(diào)用來進(jìn)行實(shí)驗(yàn)。
搭建ChatGLM的api
查閱ChatGLM-6B文檔,也發(fā)現(xiàn)了其確實(shí)可以通過API方式提供服務(wù)。 具體如下:
- 首先需要安裝額外的依賴
pip install fastapi uvicorn
,然后運(yùn)行倉庫中的 api.py:python api.py
- 默認(rèn)部署在本地的 8000 端口,通過 POST 方法進(jìn)行調(diào)用
curl -X POST "http://{your_host}:8000" \ -H 'Content-Type: application/json' \ -d '{"prompt": "你好", "history": []}'
- 得到的返回值為
{ "response":"你好??!我是人工智能助手 ChatGLM-6B,很高興見到你,歡迎問我任何問題。", "history":[["你好","你好??!我是人工智能助手 ChatGLM-6B,很高興見到你,歡迎問我任何問題。"]], "status":200, "time":"2023-03-23 21:38:40" }
封裝ChatGLM的LLM
有了API之后,就可以參照上面的自定義LLM的方式封裝ChatGLM了,具體代碼如下:
from langchain.llms.base import LLM from langchain.llms.utils import enforce_stop_tokens from typing import Dict, List, Optional, Tuple, Union import requests import json class ChatGLM(LLM): max_token: int = 10000 temperature: float = 0.1 top_p = 0.9 history = [] def __init__(self): super().__init__() @property def _llm_type(self) -> str: return "ChatGLM" def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str: # headers中添加上content-type這個(gè)參數(shù),指定為json格式 headers = {'Content-Type': 'application/json'} data=json.dumps({ 'prompt':prompt, 'temperature':self.temperature, 'history':self.history, 'max_length':self.max_token }) # print("ChatGLM prompt:",prompt) # 調(diào)用api response = requests.post("{your_host}/api",headers=headers,data=data) # print("ChatGLM resp:",response) if response.status_code!=200: return "查詢結(jié)果錯(cuò)誤" resp = response.json() if stop is not None: response = enforce_stop_tokens(response, stop) self.history = self.history+[[None, resp['response']]] return resp['response']
上面只是簡單的調(diào)用ChatGLM API,讓程序跑起來,當(dāng)然也可以參照LangChain封裝openai的方式來做更加復(fù)雜的封裝,比如提供重試、限頻退讓重試等功能。
測(cè)試
llm = ChatGLM() print(llm("你會(huì)做什么"))
輸出如下:
ChatGLM prompt: 你會(huì)做什么
我是一個(gè)大型語言模型,被訓(xùn)練來回答人類提出的問題。我不能做任何實(shí)際的事情,只能通過文字回答問題。如果你有任何問題,我會(huì)盡力回答。
驗(yàn)證通過,可以通過封裝的ChatGLM
類來訪問ChatGLM API
。這樣就可以將需要用到OpenAI
的LLM
類替換成自己封裝的ChatGLM
了。
總結(jié)
本文簡單介紹下如何將自己搭建的ChatGLM
集成進(jìn)LangChain工具鏈中,并且進(jìn)行簡單的試驗(yàn)的效果。當(dāng)然如果有其他自己搭建的LLM模型也可以采用類似的方式集成。后續(xù)將使用ChatGLM
來實(shí)現(xiàn)一個(gè)本地知識(shí)庫做問答系統(tǒng)。
參考
thomas-yanxin/LangChain-ChatGLM-Webui
使用langchain配合chatglm搭建本地的知識(shí)庫,但是langchain和chatglm是部署在一起的,耦合性比較高
ChatGLM-6B chatglm的api搭建
以上就是ChatGLM 集成進(jìn)LangChain工具的詳細(xì)內(nèi)容,更多關(guān)于ChatGLM 集成進(jìn)LangChain工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React Router中Link和NavLink的學(xué)習(xí)心得總結(jié)
這篇文章主要介紹了React Router中Link和NavLink的學(xué)習(xí)心得總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12React項(xiàng)目中使用Redux的?react-redux
這篇文章主要介紹了React項(xiàng)目中使用Redux的?react-redux,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09減少react組件不必要的重新渲染實(shí)現(xiàn)方法
這篇文章主要為大家介紹了減少react組件不必要的重新渲染實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01React應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析
這篇文章主要為大家介紹了React 應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12React路由動(dòng)畫切換實(shí)現(xiàn)過程詳解
這篇文章主要介紹了react-router 路由切換動(dòng)畫的實(shí)現(xiàn)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2022-12-12Can't?perform?a?React?state?update?on?an?unmoun
這篇文章主要為大家介紹了Can't?perform?a?React?state?update?on?an?unmounted?component報(bào)錯(cuò)解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12