解鎖 LangChain 的核心技術:開發根據大語言模型的應用程式
身為技術工作者,我持續探索各種新興技術,而 LangChain 正是我近期鑽研的重點。LangChain 是一個開源的協調框架,它讓開發者能輕鬆運用大語言模型(LLM)建構應用程式,例如聊天機器人和虛擬助理。這篇文章將深入剖析 LangChain 的核心功能、與 OpenAI 工具的整合方式,以及一些進階應用技巧,協助你開發更智慧、更高效的 AI 應用。
LangChain 的崛起與核心功能
LangChain 由 Harrison Chase 於 2022 年 10 月推出,迅速成為 GitHub 上備受矚目的開源專案。它之所以如此熱門,是因為它提供了一套簡潔而強大的工具,讓開發者能更有效率地運用 LLM 的能力。
LangChain 的核心功能包含:
- 模型整合: LangChain 支援多種 LLM,讓開發者可以根據需求選擇最合適的模型。
- 鏈式呼叫: LangChain 允許將多個 LLM 或其他工具串連起來,形成更複雜的應用程式邏輯。
- 提示管理: LangChain 提供了便捷的提示管理功能,讓開發者可以更輕鬆地控制 LLM 的行為。
- 記憶機制: LangChain 的記憶機制可以讓 LLM 保留先前的對話內容,提供更連貫的互動體驗。
graph LR A[LangChain] --> B(模型整合) A --> C(鏈式呼叫) A --> D(提示管理) A --> E(記憶機制)
上面的 圖表展示了 LangChain 的核心功能,説明它如何透過整合不同模組來提供完整的 LLM 應用開發框架。
OpenAI 工具加持:開發更精準、更高效的代理
OpenAI 的「工具」功能讓代理能偵測何時呼叫函式,並以適當的輸入做出回應。新的 OpenAI 模型已針對此功能進行微調,使代理更聰明、更高效。
在 API 呼叫中,你可以描述函式,代理會智慧地選擇輸出一個包含呼叫這些函式所需引數的 JSON 物件。OpenAI 工具的目標是確保代理可靠地傳回有效與有用的函式呼叫,超越一般文字完成或聊天 API 的能力。
OpenAI 有兩個相關的概念:「函式」和「工具」。函式允許代理呼叫單個函式,而工具允許它在適當時呼叫一個或多個函式。在 OpenAI Chat API 中,函式現在被認為是舊選項,已棄用,改用工具。
因此,如果你使用 OpenAI 模型建立代理,你應該使用 OpenAI 工具代理而不是 OpenAI 函式代理。
使用工具的優勢在於它允許模型在適當時要求呼叫多個函式。這有助於減少代理實作目標所需的時間,使其更高效。
OpenAI 工具實作
首先,安裝必要的函式庫:
pip install --upgrade langchain-openai tavily-python langchainhub
接下來,匯入所需的模組:
from langchain import hub
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_openai import ChatOpenAI
初始化工具與建立代理
賦予代理使用 Tavily 搜尋網路的能力:
tools = [TavilySearchResults(max_results=1)]
從 LangChain hub 中提取提示,並選擇 LLM 來建立 OpenAI 工具代理:
prompt = hub.pull("hwchase17/openai-tools-agent")
llm = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0)
agent = create_openai_tools_agent(llm, tools, prompt)
執行代理與使用聊天記錄
代理準備就緒後,建立一個執行器來執行它:
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke({"input": "什麼是 LangChain?"})
觀察代理如何使用 Tavily 搜尋工具查詢 LangChain 的資訊,並提供簡潔的摘要。OpenAI 工具代理的一大特色是它們能夠使用聊天記錄來獲得更具對話性的體驗。透過傳入先前的對話,代理可以以更具上下文和更自然的方式做出回應。
整合聊天歷史記錄:開發更具上下文感知的應用
在使用 ReAct agent 並整合聊天歷史記錄時,需要一個特殊的提示詞來引導 LLM。以下是一個使用 LangChain hub 中的聊天專用提示詞的示例:
from langchain import hub
from langchain.agents import create_react_agent, AgentExecutor
from langchain_core.messages import AIMessage, HumanMessage
# ... (其他程式碼,例如工具的定義)
prompt = hub.pull("hwchase17/react-chat")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
agent_executor.invoke(
{
"input": "what's my name?",
"chat_history": "Human: Hi! My name is Rabi\nAI: Hello Rabi! Nice to meet you",
}
)
這段程式碼示範瞭如何使用 create_react_agent
建立一個 ReAct 代理,並使用 agent_executor
執行它。其中,chat_history
引數用於傳入先前的對話歷史,讓代理能更好地理解當前的上下文。
graph LR A[使用者查詢] --> B{代理判斷}; B -- 需要工具 --> C[呼叫工具]; C --> D[傳回結果]; B -- 不需要工具 --> E[直接回答]; D --> F[輸出答案]; E --> F;
這個流程圖清楚地展現了根據工具的代理運作機制:使用者提問後,代理會判斷是否需要使用工具。如果需要,代理會呼叫工具並處理傳回的結果;如果不需要,則直接回答。最終,代理將答案輸出給使用者。
classDiagram class Agent { +choose_tool() +call_tool() +process_result() } class Tool { +execute() } Agent --> Tool : uses
這個類別圖描述了代理和工具之間的關係。代理使用工具來完成特定任務,它負責選擇、呼叫和處理工具的結果。工具則負責執行特定功能。
總而言之,LangChain 結合 OpenAI 工具,提供了一個強大的框架,讓開發者能更有效率地建構根據 LLM 的應用程式。透過理解其核心功能和整合方式,並善用聊天歷史記錄等進階技巧,就能開發更智慧、更具互動性的 AI 應用。 我鼓勵各位深入研究 LangChain,探索其在不同應用場景的無限潛力。
身為一個技術工作者,我經常需要處理大量的資訊,並從中提取關鍵知識。最近,我一直在研究如何構建一個更智慧的代理,它不僅可以搜尋網路,還可以查詢我自己的本地知識函式庫。在這篇文章中,我將分享我的經驗,並示範如何使用 LangChain 建立這樣一個代理。
LangSmith:代理的最佳助手
在構建代理的過程中,我發現 LangSmith 是一個非常有用的工具。它可以追蹤代理工作流程中的所有步驟,簡化除錯和可觀察性。設定 LangSmith 非常簡單,只需設定幾個環境變數:
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="<您的 API 金鑰>"
請記得將 <您的 API 金鑰>
替換成您的實際 LangSmith API 金鑰。
工具集:Tavily 與本地索引檢索
我的代理需要兩種工具:線上搜尋和本地索引查詢。我選擇了 Tavily 作為線上搜尋工具,並使用向量資料函式庫和檢索器來查詢本地索引。
Tavily:探索網路世界
Tavily 是一個強大的搜尋工具,可以讓代理輕鬆地搜尋網路。設定 Tavily API 金鑰後,就可以建立 TavilySearchResults 工具例項:
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults()
使用起來也很簡單:
search.invoke("台北的美食推薦?")
這將傳回與台北美食相關的搜尋結果。
本地索引檢索:快速存取特定資料
當我需要代理快速存取特定資料時,本地索引查詢就派上用場了。以下是如何建立檢索器的步驟:
- 載入資料:
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://www.example.com/my_data")
docs = loader.load()
- 分割檔案:
from langchain_text_splitters import RecursiveCharacterTextSplitter
documents = RecursiveCharacterTextSplitter(
chunk_size=1000, chunk_overlap=200
).split_documents(docs)
- 建立向量儲存函式庫:
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
vector = FAISS.from_documents(documents, OpenAIEmbeddings())
retriever = vector.as_retriever()
現在,我們可以使用檢索器查詢本地索引:
retriever.invoke("如何設定我的資料函式庫?")[0]
這將傳回與查詢最相關的檔案塊。
為了讓代理更方便地使用檢索器,我們可以將其轉換為工具:
from langchain.tools.retriever import create_retriever_tool
retriever_tool = create_retriever_tool(
retriever,
"local_search",
"搜尋本地資料。",
)
組裝代理:LLM、提示和執行器
現在,我們有了工具,接下來需要選擇 LLM、提示和執行器。
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
from langchain import hub
prompt = hub.pull("hwchase17/openai-functions-agent")
from langchain.agents import create_tool_calling_agent, AgentExecutor
tools = [search, retriever_tool]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
測試代理
讓我們測試一下代理:
agent_executor.invoke({"input": "你好!"})
agent_executor.invoke({"input": "如何設定我的資料函式庫?"})
graph LR A[使用者輸入] --> B{代理}; B --> C[Tavily搜尋]; B --> D[本地索引檢索]; C --> E[搜尋結果]; D --> F[索引結果]; E --> G[代理回應]; F --> G;
這張圖展示了代理的工作流程。它接收使用者輸入,然後根據需要使用 Tavily 或本地索引檢索來尋找答案,最後將結果整合並輸出。
這個架構就像一個多功能工具箱,代理可以根據任務需求選擇合適的工具。透過結合線上搜尋和本地索引查詢,代理可以更有效率地解決問題。
透過這篇文章,我希望您可以瞭解如何構建一個結合線上搜尋和本地索引查詢的智慧代理。LangSmith、Tavily 和向量資料函式庫的結合,為構建更強大的代理提供了堅實的基礎。
LangSmith 的核心功能與應用
LangSmith 提供一系列強大的工具,協助開發者更有效率地建構和測試大語言模型(LLM)應用程式。我將深入解析 LangSmith 的核心功能,並以實際案例説明如何應用這些功能提升 LLM 應用程式的品質和可靠性。
追蹤與除錯 (Tracing & Debugging)
LangSmith 的追蹤與除錯功能,如同一位經驗豐富的偵探,能深入 LLM 應用程式的內部,找出問題的根源並提供解決方案。它記錄應用程式執行過程中的每個步驟,包括輸入、輸出、中間狀態和效能資料,讓開發者能清楚地瞭解應用程式的運作方式。
graph LR A[使用者輸入] --> B[LLM 處理]; B --> C{輸出結果}; C -- 正確 --> D[結束]; C -- 錯誤 --> E[除錯分析]; E --> F[修正錯誤]; F --> A;
這個流程圖展示了 LangSmith 如何追蹤和除錯 LLM 應用程式。從使用者輸入開始,LangSmith 會記錄 LLM 的處理過程,並追蹤輸出結果。如果結果錯誤,LangSmith 提供除錯分析工具,協助開發者找出錯誤原因並進行修正。
評估 (Evaluation)
LangSmith 的評估功能,如同一位嚴格的評審,仔細評估應用程式的每個環節,確保達到最佳品質。它讓開發者在測試期間評估應用程式的效能,確保應用程式符合預期並達到必要的標準。
graph LR A[定義評估指標] --> B{執行測試}; B --> C[收集效能資料]; C --> D{分析評估結果}; D -- 透過 --> E[完成評估]; D -- 未透過 --> F[調整最佳化]; F --> B;
此流程圖説明 LangSmith 評估功能的運作方式。首先,開發者定義評估指標,然後執行測試並收集效能資料。LangSmith 會分析評估結果,如果未達標,開發者可以調整最佳化並重新執行測試,直到達到標準為止。
線上監控與自動化 (Production Monitoring & Automations)
LangSmith 允許監控線上應用程式並自動化特定流程,這對於測試不同情境和確保應用程式穩定性非常有益。它就像一位盡責的管理員,隨時監控系統運作,並自動處理例行任務。
提示中心 (Prompt Hub)
LangSmith 的提示中心,如同一個資源函式庫,方便開發者管理和重複使用各種測試提示。這個提示管理工具可以簡化測試流程,它提供一個集中管理提示和應用程式輸入的地方。
LangSmith 的這些核心功能,讓開發者能更有效率地建構和測試 LLM 應用程式,提升應用程式的品質和可靠性。它就像一位全能助手,協助開發者克服 LLM 應用程式開發中的挑戰。透過追蹤、除錯、評估、監控和提示管理,LangSmith 讓 LLM 應用程式的開發流程更加順暢和高效。