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