国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

網(wǎng)站運營推廣方案云南百度公司

網(wǎng)站運營推廣方案,云南百度公司,品牌建設的五個階段,中國做網(wǎng)站的公司介紹 大家好,博主又來給大家分享知識了。今天要給大家分享的內(nèi)容是使用LangChain進行大模型應用開發(fā)中的構建Agent智能體。 在LangChain中,Agent智能體是一種能夠根據(jù)輸入的任務或問題,動態(tài)地決定使用哪些工具(如搜索引擎、數(shù)據(jù)庫查詢等)來…

介紹

大家好,博主又來給大家分享知識了。今天要給大家分享的內(nèi)容是使用LangChain進行大模型應用開發(fā)中的構建Agent智能體。

LangChain中,Agent智能體是一種能夠根據(jù)輸入的任務或問題,動態(tài)地決定使用哪些工具(如搜索引擎、數(shù)據(jù)庫查詢等)來解決問題的程序。它可以理解自然語言指令,并利用工具獲取更多信息,最終生成解決方案。Agent智能體具備推理和決策能力,能夠在不同的工具和操作之間進行選擇,以達到最佳的問題解決效果。

Agent智能體可以極大地擴展語言模型的能力,使其能夠處理更復雜的任務。好了,那么我們直接進入正題。

創(chuàng)建和運行Agent

概念

單獨來說,語言模型無法采取行動-它們只能輸出文本。LangChain的一個重要用例是創(chuàng)建智能體。智能體是使用LLM作為推理引擎的系統(tǒng),用于確定應采取哪些行動以及這些行動的輸入應該是什么。然后可以將這些行動的結果反饋給智能體,并確定是否需要更多行動,或者是否可以結束。

在本次分享中,我們將構建一個可以與多種不同工具進行交互的智能體:一個是本地數(shù)據(jù)庫,另一個是搜索引擎。我們向該智能體提問,觀察它調(diào)用工具,并與它進行對話。

接下來,我們會探討怎樣借助LangChain智能體開展搭建工作。對于剛開始接觸相關領域的人而言,LangChain智能體是個不錯的起點,簡單易懂、容易上手。但隨著需求變得更復雜,當我們期望對智能體有更靈活的運用,或者需要更強的掌控力時,LangChain智能體就有些力不從心了。要是我們想進一步探索更高級的智能體功能,我建議大家關注一下LangGraph。

LangSmith

在使用LangChain開發(fā)應用的過程中,隨著應用邏輯越來越復雜,對內(nèi)部運行情況的監(jiān)控和調(diào)試也變得至關重要。這時,LangSmith就派上了用場,它能幫助我們更好地了解應用中各個步驟的執(zhí)行情況,尤其是大語言模型(LLM)的多次調(diào)用過程。

下面,我們就來看看如何安裝LangChain以及配置LangSmith,以便開啟高效的開發(fā)之旅 。

要使用LangSmith,我們必須要要裝LangChain庫,因為LangSmith主要依賴于LangChain相關的庫。我相信大家都已經(jīng)安裝了,但是為了讓只看這一篇博文的同事或同學,我還是要把個步驟講解出來。

安裝命令
pip install -U langchain
生成密鑰

生成LangSmith密鑰的步驟如下:

  1. 注冊賬號:訪問LangSmith官網(wǎng),使用自己常用的郵箱進行注冊或登錄。
  2. 進入設置頁面:登錄成功后,點擊頁面右上角的菜單,找到并進入Settings頁面。
  3. 創(chuàng)建API密鑰:在設置頁面中,找到API Keys選項,點擊Create API Key按鈕,系統(tǒng)會為你生成一個新的API密鑰。
  4. 保存密鑰:生成的API密鑰只會顯示一次,務必將其復制并妥善保存在安全的地方,比如密碼管理工具或本地的加密文件中。

LangSmithAPI密鑰在一定條件下是免費的。
Developer(開發(fā)者)版本:對于個人開發(fā)者或業(yè)余愛好者,可免費注冊使用。每月有5000條免費跟蹤額度,基礎跟蹤超過部分按$0.50每1000條收費,擴展跟蹤(400天保存期)超過部分按$4.50每 1000條收費。

配置環(huán)境變量

注冊并生成API密鑰完成后,設置LANGSMITH_API_KEY環(huán)境變量。

配置方式一

我們可以將環(huán)境變量在代碼中設置。

import osos.environ["LANGSMITH_API_KEY"] = "設置你自己的LangSmith API Key"
# 如果我們想要獲取自動化的最佳跟蹤,我們還可以啟用LangSmith跟蹤
os.environ["LANGSMITH_TRACING"] = "true"
配置方式二

我們也可以將環(huán)境變量設置在系統(tǒng)環(huán)境變量里。博主的電腦為Win11操作系統(tǒng),步驟為:

桌面“此電腦”圖標左鍵選中->鼠標右鍵點擊彈出菜單中的“屬性”->在打開的“系統(tǒng)信息”界面點擊“高級系統(tǒng)設置”->在彈出的“系統(tǒng)屬性”面板點擊“環(huán)境變量”。

在彈出的“環(huán)境變量”面板中左鍵點擊“系統(tǒng)變量”下的“新建”->在彈出的“新建系統(tǒng)變量”面板中的“變量名”輸入LANGSMITH_API_KEY->“變量值”輸入自己的LangSmith API Key->點擊“確定”。

(可選步驟)當前停留在“環(huán)境變量”面板->在“環(huán)境變量”面板中左鍵點擊“系統(tǒng)變量”下的“新建”->在彈出的“新建系統(tǒng)變量”面板中的“變量名”輸入LANGSMITH_TRACING->“變量值”輸入true->點擊“確定”。

重啟電腦使環(huán)境變量生效。

博主筆記:博主推薦“配置方式二”這種方式來配置環(huán)境變量。因為這樣API Key不會存在代碼中,別人也就不會知道你的API Key是多少了,防止自己的敏感信息被泄露。

定義工具

我們首先要創(chuàng)建所需工具,將使用兩個工具:Tavily(用于在線搜索),以及將創(chuàng)建的本地索引上的檢索器。

Tavily

Tavily是專門為大語言模型和檢索增強生成(RAG)場景設計的搜索引擎。TavilySearchResultsLangChain社區(qū)工具包中封裝的一個類,用于處理從Tavily搜索引擎獲取的搜索結果。

安裝命令
pip install langchain-community
生成密鑰

Tavily生成API密鑰步驟如下:

  1. 打開Tavily平臺登錄頁面:訪問Log in | Tavily,點擊 “sign in”。
  2. 選擇登錄或注冊方式:可選擇自己常用的的郵箱注冊或登錄。
  3. 獲取API密鑰:登錄成功后,頁面會跳轉(zhuǎn)到Tavily AI,進入API Keys板塊,即可看到且可復制API密鑰。

Tavily為用戶提供了一定的免費額度免費額度每月提供1000次免費搜索。

配置環(huán)境變量
配置方式一

我們可以將環(huán)境變量在代碼中設置。

import osos.environ["TAVILY_API_KEY"] = "設置你自己的Tavily API Key"
配置方式二

我們也可以將環(huán)境變量設置在系統(tǒng)環(huán)境變量里。博主的電腦為Win11操作系統(tǒng),步驟為:

桌面“此電腦”圖標左鍵選中->鼠標右鍵點擊彈出菜單中的“屬性”->在打開的“系統(tǒng)信息”界面點擊“高級系統(tǒng)設置”->在彈出的“系統(tǒng)屬性”面板點擊“環(huán)境變量”。

