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_V2LANGCHAIN_API_KEY 即可:

export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=<your-api-key>

取得 API 金鑰則需要註冊 LangSmith, 並登入後至 Settings 頁面申請,如以下畫面:

langsmith-api-key.png

一切都完成之後,只要照常執行 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 等等:

langsmith-tracing.png

譬如在 RAG 應用中,我們會更關注 Retriever 檢索到哪些相關文件,以確定這些相關文件是真的相關,而且可以用於生成回應的內容:

langsmith-retriever.png

當然,也可以觀察最後的 Prompt 是什麼樣子:

langsmith-prompt.png

總的來說,使用 LangSmith 追查 chain 應用的資訊,體驗相對好很多,更多相關使用方法可以參考 LangSmith - How-To Guides

總結

LangSmith 作為與 LangChain 高度整合的 1 個元件/服務,能夠幫助開發者有效率地追查 LangChain 應用每個環節的輸入、輸出,與其從大量純文字的輸出中找問題,個人建議可以先使用 LangSmith 提供的 tracing 功能,從大處開始著眼,會更容易查找/聚焦問題。

以上!

Enjoy!

References

LangChain - Debugging

LangSmith - How-To Guides

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!