大語(yǔ)言模型的開(kāi)發(fā)利器langchainan安裝使用快速入門(mén)學(xué)習(xí)
簡(jiǎn)介
最近隨著chatgpt的興起,人工智能和大語(yǔ)言模型又再次進(jìn)入了人們的視野,不同的是這一次像是來(lái)真的,各大公司都在拼命投入,希望能在未來(lái)的AI賽道上占有一席之地。因?yàn)锳I需要大規(guī)模的算力,尤其是對(duì)于大語(yǔ)言模型來(lái)說(shuō)。大規(guī)模的算力就意味著需要大量金錢(qián)的投入。那么對(duì)于小公司或者個(gè)人來(lái)說(shuō)是不是什么都做不了呢?
當(dāng)然不是,雖然小公司或者個(gè)人不能開(kāi)發(fā)底層的大語(yǔ)言模型,但是我們可以在大語(yǔ)言模型之上進(jìn)行應(yīng)用開(kāi)發(fā),這應(yīng)該就是我們現(xiàn)在能做到的。
今天給大家介紹一個(gè)大語(yǔ)言模型的開(kāi)發(fā)框架langchain,有了它,在AI的世界,你可以如虎添翼。
什么是langchain
簡(jiǎn)單來(lái)說(shuō),langchain是一個(gè)基于大語(yǔ)言模型只上的開(kāi)發(fā)框架,有了他,我們就可以輕松在各種大模型之上進(jìn)行實(shí)際應(yīng)用的開(kāi)發(fā)。
langchain的主要特點(diǎn)有兩個(gè),第一點(diǎn)就是組件化。langchain提供了各種封裝好的組件供我們使用,大大縮短了我們開(kāi)發(fā)的時(shí)間。
第二點(diǎn)就是提供了工具鏈,可以組裝各種組件,從而實(shí)現(xiàn)更加復(fù)雜的功能。
langchain的安裝
廢話不多說(shuō),我們來(lái)看下langchain是如何安裝的。
AI時(shí)代大家一定要學(xué)一下python,至于為什么要學(xué)習(xí)python呢?因?yàn)槠渌Z(yǔ)言都不好使......
langchain實(shí)際上是python的一個(gè)開(kāi)發(fā)包,所以可以通過(guò)pip或者conda兩種方式來(lái)安裝:
pip安裝:
pip install langchain
conda安裝:
conda install langchain -c conda-forge
默認(rèn)情況下上面的安裝方式是最簡(jiǎn)單的安裝,還有很多和langchain集成的modules并沒(méi)有安裝進(jìn)來(lái),如果你希望安裝common LLM providers的依賴模塊,那么可以通過(guò)下面的命令:
pip install langchain[llms]
如果你想安裝所有的模塊,那么可以使用下面的命令:
pip install langchain[all]
因?yàn)閘angchain是開(kāi)源軟件,所以你也可以通過(guò)源代碼來(lái)安裝,下載好源代碼之后,通過(guò)下面的命令安裝即可:
pip install -e .
langchain快速使用
下面我們以幾個(gè)具體的例子來(lái)講解一下langchain如何使用的。
因?yàn)閘angchain只是一個(gè)大語(yǔ)言模型上的開(kāi)發(fā)框架,它的所有的能力都是依賴于大語(yǔ)言模型的,所以在使用langchain之前,我們需要一個(gè)大語(yǔ)言模型,最簡(jiǎn)單同時(shí)也是最強(qiáng)大的大語(yǔ)言模型就是openai的chatgpt了。
接下來(lái)我們就以接入openai為例子進(jìn)行講解。
當(dāng)然langchain也可以接入其他的大語(yǔ)言模型框架,后面的系列教程中我們會(huì)詳細(xì)講解。
要使用openai,必須先注冊(cè)一個(gè)openai的賬號(hào),然后拿到openai的api key。
具體的注冊(cè)流程這里就不講了。大家可以自行參考網(wǎng)絡(luò)上的各種教程。
有了api key之后,我們需要配置一下環(huán)境變量:
export OPENAI_API_KEY="..."
然后安裝openai的包:
pip install openai
接下來(lái)就可以愉快的使用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)備工作,接下來(lái)我們就可以開(kāi)始使用langchain了。
當(dāng)然,最最基礎(chǔ)的一個(gè)應(yīng)用就是跟大模型交互了,比如跟openai交互,我們可以讓openai給我們寫(xiě)首詩(shī):
>>> from langchain.llms import OpenAI
>>> llm = OpenAI(temperature=0.9)
>>> llm.predict("請(qǐng)以古龍的口吻,寫(xiě)首關(guān)于春天詩(shī)")
春天來(lái)了,萬(wàn)物復(fù)蘇,
終于迎來(lái)了一個(gè)新的時(shí)辰,
草兒花兒抬起頭,
喜迎新綠與絢麗的顏色。
山林里,小草發(fā)芽,
河畔邊,花兒香烈,
這讓我們感到心曠神怡,
這真是一個(gè)美好的世界。
春天來(lái)了,列位朋友,
請(qǐng)喜迎這樣一個(gè)新時(shí)辰,
不要抱怨什么,
享受春的溫暖與欣慰。雖然寫(xiě)出來(lái)了,但是我覺(jué)得寫(xiě)的一般般吧。
但是這不重要,我們知道了如何通過(guò)langchain來(lái)調(diào)用openai的大模型,這個(gè)才是最重要的。
聊天模式
上面我們調(diào)用LLM使用用的是"text in, text out"的模型。
雖然聊天模式也是基于LLM,但是他更進(jìn)了一步,因?yàn)樗4媪藭?huì)話的上下問(wèn)題,所以在對(duì)話上更加智能化。
在代碼上,傳入的就不是文本了,而是message對(duì)象。
在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="請(qǐng)以古龍的口吻,寫(xiě)首關(guān)于春天詩(shī)")])那么聊天模式和LLM模式有什么不一樣呢?
大家可以看到,聊天模式調(diào)用的是predict_messages接口, 而LLM模式調(diào)用的是predict接口。
事實(shí)上聊天模式底層還是使用的是LLM,為了方便大家的使用,你也可以直接使用chat.predict方法來(lái)進(jìn)行LLM方式的調(diào)用,如下所示:
chat.predict("請(qǐng)以古龍的口吻,寫(xiě)首關(guān)于春天詩(shī)")Prompt的模板
開(kāi)發(fā)過(guò)LLM應(yīng)用的人都知道,在LLM中Prompt是非常重要的,一個(gè)好的Prompt直接決定了這個(gè)應(yīng)用的質(zhì)量。
但是Prompt肯定需要結(jié)合用戶的輸入和我們自己做的一些限定來(lái)結(jié)合使用。
這時(shí)候就需要用到Prompt的模板功能了。 我們可以在系統(tǒng)中設(shè)置好模板,用戶只需要填充模板中的特定消息即可。
在LLM模式中,可以使用PromptTemplates,這樣來(lái)寫(xiě):
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("請(qǐng)幫忙我詳細(xì)描述一下這個(gè)物體,這個(gè)物體的名字是: {object}?")
prompt.format(object="貓")最后生成的結(jié)果如下:
請(qǐng)幫忙我詳細(xì)描述一下這個(gè)物體,這個(gè)物體的名字是: 貓
如果是在chat models中,代碼會(huì)復(fù)雜一點(diǎn)點(diǎn),但是邏輯實(shí)際上是一樣的。 在chat models中,需要用到幾種MessagePromptTemplate,比如:ChatPromptTemplate,SystemMessagePromptTemplate和HumanMessagePromptTemplate。
我們具體來(lái)看下如何使用:
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
template = "現(xiàn)在,你的角色是{your_role}, 請(qǐng)根據(jù)你的角色回答后續(xù)的問(wèn)題."
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)的地方是哪里?")對(duì)應(yīng)的輸出如下:
[
SystemMessage(content="現(xiàn)在,你的角色是教師, 請(qǐng)根據(jù)你的角色回答后續(xù)的問(wèn)題.", additional_kwargs={}),
HumanMessage(content="世界上最遠(yuǎn)的地方是哪里?")
]
非常完美。
Chains
langchain還有一個(gè)非常有用的功能就是Chains,他可以把多種不同的功能結(jié)合起來(lái)。
比如上面我們用到了LLM,還用到了Prompt的模板,那么我們可以用Chains把他們結(jié)合起來(lái):
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}, 請(qǐng)根據(jù)你的角色回答后續(xù)的問(wèn)題."
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就是代理。
事實(shí)上langchain中的Agents就是代理的意思。
比如我們現(xiàn)在需要向openai詢問(wèn)昨天的天氣,但是openai本身只是一個(gè)大模型,它并不知道實(shí)時(shí)的信息。但是通過(guò)agents就可以先進(jìn)行一次判斷,看看這個(gè)問(wèn)題是交給大模型處理合適,還是交給搜索引擎來(lái)查詢比較合適。
這就是agents的作用。
agents利用LLM來(lái)判斷需要怎么處理這個(gè)任務(wù),并且以什么樣的順序來(lái)處理這個(gè)任務(wù)。
但是使用agents是要有些條件的,首先你這個(gè)LLM模型必須支持agent,這樣才能進(jìn)行后續(xù)的工作。
其次是需要挑選合適的工具來(lái)進(jìn)行你想要做的事情,比如:Google Search, Database lookup, Python REPL等等。
最后就是需要指定支持的agent的名字,這樣LLM才知道到底需要進(jìn)行哪種action。
下面是一個(gè)使用SerpAPI結(jié)合openai來(lái)進(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ù)我們會(huì)詳細(xì)講解。
Memory
最后要講解的langchain的一個(gè)功能就是Memory。
因?yàn)楹芏鄷r(shí)候,我們的應(yīng)用應(yīng)該是一個(gè)有狀態(tài)的,也就是說(shuō)應(yīng)用需要知道你之前做了什么,這樣才可以給用戶提供更好的服務(wù)。
但是之前我們將的LLM或者chain都是無(wú)狀態(tài)的。
所以langchain提供了一個(gè)Memory的功能,可以把之前的輸入輸出保存起來(lái),方便后續(xù)的使用。
總結(jié)
有了langchain的各種工具,現(xiàn)在你就可以快速開(kāi)發(fā)一個(gè)屬于你自己的LLM應(yīng)用啦。
以上就是大語(yǔ)言模型的開(kāi)發(fā)利器langchain快速入門(mén)學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于大語(yǔ)言模型開(kāi)發(fā)langchain的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- ollama搭建本地ai大模型并應(yīng)用調(diào)用的操作方法
- langchain Prompt大語(yǔ)言模型使用技巧詳解
- Docker?AIGC等大模型深度學(xué)習(xí)環(huán)境搭建步驟最新詳細(xì)版
- 前端AI機(jī)器學(xué)習(xí)在瀏覽器中訓(xùn)練模型
- AI:如何訓(xùn)練機(jī)器學(xué)習(xí)的模型
- django數(shù)據(jù)模型on_delete, db_constraint的使用詳解
- TensorFlow入門(mén)使用 tf.train.Saver()保存模型
- Python從零開(kāi)始訓(xùn)練AI模型的實(shí)用教程
相關(guān)文章
python使用Selenium和cookie繞過(guò)驗(yàn)證碼實(shí)現(xiàn)登錄示例代碼
文章介紹了如何使用Selenium獲取登錄過(guò)程中的cookie信息,并通過(guò)抓包工具獲取cookie,通過(guò)示例展示了如何在Dsmall和CRM系統(tǒng)中實(shí)現(xiàn)免登陸操作,總結(jié)了兩種方法:一種是在獲取到cookie后直接添加到當(dāng)前會(huì)話中,另一種是將cookie存儲(chǔ)到本地文件并在后續(xù)請(qǐng)求中使用2025-01-01
Python讀取文件內(nèi)容為字符串的方法(多種方法詳解)
這篇文章主要介紹了Python讀取文件內(nèi)容為字符串的方法,本文通過(guò)三種方式給大家介紹,在文章末尾給大家提到了python讀取txt文件中字符串,字符串用空格分隔的相關(guān)知識(shí),需要的朋友可以參考下2020-03-03
基于Python開(kāi)發(fā)一個(gè)文件頭簽名分析工具
本文介紹了一個(gè)功能強(qiáng)大的文件頭簽名分析工具的實(shí)現(xiàn)原理和開(kāi)發(fā)過(guò)程,該工具通過(guò)讀取文件頭部二進(jìn)制簽名來(lái)識(shí)別文件真實(shí)類型,即使用戶修改了文件擴(kuò)展名也能準(zhǔn)確判斷,文章詳細(xì)解析了核心算法、GUI設(shè)計(jì)以及技術(shù)實(shí)現(xiàn)細(xì)節(jié),為開(kāi)發(fā)類似工具提供了完整參考,需要的朋友可以參考下2025-05-05
用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問(wèn)題的示例
這篇文章主要介紹了用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問(wèn)題的一個(gè)棋盤(pán)游戲的示例,動(dòng)態(tài)規(guī)劃常常適用于有重疊子問(wèn)題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問(wèn)題,且耗時(shí)間往往遠(yuǎn)少于樸素解法,需要的朋友可以參考下2015-04-04
淺談Python實(shí)現(xiàn)貪心算法與活動(dòng)安排問(wèn)題
本篇文章主要介紹了淺談Python實(shí)現(xiàn)貪心算法與活動(dòng)安排問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
python函數(shù)之任意數(shù)量的實(shí)參方式
這篇文章主要介紹了python函數(shù)之任意數(shù)量的實(shí)參方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02

