從0到1開發(fā)AI Agent(智能體)| LangChain 的快速入門
AI Agent,即人工智能代理,一般直接叫做智能體。是一種能夠感知環(huán)境、做出決策并采取行動(dòng)的系統(tǒng)。這些系統(tǒng)能夠執(zhí)行被動(dòng)的任務(wù),也能夠主動(dòng)尋找解決問題的方法,適應(yīng)環(huán)境的變化,并在沒有人類直接干預(yù)的情況下做出決策。
1. LangChain是什么?(示例代碼基于 v0.3版本)
LangChain 是一個(gè)開源框架,目標(biāo)是將大模型與外部數(shù)據(jù)連接起來,以便開發(fā)者能夠更快和更容易地構(gòu)建基于語言的 Al 應(yīng)用。
LangChain的核心思想是通過模塊化能設(shè)計(jì)和力抽象,將不同的組件和功能“鏈”在一起,以創(chuàng)建更復(fù)雜和多功能的語言處理系統(tǒng)。這些組件包括模型、聊天模型、文本嵌入模、型提示模板、索引、文檔加載器、文本分割器、向量存儲(chǔ)、檢索器、記憶功能、鏈和代理等。這種設(shè)計(jì)不僅提高了系統(tǒng)的靈活性和可擴(kuò)展性,還使得開發(fā)者可以根據(jù)具體需求自由組合和調(diào)整各個(gè)模塊,從而實(shí)現(xiàn)更強(qiáng)大、更定制化的AI應(yīng)用
通俗來說,LangChain 是一種幫助開發(fā)者用大模型制作“應(yīng)用程序”的開發(fā)工具。它就像一個(gè)“搭建AI房子”的工具箱,里面有各種現(xiàn)成的積木,開發(fā)者只需要把這些積木拼起來,就可以實(shí)現(xiàn)很多強(qiáng)大的功能。
舉個(gè)例子,假如你想制作一個(gè)智能客服,LangChain 可以:
- 給AI搭建大腦:讓它用 ChatGPT 或類似的模型來回答問題。
- 記住用戶信息:記住顧客的名字和之前的問題,避免每次都從頭開始解釋。
- 讓AI會(huì)用工具:比如連接到公司數(shù)據(jù)庫,查訂單狀態(tài);或者直接用計(jì)算器給顧客算賬。
- 處理復(fù)雜問題:比如顧客問一個(gè)"需要多步"才能回答的問題,LangChain 可以指導(dǎo) AI 逐步完成。
2. LangChain全景
具體來說,該框架由以下開源庫組成:
- langchain-core : 基礎(chǔ)抽象和LangChain表達(dá)式 (LCEL)。
- langchain-community? : 第三方集成。合作伙伴庫(例如?langchain-openai、langchain-anthropic? 等):一些集成已進(jìn)一步拆分為自己的輕量級(jí)庫,僅依賴于langchain-core。
- langchain : 組成應(yīng)用程序認(rèn)知架構(gòu)的鏈、代理和檢索策略。
- LangGraph : 通過將步驟建模為圖中的邊和節(jié)點(diǎn),構(gòu)建強(qiáng)大且有狀態(tài)的多參與者應(yīng)用程序。與LangChain無縫集成,但也可以單獨(dú)使用。
- LangServe : 將LangChain鏈部署為REST API。
- LangSmith : 一個(gè)開發(fā)者平臺(tái),讓您調(diào)試、測試、評估和監(jiān)控LLM應(yīng)用程序。
3. 優(yōu)點(diǎn)
3.1 LangChain 是一個(gè)靈活的框架,它提供了與多種大模型進(jìn)行交互的能力(示例)。
雖然LangChain最初主要支持 OpenAI公司的模型,但它的設(shè)計(jì)允許集成和使用來自不同源的多種模型,包括但不限于OpenAl、Cohere和 Hugging Face 等模型庫中的模型。這樣,你不必拘泥于某種模型,而是為自己的應(yīng)用選擇最合適的模型。
通過LangChain 提供的ModelLaboratory(模型實(shí)驗(yàn)室),你可以測試并比較不同的模型。下面是一段通過 ModelLaboratory比較不同大模型的示例代碼
需要確保已經(jīng)安裝langchain-openai、langchain-cohere和langchain-huggingface庫,并申請OpenAI_API_KEY、COHERE_API_KEY和HUGGINGFACEHUB_API_TOKEN
Cohere 是一家專注于自然語言處理(NLP)技術(shù)的公司,提供強(qiáng)大的語言模型和AI服務(wù)。提供API接口,供開發(fā)者和企業(yè)在自己的應(yīng)用中集成先進(jìn)的語言理解和生成能力
Hugging Face 是一個(gè)開源人工智能公司,專注于自然語言處理(NLP)和機(jī)器學(xué)習(xí)(ML)的技術(shù)發(fā)展。它為開發(fā)者和研究人員提供了大量的預(yù)訓(xùn)練模型和工具,方便他們在各自的應(yīng)用中使用機(jī)器學(xué)習(xí)模型。提供大量開源的預(yù)訓(xùn)練模型和工具,開發(fā)者可以自由下載并在本地進(jìn)行訓(xùn)練和使用,也有 API 服務(wù),更側(cè)重于提供一個(gè)開源生態(tài)系統(tǒng)
這兩個(gè)公司都有一堆模型可被調(diào)用,這里需要對比三者的調(diào)用結(jié)果有什么不同
安裝依賴:
pip install langchain-cohere
pip install langchain-huggingface
# 導(dǎo)入langchain_openai庫中的OpenAI類,用于與OpenAI進(jìn)行交互
from langchain_openai import OpenAI
# 導(dǎo)入cohere,用于使用cohere的模型
from langchain_cohere import ChatCohere
# 導(dǎo)入huggingface,用于使用huggingface的模型
from langchain_huggingface import ChatHuggingFace,HuggingFaceEndpoint
import os
os.environ["CO_API_KEY"] = "myRKkidpqyuQqXZfe"
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "hf_wQwVfvKMoGK"
# 初始化OpenAI、Cohere和HuggingFace的實(shí)例,并設(shè)置溫度參數(shù)(控制生成文本的創(chuàng)新性)
openai = OpenAI(
api_key='hk-iwtbie100a91e427',
base_url='https://api.openai-hk.com/v1',
temperature=0.1
)
# Cohere command-xlarge-nightly這個(gè)模型支持中文;command模型不支持中文
cohere = ChatCohere(model="command-xlarge-nightly", temperature=0.1)
# HuggingFace
repo_id = "Qwen/Qwen2.5-72B-Instruct" # 使用千問的模型
llm = HuggingFaceEndpoint(
repo_id=repo_id,
temperature=0.1,
model_kwargs={'trust_remote_code':True}
)
huggingface = ChatHuggingFace(llm=llm, verbose=True)
# 導(dǎo)入ModelLaboratory類,用于創(chuàng)建和管理多個(gè)語言模型
from langchain.model_laboratory import ModelLaboratory
# 創(chuàng)建一個(gè)模型實(shí)驗(yàn)室實(shí)例,整合了OpenAI、Cohere和HuggingFace的模型
model_lab = ModelLaboratory.from_llms([openai, cohere, huggingface])
# 使用模型實(shí)驗(yàn)室比較不同模型對同一個(gè)問題“百合花是來源自哪個(gè)國家?”的回答
model_lab.compare("百合花是來源自哪個(gè)國家?")
輸出結(jié)果:
###### 輸入的提示詞
Input:
百合花是來源自哪個(gè)國家?
###### OpenAI的回答
OpenAI
Params: {'model_name': 'gpt-3.5-turbo-instruct', 'temperature': 0.1, 'top_p': 1, 'frequency_penalty': 0, 'presence_penalty': 0, 'n': 1, 'logit_bias': {}, 'seed': None, 'logprobs': None, 'max_tokens': 256}
百合花最早起源于中國,后來傳播到日本、韓國、歐洲等地。
###### Cohere的回答
client=<cohere.client.Client object at 0x00000214FC92BD90> async_client=<cohere.client.AsyncClient object at 0x0000021482AAAEC0> model='command-xlarge-nightly' temperature=0.1
百合花,即百合屬(學(xué)名:Lilium)植物,是一種多年生草本植物,原產(chǎn)于北半球溫帶地區(qū)。它廣泛分布在歐洲、亞洲和北美等地,不同品種的百合花可能源自不同的國家和地區(qū)。
其中,亞洲是百合花的主要分布區(qū)域,中國、日本和韓國都有豐富的百合花品種。中國是百合花的重要原產(chǎn)國,擁有許多獨(dú)特的野生百合品種,如卷丹、山丹、百合等。
歐洲的百合花品種也非常豐富,如法國的東方百合、英國的圣潔百合等。
北美地區(qū)也有許多百合花品種,如北美百合、加拿大百合等。
因此,不同種類的百合花可能源自不同的國家,但總體來說,百合花是廣泛分布在北半球溫帶地區(qū)的植物。
###### HuggingFace的回答
llm=HuggingFaceEndpoint(repo_id='Qwen/Qwen2.5-72B-Instruct',
.... 省略 ....
} model_id='Qwen/Qwen2.5-72B-Instruct'
百合花是一種非常古老的植物,其種類繁多,分布廣泛,因此不能簡單地說它起源于某一個(gè)國家。不過,關(guān)于百合屬植物(Lilium)的原始分布地,科學(xué)界普遍認(rèn)為大部分百合種類最初分布在亞洲東部,特別是中國、日本和俄羅斯的遠(yuǎn)東地區(qū)。中國是百合屬植物的主要分布中心之一,擁有許多野生種類。因此,可以說百合花與中國有著密切的聯(lián)系。同時(shí),百合屬植物也在歐洲和北
參考:
https://python.langchain.com/docs/integrations/providers/cohere/
https://python.langchain.com/api_reference/huggingface/chat_models/langchain_huggingface.chat_models.huggingface.ChatHuggingFace.html#langchain_huggingface.chat_models.huggingface.ChatHuggingFace
https://python.langchain.ac.cn/docs/integrations/llms/huggingface_endpoint/
3.2 LangChain封裝了很多大模型應(yīng)用開發(fā)理念的技術(shù)實(shí)現(xiàn)細(xì)節(jié)
這種封裝能省好多事,具體包括管理提示模板和提示詞、與不同類型的大模型進(jìn)行交互的通用接口、完成語言邏輯思維框架(例如 ReAct)的代碼實(shí)現(xiàn)、與外部數(shù)據(jù)源交互、創(chuàng)建交互式 Agent、維護(hù)鏈或 Agent 調(diào)用的狀態(tài),以及實(shí)現(xiàn)歷史對話的記憶功能等。
例如,我們只需調(diào)用 create_react_agent函數(shù),就可以創(chuàng)建一個(gè)具有ReAct思維框架的 Agent,輕松實(shí)現(xiàn) ReAct 的推理功能 - 所有的細(xì)節(jié)都被封裝在 LangChain 的API中。
ReAct見:?從0到1開發(fā)AI Agent(智能體)(二)| 智能體推理引擎ReAct框架的快速入門
3.3 LangChain 的第三方應(yīng)用接口多且全,與大量其他AI開發(fā)相關(guān)的庫和工具進(jìn)行集成。
例如LangChain包含與各種向量數(shù)據(jù)庫進(jìn)行交互的接口。這為我們進(jìn)行大模型應(yīng)用開發(fā)提供了一站式解決方案。
4. 注意事項(xiàng)
因?yàn)長angChain 提供了豐富的功能、工具和第三方接口,所以它的功能和整個(gè)生態(tài)環(huán)境顯得過于復(fù)雜,這可能會(huì)給初學(xué)者或不熟悉大模型的開發(fā)者帶來挑戰(zhàn)。其次,通過 LangChain開發(fā)的復(fù)雜應(yīng)用在處理過多數(shù)據(jù)時(shí)也可能會(huì)遇到效率問題。最后LangChain 還在迅速發(fā)展,其版本迭代速度非常快,舊的代碼在新版本中可能無法正常運(yùn)行。
最后這個(gè)問題需要注意,現(xiàn)在網(wǎng)上很多示例是基于舊版本的
5. LCEL(LangChain Expression Language)(示例)
為了讓基于大模型的Al應(yīng)用開發(fā)變得容易,LangChain 推出了LangChain Expression Language(簡稱 LCEL)。LCEL是一種聲明式語言。它可以使 LangChain 中各組件的組合變得簡單且直觀。
LCEL 的特點(diǎn)如下:
- 流式處理,即在與大模型交互的過程中盡可能快地輸出首個(gè)Token,同時(shí)確保數(shù)據(jù)的連續(xù)性和不斷輸出,維持一個(gè)持續(xù)穩(wěn)定的交互流程。
- 異步操作,能在同一臺(tái)服務(wù)器上處理多個(gè)并發(fā)請求
- 自動(dòng)并行執(zhí)行那些可以并行的步驟,以實(shí)現(xiàn)盡可能低的延遲
- 允許配置重試和后備選項(xiàng),使鏈在規(guī)模上更可靠。
- 允許訪問復(fù)雜鏈的中間結(jié)果,并與LangSmith跟蹤和LangServe部署無縫集成
示例:
# 導(dǎo)入所需的庫
from langchain_core.output_parsers import StrOutputParser # 用于解析輸出結(jié)果為字符串
from langchain_core.prompts import ChatPromptTemplate # 用于創(chuàng)建聊天提示模板
from langchain_openai import ChatOpenAI # 用于調(diào)用OpenAI的GPT模型
# 創(chuàng)建一個(gè)聊天提示模板,其中{topic}是一個(gè)占位符,用于后續(xù)插入具體的話題
prompt = ChatPromptTemplate.from_template("請講一個(gè)關(guān)于 {topic} 的故事")
# 初始化ChatOpenAI對象,指定使用的模型為"gpt-4"
# model = ChatOpenAI(model="gpt-4-mini")
model = ChatOpenAI(
api_key='hk-iwtbie91e427',
base_url='https://api.openai-hk.com/v1',
temperature=0.1
)
# 初始化一個(gè)輸出解析器,用于將模型的輸出解析成字符串
output_parser = StrOutputParser()
'''使用管道操作符(|)連接各個(gè)處理步驟,創(chuàng)建一個(gè)處理鏈
其中prompt用于生成具體的提示文本,
model用于根據(jù)提示文本生成回應(yīng),
output_parser用于處理回應(yīng)并將其轉(zhuǎn)換為字符串'''
chain = prompt | model | output_parser
# 調(diào)用處理鏈,傳入話題"水仙花",執(zhí)行生成故事的操作
message = chain.invoke({"topic": "水仙花"})
# 打印鏈的輸出結(jié)果
print(message)
從前,有一朵美麗的水仙花,她生長在一個(gè)幽靜的小花園里。水仙花的花瓣潔白如雪,花蕊嬌嫩如玉,散發(fā)著淡淡的清香,吸引了許多蜜蜂和蝴蝶前來采蜜。
水仙花非常喜歡陽光和清新的空氣,每天都在花園里歡快地舞動(dòng)著花瓣,享受著自由自在的生活。她和其他花朵們相處融洽,彼此之間互相照顧,共同綻放出美麗的花海。
然而,有一天,一場暴風(fēng)雨襲擊了小花園,水仙花被狂風(fēng)吹倒在地,花瓣被雨水打濕,顯得狼狽不堪。其他花朵們紛紛為她擔(dān)心,希望她能夠振作起來。
水仙花雖然受傷了,但她并沒有放棄,她努力地掙扎著站起來,用最后一絲力氣重新展開花瓣,綻放出最后一絲光芒。她告訴其他花朵們:“即使受傷,也要堅(jiān)強(qiáng)地面對,因?yàn)樯锌倳?huì)有風(fēng)雨,只有堅(jiān)強(qiáng)才能戰(zhàn)勝困難。”
最終,水仙花頑強(qiáng)地度過了風(fēng)雨,重新恢復(fù)了往日的美麗。她的堅(jiān)強(qiáng)和勇敢感動(dòng)了其他花朵們,大家都學(xué)會(huì)了面對困難時(shí)要堅(jiān)強(qiáng)不屈,不輕易放棄。
從此以后,水仙花成為了小花園里最受尊敬的花朵,她的故事也被傳頌開來,成為了一代代花朵們學(xué)習(xí)的楷模。每當(dāng)風(fēng)雨來臨時(shí),大家都會(huì)想起水仙花的故事,堅(jiān)定地面對挑戰(zhàn),勇敢地前行。
LCEL 是通過“|” 符號(hào)連接不同組件的。首先,通過 PromptTemplate 生成針對大模型的提示,插入實(shí)際的問題。然后,將這個(gè)提示發(fā)送給OpenAI組件(即語言模型),模型根據(jù)提示生成回答。最后,通過 StrOutputParser解析模型的輸出,確保輸出是字符串格式 這個(gè)示例展示了通過串聯(lián)不同的組件(如輸入處理、模型調(diào)用、輸出解析等)來構(gòu)建復(fù)雜的語言處理任務(wù)的基本流程。
6. LangChain 的核心功能
- 鏈(Chains)
- LangChain 支持將多個(gè) LLM 調(diào)用和工具操作鏈接成工作流,比如從用戶提問到返回答案的多步驟處理。
- 工作流可以動(dòng)態(tài)適應(yīng)輸入內(nèi)容,特別適合構(gòu)建復(fù)雜任務(wù)的自動(dòng)化流程。
- 提示模板(Prompt Templates)
- 提供動(dòng)態(tài)模板化提示生成工具,優(yōu)化提示質(zhì)量并提高 LLM 的輸出表現(xiàn)。開發(fā)者可以輕松重復(fù)使用和調(diào)整提示。
- 記憶(Memory)
- 內(nèi)置上下文記憶功能,可以保留會(huì)話歷史,用于創(chuàng)建更連貫的對話體驗(yàn)。
- 支持短期記憶(會(huì)話內(nèi)存儲(chǔ))和長期記憶(跨會(huì)話存儲(chǔ),例如結(jié)合向量數(shù)據(jù)庫)。
- 工具(Tools)與代理(Agents)
- 工具:集成搜索引擎、數(shù)據(jù)庫、API 等功能,擴(kuò)展 LLM 的能力。
- 代理:通過代理動(dòng)態(tài)決策調(diào)用哪些工具,完成復(fù)雜任務(wù)(如知識(shí)查詢或計(jì)算)。
- 數(shù)據(jù)增強(qiáng)生成(RAG, Retrieval-Augmented Generation)
- 將外部知識(shí)庫(文檔、數(shù)據(jù)庫)與 LLM 結(jié)合,動(dòng)態(tài)檢索相關(guān)內(nèi)容以提升回答的準(zhǔn)確性。
- 向量數(shù)據(jù)庫集成
- 支持向量數(shù)據(jù)庫,用于語義搜索和知識(shí)庫管理。
- LangGraph
- 新推出的工具庫,用于構(gòu)建多智能體(multi-agent)和多狀態(tài)應(yīng)用,推薦用于設(shè)計(jì)復(fù)雜代理系統(tǒng)。
7. LangChain和Agent開發(fā)
在構(gòu)建 Agent 時(shí),LangChain 可以作為一個(gè)強(qiáng)大的框架來整合不同的 AI模型和工具,提供更連貫和復(fù)雜的對話流程,以及信息檢索和處理能力。
因此,它允許開發(fā)者構(gòu)建更復(fù)雜、更智能的 Agent。LangChain 提供了大量工具,可以將大模型連接到其他數(shù)據(jù)或計(jì)算源,包括搜索引擎、API和其他數(shù)據(jù)存儲(chǔ)。大模型通過工具可以獲取最新的數(shù)據(jù),并將其作為上下文插入提示中。工具還可以用來執(zhí)行行動(dòng)(如運(yùn)行代碼、修改文件等)。大模型觀察這些行動(dòng)的結(jié)果,以決定下一步要做什么。
LangChain 通過 Agent執(zhí)行器(Agent Executor)運(yùn)行 Agent的邏輯,當(dāng)滿足某些標(biāo)準(zhǔn)時(shí)才停止運(yùn)行。
下圖展示了一個(gè)由 LangChain Agent 驅(qū)動(dòng)的典型的大模型系統(tǒng)設(shè)計(jì)架構(gòu)。
在上圖所示的架構(gòu)中,用戶通過服務(wù)器提供提示詞(Prompt),系統(tǒng)則通過索引(Indexes,也就是 Retrieval)檢索信息。這些信息被用來更新系統(tǒng)的記憶(Memory)為處理用戶的輸入提供上下文。
系統(tǒng)核心是模型(Model),其中包括一個(gè)大模型,可能是用于理解和生成語言的AI。大模型通過鏈(Chains)與其他模型相連,這可能意味著不同模型之間的信息流動(dòng)和合作。
在系統(tǒng)底部,多個(gè)Agent負(fù)責(zé)執(zhí)行具體任務(wù)。它們可以完成不同的操作,并且可能獨(dú)立工作。每個(gè) Agent都可能代表系統(tǒng)中的一個(gè)功能模塊或服務(wù)。用戶的提示被模型處理后,系統(tǒng)產(chǎn)生輸出(Output),并可能通過回調(diào)(Callbacks)觸發(fā)額外的動(dòng)作或處理,這通常用于處理異步事件或在滿足某些條件時(shí)執(zhí)行特定的函數(shù)。
整個(gè)過程形成了一個(gè)從輸入到輸出的循環(huán),涉及信息檢索、記憶更新、模型處理和動(dòng)作執(zhí)行,最終達(dá)到響應(yīng)用戶請求的目的。這個(gè)過程體現(xiàn)了LangChain的模塊化和靈活性允許系統(tǒng)根據(jù)需要?jiǎng)討B(tài)地組合不同的功能和服務(wù)。
本文轉(zhuǎn)載自 ??AI取經(jīng)路??,作者: AI取經(jīng)路
