【可能是全網(wǎng)最絲滑的LangChain教程】六逊移、快速入門Agent

系列文章地址

【可能是全網(wǎng)最絲滑的LangChain教程】一、LangChain介紹 - 簡書 (jianshu.com)
【可能是全網(wǎng)最絲滑的LangChain教程】二龙填、LangChain安裝 - 簡書 (jianshu.com)
【可能是全網(wǎng)最絲滑的LangChain教程】三胳泉、快速入門LLMChain - 簡書 (jianshu.com)
【可能是全網(wǎng)最絲滑的LangChain教程】四、快速入門Retrieval Chain - 簡書 (jianshu.com)
【可能是全網(wǎng)最絲滑的LangChain教程】五岩遗、快速入門Conversation Retrieval Chain - 簡書 (jianshu.com)

使用LangChain構建應用

LangChain支持構建應用程序扇商,將外部數(shù)據(jù)源和計算源連接到LLM。我們將從一個簡單的 LLM 鏈開始宿礁,它只依賴于提示模板中的信息來響應案铺。 接下來,我們將構建一個檢索鏈窘拯,該鏈從單獨的數(shù)據(jù)庫獲取數(shù)據(jù)并將其傳遞到提示模板中红且。 然后,我們將添加聊天記錄涤姊,以創(chuàng)建對話檢索鏈暇番。這允許您以聊天方式與此 LLM 進行交互,因此它會記住以前的問題思喊。 最后壁酬,我們將構建一個代理,利用 LLM 來確定它是否需要獲取數(shù)據(jù)來回答問題。

Agent

到目前為止舆乔,我們已經(jīng)創(chuàng)建了鏈的例子 - 每一步都是提前知道的岳服。我們將創(chuàng)建的最后一件事是一個代理 - LLM在其中決定要采取的步驟。

一句話:Agent(代理)就是目前比較火熱的智能體的基礎希俩。

構建代理時要做的第一件事是確定它應該有權訪問哪些工具吊宋。 在此示例中,我們將授予代理對兩個工具的訪問權限:

  1. 基于百度文庫的《讓子彈飛》電影信息颜武。
  2. LangChain內置的Agent——“l(fā)lm-math”璃搜。用于復雜的數(shù)學計算。

簡單來說就是鳞上,我問《讓子彈飛》的相關問題这吻,LangChain使用第一個Agent回答問題,我問數(shù)學計算篙议,LangChain使用第二個Agent回答問題唾糯!

準備工作

主要是網(wǎng)頁數(shù)據(jù)的加載、嵌入模型的初始化鬼贱、向量數(shù)據(jù)庫的初始化等移怯,具體代碼如下。

from langchain_community.document_loaders import WebBaseLoader
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
import torch
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter 

# 詞嵌入模型
EMBEDDING_DEVICE = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
embeddings = HuggingFaceEmbeddings(model_name='D:\models\m3e-base', model_kwargs={'device': EMBEDDING_DEVICE})
# 加載外部文檔
loader = WebBaseLoader("https://baike.baidu.com/item/%E8%AE%A9%E5%AD%90%E5%BC%B9%E9%A3%9E/5358?fr=ge_ala")
docs = loader.load()
# 文檔向量化到FAISS
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
# 得到一個檢索器
retriever = vector.as_retriever()

Agent創(chuàng)建

首先吩愧,讓我們?yōu)閯倓倓?chuàng)建的檢索器設置一個工具:

from langchain.tools.retriever import create_retriever_tool 

retriever_tool = create_retriever_tool(    
  retriever,    
  "rzdf_search",    
  "搜索有關電影《讓子彈飛》的信息芋酌。對于任何關于《讓子彈飛》的問題,你必須使用此工具雁佳!",
)

加載內置的llm-math:

from langchain.agents import load_tools 

tools = load_tools(['llm-math'],llm=llm)

現(xiàn)在脐帝,我們可以創(chuàng)建要使用的工具列表:

