系列文章地址
【可能是全網(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(代理)就是目前比較火熱的智能體的基礎希俩。
構建代理時要做的第一件事是確定它應該有權訪問哪些工具吊宋。 在此示例中,我們將授予代理對兩個工具的訪問權限:
- 基于百度文庫的《讓子彈飛》電影信息颜武。
- 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~