在彈出的“環(huán)境變量”面板中左鍵點擊“系統(tǒng)變量”下的“新建”->在彈出的“新建系統(tǒng)變量”面板中的“變量名”輸入TAVILY_API_KEY->“變量值”輸入自己的Tavily API Key->點擊“確定”。

博主筆記:博主推薦“配置方式二”這種方式來配置環(huán)境變量。因為這樣API Key不會存在代碼中,別人也就不會知道你的API Key是多少了,防止自己的敏感信息被泄露。

重啟電腦使環(huán)境變量生效。

Tavily測試完整代碼

我們可以寫一段代碼來測試Tavily環(huán)境變量是否生效。

# 從langchain_community工具包的tavily_search模塊中導入TavilySearchResults類
from langchain_community.tools.tavily_search import TavilySearchResults# 創(chuàng)建一個TavilySearchResults類的實例,設置最大返回結果數(shù)量為2
search = TavilySearchResults(max_results=2)
# 調(diào)用search實例的invoke方法,傳入查詢語句,并將結果打印輸出
print(search.invoke("今天北京天氣怎么樣"))
?Tavily測試運行結果
[{'url': 'https://tianqi.moji.com/today/china/beijing/beijing', 'content': '首頁 天氣 下載 資訊 關于墨跡 天氣 中國 北京市, 北京市, 中國 熱門時景 更多 附近地區(qū) 更多 附近景點 更多 1  晴 晴 1°日出 07:14 晴 -9°日落 17:43 周六 晴  多云 02/08 *   周日 晴  晴 02/09 *   周一 晴  多云 02/10 *   周二 多云  多云 02/11 晴 02/12 *   周四 晴  晴 02/13 多云 02/14 *   周六 多云  晴 02/15 *   周日 晴  晴 02/16 *   周一 晴  晴 02/17 *   周二 晴  多云 02/18 *   周三 陰  陰 02/19 *   周四 陰  陰 02/20 *   周五 陰  陰 02/21 *   周六 陰  *   周日 陰  晴 02/23 較適宜 狗狗 不適宜 貓咪 不適宜 運動 不適宜 廣場舞 較適宜 釣魚 不適宜 劃船 較不適宜 夜生活 較適宜 旅游 較適宜 洗車 較不適宜 約會 較適宜 逛街 pm2.5 pm2.5省份列表 pm2.5城市列表'}, {'url': 'https://tianqi.fliggy.com/110100/', 'content': '【北京天氣預報】最新實時天氣,北京旅游指數(shù)/交通指數(shù),24小時/未來天氣預報查詢 - 飛豬天氣 搜索 我的訂單 注冊 登錄 飛豬國際 聯(lián)系我們 機票 酒店 火車票 旅游度假 旅游度假 -10℃最低 -12℃ - 最高 -1℃ 風速:10km/h 北京2月8日 02:02天氣預報,今天-12℃--1℃,晴, 風向情況:東南風,總降水量:0.00mm,相對濕度:28%。北京今日生活指數(shù): 交通指數(shù),良好 (天氣較好,路面干燥,交通氣象條件良好,車輛可以正常行駛。),旅游指數(shù),適宜 (天氣較好,溫度適宜,是個好天氣哦。這樣的天氣適宜旅游,您可以盡情地享受大自然的風光。)。未來5天,最低溫度-12℃,最高溫度6℃,查詢北京實時、5天天氣預報,上飛豬天氣預報頻道 -10℃最低 -12℃ - 最高 -1℃ 風速:10km/h 北京2月8日 02:02天氣預報,今天-12℃--1℃,晴, 風向情況:東南風,總降水量:0.00mm,相對濕度:28%。北京今日生活指數(shù): 交通指數(shù),良好 (天氣較好,路面干燥,交通氣象條件良好,車輛可以正常行駛。),旅游指數(shù),適宜 (天氣較好,溫度適宜,是個好天氣哦。這樣的天氣適宜旅游,您可以盡情地享受大自然的風光。)。未來5天,最低溫度-12℃,最高溫度6℃,查詢北京實時、5天天氣預報,上飛豬天氣預報頻道 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 10km/h 體感: -7℃ 最低 -12℃ - 最高 -1℃ 最低 -10℃ - 最高 1℃ 最低 -9℃ - 最高 3℃ 最低 -6℃ - 最高 5℃ 最低 -4℃ - 最高 6℃ 廊坊-12℃ - 0℃ 天津-9℃ - -1℃ 保定-14℃ - 0℃ 唐山-13℃ - 0℃ 張家口-19℃ - -9℃ 承德-17℃ - -3℃ 滄州-12℃ - 0℃ 喬一喬怪味餐廳(東升店)天氣 Gucci(成都天府機場店)天氣 韓式旋轉(zhuǎn)小火鍋(金利來店)天氣 羅莎蛋糕(橙子街店)天氣 北京2月8日 02:02天氣預報,今天-12℃--1℃,晴, 風向情況:東南風,總降水量:0.00mm,相對濕度:28%。北京今日生活指數(shù): 交通指數(shù),良好 (天氣較好,路面干燥,交通氣象條件良好,車輛可以正常行駛。),旅游指數(shù),適宜 (天氣較好,溫度適宜,是個好天氣哦。這樣的天氣適宜旅游,您可以盡情地享受大自然的風光。)。未來5天,最低溫度-12℃,最高溫度6℃,查詢北京實時、5天天氣預報,上飛豬天氣預報頻道'}]進程已結束,退出代碼為 0

Retriever

在自然語言處理(NLP)和信息檢索領域,Retriever(檢索器)是一個非常重要的組件,它是一種用于從大量文本數(shù)據(jù)(如文檔集合、知識庫等)中快速定位和提取與給定查詢相關信息的工具或算法。它的核心任務是在眾多文本片段中篩選出最有可能包含問題答案或與查詢相關的部分。

RetrieverLangChain庫中的一個模塊,用于檢索工具。檢索工具的主要用途是從大型文本集合或知識庫中找到相關信息。它們通常用于問答系統(tǒng)、對話智能體和其他需要從大量文本數(shù)據(jù)中提取信息的應用程序。我們還可以將在自己的一些數(shù)據(jù)上創(chuàng)建一個Retriever

Retriever測試完整代碼

在執(zhí)行下列代碼前,請先使用pip安裝faiss-cpufaiss-gpu。

pip install faiss-cpu

該命令用于安裝僅支持CPU計算的Faiss版本。如果大家使用的計算機沒有NVIDIA GPU或者不需要利用GPU的強大計算能力來加速相似性搜索等操作,就可以選擇安裝這個版本。它可以在各種具備CPU的計算機上運行,包括集成顯卡的電腦,因為它不依賴于GPU硬件。?

pip install faiss-gpu

此命令用于安裝支持GPU加速的Faiss版本。它依賴于NVIDIA GPU以及相應的CUDA工具包。如果大家的電腦擁有NVIDIA GPU并且希望利用其并行計算能力來顯著提高Faiss的搜索速度,尤其是在處理大規(guī)模向量數(shù)據(jù)時,那么應該選擇安裝這個版本。?

博主筆記:由于博主在這寫這篇博文的時候,使用的電腦是沒有NVIDIA GPU,所以用的第一個命令。請大家根據(jù)自身的電腦情況來選擇使用的安裝命令。?

FaissFacebook AI Research開發(fā)的用于高效相似性搜索和聚類密集向量的庫,特點是高性能、索引類型多樣且易于使用。在LangChain中,Faiss主要用于:支持向量數(shù)據(jù)庫功能增強檢索能力、與其他組件集成。

