LLM(Large Language Model)大模型的可觀測性是指對模型內部運行過程的理解和監控能力。由于LLM大模型通常具有龐大的參數量和復雜的網絡結構,因此對其內部狀態和運行過程的理解和監控是一個重要的問題。
什么是 LangChain?
LangChain 是一個開源的應用開發框架,旨在將大型語言模型(LLM)與開發者現有的知識和系統相結合,以提供更智能化的服務。具體來說,LangChain 可以幫助開發者f輕松地管理與 LLM 的交互,將多個組件鏈接在一起,并集成額外的資源,例如 API 和數據庫。
此外,LangChain 還提供了多種工具、組件和接口,以簡化創建由 LLM 提供支持的應用程序的過程。例如,它提供了模型輸入/輸出管理工具,用于管理 LLM 及其輸入和格式化輸出;Prompt 模板支持自定義 Prompt 工程的快速實現以及和 LLMs 的對接;Utils 組件提供了大模型常見的植入能力的封裝,如搜索引擎、Python 編譯器、Bash 編譯器、數據庫等;Chains 組件則提供了大模型針對一系列任務的順序執行邏輯鏈。
因此,LangChain 的應用場景非常廣泛,可以應用于自然語言處理、聊天機器人、智能客服、文本生成等多個領域。同時,由于其開源的特性,LangChain 也可以被廣大開發者用于定制開發自己的 LLM 應用,從而推動人工智能技術的不斷發展和創新。
LangChain 可觀測性體系
LangChain 本身并沒有提供可觀測性能力,但可以通過集成其他工具來實現對 LangChain 應用的可觀測性,以此來提高大模型的可解釋性和可控性。
- 日志:收集、存儲和分析 LangChain 應用的日志數據。通過日志數據,可以監控應用程序的運行狀態、錯誤日志、用戶行為等信息。
- 指標:使用監控工具收集 LangChain 應用的性能指標,如響應時間、吞吐量、錯誤率等。這些指標可以幫助你了解應用程序的性能瓶頸和潛在問題,并及時進行優化和調整。
- 組件依賴:監控 LangChain 應用所依賴的服務或組件,如數據庫、API接口等。確保這些依賴服務的可用性和性能穩定,以避免因依賴問題導致的應用故障。
- 自定義監控:根據具體需求,可以編寫自定義的監控腳本或插件,用于監控特定的業務邏輯或功能。例如,你可以編寫腳本監控某個特定任務的執行情況、API 接口的調用頻率等。
- 告警與通知:設置告警規則,當監控數據達到預設的閾值時,觸發告警并通知相關人員。這可以幫助你及時發現并處理潛在問題,確保應用程序的穩定運行。
需要注意的是,可觀測性方案的選擇和實施應根據具體的應用場景和需求進行定制。
LangChain 可觀測性接入方案
準備工作
#### 安裝 DataKit
token 在「觀測云控制臺」-「集成」-「Datakit」 上面獲取。
DK_DATAWAY="https://openway.guance.com?token=tkn_xxxxxx" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"
DataKit 采集器配置
- 開啟 DDTrace 采集器
DDTrace 采集器用于采集鏈路信息,進入到 DataKit 安裝目錄下,執行 `conf.d/ddtrace/`,復制 `ddtrace.conf.sample` 并重命名為 `ddtrace.conf` 。
- 開啟 StatsD 采集器
StatsD 采集器用于采集指標信息,默認端口為 `8125` 。
- 重啟 DataKit
systemctl restart datakit
準備 OpenAI API Key
在 Langchain 應用中使用 OpenAI 的模型,需要一個 API Key,點擊 https://platform.openai.com/account/api-keys 創建你的 API Key。
模擬 LLM 應用并接入觀測云
主要實現了一個基于 OpenAI 的 GPT-3.5 模型的聊天對話系統,并設置了一個函數來跟蹤 API 令牌的使用情況。
- 安裝 Python 依賴
pip install langchain
pip install openai
pip install ddtrace
- 創建 LLM
使用 Langchain 創建 LLM,模型選擇 `gpt-3.5` 。
llm = ChatOpenAI(model='gpt-3.5-turbo',temperature=0)
- 創建 ConversationChain 對象
創建一個 `ConversationChain` 對象,傳入之前創建的 `llm` 對象,設置 verbose 為 `True`(表示輸出詳細的調試信息),并使用 `ConversationBufferMemory` 作為記憶儲存。
conversation = ConversationChain(
? ? llm=llm, verbose=True, memory=ConversationBufferMemory()
)
- 創建對話函數
定義一個函數 `track_tokens_usage` ,它接受一個對話鏈和一個查詢作為參數。
def track_tokens_usage(chain, query):
? ? with get_openai_callback() as cb:
? ? ? ? result = chain.run(query)
? ? ? ? print(f"prompt token {cb.prompt_tokens}, res token {cb.completion_tokens}, total token {cb.total_tokens}")
? ? ? ? print(f"successful requests {cb.successful_requests}, total cost {cb.total_cost}USD")
? ? ? ? print(result)
? ? return result
通過回調函數 `get_openai_callback` 創建一個回調對象 `cb` ,并通過對象 `cb` 可以獲取請求相關信息:請求數、消耗金額、令牌數量等。
- 調用
track_tokens_usage(conversation, "介紹一下觀測云可觀測性的產品及優勢")
由于執行完成后,進程會退出,添加以下代碼阻止退出,方便相關數據及時上報。
print("腳本執行完成,按 Enter 鍵退出...")
input()
- 執行腳本
DD_SERVICE="my-langchain" DD_ENV="dev" DD_AGENT_HOST="localhost" DD_AGENT_PORT="9529" ddtrace-run python3 langchain_demo.py
LangChain 可觀測性實踐效果
- 指標
- 調用鏈
常見問題
Token 異常
如果沒有配置 Token,則會報錯:
pydantic.v1.error_wrappers.ValidationError: 1 validation error for ChatOpenAI
__root__
? Did not find openai_api_key, please add an environment variable `OPENAI_API_KEY` which contains it, or pass `openai_api_key` as a named parameter. (type=value_error)
關于 Token,可以在代碼中定義:
import os
os.environ["OPENAI_API_KEY"] = 'sk-...DcE2'
但不建議那么做,可以使用環境變量方式:
>OPENAI_API_KEY="sk-...DcE2"
### 余額不足
openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details. For more information on this error, read the docs: https://platform.openai.com/docs/guides/error-codes/api-errors.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
### 代理
如需配置代理,可以加入以下配置:
import os
os.environ["http_proxy"] = "http://localhost:7890"
os.environ["https_proxy"] = "http://localhost:7890"
### 其他第三方 API
如果需要更換第三方 API 地址,可以使用以下方式:
import os
os.environ["OPENAI_API_BASE"] = 'https://chatapi.a3e.top/v1'
## 參考資料