好風憑借力,送我上青云!
什么是LangSmith
LangSmith is a platform for building production-grade LLM applications.
It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly integrates with LangChain, the go-to open source framework for building with LLMs.
LangSmith is developed by LangChain, the company behind the open source LangChain framework.
LangSmith 是一個用于構建生產級 LLM 應用程序的平臺。
它允許您調試、測試、評估和監控基于任何 LLM 框架構建的鏈和智能代理,并無縫集成 LangChain(用于構建 LLM 的首選開源框架)。
LangSmith 由 LangChain 開發,LangChain 是開源 LangChain 框架背后的公司。
LangSmith的目標很宏大,但是實際上還是處于早期階段,目前最實用的功能還是調試、跟蹤LangChain應用,但是單是這一項的價值都已經無可估量,可以大大縮減你學習LangChain的時間,提高用LangChain開發LLM應用的效率。
用LangChain來完成大語言模型的應用原型/代理很簡單,但是,要交付實際的大語言應用異常困難:可能要大量定制、迭代Prompt、鏈和其他組件。LangSmith可以幫你快速調試鏈、代理或者一組工具,可視化各種組件(鏈、llms、檢索器retrievers等)如何交互及使用,評估不同的Prompts等等。
注冊與設置
注冊
登錄 https://smith.langchain.com/ 可以直接用Discord、GitHub、Google賬號登錄,也可以用自己郵箱注冊。現在已經不需要邀請碼。
生成API Key
注意生成Key的時候就復制下來,后面丟了就只能重新生成。
設置環境變量
Linux用下面的命令設置環境變量:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com"
export LANGCHAIN_API_KEY="<your-api-key>"
export LANGCHAIN_PROJECT="langchain_for_llm_application_development"
Windows可以用下面的命令:
setx LANGCHAIN_TRACING_V2 true
setx LANGCHAIN_ENDPOINT "https://api.smith.langchain.com"
setx LANGCHAIN_API_KEY <your-api-key>
setx LANGCHAIN_PROJECT langchain_for_llm_application_development
LANGCHAIN_TRACING_V2是設置LangChain是否開啟日志跟蹤模式。
LANGCHAIN_PROJECT 是要跟蹤的項目名稱,如果LangSmith平臺上還沒有這個項目,會自動創建。如果不設置這個環境變量,會把相關信息寫到default項目。這里的項目不一定要跟你實際的項目一一對應,可以理解為分類或者標簽。你只要在運行某個應用前改變這一項,就會把相關的日志寫到這個下面。可以按開發、生產環境分,也可以按日期分等等。
LANGCHAIN_API_KEY就是上面生成的LangSmith的key。
設置好環境變量就可以了,代碼無需任何變動!完全沒有侵入性的感覺真好。當然,如果要較真的話,引入LangChain的時候代碼就已經侵入了,但是我們本來就要用LangChain,那就不用管這個了。
使用
我們可以使用LangSmith調試:出乎意料的最終結果、代理為何一直在循環、鏈為何比預期慢、代理使用了多少個令牌等等。
我們來看一個RouterChain的例子(源碼來自黃佳老師的課程):
'''歡迎來到LangChain實戰課
https://time.geekbang.org/column/intro/100617601
作者 黃佳'''
import warnings
warnings.filterwarnings('ignore')# 設置OpenAI API密鑰
# import os
# os.environ["OPENAI_API_KEY"] = 'Your Key'
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
from langchain.chat_models import AzureChatOpenAI# 構建兩個場景的模板
flower_care_template = """
你是一個經驗豐富的園丁,擅長解答關于養花育花的問題。
下面是需要你來回答的問題:
{input}
"""flower_deco_template = """
你是一位網紅插花大師,擅長解答關于鮮花裝飾的問題。
下面是需要你來回答的問題:
{input}
"""# 構建提示信息
prompt_infos = [{"key": "flower_care","description": "適合回答關于鮮花護理的問題","template": flower_care_template,},{"key": "flower_decoration","description": "適合回答關于鮮花裝飾的問題","template": flower_deco_template,}
]# 初始化語言模型
# from langchain.llms import OpenAI
# llm = OpenAI()
llm = AzureChatOpenAI(deployment_name="GPT-4", temperature=0)# 構建目標鏈
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplatechain_map = {}for info in prompt_infos:prompt = PromptTemplate(template=info['template'],input_variables=["input"])print("目標提示:\n", prompt)chain = LLMChain(llm=llm,prompt=prompt,verbose=True)chain_map[info["key"]] = chain# 構建路由鏈
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RounterTemplatedestinations = [f"{p['key']}: {p['description']}" for p in prompt_infos]
router_template = RounterTemplate.format(destinations="\n".join(destinations))
print("路由模板:\n", router_template)router_prompt = PromptTemplate(template=router_template,input_variables=["input"],output_parser=RouterOutputParser(),
)
print("路由提示:\n", router_prompt)router_chain = LLMRouterChain.from_llm(llm,router_prompt,verbose=True
)# 構建默認鏈
from langchain.chains import ConversationChain
default_chain = ConversationChain(llm=llm,output_key="text",verbose=True
)# 構建多提示鏈
from langchain.chains.router import MultiPromptChainchain = MultiPromptChain(router_chain=router_chain,destination_chains=chain_map,default_chain=default_chain,verbose=True
)# 測試1
print(chain.run("如何為玫瑰澆水?"))
雖然黃佳老師加了很多print輸出信息,但是代碼的邏輯還是不容易看清楚。
查看運行情況
運行一次上面的程序,然后打開LangSmith,找到最近一次的運行:
從圖中,我們可以很直觀的看到LangChain組件的調用順序(如果有用過微服務的Zipkin,對這個界面應該不陌生)、每一步耗費的時間、調用OpenAI消耗的Token數。
使用Playground
面向LLM編程,很多時候就是要迭代Prompt。在LangSmith里除了可以直接看到輸入給LLM的Prompt和輸出結果,更方便的是里面還集成了Playground,可以直接修改Prompt來看輸出的結果。
點擊上圖右上角的Playground,進去后你會發現你調用LLM的各種參數、Prompt都幫你設置好了(OpenAI的Key還要設置,只保存在本地瀏覽器)。
這樣,你就可以修改你的Prompt,重新運行,觀察Prompt改變引起的結果變化。
在Playground里執行的過程會記錄到“playground”這個項目。
添加到數據集
在查看運行情況的界面,點擊右上角的“Add to Dataset”,可以把對應的輸入、輸出添加到數據集,后面大模型或者Prompt有了調整,可以用數據集來測試、評估。
Hub
LangSmith里面還有一個有趣的功能是Hub。在Hub里,可以發現、分享和對Prompt進行版本控制。Hub感覺是借用GitHub的概念,也可以叫PromptHub?
對別人分享出來的Prompt,你可以點愛心收藏(收藏了之后沒找到相應的入口 😅),也可以Fork、試運行。
總的來說,LangSmith還處于快速開發的階段(LangChain本身也才0.0.348版),某些功能還比較簡陋。從另一方面來說,我們可以和它一起成長,更快速掌握LangChain,打造自己的LLM應用。
參考
- LangSmith文檔:https://docs.smith.langchain.com/