像OpenAI的GPT-4這樣的大型語言模型(LLMs)已經(jīng)風(fēng)靡全球。它們可以自動執(zhí)行各種任務(wù),如回答問題、翻譯語言、分析文本等。LLMs是第一種真正感覺像“人工智能”的機器學(xué)習(xí)類型。
然而,在將LLMs應(yīng)用于實際產(chǎn)品時仍然存在挑戰(zhàn)。特別是其中一個最棘手和繁瑣的挑戰(zhàn)是LLM的管理。如果我們想要構(gòu)建由LLMs驅(qū)動的應(yīng)用程序,我們需要管理以下幾個方面:
不同類型的LLM —— OpenAI、Anthropic、開源等
模型版本 —— 隨著我們更新到最新版本
提示版本 —— 隨著不斷調(diào)整和改進提示
模型鏈接 —— 可能需要結(jié)合或鏈接多個LLM的輸入和輸出以獲得最終結(jié)果
要獨自完成所有這些工作將需要大量工作,這就是LangChain發(fā)揮作用的地方!
介紹LangChain
LangChain使構(gòu)建由LLMs驅(qū)動的應(yīng)用程序變得簡單。它提供了極大簡化上述所有挑戰(zhàn)的工具。使用LangChain,我們可以在統(tǒng)一的界面中輕松與不同類型的LLMs進行交互,管理模型版本,管理提示版本,并將LLMs連接在一起。所有這些功能都打包在易于使用的API中,因此我們可以快速在應(yīng)用程序中利用LLMs。
安裝
開始使用LangChain很容易。我們可以使用pip進行安裝,如下所示:
pip install langchain
或者使用conda:
conda install langchain -c conda-forge
最后,如果想要所有最新的功能,可以直接從其GitHub存儲庫構(gòu)建該庫。
設(shè)置
為了充分利用LangChain,將希望將其與不同的組件,如模型提供商和API,集成在一起?梢詾橄MB接到的每個提供商設(shè)置環(huán)境變量。例如,對于OpenAI,可以設(shè)置OpenAI API密鑰:
export OPENAI_API_KEY="..."
或者,可以在使用LangChain的Python應(yīng)用程序中啟動后,在代碼中設(shè)置變量:
from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")
LangChain的關(guān)鍵部分
LangChain之所以偉大,是因為它靈活且模塊化。它將語言處理分解為單獨的部分,讓開發(fā)者創(chuàng)建自定義工作流程。以下是它的關(guān)鍵部分:
組件和鏈:執(zhí)行語言處理特定任務(wù)的模塊。鏈將這些組件連接起來,形成自定義工作流程
提示模板:可重復(fù)使用的提示,可以更改其中的特定值。例如,一個詢問用戶姓名的提示可以被個性化
向量存儲:通過文檔的數(shù)字意義來保存和搜索信息
索引和檢索器:存儲和查找有關(guān)模型訓(xùn)練數(shù)據(jù)的詳細(xì)信息,以獲得更好的響應(yīng)
輸出解析器:管理和精煉模型的響應(yīng),使其更有結(jié)構(gòu)
示例選擇器:從模型的訓(xùn)練數(shù)據(jù)中選擇正確的例子,提高響應(yīng)準(zhǔn)確性
代理:具有特定任務(wù)的唯一實例,如聊天機器人或移動應(yīng)用程序
在LangChain中構(gòu)建一個由LLM驅(qū)動的應(yīng)用程序
LangChain的LLM類連接到不同的語言模型提供商,如OpenAI和Hugging Face。我們可以輕松使用LangChain構(gòu)建一個帶有提示的應(yīng)用程序,并得到輸出。例如:
import os
from langchain.llms import OpenAI
llm = OpenAI(model_name="gpt-3.5-turbo",
openai_api_key=os.environ["OPENAI_API_KEY"])
print(llm("Tell me a joke about pizza!"))
這可能會得到類似這樣的輸出:
Why did the pizza maker go to art school?
Because they wanted to get a "pizza" the creative action!
Hahahaha….. so funny Mr. gpt-3.5-turbo….
如果我們想要切換模型,只需在代碼中更改一些細(xì)節(jié)即可。
在LangChain中管理LLMs的提示
LLMs需要正確的提示才能得到正確的輸出。LangChain中的PromptTemplate通過使用模板生成提示,幫助生成提示。可以在保持主結(jié)構(gòu)的同時輕松更改值。例如:
from langchain.llms import OpenAI
from langchain import PromptTemplate
import os
USER_INPUT = "chocolate cake"
llm = OpenAI(model_name="gpt-3.5-turbo",
openai_api_key=os.environ["OPENAI_API_KEY"])
template = """I'm interested in making {dish}. Can you provide me with a simple recipe for it, including the main ingredients and basic instructions?"""
prompt = PromptTemplate(input_variables=["dish"], template=template)
final_prompt = prompt.format(dish=USER_INPUT)
print(f"LLM Output: {llm(final_prompt)}")
這使得管理所有提示并處理動態(tài)輸入變得非常容易。
在多步驟工作流中結(jié)合LLMs和提示
在LangChain中進行鏈接意味著將LLMs與其他元素組合用于應(yīng)用程序。我們可以:
使用一個LLM的輸出作為另一個LLM的輸入。
將LLMs與模板結(jié)合使用。
將LLMs與外部數(shù)據(jù)或聊天歷史結(jié)合使用。
例如:
from langchain.llms import OpenAI
from langchain.chains import LLMChain, SimpleSequentialChain
from langchain import PromptTemplate
import os
llm = OpenAI(model_name="gpt-3.5-turbo",
openai_api_key=os.environ["OPENAI_API_KEY"])
# 鏈中的第一步
template = "Can you provide a brief summary of the movie {movie_title}? Please keep it concise."
first_prompt = PromptTemplate(input_variables=["movie_title"],
template=template)
chain_one = LLMChain(llm=llm, prompt=first_prompt)
# 鏈中的第二步
second_prompt = PromptTemplate(input_variables=["actor"],
template="Can you list three movies featuring {actor}?")
chain_two = LLMChain(llm=
llm, prompt=second_prompt)
# 結(jié)合第一和第二鏈
overall_chain = SimpleSequentialChain(chains=[chain_one, chain_two], verbose=True)
final_answer = overall_chain.run("Inception")
此示例構(gòu)建了一個兩步鏈,用于查找有關(guān)城市的旅游信息。
深入學(xué)習(xí)
LangChain是一個Python框架,讓我們可以使用LLMs構(gòu)建應(yīng)用程序。它與各種模型連接,使與LLM和提示管理有關(guān)的一切變得簡單。要了解更多信息,請查看精彩的LangChain文檔,其中包含有關(guān)各種功能和示例的信息。