# 導入os模塊,該模塊提供了與操作系統(tǒng)進行交互的功能
import os
# 設置USER_AGENT環(huán)境變量,模擬Chrome瀏覽器在Windows11系統(tǒng)上的請求頭信息
os.environ["USER_AGENT"] = ("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/118.0.0.0 Safari/537.36")
# 從langchain_community.document_loaders模塊導入WebBaseLoader類,用于從網(wǎng)頁加載文檔
from langchain_community.document_loaders import WebBaseLoader
# 從 langchain_community.vectorstores模塊導入FAISS類,用于創(chuàng)建基于FAISS的向量存儲
from langchain_community.vectorstores import FAISS
# 從langchain_openai模塊導入OpenAIEmbeddings類,用于將文本轉(zhuǎn)換為向量表示
from langchain_openai import OpenAIEmbeddings
# 從langchain_text_splitters模塊導入RecursiveCharacterTextSplitter類,用于對文檔進行文本分割
from langchain_text_splitters import RecursiveCharacterTextSplitter# 創(chuàng)建一個WebBaseLoader實例,指定要加載的網(wǎng)頁URL為關于狗的維基百科頁面
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8A%AC")
# 調(diào)用loader的load方法,從指定網(wǎng)頁加載文檔內(nèi)容
docs = loader.load()
# 創(chuàng)建一個RecursiveCharacterTextSplitter實例,設置每個文本塊的大小為1000個字符,重疊部分為200個字符
# 并使用該實例對加載的文檔進行分割
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200
).split_documents(docs)
# 使用FAISS類的from_documents方法,將分割后的文檔和OpenAIEmbeddings實例傳入,創(chuàng)建向量存儲
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
# 調(diào)用vector的as_retriever方法,將向量存儲轉(zhuǎn)換為檢索器對象
retriever = vector.as_retriever()
# 調(diào)用檢索器的invoke方法,傳入查詢語句,并取第一個檢索結果
result = retriever.invoke("狗的特征")[0]
# 打印檢索到的結果
print(result)
Retriever測試運行結果
page_content='種族特性
犬類擁有與掠食者相稱的身體用于追捕,跳躍和殺死獵物(圖為魏瑪倫納獵狗,Weimaraner)
犬類通過伸舌頭喘氣以蒸發(fā)水汽從而降溫,時值夏季高溫天
現(xiàn)代狗種在體形,外貌和行為上要比其他馴化動物的差異更大。但即使各個種類差異如此極端,家犬與其野生祖先狼仍然有著共同的屬性。所有犬科動物都是掠食動物或食腐動物,擁有便于攻擊,抓捕和撕咬它們食物的鋒利尖牙和有力的爪。
狗類四肢的結構能夠使它們在必要時快速向前出擊或是進行跳躍動作,用于追趕或抓捕它們的獵物。因此,它們擁有小而結實的足部,使用前足移動;前腿松軟靈活,肌肉只用于與軀干連接;后腿則強健有力。
狗類是二元色視者,所以以人類的標準來說狗類是色盲1,2,基本上在狗的世界中他們可以看見的是藍色與黃色。又由于狗類眼球透鏡比人類要平,所以它們不能看見過多的細節(jié)事物;另一方面,狗眼比人眼對光和運動更為敏感。有些種類的狗,特別是最好的視力型嗅獵犬(sighthound),擁有270°的視力范圍(人類只有100°到120°),而大頭狗(broad-headed)向前的視力范圍則要小一些,只有180°。1,2
狗類對音頻聲波的感覺極限為67Hz至45,000Hz(人類為20Hz至20,000Hz;貓為45Hz至64,000Hz )2,另外,狗的耳朵是可以活動的,這可以幫助它們快速準確的定位聲音的來源。狗對聲音的定位比人類迅速,聽見聲音的距離也要比人類遠四倍,但比貓遜色。' metadata={'source': 'https://zh.wikipedia.org/wiki/%E7%8A%AC', 'title': '犬 - 維基百科,自由的百科全書', 'language': 'zh'}進程已結束,退出代碼為 0

博主筆記:

  1. os.environ["USER_AGENT"]的賦值,一定要根據(jù)自己電腦的操作系統(tǒng)進行設置。
  2. 設置USER_AGENT代碼要放在WebBaseLoader前面,是因為WebBaseLoader在被創(chuàng)建并調(diào)用load方法時,就會立即發(fā)起HTTP請求去訪問指定的網(wǎng)頁。在發(fā)起請求的過程中,它會讀取當前環(huán)境中的USER_AGEN信息并將其添加到請求頭里。

使用語言模型

我們已經(jīng)成功創(chuàng)建并配置好了Tavily搜索工具和Retriever檢索工具,接下來,我們可以創(chuàng)建一個工具列表,將這兩個工具添加進去,以便在后續(xù)的Agent或者Chain中方便地調(diào)用這些工具來完成特定的任務。

下面我來給大家講解下如何使用語言模型來調(diào)用工具。LangChain支持許多可以互換使用的不同語言模型,請大家選擇想要使用的語言模型。

完整代碼
# 導入os模塊,該模塊提供了與操作系統(tǒng)進行交互的功能
import os
# 設置USER_AGENT環(huán)境變量,模擬Chrome瀏覽器在Windows11系統(tǒng)上的請求頭信息
os.environ["USER_AGENT"] = ("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/118.0.0.0 Safari/537.36")
# 從langchain_community工具包的tavily_search模塊中導入TavilySearchResults類
from langchain_community.tools.tavily_search import TavilySearchResults
# 從langchain_community.document_loaders模塊導入WebBaseLoader類,用于從網(wǎng)頁加載文檔
from langchain_community.document_loaders import WebBaseLoader
# 從 langchain_community.vectorstores模塊導入FAISS類,用于創(chuàng)建基于FAISS的向量存儲
from langchain_community.vectorstores import FAISS
# 從langchain_openai模塊導入OpenAIEmbeddings類,用于將文本轉(zhuǎn)換為向量表示
from langchain_openai import OpenAIEmbeddings
# 從langchain_text_splitters模塊導入RecursiveCharacterTextSplitter類,用于對文檔進行文本分割
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 從langchain.tools.retriever模塊導入create_retriever_tool函數(shù),用于創(chuàng)建基于檢索器的工具
from langchain.tools.retriever import create_retriever_tool
# 從langchain_openai模塊導入ChatOpenAI類,用于創(chuàng)建調(diào)用OpenAI聊天模型的實例
from langchain_openai import ChatOpenAI
# 從langchain_core.messages模塊導入HumanMessage類,用于創(chuàng)建表示人類輸入消息的對象
from langchain_core.messages import HumanMessage# 創(chuàng)建一個TavilySearchResults類的實例,設置最大返回結果數(shù)量為2
search = TavilySearchResults(max_results=2)# 創(chuàng)建一個WebBaseLoader實例,指定要加載的網(wǎng)頁URL為關于狗的維基百科頁面
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8A%AC")
# 調(diào)用loader的load方法,從指定網(wǎng)頁加載文檔內(nèi)容
docs = loader.load()
# 創(chuàng)建一個RecursiveCharacterTextSplitter實例,設置每個文本塊的大小為1000個字符,重疊部分為200個字符
# 并使用該實例對加載的文檔進行分割
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200
).split_documents(docs)
# 使用FAISS類的from_documents方法,將分割后的文檔和OpenAIEmbeddings實例傳入,創(chuàng)建向量存儲
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
# 調(diào)用vector的as_retriever方法,將向量存儲轉(zhuǎn)換為檢索器對象
retriever = vector.as_retriever()
# 使用create_retriever_tool函數(shù)創(chuàng)建一個檢索器工具,該工具基于前面創(chuàng)建的檢索器 retriever
retriever_tool = create_retriever_tool(retriever,"wiki_search",  # 為工具命名為"wiki_search",方便后續(xù)識別和調(diào)用"搜索維基百科",  # 為工具添加描述"搜索維基百科",使得模型在使用工具時能理解其用途
)# 創(chuàng)建一個包含Tavily搜索實例和檢索器工具的工具列表
tools = [search, retriever_tool]
# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 使用chat_model調(diào)用模型,傳入一個人類消息"hi!",獲取模型的響應
response = chat_model.invoke([HumanMessage(content="hi!")])
# 打印模型響應的內(nèi)容
print(response.content)
# 將工具列表綁定到chat_model上,創(chuàng)建一個帶有工具的模型實例
model_with_tools = chat_model.bind_tools(tools)
# 使用帶有工具的模型實例調(diào)用模型,傳入一個人類消息"你好",獲取模型的響應
response = model_with_tools.invoke([HumanMessage(content="你好")])
# 打印模型響應的內(nèi)容
print(f"ContentString: {response.content}")
# 打印模型響應中涉及的工具調(diào)用信息
print(f"ToolCalls: {response.tool_calls}")
# 使用帶有工具的模型實例調(diào)用模型,傳入一個人類消息"今天北京天氣怎么樣",獲取模型的響應
response = model_with_tools.invoke([HumanMessage(content="今天北京天氣怎么樣")])
# 打印模型響應的內(nèi)容
print(f"ContentString: {response.content}")
# 打印模型響應中涉及的工具調(diào)用信息
print(f"ToolCalls: {response.tool_calls}")
運行結果
Hello! How can I assist you today?
ContentString: 你好!有什么可以幫助你的嗎?
ToolCalls: []
ContentString: 
ToolCalls: [{'name': 'tavily_search_results_json', 'args': {'query': '北京今天天氣'}, 'id': 'call_9uQYDblcSP5WjKw0W8s7D6u4', 'type': 'tool_call'}]進程已結束,退出代碼為 0

