前言
Large Language Models (LLMs)在2020年OpenAI 的 GPT-3 的發(fā)布而進入世界舞臺 。從那時起,他們穩(wěn)步增長進入公眾視野。
眾所周知 OpenAI 的 API 無法聯(lián)網(wǎng),所以大家如果想通過它的API實現(xiàn)聯(lián)網(wǎng)搜索并給出回答、總結(jié) PDF 文檔、基于某個 Youtube 視頻進行問答等等的功能肯定是無法實現(xiàn)的。所以,我們來介紹一個非常強大的第三方開源庫:LangChain 。
LangChain 是一個用于開發(fā)由語言模型驅(qū)動的應(yīng)用程序的框架。他主要擁有 2 個能力:可以將 LLM 模型與外部數(shù)據(jù)源進行連接&允許與 LLM 模型進行交互。
項目地址:https://github.com/langchain-ai/langchain
LangChain 是一個開發(fā)由語言模型驅(qū)動的應(yīng)用程序的框架。
框架是設(shè)計原則:
數(shù)據(jù)感知 : 將語言模型連接到其他數(shù)據(jù)源
具有代理性質(zhì) : 允許語言模型與其環(huán)境交互
Langchain的核心思想
將不同的組件“鏈接”在一起,以圍繞LLM創(chuàng)建更高級的用例。
LangChain 核心模塊支持
模型(models) : LangChain 支持的各種模型類型和模型集成。
提示(prompts) : 包括提示管理、提示優(yōu)化和提示序列化。
內(nèi)存(memory) : 內(nèi)存是在鏈/代理調(diào)用之間保持狀態(tài)的概念。LangChain 提供了一個標(biāo)準(zhǔn)的內(nèi)存接口、一組內(nèi)存實現(xiàn)及使用內(nèi)存的鏈/代理示例。
索引(indexes) : 與您自己的文本數(shù)據(jù)結(jié)合使用時,語言模型往往更加強大——此模塊涵蓋了執(zhí)行此操作的最佳實踐。
鏈(chains) : 鏈不僅僅是單個 LLM 調(diào)用,還包括一系列調(diào)用(無論是調(diào)用 LLM 還是不同的實用工具)。LangChain 提供了一種標(biāo)準(zhǔn)的鏈接口、許多與其他工具的集成。LangChain 提供了用于常見應(yīng)用程序的端到端的鏈調(diào)用。
代理(agents) : 代理涉及 LLM 做出行動決策、執(zhí)行該行動、查看一個觀察結(jié)果,并重復(fù)該過程直到完成。LangChain 提供了一個標(biāo)準(zhǔn)的代理接口,一系列可供選擇的代理,以及端到端代理的示例。
###LangChain工作原理
LangChain就是把大量的數(shù)據(jù)組合起來,讓LLM能夠盡可能少地消耗計算力就能輕松地引用。它的工作原理是把一個大的數(shù)據(jù)源,比如一個50頁的PDF文件,分成一塊一塊的,然后把它們嵌入到一個向量存儲(Vector Store)里。
創(chuàng)建向量存儲的簡單示意圖
現(xiàn)在我們有了大文檔的向量化表示,我們就可以用它和LLM一起工作,只檢索我們需要引用的信息,來創(chuàng)建一個提示-完成(prompt-completion)對。
當(dāng)我們把一個提示輸入到我們新的聊天機器人里,LangChain就會在向量存儲里查詢相關(guān)的信息。你可以把它想象成一個專門為你的文檔服務(wù)的小型谷歌。一旦找到了相關(guān)的信息,我們就用它和提示一起喂給LLM,生成我們的答案。
使用場景用例
自治代理(autonomous agents)
長時間運行的代理會采取多步操作以嘗試完成目標(biāo)。 AutoGPT 和 BabyAGI就是典型代表。
代理模擬(agent simulations)
將代理置于封閉環(huán)境中觀察它們?nèi)绾蜗嗷プ饔茫绾螌κ录鞒龇磻?yīng),是觀察它們長期記憶能力的有趣方法。
個人助理(personal assistants)
主要的 LangChain 使用用例。個人助理需要采取行動、記住交互并具有您的有關(guān)數(shù)據(jù)的知識。
問答(question answering)
第二個重大的 LangChain 使用用例。僅利用這些文檔中的信息來構(gòu)建答案,回答特定文檔中的問題。
聊天機器人(chatbots)
由于語言模型擅長生成文本,因此它們非常適合創(chuàng)建聊天機器人。
查詢表格數(shù)據(jù)(tabular)
如果您想了解如何使用 LLM 查詢存儲在表格格式中的數(shù)據(jù)(csv、SQL、數(shù)據(jù)框等),請閱讀此頁面。
代碼理解(code) : 如果您想了解如何使用 LLM 查詢來自 GitHub 的源代碼,請閱讀此頁面。
與 API 交互(apis)
使LLM 能夠與 API 交互非常強大,以便為它們提供更實時的信息并允許它們采取行動。
提?。╡xtraction)
從文本中提取結(jié)構(gòu)化信息。
摘要(summarization)
將較長的文檔匯總為更短、更簡潔的信息塊。一種數(shù)據(jù)增強生成的類型。
評估(evaluation)
生成模型是極難用傳統(tǒng)度量方法評估的。 一種新的評估方式是使用語言模型本身進行評估。 LangChain 提供一些用于輔助評估的提示/鏈。
Langchian生態(tài)
實戰(zhàn)舉例
模型(LLM包裝器)
提示
鏈
嵌入和向量存儲
代理
我會給你分別來介紹每個部分,讓你能夠?qū)angChain的工作原理有一個高層次的理解。接下來,你應(yīng)該能夠運用這些概念,開始設(shè)計你自己的用例和創(chuàng)建你自己的應(yīng)用程序。
接下來我會用Rabbitmetrics(Github)的一些簡短的代碼片段來進行介紹。他提供了有關(guān)此主題的精彩教程。這些代碼片段應(yīng)該能讓你準(zhǔn)備好使用LangChain。
首先,讓我們設(shè)置我們的環(huán)境。你可以用pip安裝3個你需要的庫:
pip install -r requirements.txt
python-dotenv==1.0.0 langchain==0.0.137 pinecone-client==2.2.1
Pinecone是我們將要和LangChain一起使用的向量存儲(Vector Store)。在這里,你要把你的OpenAI、Pinecone環(huán)境和Pinecone API的API密鑰存儲到你的環(huán)境配置文件里。你可以在它們各自的網(wǎng)站上找到這些信息。然后我們就用下面的代碼來加載那個環(huán)境文件:
現(xiàn)在,我們準(zhǔn)備好開始了!
# 加載環(huán)境變量
from dotenv import loaddotenv,finddotenv loaddotenv(finddotenv())
3.1、模型(LLM包裝器)
為了和我們的LLM交互,我們要實例化一個OpenAI的GPT模型的包裝器。在這里,我們要用OpenAI的GPT-3.5-turbo,因為它是最劃算的。但是如果你有權(quán)限,你可以隨意使用更強大的GPT4。
要導(dǎo)入這些,我們可以用下面的代碼:
# 為了查詢聊天模型GPT-3.5-turbo或GPT-4,導(dǎo)入聊天消息和ChatOpenAI的模式(schema)。
from langchain.schema import ( AIMessage, HumanMessage, SystemMessage)
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0.3)
messages = [ SystemMessage(content="你是一個專業(yè)的數(shù)據(jù)科學(xué)家"), HumanMessage(content="寫一個Python腳本,用模擬數(shù)據(jù)訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)")]
response=chat(messages)print(response.content,end='\n')
實際上,SystemMessage為GPT-3.5-turbo模塊提供了每個提示-完成對的上下文信息。HumanMessage是指您在ChatGPT界面中輸入的內(nèi)容,也就是您的提示。
但是對于一個自定義知識的聊天機器人,我們通常會將提示中重復(fù)的部分抽象出來。例如,如果我要創(chuàng)建一個推特生成器應(yīng)用程序,我不想一直輸入“給我寫一條關(guān)于…的推特”。
因此,讓我們來看看如何使用提示模板(PromptTemplates)來將這些內(nèi)容抽象出來。
3.2、提示
LangChain提供了PromptTemplates,允許你可以根據(jù)用戶輸入動態(tài)地更改提示,類似于正則表達式(regex)的用法。
# 導(dǎo)入提示并定義
PromptTemplatefrom langchain
import PromptTemplatetemplate = """您是一位專業(yè)的數(shù)據(jù)科學(xué)家,擅長構(gòu)建深度學(xué)習(xí)模型。用幾行話解釋{concept}的概念"""
prompt = PromptTemplate( input_variables=["concept"], template=template,)
# 用PromptTemplate運行LLM
llm(prompt.format(concept="autoencoder"))
llm(prompt.format(concept="regularization"))
你可以用不同的方式來改變這些提示模板,讓它們適合你的應(yīng)用場景。如果你熟練使用ChatGPT,這應(yīng)該對你來說很簡單。
3.3、鏈
鏈可以讓你在簡單的提示模板上面構(gòu)建功能。本質(zhì)上,鏈就像復(fù)合函數(shù),讓你可以把你的提示模板和LLM結(jié)合起來。
使用之前的包裝器和提示模板,我們可以用一個單一的鏈來運行相同的提示,它接受一個提示模板,并把它和一個LLM組合起來:
# 導(dǎo)入LLMChain并定義一個鏈,用語言模型和提示作為參數(shù)。
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
# 只指定輸入變量來運行鏈。
print(chain.run("autoencoder"))
除此之外,顧名思義,我們還可以把這些鏈連起來,創(chuàng)建更大的組合。
比如,我可以把一個鏈的結(jié)果傳遞給另一個鏈。在這個代碼片段里,Rabbitmetrics把第一個鏈的完成結(jié)果傳遞給第二個鏈,讓它用500字向一個五歲的孩子解釋。
你可以把這些鏈組合成一個更大的鏈,然后運行它。
# 定義一個第二個提示
second_prompt = PromptTemplate( input_variables=["ml_concept"], template="把{ml_concept}的概念描述轉(zhuǎn)換成用500字向我解釋,就像我是一個五歲的孩子一樣",)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 用上面的兩個鏈定義一個順序鏈:第二個鏈把第一個鏈的輸出作為輸入
from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
# 只指定第一個鏈的輸入變量來運行鏈。
explanation = overall_chain.run("autoencoder")print(explanation)
有了鏈,你可以創(chuàng)建很多功能,這就是LangChain功能強大的原因。但是它真正發(fā)揮作用的地方是和前面提到的向量存儲一起使用。接下來我們開始介紹一下這個部分。
3.4、嵌入和向量存儲
這里我們將結(jié)合LangChain進行自定義數(shù)據(jù)存儲。如前所述,嵌入和向量存儲的思想是把大數(shù)據(jù)分成小塊,并存儲起來。
LangChain有一個文本分割函數(shù)來做這個:
# 導(dǎo)入分割文本的工具,并把上面給出的解釋分成文檔塊
from langchain.text_splitter import RecursiveCharacter
TextSplittertext_splitter = RecursiveCharacterTextSplitter( chunk_size = 100, chunk_overlap = 0,)
texts = text_splitter.create_documents([explanation])
分割文本需要兩個參數(shù):每個塊有多大(chunksize)和每個塊有多少重疊(chunkoverlap)。讓每個塊之間有重疊是很重要的,可以幫助識別相關(guān)的相鄰塊。
每個塊都可以這樣獲?。?/p>
texts[0].page_content
在我們有了這些塊之后,我們需要把它們變成嵌入。這樣向量存儲就能在查詢時找到并返回每個塊。我們將使用OpenAI的嵌入模型來做這個。
# 導(dǎo)入并實例化 OpenAI embeddingsfrom langchain.embeddings import OpenAIEmbeddingsembeddings = OpenAIEmbeddings(model_name="ada") # 用嵌入把第一個文本塊變成一個向量query_result = embeddings.embed_query(texts[0].page_content)print(query_result)
最后,我們需要有一個地方來存儲這些向量化的嵌入。如前所述,我們將使用Pinecone來做這個。使用之前環(huán)境文件里的API密鑰,我們可以初始化Pinecone來存儲我們的嵌入。
# 導(dǎo)入并初始化Pinecone客戶端
import osimport pineconefrom langchain.vectorstores
import Pineconepinecone.init( api_key=os.getenv('PINECONE_API_KEY'), environment=os.getenv('PINECONE_ENV') )
# 上傳向量到
Pineconeindex_name = "langchain-quickstart"
search = Pinecone.from_documents(texts, embeddings, index_name=index_name)
# 做一個簡單的向量相似度搜索
query = "What is magical about an autoencoder?"
result = search.similarity_search(query)print(result)
現(xiàn)在我們能夠從我們的Pinecone向量存儲里查詢相關(guān)的信息了!剩下要做的就是把我們學(xué)到的東西結(jié)合起來,創(chuàng)建我們特定的用例,給我們一個專門的AI“代理”。
3.5、代理
一個智能代理就是一個能夠自主行動的AI,它可以根據(jù)輸入,依次完成一系列的任務(wù),直到達成最終的目標(biāo)。這就意味著我們的AI可以利用其他的API,來實現(xiàn)一些功能,比如發(fā)送郵件或做數(shù)學(xué)題。如果我們再加上我們的LLM+提示鏈,我們就可以打造出一個適合我們需求的AI應(yīng)用程序。
這部分的原理可能有點復(fù)雜,所以讓我們來看一個簡單的例子,來演示如何用LangChain中的一個Python代理來解決一個簡單的數(shù)學(xué)問題。這個代理是通過調(diào)用我們的LLM來執(zhí)行Python代碼,并用NumPy來求解方程的根:
# 導(dǎo)入Python REPL工具并實例化Python代理
from langchain.agents.agent_toolkits
import create_python_agent from langchain.tools.python.tool
import PythonREPLToolfrom langchain.python
import PythonREPLfrom langchain.llms.openai
import OpenAI
agent_executor = create_python_agent( llm=OpenAI(temperature=0, max_tokens=1000), tool=PythonREPLTool(), verbose=True)
# 執(zhí)行Python代理
agent_executor.run("找到二次函數(shù)3 * x ** 2 + 2 * x - 1的根(零點)。")
一個定制知識的聊天機器人,其實就是一個能夠把問題和動作串起來的智能代理。它會把問題發(fā)送給向量化存儲,然后把得到的結(jié)果和原來的問題結(jié)合起來,給出答案!文章來源:http://www.zghlxwxcb.cn/news/detail-619190.html
其它參考
10個最流行的向量數(shù)據(jù)庫【AI】文章來源地址http://www.zghlxwxcb.cn/news/detail-619190.html
到了這里,關(guān)于用LangChain開源框架實現(xiàn)知識機器人的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!