最近隨著chatgpt的興起,人工智慧和大語言模型又再次進入了人們的視野,不同的是這一次像是來真的,各大公司都在拼命投入,希望能在未來的AI賽道上佔有一席之地。因為AI需要大規模的算力,尤其是對於大語言模型來說。大規模的算力就意味著需要大量金錢的投入。那麼對於小公司或者個人來說是不是什麼都做不了呢?
當然不是,雖然小公司或者個人不能開發底層的大語言模型,但是我們可以在大語言模型之上進行應用開發,這應該就是我們現在能做到的。
今天給大家介紹一個大語言模型的開發框架langchain,有了它,在AI的世界,你可以如虎添翼。
簡單來說,langchain是一個基於大語言模型只上的開發框架,有了他,我們就可以輕鬆在各種大模型之上進行實際應用的開發。
langchain的主要特點有兩個,第一點就是元件化。langchain提供了各種封裝好的元件供我們使用,大大縮短了我們開發的時間。
第二點就是提供了工具鏈,可以組裝各種元件,從而實現更加複雜的功能。
廢話不多說,我們來看下langchain是如何安裝的。
AI時代大家一定要學一下python,至於為什麼要學習python呢?因為其他語言都不好使......
langchain實際上是python的一個開發包,所以可以通過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之前,我們需要一個大語言模型,最簡單同時也是最強大的大語言模型就是openai的chatgpt了。
接下來我們就以接入openai為例子進行講解。
當然langchain也可以接入其他的大語言模型框架,後面的系列教學中我們會詳細講解。
要使用openai,必須先註冊一個openai的賬號,然後拿到openai的api key。
具體的註冊流程這裡就不講了。大家可以自行參考網路上的各種教學。
有了api key之後,我們需要設定一下環境變數:
export OPENAI_API_KEY="..."
然後安裝openai的包:
pip install openai
接下來就可以愉快的使用openai提供的各種功能了。
當然,如果你不想在環境變數中設定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("請以古龍的口吻,寫首關於春天詩")
春天來了,萬物復甦,
終於迎來了一個新的時辰,
草兒花兒擡起頭,
喜迎新綠與絢麗的顏色。
山林裡,小草發芽,
河畔邊,花兒香烈,
這讓我們感到心曠神怡,
這真是一個美好的世界。
春天來了,列位朋友,
請喜迎這樣一個新時辰,
不要抱怨什麼,
享受春的溫暖與欣慰。
雖然寫出來了,但是我覺得寫的一般般吧。
但是這不重要,我們知道了如何通過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("請以古龍的口吻,寫首關於春天詩")
開發過LLM應用的人都知道,在LLM中Prompt是非常重要的,一個好的Prompt直接決定了這個應用的質量。
但是Prompt肯定需要結合使用者的輸入和我們自己做的一些限定來結合使用。
這時候就需要用到Prompt的模板功能了。 我們可以在系統中設定好模板,使用者只需要填充模板中的特定訊息即可。
在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}, 請根據你的角色回答後續的問題."
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="現在,你的角色是教師, 請根據你的角色回答後續的問題.", additional_kwargs={}),
HumanMessage(content="世界上最遠的地方是哪裡?")
]
非常完美。
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}, 請根據你的角色回答後續的問題."
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就是代理。
事實上langchain中的Agents就是代理的意思。
比如我們現在需要向openai詢問昨天的天氣,但是openai本身只是一個大模型,它並不知道實時的資訊。但是通過agents就可以先進行一次判斷,看看這個問題是交給大模型處理合適,還是交給搜尋引擎來查詢比較合適。
這就是agents的作用。
agents利用LLM來判斷需要怎麼處理這個任務,並且以什麼樣的順序來處理這個任務。
但是使用agents是要有些條件的,首先你這個LLM模型必須支援agent,這樣才能進行後續的工作。
其次是需要挑選合適的工具來進行你想要做的事情,比如: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比較複雜,功能也很強大,後續我們會詳細講解。
最後要講解的langchain的一個功能就是Memory。
因為很多時候,我們的應用應該是一個有狀態的,也就是說應用需要知道你之前做了什麼,這樣才可以給使用者提供更好的服務。
但是之前我們將的LLM或者chain都是無狀態的。
所以langchain提供了一個Memory的功能,可以把之前的輸入輸出儲存起來,方便後續的使用。
有了langchain的各種工具,現在你就可以快速開發一個屬於你自己的LLM應用啦。