運行結果分析

首先,當我們傳入消息列表來調(diào)用語言模型時,而此時我們沒有給語言模型綁定任何工具,最終返回的響應通常確實是一個包含文本內(nèi)容的對象,從這個對象中提取的主要內(nèi)容表現(xiàn)為一個字符串content字符串。

# 創(chuàng)建一個包含Tavily搜索實例和檢索器工具的工具列表
tools = [search, retriever_tool]
# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 使用chat_model調(diào)用模型,傳入一個人類消息"hi!",獲取模型的響應
response = chat_model.invoke([HumanMessage(content="hi!")])
# 打印模型響應的內(nèi)容
print(response.content)
Hello! How can I assist you today?進程已結束,退出代碼為 0

其次,我們給語言模型綁定了工具列表,其中包括我們在上面講解到的Tavily搜索工具和Retriever檢索工具。我們再次調(diào)用語言模型,繼續(xù)用一個基本消息來調(diào)用它,看它的回復結果。

我們查看content字段和tool_calls字段,發(fā)現(xiàn)content有內(nèi)容,而tool_calls是空的,說明此時語言模型并沒有借助工具集來處理用戶需求。

# 將工具列表綁定到chat_model上,創(chuàng)建一個帶有工具的模型實例
model_with_tools = chat_model.bind_tools(tools)
# 使用帶有工具的模型實例調(diào)用模型,傳入一個人類消息"你好",獲取模型的響應
response = model_with_tools.invoke([HumanMessage(content="你好")])
# 打印模型響應的內(nèi)容
print(f"ContentString: {response.content}")
# 打印模型響應中涉及的工具調(diào)用信息
print(f"ToolCalls: {response.tool_calls}")
ContentString: 你好!有什么可以幫助你的嗎?
ToolCalls: []進程已結束,退出代碼為 0

然后,在已經(jīng)正確為語言模型綁定了包含Tavily Search工具等的工具集,且工具配置和初始化均無誤的前提下,我們再次向語言模型提問關于天氣的問題,這類問題期望語言模型借助工具集來處理。

提問后,我們查看模型響應的content字段和tool_calls字段,發(fā)現(xiàn)content字段沒有內(nèi)容,而tool_calls字段中存在工具調(diào)用信息,顯示語言模型請求調(diào)用Tavily Search工具。

# 使用帶有工具的模型實例調(diào)用模型,傳入一個人類消息"今天北京天氣怎么樣",獲取模型的響應
response = model_with_tools.invoke([HumanMessage(content="今天北京天氣怎么樣")])
# 打印模型響應的內(nèi)容
print(f"ContentString: {response.content}")
# 打印模型響應中涉及的工具調(diào)用信息
print(f"ToolCalls: {response.tool_calls}")
ContentString: 
ToolCalls: [{'name': 'tavily_search_results_json', 'args': {'query': '北京今天天氣'}, 'id': 'call_9uQYDblcSP5WjKw0W8s7D6u4', 'type': 'tool_call'}]進程已結束,退出代碼為 0

這表明根據(jù)模型的判斷,需要借助該工具來獲取回答問題所需的信息。由于直接通過模型響應中的工具調(diào)用指示并不能自動執(zhí)行工具調(diào)用,為了實際調(diào)用Tavily Search工具獲取天氣信息,我們需要創(chuàng)建智能體程序。

智能體程序能夠根據(jù)模型的工具調(diào)用請求,實際調(diào)用工具并將工具返回的結果再反饋給語言模型,以幫助生成最終的回答。請大家繼續(xù)往下看。

創(chuàng)建智能體程序

既然我們已經(jīng)成功定義好了用于輔助的工具,以及完成了大語言模型(LLM)的配置,接下來就可以著手創(chuàng)建智能體程序了。

我們計劃使用的是一個工具調(diào)用智能體程序,這種智能體程序能夠在處理任務時根據(jù)需求調(diào)用預先設定好的工具,以獲取更準確、更全面的信息來完成任務。

在創(chuàng)建智能體程序的過程中,我們首先需要選擇一個合適的提示,這個提示將用于指導智能體程序的行為和決策邏輯。

我們從LangChain中的LangSmith平臺中獲取一個特定的提示模板,并查看其包含的消息內(nèi)容,為后續(xù)構建基于該提示的智能體或與語言模型的交互做準備。以下鏈接可訪問該模板:LangSmith

獲取模板完整代碼

# 從langchain導入hub模塊,用于從LangChain Hub拉取提示模板
from langchain import hub# 從LangChain Hub拉取名為"hwchase17/openai-functions-agent"的提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
# 打印拉取到的提示模板中的消息內(nèi)容
print(prompt.messages)

獲取模板運行結果

[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='You are a helpful assistant'), additional_kwargs={}), MessagesPlaceholder(variable_name='chat_history', optional=True), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], input_types={}, partial_variables={}, template='{input}'), additional_kwargs={}), MessagesPlaceholder(variable_name='agent_scratchpad')]進程已結束,退出代碼為 0

現(xiàn)在,我們可以使用LLM、提示模板和工具初始化智能體。智能體負責接收輸入并決定采取什么行動。

初始化智能體演示代碼

