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