LangChain 怎麼玩?用 LangSmith 幫忙追查問題
Posted on Mar 11, 2024 in LangChain , Python 程式設計 - 高階 by Amo Chen ‐ 3 min read
LangChain 或其他語言模型框架的應用,先天上就相對不容易進行除錯,畢竟有太多步驟被包裝的相當好,一旦打開除錯模式(debug mode),就會有相當多的資訊輸出,即使是專家也很難馬上從眾多資訊中迅速定位問題。
如果能藉由較好的 UI 介面或工具,肯定可以減輕在除錯上的困難度。
LangChain 也知道這些痛點,因此將資訊的收集、彙整、呈現都整合到 LangSmith 之中,可以幫助我們更輕鬆地開發 LangChain 應用!
本文將帶各位簡略地認識與學習使用 LangSmith 。
本文環境
$ pip install langchain beautifulsoup4
本文需要 Ollama 指令與 Meta 公司提供的 llama2
模型(model),ollama
指令請至 Ollama 官方頁面下載安裝,安裝完成之後即可執行指令安裝 llama2
模型,其安裝指令如下:
$ ollama run llama2
p.s. 執行上述模型需要至少 8GB 記憶體, 3.8G 硬碟空間
如何設定 Debug 模式
LangChain 有提供 debug 模式,可以讓語言模型應用的開發者為每 1 個步驟進行除錯,只要使用 set_debug(True)
即可啟用:
from langchain.globals import set_debug
set_debug(True)
除了 set_debug(True)
之外,也可以選擇使用 set_verbose(True)
,set_verbose(True)
輸出的訊息會比 set_debug(True)
更口語化,如果是新手建議可以開啟 set_verbose(True)
進行除錯。
from langchain.globals import set_verbose
set_verbose(True)
不過,除錯模式預設會輸出到 console, 而且通常非常長,難以閱讀。
所以建議使用 WandB 或者 LangSmith 等工具會體驗更好,也比較容易找到想了解的資訊。
本文將用 LangSmith 作為示範。
LangSmith
LangSmith 是 LangChain 提供的 1 項服務,可以為開發者提供追蹤(tracing)、監控(monitor)、部署(deployment)語言模型應用等功能,與 LangChain 的整合度很高,也是 LangChain 官方重視的服務之一。
LangSmith 雖然是 1 個 LangChain 的服務,但它對開發者也相當友善,提供個人開發者免費方案可以使用,每月可使用 3,000 次的 tracing, 超過 3,000 次之後每次 $0.005 美元計費,不過 3,000 次作為學習之用,其實也相當足夠。
使用 LangSmith 的方法十分簡單,只要設定環境變數 LANGCHAIN_TRACING_V2
與 LANGCHAIN_API_KEY
即可:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>
取得 API 金鑰則需要註冊 LangSmith, 並登入後至 Settings 頁面申請,如以下畫面:
一切都完成之後,只要照常執行 LangChain 的應用, LangChain 就會自動將執行過程送到 LangSmith, 例如執行 LangChain 怎麼玩?用 Document Loaders / Text Splitter 處理多種類型的資料 的文中範例:
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_community.document_loaders import WebBaseLoader
from langchain.chains import create_retrieval_chain
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.llms import Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
llm = Ollama(model='llama2')
embeddings = OllamaEmbeddings()
loader = WebBaseLoader("https://edition.cnn.com/2024/03/06/tech/openai-elon-musk-emails/index.html")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter()
docs = text_splitter.split_documents(documents)
vector = FAISS.from_documents(docs, embeddings)
retriever = vector.as_retriever()
prompt = ChatPromptTemplate.from_messages([
('system', 'Answer the user\'s questions based on the below context:\n\n{context}'),
('user', 'Question: {input}'),
])
document_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever, document_chain)
context = []
input_text = input('>>> ')
while input_text.lower() != 'bye':
response = retrieval_chain.invoke({
'input': input_text,
'context': context
})
print(response['answer'])
context = response['context']
input_text = input('>>> ')
執行之後,可以先輸入 prompt:
>>> Who sued OpenAI last week?
等語言模型生成回應結束,就可以在 LangSmith 的 tracing 頁面看到執行過程的相關資訊,例如每個步驟、執行多長時間以及其 input, output 等等:
譬如在 RAG 應用中,我們會更關注 Retriever 檢索到哪些相關文件,以確定這些相關文件是真的相關,而且可以用於生成回應的內容:
當然,也可以觀察最後的 Prompt 是什麼樣子:
總的來說,使用 LangSmith 追查 chain 應用的資訊,體驗相對好很多,更多相關使用方法可以參考 LangSmith - How-To Guides 。
總結
LangSmith 作為與 LangChain 高度整合的 1 個元件/服務,能夠幫助開發者有效率地追查 LangChain 應用每個環節的輸入、輸出,與其從大量純文字的輸出中找問題,個人建議可以先使用 LangSmith 提供的 tracing 功能,從大處開始著眼,會更容易查找/聚焦問題。
以上!
Enjoy!