# 導入os模塊,該模塊提供了與操作系統(tǒng)進行交互的功能
import os
# 設置USER_AGENT環(huán)境變量,模擬Chrome瀏覽器在Windows11系統(tǒng)上的請求頭信息
os.environ["USER_AGENT"] = ("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/118.0.0.0 Safari/537.36")
# 從langchain_community工具包的tavily_search模塊中導入TavilySearchResults類
from langchain_community.tools.tavily_search import TavilySearchResults
# 從langchain_community.document_loaders模塊導入WebBaseLoader類,用于從網(wǎng)頁加載文檔
from langchain_community.document_loaders import WebBaseLoader
# 從 langchain_community.vectorstores模塊導入FAISS類,用于創(chuàng)建基于FAISS的向量存儲
from langchain_community.vectorstores import FAISS
# 從langchain_openai模塊導入OpenAIEmbeddings類,用于將文本轉(zhuǎn)換為向量表示
from langchain_openai import OpenAIEmbeddings
# 從langchain_text_splitters模塊導入RecursiveCharacterTextSplitter類,用于對文檔進行文本分割
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 從langchain.tools.retriever模塊導入create_retriever_tool函數(shù),用于創(chuàng)建基于檢索器的工具
from langchain.tools.retriever import create_retriever_tool
# 從langchain_openai模塊導入ChatOpenAI類,用于創(chuàng)建調(diào)用OpenAI聊天模型的實例
from langchain_openai import ChatOpenAI
# 從langchain導入hub模塊,用于從LangChain Hub拉取提示模板
from langchain import hub
# 從langchain.agents模塊導入create_tool_calling_agent函數(shù),用于創(chuàng)建工具調(diào)用智能體
from langchain.agents import create_tool_calling_agent
# 從langchain.agents模塊導入AgentExecutor類,用于執(zhí)行智能體
from langchain.agents import AgentExecutor# 創(chuàng)建一個TavilySearchResults類的實例,設置最大返回結果數(shù)量為2
search = TavilySearchResults(max_results=2)# 創(chuàng)建一個WebBaseLoader實例,指定要加載的網(wǎng)頁URL為關于狗的維基百科頁面
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8A%AC")
# 調(diào)用loader的load方法,從指定網(wǎng)頁加載文檔內(nèi)容
docs = loader.load()
# 創(chuàng)建一個RecursiveCharacterTextSplitter實例,設置每個文本塊的大小為1000個字符,重疊部分為200個字符
# 并使用該實例對加載的文檔進行分割
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200
).split_documents(docs)
# 使用FAISS類的from_documents方法,將分割后的文檔和OpenAIEmbeddings實例傳入,創(chuàng)建向量存儲
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
# 調(diào)用vector的as_retriever方法,將向量存儲轉(zhuǎn)換為檢索器對象
retriever = vector.as_retriever()
# 使用create_retriever_tool函數(shù)創(chuàng)建一個檢索器工具,該工具基于前面創(chuàng)建的檢索器retriever
retriever_tool = create_retriever_tool(retriever,"wiki_search",  # 為工具命名為"wiki_search",方便后續(xù)識別和調(diào)用"搜索維基百科",  # 為工具添加描述"搜索維基百科",使得模型在使用工具時能理解其用途
)# 創(chuàng)建一個包含Tavily搜索實例和檢索器工具的工具列表
tools = [search, retriever_tool]
# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 從LangChain Hub拉取名為"hwchase17/openai-functions-agent"的提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
# 使用create_tool_calling_agent函數(shù)創(chuàng)建一個工具調(diào)用智能體,傳入聊天模型、工具列表和提示模板
agent = create_tool_calling_agent(chat_model, tools, prompt)

大家注意下,目前智能體不執(zhí)行任何操作,因為我們還有沒有創(chuàng)建AgentExecutor

另外,大家看代碼里,我們傳遞的是chat_model,而不是model_with_tools。這是因為 create_tool_calling_agent會在內(nèi)部完成工具綁定的操作,即調(diào)用.bind_tools。

最后,我們將智能體與AgentExecutor中的工具結合起來(AgentExecutor會不斷地讓智能體對輸入進行分析和決策,也就是重復調(diào)用智能體)。

創(chuàng)建智能體執(zhí)行器演示代碼

# 導入os模塊,該模塊提供了與操作系統(tǒng)進行交互的功能
import os
# 設置USER_AGENT環(huán)境變量,模擬Chrome瀏覽器在Windows11系統(tǒng)上的請求頭信息
os.environ["USER_AGENT"] = ("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/118.0.0.0 Safari/537.36")
# 從langchain_community工具包的tavily_search模塊中導入TavilySearchResults類
from langchain_community.tools.tavily_search import TavilySearchResults
# 從langchain_community.document_loaders模塊導入WebBaseLoader類,用于從網(wǎng)頁加載文檔
from langchain_community.document_loaders import WebBaseLoader
# 從 langchain_community.vectorstores模塊導入FAISS類,用于創(chuàng)建基于FAISS的向量存儲
from langchain_community.vectorstores import FAISS
# 從langchain_openai模塊導入OpenAIEmbeddings類,用于將文本轉(zhuǎn)換為向量表示
from langchain_openai import OpenAIEmbeddings
# 從langchain_text_splitters模塊導入RecursiveCharacterTextSplitter類,用于對文檔進行文本分割
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 從langchain.tools.retriever模塊導入create_retriever_tool函數(shù),用于創(chuàng)建基于檢索器的工具
from langchain.tools.retriever import create_retriever_tool
# 從langchain_openai模塊導入ChatOpenAI類,用于創(chuàng)建調(diào)用OpenAI聊天模型的實例
from langchain_openai import ChatOpenAI
# 從langchain導入hub模塊,用于從LangChain Hub拉取提示模板
from langchain import hub
# 從langchain.agents模塊導入create_tool_calling_agent函數(shù),用于創(chuàng)建工具調(diào)用智能體
from langchain.agents import create_tool_calling_agent
# 從langchain.agents模塊導入AgentExecutor類,用于執(zhí)行智能體
from langchain.agents import AgentExecutor# 創(chuàng)建一個TavilySearchResults類的實例,設置最大返回結果數(shù)量為2
search = TavilySearchResults(max_results=2)# 創(chuàng)建一個WebBaseLoader實例,指定要加載的網(wǎng)頁URL為關于狗的維基百科頁面
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8A%AC")
# 調(diào)用loader的load方法,從指定網(wǎng)頁加載文檔內(nèi)容
docs = loader.load()
# 創(chuàng)建一個RecursiveCharacterTextSplitter實例,設置每個文本塊的大小為1000個字符,重疊部分為200個字符
# 并使用該實例對加載的文檔進行分割
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200
).split_documents(docs)
# 使用FAISS類的from_documents方法,將分割后的文檔和OpenAIEmbeddings實例傳入,創(chuàng)建向量存儲
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
# 調(diào)用vector的as_retriever方法,將向量存儲轉(zhuǎn)換為檢索器對象
retriever = vector.as_retriever()
# 使用create_retriever_tool函數(shù)創(chuàng)建一個檢索器工具,該工具基于前面創(chuàng)建的檢索器retriever
retriever_tool = create_retriever_tool(retriever,"wiki_search",  # 為工具命名為"wiki_search",方便后續(xù)識別和調(diào)用"搜索維基百科",  # 為工具添加描述"搜索維基百科",使得模型在使用工具時能理解其用途
)# 創(chuàng)建一個包含Tavily搜索實例和檢索器工具的工具列表
tools = [search, retriever_tool]
# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 從LangChain Hub拉取名為"hwchase17/openai-functions-agent"的提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
# 打印拉取到的提示模板中的消息內(nèi)容
print(prompt.messages)
# 使用create_tool_calling_agent函數(shù)創(chuàng)建一個工具調(diào)用智能體,傳入聊天模型、工具列表和提示模板
agent = create_tool_calling_agent(chat_model, tools, prompt)
# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=tools)