tools.append(retriever_tool)

現(xiàn)在我們有了這些工具,我們可以創(chuàng)建一個代理來使用它們糖权。

from langchain import hub
from langchain.agents import create_react_agent
from langchain.agents import AgentExecutor 

# 這里獲取一個內置prompt堵腹,為了方便
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

使用Agent

現(xiàn)在,我們可以調用代理星澳,看看它是如何響應的疚顷!

agent_executor.invoke({"input": "讓子彈飛的導演是誰"})

如果你的LangChain將verbose設置稱True,會完整輸出執(zhí)行的中間過程禁偎。會有一個明顯的COT過程:

{'input': '讓子彈飛的導演是誰', 'output': '《讓子彈飛》的導演是姜文腿堤。'}

我們再繼續(xù)問一個數(shù)學計算問題

agent_executor.invoke({"input": "8 的立方根是多少?乘以 13.27如暖,然后減去 5笆檀。"})

結果是:

{'input': '8 的立方根是多少?乘以 13.27盒至,然后減去 5酗洒。', 
'output': '8的立方根大約是2士修,然后乘以13.27得到26.54,減去5后得到21.54樱衷。'}

我們也可以跟Agent進行對話:

from langchain_core.messages import HumanMessage, AIMessage 

chat_history = [HumanMessage(content="讓子彈飛是誰導演的"), AIMessage(content="讓子彈飛是姜文導演的棋嘲。")]
agent_executor.invoke({    
  "chat_history": chat_history,    
  "input": "這部電影什么時候上映的?"
})

輸出的結果如下(省略中間過程) :

{'chat_history': [HumanMessage(content='讓子彈飛是誰導演的'),  AIMessage(content='讓子彈飛是姜文導演的矩桂。')], 
'input': '這部電影什么時候上映的沸移?', 
'output': '電影《讓子彈飛》上映于2010年12月16日。'}

我們現(xiàn)在已經(jīng)成功設置了一個基本的Agent侄榴。我們只觸及了Agent基礎知識阔籽,高級用法后面系列文章會介紹,比如說自定義代理等等牲蜀。

大家要是隨便關注下公眾號,那就太好了绅这。

Peace Guys~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末涣达,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子证薇,更是在濱河造成了極大的恐慌度苔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浑度,死亡現(xiàn)場離奇詭異寇窑,居然都是意外死亡,警方通過查閱死者的電腦和手機箩张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門甩骏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人先慷,你說我怎么就攤上這事饮笛。” “怎么了论熙?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵福青,是天一觀的道長。 經(jīng)常有香客問我脓诡,道長无午,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任祝谚,我火速辦了婚禮宪迟,結果婚禮上,老公的妹妹穿的比我還像新娘踊跟。我一直安慰自己踩验,他們只是感情好鸥诽,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著箕憾,像睡著了一般牡借。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袭异,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天钠龙,我揣著相機與錄音,去河邊找鬼御铃。 笑死碴里,一個胖子當著我的面吹牛,可吹牛的內容都是我干的上真。 我是一名探鬼主播咬腋,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睡互!你這毒婦竟也來了根竿?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤就珠,失蹤者是張志新(化名)和其女友劉穎寇壳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妻怎,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡壳炎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逼侦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匿辩。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖榛丢,靈堂內的尸體忽然破棺而出撒汉,到底是詐尸還是另有隱情,我是刑警寧澤涕滋,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布睬辐,位于F島的核電站,受9級特大地震影響宾肺,放射性物質發(fā)生泄漏溯饵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一锨用、第九天 我趴在偏房一處隱蔽的房頂上張望丰刊。 院中可真熱鬧,春花似錦增拥、人聲如沸啄巧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秩仆。三九已至码泛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澄耍,已是汗流浹背噪珊。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留齐莲,地道東北人痢站。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像选酗,于是被迫代替她去往敵國和親阵难。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容