大語言模型的開發(fā)利器langchainan安裝使用快速入門學(xué)習(xí)
簡介
最近隨著chatgpt的興起,人工智能和大語言模型又再次進(jìn)入了人們的視野,不同的是這一次像是來真的,各大公司都在拼命投入,希望能在未來的AI賽道上占有一席之地。因為AI需要大規(guī)模的算力,尤其是對于大語言模型來說。大規(guī)模的算力就意味著需要大量金錢的投入。那么對于小公司或者個人來說是不是什么都做不了呢?
當(dāng)然不是,雖然小公司或者個人不能開發(fā)底層的大語言模型,但是我們可以在大語言模型之上進(jìn)行應(yīng)用開發(fā),這應(yīng)該就是我們現(xiàn)在能做到的。
今天給大家介紹一個大語言模型的開發(fā)框架langchain,有了它,在AI的世界,你可以如虎添翼。
什么是langchain
簡單來說,langchain是一個基于大語言模型只上的開發(fā)框架,有了他,我們就可以輕松在各種大模型之上進(jìn)行實際應(yīng)用的開發(fā)。
langchain的主要特點有兩個,第一點就是組件化。langchain提供了各種封裝好的組件供我們使用,大大縮短了我們開發(fā)的時間。
第二點就是提供了工具鏈,可以組裝各種組件,從而實現(xiàn)更加復(fù)雜的功能。
langchain的安裝
廢話不多說,我們來看下langchain是如何安裝的。
AI時代大家一定要學(xué)一下python,至于為什么要學(xué)習(xí)python呢?因為其他語言都不好使......
langchain實際上是python的一個開發(fā)包,所以可以通過pip或者conda兩種方式來安裝:
pip安裝:
pip install langchain
conda安裝:
conda install langchain -c conda-forge
默認(rèn)情況下上面的安裝方式是最簡單的安裝,還有很多和langchain集成的modules并沒有安裝進(jìn)來,如果你希望安裝common LLM providers的依賴模塊,那么可以通過下面的命令:
pip install langchain[llms]
如果你想安裝所有的模塊,那么可以使用下面的命令:
pip install langchain[all]
因為langchain是開源軟件,所以你也可以通過源代碼來安裝,下載好源代碼之后,通過下面的命令安裝即可:
pip install -e .
langchain快速使用
下面我們以幾個具體的例子來講解一下langchain如何使用的。
因為langchain只是一個大語言模型上的開發(fā)框架,它的所有的能力都是依賴于大語言模型的,所以在使用langchain之前,我們需要一個大語言模型,最簡單同時也是最強(qiáng)大的大語言模型就是openai的chatgpt了。
接下來我們就以接入openai為例子進(jìn)行講解。
當(dāng)然langchain也可以接入其他的大語言模型框架,后面的系列教程中我們會詳細(xì)講解。
要使用openai,必須先注冊一個openai的賬號,然后拿到openai的api key。
具體的注冊流程這里就不講了。大家可以自行參考網(wǎng)絡(luò)上的各種教程。
有了api key之后,我們需要配置一下環(huán)境變量:
export OPENAI_API_KEY="..."
然后安裝openai的包:
pip install openai
接下來就可以愉快的使用openai提供的各種功能了。
當(dāng)然,如果你不想在環(huán)境變量中配置openai的key,我們也可以在OpenAI的構(gòu)造函數(shù)中傳入openai_api_key:
from langchain.llms import OpenAI llm = OpenAI(openai_api_key="...")
構(gòu)建應(yīng)用
有了上面的準(zhǔn)備工作,接下來我們就可以開始使用langchain了。
當(dāng)然,最最基礎(chǔ)的一個應(yīng)用就是跟大模型交互了,比如跟openai交互,我們可以讓openai給我們寫首詩:
>>> from langchain.llms import OpenAI >>> llm = OpenAI(temperature=0.9) >>> llm.predict("請以古龍的口吻,寫首關(guān)于春天詩") 春天來了,萬物復(fù)蘇, 終于迎來了一個新的時辰, 草兒花兒抬起頭, 喜迎新綠與絢麗的顏色。 山林里,小草發(fā)芽, 河畔邊,花兒香烈, 這讓我們感到心曠神怡, 這真是一個美好的世界。 春天來了,列位朋友, 請喜迎這樣一個新時辰, 不要抱怨什么, 享受春的溫暖與欣慰。
雖然寫出來了,但是我覺得寫的一般般吧。
但是這不重要,我們知道了如何通過langchain來調(diào)用openai的大模型,這個才是最重要的。
聊天模式
上面我們調(diào)用LLM使用用的是"text in, text out"的模型。
雖然聊天模式也是基于LLM,但是他更進(jìn)了一步,因為他保存了會話的上下問題,所以在對話上更加智能化。
在代碼上,傳入的就不是文本了,而是message對象。
在langchain中,目前支持下面幾種消息類型:AIMessage, HumanMessage, SystemMessage 和 ChatMessage。
在絕大多數(shù)情況下,我們只需要用到AIMessage, HumanMessage, SystemMessage即可。
下面是使用的代碼例子:
from langchain.chat_models import ChatOpenAI from langchain.schema import ( AIMessage, HumanMessage, SystemMessage ) chat = ChatOpenAI(temperature=0) chat.predict_messages([HumanMessage(content="請以古龍的口吻,寫首關(guān)于春天詩")])
那么聊天模式和LLM模式有什么不一樣呢?
大家可以看到,聊天模式調(diào)用的是predict_messages接口, 而LLM模式調(diào)用的是predict接口。
事實上聊天模式底層還是使用的是LLM,為了方便大家的使用,你也可以直接使用chat.predict方法來進(jìn)行LLM方式的調(diào)用,如下所示:
chat.predict("請以古龍的口吻,寫首關(guān)于春天詩")
Prompt的模板
開發(fā)過LLM應(yīng)用的人都知道,在LLM中Prompt是非常重要的,一個好的Prompt直接決定了這個應(yīng)用的質(zhì)量。
但是Prompt肯定需要結(jié)合用戶的輸入和我們自己做的一些限定來結(jié)合使用。
這時候就需要用到Prompt的模板功能了。 我們可以在系統(tǒng)中設(shè)置好模板,用戶只需要填充模板中的特定消息即可。
在LLM模式中,可以使用PromptTemplates,這樣來寫:
from langchain.prompts import PromptTemplate prompt = PromptTemplate.from_template("請幫忙我詳細(xì)描述一下這個物體,這個物體的名字是: {object}?") prompt.format(object="貓")
最后生成的結(jié)果如下:
請幫忙我詳細(xì)描述一下這個物體,這個物體的名字是: 貓
如果是在chat models中,代碼會復(fù)雜一點點,但是邏輯實際上是一樣的。 在chat models中,需要用到幾種MessagePromptTemplate,比如:ChatPromptTemplate,SystemMessagePromptTemplate和HumanMessagePromptTemplate。
我們具體來看下如何使用:
from langchain.prompts.chat import ( ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate, ) template = "現(xiàn)在,你的角色是{your_role}, 請根據(jù)你的角色回答后續(xù)的問題." system_message_prompt = SystemMessagePromptTemplate.from_template(template) human_template = "{text}" human_message_prompt = HumanMessagePromptTemplate.from_template(human_template) chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt]) chat_prompt.format_messages(your_role="教師", text="世界上最遠(yuǎn)的地方是哪里?")
對應(yīng)的輸出如下:
[
SystemMessage(content="現(xiàn)在,你的角色是教師, 請根據(jù)你的角色回答后續(xù)的問題.", additional_kwargs={}),
HumanMessage(content="世界上最遠(yuǎn)的地方是哪里?")
]
非常完美。
Chains
langchain還有一個非常有用的功能就是Chains,他可以把多種不同的功能結(jié)合起來。
比如上面我們用到了LLM,還用到了Prompt的模板,那么我們可以用Chains把他們結(jié)合起來:
from langchain.chains import LLMChain chain = LLMChain(llm=llm, prompt=prompt) chain.run("貓")
當(dāng)然,也可以結(jié)合chat使用:
from langchain import LLMChain from langchain.chat_models import ChatOpenAI from langchain.prompts.chat import ( ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate, ) chat = ChatOpenAI(temperature=0) template = "現(xiàn)在,你的角色是{your_role}, 請根據(jù)你的角色回答后續(xù)的問題." system_message_prompt = SystemMessagePromptTemplate.from_template(template) human_template = "{text}" human_message_prompt = HumanMessagePromptTemplate.from_template(human_template) chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt]) chain = LLMChain(llm=chat, prompt=chat_prompt) chain.run(your_role="教師", text="世界上最遠(yuǎn)的地方是哪里?")
Agents
什么是agents? 從字面意義上看,Agents就是代理。
事實上langchain中的Agents就是代理的意思。
比如我們現(xiàn)在需要向openai詢問昨天的天氣,但是openai本身只是一個大模型,它并不知道實時的信息。但是通過agents就可以先進(jìn)行一次判斷,看看這個問題是交給大模型處理合適,還是交給搜索引擎來查詢比較合適。
這就是agents的作用。
agents利用LLM來判斷需要怎么處理這個任務(wù),并且以什么樣的順序來處理這個任務(wù)。
但是使用agents是要有些條件的,首先你這個LLM模型必須支持agent,這樣才能進(jìn)行后續(xù)的工作。
其次是需要挑選合適的工具來進(jìn)行你想要做的事情,比如:Google Search, Database lookup, Python REPL等等。
最后就是需要指定支持的agent的名字,這樣LLM才知道到底需要進(jìn)行哪種action。
下面是一個使用SerpAPI結(jié)合openai來進(jìn)行搜索的例子:
from langchain.agents import AgentType, initialize_agent, load_tools from langchain.llms import OpenAI # The language model we're going to use to control the agent. llm = OpenAI(temperature=0) # The tools we'll give the Agent access to. Note that the 'llm-math' tool uses an LLM, so we need to pass that in. tools = load_tools(["serpapi", "llm-math"], llm=llm) # Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use. agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # Let's test it out! agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")
agent比較復(fù)雜,功能也很強(qiáng)大,后續(xù)我們會詳細(xì)講解。
Memory
最后要講解的langchain的一個功能就是Memory。
因為很多時候,我們的應(yīng)用應(yīng)該是一個有狀態(tài)的,也就是說應(yīng)用需要知道你之前做了什么,這樣才可以給用戶提供更好的服務(wù)。
但是之前我們將的LLM或者chain都是無狀態(tài)的。
所以langchain提供了一個Memory的功能,可以把之前的輸入輸出保存起來,方便后續(xù)的使用。
總結(jié)
有了langchain的各種工具,現(xiàn)在你就可以快速開發(fā)一個屬于你自己的LLM應(yīng)用啦。
以上就是大語言模型的開發(fā)利器langchain快速入門學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于大語言模型開發(fā)langchain的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python print出共軛復(fù)數(shù)的方法詳解
在本篇內(nèi)容里小編給大家分享的是關(guān)于python print出共軛復(fù)數(shù)的方法總結(jié)內(nèi)容,有需要的讀者們可以學(xué)習(xí)下。2019-06-06Python 對象序列化與反序列化之pickle json詳細(xì)解析
我們知道在Python中,一切皆為對象,實例是對象,類是對象,元類也是對象。本文正是要聊聊如何將這些對象有效地保存起來,以供后續(xù)使用2021-09-09Python實現(xiàn)批量將MP3音頻轉(zhuǎn)為WAV格式詳解
這篇文章主要介紹了通過Python實現(xiàn)將MP3音頻轉(zhuǎn)為WAV格式的方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定幫助,感興趣的可以了解一下2021-12-12關(guān)于Python3的import問題(pycharm可以運行命令行import錯誤)
這篇文章主要介紹了關(guān)于Python3的import問題(pycharm可以運行命令行import錯誤),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11