運行智能體

現(xiàn)在我們開始運行智能體程序。

完整代碼
# 導入os模塊,該模塊提供了與操作系統(tǒng)進行交互的功能
import os
# 設置USER_AGENT環(huán)境變量,模擬Chrome瀏覽器在Windows11系統(tǒng)上的請求頭信息
os.environ["USER_AGENT"] = ("Mozilla/5.0 (Windows NT 11.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/118.0.0.0 Safari/537.36")
# 從langchain_community工具包的tavily_search模塊中導入TavilySearchResults類
from langchain_community.tools.tavily_search import TavilySearchResults
# 從langchain_community.document_loaders模塊導入WebBaseLoader類,用于從網(wǎng)頁加載文檔
from langchain_community.document_loaders import WebBaseLoader
# 從 langchain_community.vectorstores模塊導入FAISS類,用于創(chuàng)建基于FAISS的向量存儲
from langchain_community.vectorstores import FAISS
# 從langchain_openai模塊導入OpenAIEmbeddings類,用于將文本轉(zhuǎn)換為向量表示
from langchain_openai import OpenAIEmbeddings
# 從langchain_text_splitters模塊導入RecursiveCharacterTextSplitter類,用于對文檔進行文本分割
from langchain_text_splitters import RecursiveCharacterTextSplitter
# 從langchain.tools.retriever模塊導入create_retriever_tool函數(shù),用于創(chuàng)建基于檢索器的工具
from langchain.tools.retriever import create_retriever_tool
# 從langchain_openai模塊導入ChatOpenAI類,用于創(chuàng)建調(diào)用OpenAI聊天模型的實例
from langchain_openai import ChatOpenAI
# 從langchain導入hub模塊,用于從LangChain Hub拉取提示模板
from langchain import hub
# 從langchain.agents模塊導入create_tool_calling_agent函數(shù),用于創(chuàng)建工具調(diào)用智能體
from langchain.agents import create_tool_calling_agent
# 從langchain.agents模塊導入AgentExecutor類,用于執(zhí)行智能體
from langchain.agents import AgentExecutor# 創(chuàng)建一個TavilySearchResults類的實例,設置最大返回結果數(shù)量為2
search = TavilySearchResults(max_results=2)# 創(chuàng)建一個WebBaseLoader實例,指定要加載的網(wǎng)頁URL為關于狗的維基百科頁面
loader = WebBaseLoader("https://zh.wikipedia.org/wiki/%E7%8A%AC")
# 調(diào)用loader的load方法,從指定網(wǎng)頁加載文檔內(nèi)容
docs = loader.load()
# 創(chuàng)建一個RecursiveCharacterTextSplitter實例,設置每個文本塊的大小為1000個字符,重疊部分為200個字符
# 并使用該實例對加載的文檔進行分割
documents = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200
).split_documents(docs)
# 使用FAISS類的from_documents方法,將分割后的文檔和OpenAIEmbeddings實例傳入,創(chuàng)建向量存儲
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
# 調(diào)用vector的as_retriever方法,將向量存儲轉(zhuǎn)換為檢索器對象
retriever = vector.as_retriever()
# 使用create_retriever_tool函數(shù)創(chuàng)建一個檢索器工具,該工具基于前面創(chuàng)建的檢索器retriever
retriever_tool = create_retriever_tool(retriever,"wiki_search",  # 為工具命名為"wiki_search",方便后續(xù)識別和調(diào)用"搜索維基百科",  # 為工具添加描述"搜索維基百科",使得模型在使用工具時能理解其用途
)# 創(chuàng)建一個包含Tavily搜索實例和檢索器工具的工具列表
tools = [search, retriever_tool]
# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 從LangChain Hub拉取名為"hwchase17/openai-functions-agent"的提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
# 使用create_tool_calling_agent函數(shù)創(chuàng)建一個工具調(diào)用智能體,傳入聊天模型、工具列表和提示模板
agent = create_tool_calling_agent(chat_model, tools, prompt)
# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=tools)
# 調(diào)用智能體執(zhí)行器,傳入包含用戶輸入“你好”,打印智能體處理后的結果
print(agent_executor.invoke({"input": "你好"}))
# 調(diào)用智能體執(zhí)行器,傳入包含用戶輸入“狗的特征”,打印智能體處理后的結果
print(agent_executor.invoke({"input": "狗的特征"}))
# 調(diào)用智能體執(zhí)行器,傳入包含用戶輸入“今天北京天氣怎么樣”,打印智能體處理后的結果
print(agent_executor.invoke({"input": "今天北京天氣怎么樣"}))
運行結果
{'input': '你好', 'output': '你好!有什么可以幫助你的嗎?'}
{'input': '狗的特征', 'output': '狗類有許多特征,包括:\n\n1. 犬類是類似掠食者的動物,具有追捕、跳躍和殺死獵物的身體結構。\n2. 狗類通過伸舌頭喘氣來蒸發(fā)水汽降溫,適應夏季高溫天氣。\n3. 狗類擁有鋒利的尖牙和有力的爪,適合攻擊、抓捕和撕咬食物。\n4. 狗類四肢結構使它們可以快速追逐或跳躍,擁有小而結實的足部和強健有力的后腿。\n5. 狗類是二元色視者,在狗的世界中可以看見藍色和黃色,但不能看見過多的細節(jié)事物。\n6. 狗類對音頻聲波的感覺范圍為67Hz至45,000Hz,比人類更敏感,可以迅速準確地定位聲音的來源。\n\n除此之外,狗類與人類有著密切的關系,成為人類的寵物并扮演多重角色,包括導盲、搜救、偵緝等工作。狗類也被證明能傳遞深度情感,具有認知能力和學習人類社會技能的能力,與人類的情緒產(chǎn)生共鳴。'}
{'input': '今天北京天氣怎么樣', 'output': '今天北京的天氣是晴轉(zhuǎn)多云,最低氣溫為-11℃,最高氣溫為-1℃,北風微風。您可以查看更多詳細信息和天氣預報,請訪問以下鏈接:[北京天氣詳情](https://tianqi.moji.com/today/china/beijing/beijing)。'}進程已結束,退出代碼為 0

運行結果分析

