langchain中LLM模型使用詳解
簡(jiǎn)介
構(gòu)建在大語(yǔ)言模型基礎(chǔ)上的應(yīng)用通常有兩種,第一種叫做text completion,也就是一問(wèn)一答的模式,輸入是text,輸出也是text。這種模型下應(yīng)用并不會(huì)記憶之前的問(wèn)題內(nèi)容,每一個(gè)問(wèn)題都是最新的。通常用來(lái)做知識(shí)庫(kù)。
還有一種是類似聊天機(jī)器人這種會(huì)話模式,也叫Chat models。這種模式下輸入是一個(gè)Chat Messages的列表。從而可以保存上下文信息,讓模型的回復(fù)更加真實(shí)。
實(shí)際上Chat models的底層還是LLMs,只不過(guò)在調(diào)用方式上有些變化。
簡(jiǎn)單使用LLMs
什么是LLMs呢?LLMs是Large Language Models的簡(jiǎn)稱,也就是我們常說(shuō)的大語(yǔ)言模型。
對(duì)于langchain來(lái)說(shuō),它本身并不提供大語(yǔ)言模型,它只是一個(gè)中間的粘合層,提供了統(tǒng)一的接口,方便我們對(duì)接底層的各種LLMs模型。
langchain除了可以對(duì)接OpenAI之外,還可以對(duì)接Cohere, Hugging Face等其他的大語(yǔ)言模型。
比如下面是openAI的使用:
from langchain.llms import OpenAI llm = OpenAI(openai_api_key="...")
接下來(lái)就可以調(diào)用llm的方法來(lái)進(jìn)行text completion了。
一般來(lái)說(shuō)有兩種方式。第一種方式就是直接輸出:
llm("給我寫(xiě)首詩(shī)")
還有一種方式調(diào)用他的generate方法:
llm_result = llm.generate(["給我唱首歌", "給我寫(xiě)首詩(shī)"])
這種方式可以傳入一個(gè)數(shù)組,用來(lái)生成比較復(fù)雜的結(jié)果。
langchain支持的LLM
現(xiàn)在大語(yǔ)言模型可謂是蓬勃發(fā)展,一不留神就可能出一個(gè)新的大語(yǔ)言模型。
就目前而言,基本的國(guó)外主流模型langchain都是支持的。
比如:openai,azure openai,AmazonAPI,Hugging Face Hub等等。數(shù)目繁多,功能齊全,你想要的他全都有,你沒(méi)想到的他也有。
那么有小伙伴可能要問(wèn)題了,langchain支不支持國(guó)產(chǎn)的大語(yǔ)言模型呢?
答案是肯定的,但并不是直接的。
如果你發(fā)現(xiàn)langchain并沒(méi)有你想要的llm,那么你可以嘗試進(jìn)行自定義。
langchain為我們提供了一個(gè)類叫做LLM,我們只需要繼承這個(gè)LLM即可:
class LLM(BaseLLM): @abstractmethod def _call( self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, ) -> str: """Run the LLM on the given prompt and input."""
其中,唯一一個(gè)必須要實(shí)現(xiàn)的方法就是_call,這個(gè)方法傳入一個(gè)字符串和一些可選的stop word,然后返回LLM的輸出即可。
另外還可以實(shí)現(xiàn)一個(gè)_identifying_params方法,用來(lái)輸出自定義LLM的一些參數(shù)信息。
大家可以自行嘗試和接入不同的LLM模型。
一些特殊的LLM
很多時(shí)候調(diào)用LLM是需要收費(fèi)的,如果我們?cè)陂_(kāi)發(fā)的過(guò)程中也要不斷的消耗token肯定是得不償失。
所以langchain為了給我們省錢,提供了一個(gè)FakeLLM來(lái)使用。
顧名思義,F(xiàn)akeLLM就是可以手動(dòng)來(lái)mock一些LLM的回答,方便測(cè)試。
from langchain.llms.fake import FakeListLLM responses = ["窗前明月光\n低頭鞋兩雙"] llm = FakeListLLM(responses=responses) print(llm("給我寫(xiě)首詩(shī)"))
上面的輸出結(jié)果如下:
窗前明月光
低頭鞋兩雙
langchain中還有一個(gè)和FakeLLM類似的叫做HumanInputLLM。
這個(gè)LLM可以打印出給用戶的prompt,并且將用戶的輸入作為輸出返回給用戶,大家可以自行體驗(yàn)。
LLM的高級(jí)用法
除了正常的LLM調(diào)用之外,langchain還提供了一些LLM的高級(jí)用法。
異步調(diào)用
比如異步調(diào)用LLM。當(dāng)然目前只支持OpenAI, PromptLayerOpenAI, ChatOpenAI 和 Anthropic這幾個(gè)LLM。其他的對(duì)LLM的支持貌似正在開(kāi)發(fā)中。
異步方法也很簡(jiǎn)單,主要是調(diào)用llm的agenerate方法,比如下面這樣:
async def async_generate(llm): resp = await llm.agenerate(["Hello, how are you?"]) print(resp.generations[0][0].text)
緩存功能
另外,對(duì)于一些重復(fù)的請(qǐng)求來(lái)說(shuō),langchain還提供了緩存功能,這樣可以重復(fù)的請(qǐng)求就不需要再發(fā)送到LLM去了,給我們節(jié)約了時(shí)間和金錢,非常好用。
langchain提供的cache也有很多種,比如InMemoryCache,FullLLMCache,SQLAlchemyCache,SQLiteCache和RedisCache等等。
我們以InMemoryCache為例,看看是怎么使用的:
from langchain.cache import InMemoryCache langchain.llm_cache = InMemoryCache() # 第一次沒(méi)有使用緩存 llm.predict("Tell me a joke") # 第二次使用了緩存 llm.predict("Tell me a joke")
使用起來(lái)很簡(jiǎn)單,只需要添加一行l(wèi)lm_cache即可。
如果你使用其他的cache,除了構(gòu)造函數(shù)不同之外,其他的都是類似的。
保存LLM配置
有時(shí)候我們配置好了LLM之外,還可以把LLM相關(guān)的參數(shù)以文本的形式存儲(chǔ)起來(lái)。
保存llm到文件:
llm.save("llm.json")
加載llm:
llm = load_llm("llm.json")
流式處理
LLM的速度是一個(gè)硬傷,由于返回整個(gè)響應(yīng)的速度太慢了,所以推出了流式響應(yīng)。只要有response返回,就傳輸給用戶。并不需要等待所有內(nèi)容都獲得之后再處理。這樣對(duì)用戶的體驗(yàn)是最好的。
目前l(fā)angchain只支持OpenAI,ChatOpenAI和ChatAnthropic。
要實(shí)現(xiàn)這個(gè)流式處理, langchain提供了BaseCallbackHandler,我們只需要繼承這個(gè)類,實(shí)現(xiàn)on_llm_new_token這個(gè)方法即可。
當(dāng)然langchain已經(jīng)給我們提供了一個(gè)實(shí)現(xiàn)好的類叫做:StreamingStdOutCallbackHandler。下面是他的實(shí)現(xiàn):
def on_llm_new_token(self, token: str, **kwargs: Any) -> None: sys.stdout.write(token) sys.stdout.flush()
使用的時(shí)候,只需要在構(gòu)建llm的是傳入對(duì)應(yīng)的callback即可:
from langchain.llms import OpenAI from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler llm = OpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0) resp = llm("給我寫(xiě)首詩(shī)")
統(tǒng)計(jì)token數(shù)目
這個(gè)統(tǒng)計(jì)token使用數(shù)目的功能目前只能在openai使用。
from langchain.llms import OpenAI from langchain.callbacks import get_openai_callback llm = OpenAI(model_name="text-davinci-002", n=2, best_of=2) with get_openai_callback() as cb: result = llm("T給我寫(xiě)首詩(shī)") print(cb)
總結(jié)
LLM是大語(yǔ)言模型最基礎(chǔ)的模式,chat模式的底層就是基于LLM實(shí)現(xiàn)的。后續(xù)我們會(huì)詳細(xì)介紹chat模式,盡請(qǐng)期待。
更多關(guān)于langchain LLM模型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解析pandas apply() 函數(shù)用法(推薦)
這篇文章主要介紹了pandas apply() 函數(shù)用法,大家需要掌握函數(shù)作為一個(gè)對(duì)象,能作為參數(shù)傳遞給其它函數(shù),也能作為函數(shù)的返回值,具體內(nèi)容詳情跟隨小編一起看看吧2021-10-10jupyter lab的目錄調(diào)整及設(shè)置默認(rèn)瀏覽器為chrome的方法
這篇文章主要介紹了jupyter lab的目錄調(diào)整及設(shè)置默認(rèn)瀏覽器為chrome的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python+Pygame實(shí)戰(zhàn)之文字劇情游戲的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Pygame實(shí)現(xiàn)兩款文字劇情游戲——《巨龍之洞》和《太空礦工》,感興趣的小伙伴可以了解一下2022-12-12在Python web中實(shí)現(xiàn)驗(yàn)證碼圖片代碼分享
這篇文章主要介紹了在Python web中實(shí)現(xiàn)驗(yàn)證碼圖片代碼分享,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11利用Python+阿里云實(shí)現(xiàn)DDNS動(dòng)態(tài)域名解析的方法
這篇文章主要介紹了利用Python+阿里云實(shí)現(xiàn)DDNS動(dòng)態(tài)域名解析的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04python實(shí)現(xiàn)AES算法及AES-CFB8加解密源碼
這篇文章主要為大家介紹了python實(shí)現(xiàn)AES算法及AES-CFB8加解密的源碼示例,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02關(guān)于Python時(shí)間日期常見(jiàn)的一些操作方法
Python的datetime模塊是處理日期和時(shí)間的強(qiáng)大工具,datetime類可以獲取當(dāng)前時(shí)間、指定日期、計(jì)算時(shí)間差、訪問(wèn)時(shí)間屬性及格式化時(shí)間,這些功能使得在Python中進(jìn)行時(shí)間日期處理變得簡(jiǎn)單高效,需要的朋友可以參考下2024-09-09