首先,我們可對智能體進行多個查詢,這些查詢是無狀態(tài)的(意味著智能體不會記住先前交互。

我們先看一下對智能體進行基礎問題提問,智能體如何對查詢做出回應。

# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=tools)
# 調(diào)用智能體執(zhí)行器,傳入包含用戶輸入“你好”,打印智能體處理后的結果
print(agent_executor.invoke({"input": "你好"}))
{'input': '你好', 'output': '你好!有什么可以幫助你的嗎?'}進程已結束,退出代碼為 0

我們在LangSmith平臺查看智能體具體做了什么,并確認它是否調(diào)用了工具。

我們發(fā)現(xiàn)此時智能體并沒有借助工具集來處理用戶需求。

接著,我們再去向智能體提問 “狗的特征”,我們期待智能體借助檢索器retriever來檢索內(nèi)容,然后再對用戶提問做出回答。

# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=tools)
# 調(diào)用智能體執(zhí)行器,傳入包含用戶輸入“狗的特征”,打印智能體處理后的結果
print(agent_executor.invoke({"input": "狗的特征"}))
{'input': '狗的特征', 'output': '狗類有許多特征,包括:\n\n1. 犬類是類似掠食者的動物,具有追捕、跳躍和殺死獵物的身體結構。\n2. 狗類通過伸舌頭喘氣來蒸發(fā)水汽降溫,適應夏季高溫天氣。\n3. 狗類擁有鋒利的尖牙和有力的爪,適合攻擊、抓捕和撕咬食物。\n4. 狗類四肢結構使它們可以快速追逐或跳躍,擁有小而結實的足部和強健有力的后腿。\n5. 狗類是二元色視者,在狗的世界中可以看見藍色和黃色,但不能看見過多的細節(jié)事物。\n6. 狗類對音頻聲波的感覺范圍為67Hz至45,000Hz,比人類更敏感,可以迅速準確地定位聲音的來源。\n\n除此之外,狗類與人類有著密切的關系,成為人類的寵物并扮演多重角色,包括導盲、搜救、偵緝等工作。狗類也被證明能傳遞深度情感,具有認知能力和學習人類社會技能的能力,與人類的情緒產(chǎn)生共鳴。'}進程已結束,退出代碼為 0

為了確切知曉智能體在處理任務時是否調(diào)用了檢索器Retriever來檢索相關內(nèi)容,?我們在LangSmith平臺上進行細致查看。

我們發(fā)現(xiàn)智能體對于“狗的特征”進行了查詢,并且使用了檢索器Retriever。這符合我們的預期結果。

最后,我們再去向智能體提問 “今天北京天氣怎么樣”,我們期待智能體借助Tavily搜索工具來搜索內(nèi)容,然后再對用戶提問做出回答。

# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=tools)
# 調(diào)用智能體執(zhí)行器,傳入包含用戶輸入“今天北京天氣怎么樣”,打印智能體處理后的結果
print(agent_executor.invoke({"input": "今天北京天氣怎么樣"}))
{'input': '今天北京天氣怎么樣', 'output': '今天北京的天氣是晴轉(zhuǎn)多云,最低氣溫為-11℃,最高氣溫為-1℃,北風微風。您可以查看更多詳細信息和天氣預報,請訪問以下鏈接:[北京天氣詳情](https://tianqi.moji.com/today/china/beijing/beijing)。'}進程已結束,退出代碼為 0

為了確切知曉智能體在處理任務時是否調(diào)用了Tavily搜索工具來搜索相關內(nèi)容,?我們在LangSmith平臺上進行細致查看。?

我們發(fā)現(xiàn)智能體對于“今天北京天氣怎么樣”進行了查詢,并且使用了Tavily搜索工具。這符合我們的預期結果。

綜上,我們發(fā)現(xiàn)我們創(chuàng)建的智能體會根據(jù)不同類型的問題有效的調(diào)用搜索工具。

添加記憶

如前所述,此智能體是無狀態(tài)的。這意味著它不會記住先前的交互內(nèi)容。如果要給它“記憶”,我們需要傳遞先前的chat_history。

完整代碼
# 從langchain_openai庫導入ChatOpenAI類,用于創(chuàng)建OpenAI聊天模型實例
from langchain_openai import ChatOpenAI
# 從langchain導入hub模塊,用于從LangChain Hub拉取提示模板
from langchain import hub
# 從langchain.agents模塊導入create_tool_calling_agent函數(shù),用于創(chuàng)建工具調(diào)用智能體
from langchain.agents import create_tool_calling_agent
# 從langchain.agents模塊導入AgentExecutor類,用于執(zhí)行智能體
from langchain.agents import AgentExecutor
# 從langchain_core.messages模塊導入HumanMessage和AIMessage類,分別表示人類消息和AI消息
from langchain_core.messages import HumanMessage, AIMessage# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 從LangChain Hub拉取名為"hwchase17/openai-functions-agent"的提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
# 調(diào)用create_tool_calling_agent函數(shù)創(chuàng)建一個工具調(diào)用智能體,傳入聊天模型、空工具列表和提示模板
agent = create_tool_calling_agent(chat_model, tools=[], prompt=prompt)
# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=[])
# 定義第一個用戶輸入內(nèi)容
first_input = "你好! 我是Ethan"
# 調(diào)用智能體執(zhí)行器處理第一個輸入,傳入輸入內(nèi)容和空的聊天歷史記錄,得到響應
response = agent_executor.invoke({"input": first_input, "chat_history": []})
# 定義第二個用戶輸入內(nèi)容
second_input = "我的名字是什么?"
# 調(diào)用智能體執(zhí)行器處理第二個輸入,傳入包含第一次交互信息的聊天歷史記錄和第二個輸入,得到新響應
response = agent_executor.invoke({# 構建聊天歷史記錄,包含第一次的人類消息和AI的回復"chat_history": [HumanMessage(content=first_input),AIMessage(content=response['output']),],# 第二個用戶輸入"input": second_input,}
)
# 打印第二次交互的響應結果
print(response)
運行結果
{'chat_history': [HumanMessage(content='你好! 我是Ethan', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,Ethan!有什么我能幫助你的嗎?', additional_kwargs={}, response_metadata={})], 'input': '我的名字是什么?', 'output': '你的名字是Ethan。有什么其他問題我可以回答嗎?'}進程已結束,退出代碼為 0

從運行結果我們看到,在第一次交互中用戶告知了自己的名字,并且這些信息被包含在chat_history中傳遞給了智能體。所以當詢問“我的名字是什么?”時,智能體能夠利用這些 “記憶”(即聊天歷史記錄)來給出正確的回答。

這就體現(xiàn)了通過傳遞聊天歷史記錄為AgentExecutor賦予了記憶功能,使其能夠參考先前的交互信息來處理當前任務。

帶消息歷史記錄的可運行體

RunnableWithMessageHistory。在處理智能體交互消息時,如果希望能自動記錄和跟蹤這些消息,以便后續(xù)使用,可以利用RunnableWithMessageHistory類。將智能體執(zhí)行相關的操作包裝在這個類中,它就能對消息進行自動跟蹤管理,方便為智能體賦予記憶等功能,讓智能體在后續(xù)交互中能參考歷史消息。

在使用RunnableWithMessageHistory類時,因為我們有多個輸入,我們需要指定兩個事項:

  • input_messages_key:用于將輸入添加到對話歷史記錄中的鍵。
  • history_messages_key:用于將加載的消息添加到其中的鍵。
完整代碼
# 從langchain_openai庫導入ChatOpenAI類,用于創(chuàng)建OpenAI聊天模型實例
from langchain_openai import ChatOpenAI
# 從langchain導入hub模塊,用于從LangChain Hub拉取提示模板
from langchain import hub
# 從langchain.agents模塊導入create_tool_calling_agent函數(shù),用于創(chuàng)建工具調(diào)用智能體
from langchain.agents import create_tool_calling_agent
# 從langchain.agents模塊導入AgentExecutor類,用于執(zhí)行智能體
from langchain.agents import AgentExecutor
# 從langchain_community.chat_message_histories模塊導入ChatMessageHistory類,用于管理聊天歷史記錄
from langchain_community.chat_message_histories import ChatMessageHistory
# 從langchain_core.chat_history模塊導入BaseChatMessageHistory類,是聊天歷史記錄類的基類
from langchain_core.chat_history import BaseChatMessageHistory
# 從langchain_core.runnables.history模塊導入RunnableWithMessageHistory類,用于創(chuàng)建帶有消息歷史記錄的可運行對象
from langchain_core.runnables.history import RunnableWithMessageHistory# 創(chuàng)建一個ChatOpenAI實例,指定使用的模型為gpt-3.5-turbo
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
# 從LangChain Hub拉取名為"hwchase17/openai-functions-agent"的提示模板
prompt = hub.pull("hwchase17/openai-functions-agent")
# 調(diào)用create_tool_calling_agent函數(shù)創(chuàng)建一個工具調(diào)用智能體,傳入聊天模型、空工具列表和提示模板
agent = create_tool_calling_agent(chat_model, tools=[], prompt=prompt)
# 創(chuàng)建一個AgentExecutor實例,傳入智能體和工具列表,用于執(zhí)行智能體
agent_executor = AgentExecutor(agent=agent, tools=[])# 定義一個空字典,用于存儲不同會話的聊天歷史記錄
store = {}# 定義一個函數(shù),根據(jù)會話ID獲取對應的聊天歷史記錄,如果不存在則創(chuàng)建一個新的
def get_session_history(session_id: str) -> BaseChatMessageHistory:# 檢查會話ID是否已存在于存儲中if session_id not in store:# 若不存在,為該會話ID創(chuàng)建一個新的聊天歷史記錄實例store[session_id] = ChatMessageHistory()# 返回對應會話ID的聊天歷史記錄return store[session_id]# 創(chuàng)建一個帶有消息歷史記錄的可運行對象,傳入智能體執(zhí)行器、獲取會話歷史記錄的函數(shù)以及輸入和歷史記錄的鍵名
agent_with_chat_history = RunnableWithMessageHistory(agent_executor,get_session_history,input_messages_key="input",history_messages_key="chat_history",
)
# 調(diào)用帶有消息歷史記錄的可運行對象處理輸入,指定會話ID為123,得到響應
response = agent_with_chat_history.invoke({"input": "你好,我是Ethan"},config={"configurable": {"session_id": "123"}},
)
# 打印此次交互的響應結果
print(response)
# 再次調(diào)用帶有消息歷史記錄的可運行對象處理新輸入,使用相同的會話ID,得到新響應
new_response = agent_with_chat_history.invoke({"input": "我叫什么名字?"},config={"configurable": {"session_id": "123"}},
)
# 打印新的交互響應結果
print(new_response)
運行結果
{'input': '你好,我是Ethan', 'chat_history': [], 'output': '你好,Ethan!有什么可以幫助你的嗎?'}
{'input': '我叫什么名字?', 'chat_history': [HumanMessage(content='你好,我是Ethan', additional_kwargs={}, response_metadata={}), AIMessage(content='你好,Ethan!有什么可以幫助你的嗎?', additional_kwargs={}, response_metadata={})], 'output': '您剛剛告訴我您的名字是Ethan。您還有其他問題需要幫助嗎?'}進程已結束,退出代碼為 0

綜上,在開發(fā)智能體等對話式應用時,用戶與智能體的交互是連續(xù)的,需要智能體能夠記住之前的對話內(nèi)容。RunnableWithMessageHistory可以幫助管理對話歷史,使得智能體能夠理解上下文,提供更準確和連貫的回答。

當處理需要多個步驟完成的任務時,每個步驟的結果和交互信息都可能對后續(xù)步驟產(chǎn)生影響。使用 RunnableWithMessageHistory可以記錄這些步驟中的消息,確保智能體在整個任務過程中能夠參考歷史信息,順利完成任務。

結束

好了,以上就是本次分享的全部內(nèi)容了。博主希望大家能熟練的掌握創(chuàng)建和運行Agent(智能體),并且可以在實際開發(fā)中靈活的去運用它。

LangChain中構建Agent智能體是打造一個能夠借助大語言模型,根據(jù)用戶輸入動態(tài)規(guī)劃并執(zhí)行任務的系統(tǒng)。它具有多方面重要作用,包括提升任務處理能力增強交互體驗提高自動化程度拓展應用場景。

那么本次分享就到這了。對于上面提到過的NLP,它的全稱是Natural Language Processing,翻譯過來叫自然語言處理NLP是人工智能和語言學的交叉領域,專注于讓計算機理解、處理和生成人類自然語言。

這段時間博主一直在研究這個領域(都快吐了血了🤮,可能是因為博主并不是人工智能專業(yè)出身吧)。博主打算把LangChain大模型應用開發(fā)完結后,開始講這部分內(nèi)容,請大家多關注下博主。(PS:需要大家具備線性代數(shù)、概率論與數(shù)理統(tǒng)計、微積分的知識儲備哈。🤣🤣🤣)

最后,博主還是那句話:請大家多去大膽的嘗試和使用,成功總是在不斷的失敗中試驗出來的,敢于嘗試就已經(jīng)成功了一半。如果大家對博主分享的內(nèi)容感興趣或有幫助,請點贊和關注。大家的點贊和關注是博主持續(xù)分享的動力🤭,博主也希望讓更多的人學習到新的知識。

http://m.aloenet.com.cn/news/40543.html

相關文章:

  • 網(wǎng)站ico圖標 代碼搜索引擎排名中國
  • 上的網(wǎng)站app上海百度公司總部
  • 女同性怎么做的視頻網(wǎng)站軟文有哪些發(fā)布平臺
  • 合肥seo優(yōu)化安徽網(wǎng)站關鍵詞優(yōu)化
  • 虛擬主機網(wǎng)站淘客網(wǎng)站建設b站推廣軟件
  • 網(wǎng)站備案之前需要建好網(wǎng)站嗎windows優(yōu)化大師要會員
  • 教育網(wǎng)站怎么做如何推廣一個項目
  • 長春企業(yè)網(wǎng)站模板建站域名解析ip
  • css做購物網(wǎng)站的分類目錄搜索引擎優(yōu)化搜索優(yōu)化
  • 做地方旅游網(wǎng)站目的意義正規(guī)的教育培訓機構有哪些
  • 中華人民共和國城鄉(xiāng)與建設部網(wǎng)站長沙seo優(yōu)化推薦
  • ae有么有做gif的網(wǎng)站構建新發(fā)展格局
  • 網(wǎng)站開發(fā)架設baidu百度
  • 如何打開本地安裝的WORDPRESS網(wǎng)站查詢工具seo
  • 合肥建設學校官網(wǎng)網(wǎng)站網(wǎng)站關鍵詞挖掘
  • html5移動網(wǎng)站模板貴港網(wǎng)站seo
  • 怎么兼職做網(wǎng)站谷歌seo站內(nèi)優(yōu)化
  • 用網(wǎng)站模板建網(wǎng)站谷歌官網(wǎng)注冊入口
  • 一個網(wǎng)站想看訪客量怎么做seo外鏈平臺
  • 青浦網(wǎng)站建設公司福州短視頻seo推薦
  • 網(wǎng)站風格設計百度seo怎么樣優(yōu)化
  • 網(wǎng)站建設文化怎么樣圖片百度搜索
  • 簡單的招聘網(wǎng)站怎么做電商網(wǎng)站設計
  • 手機哪里可以做視頻網(wǎng)站鄭州聚商網(wǎng)絡科技有限公司
  • 勁松做網(wǎng)站的公司百度一下首頁設為主頁
  • wordpress中文 插件網(wǎng)站文章優(yōu)化技巧
  • 做網(wǎng)站北京公司推廣產(chǎn)品的渠道
  • drupal7建站教程怎么創(chuàng)建網(wǎng)站鏈接
  • 重慶微網(wǎng)站建設寧波網(wǎng)絡推廣軟件
  • 自適應網(wǎng)站設計規(guī)范企業(yè)的互聯(lián)網(wǎng)推廣