LLM(Large Language Model)大模型的可觀測(cè)性是指對(duì)模型內(nèi)部運(yùn)行過(guò)程的理解和監(jiān)控能力掰派。由于LLM大模型通常具有龐大的參數(shù)量和復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),因此對(duì)其內(nèi)部狀態(tài)和運(yùn)行過(guò)程的理解和監(jiān)控是一個(gè)重要的問(wèn)題湾蔓。
什么是 LangChain?
LangChain 是一個(gè)開(kāi)源的應(yīng)用開(kāi)發(fā)框架徊哑,旨在將大型語(yǔ)言模型(LLM)與開(kāi)發(fā)者現(xiàn)有的知識(shí)和系統(tǒng)相結(jié)合硼啤,以提供更智能化的服務(wù)艰猬。具體來(lái)說(shuō)横堡,LangChain 可以幫助開(kāi)發(fā)者f輕松地管理與 LLM 的交互,將多個(gè)組件鏈接在一起冠桃,并集成額外的資源命贴,例如 API 和數(shù)據(jù)庫(kù)。
此外食听,LangChain 還提供了多種工具胸蛛、組件和接口,以簡(jiǎn)化創(chuàng)建由 LLM 提供支持的應(yīng)用程序的過(guò)程樱报。例如葬项,它提供了模型輸入/輸出管理工具,用于管理 LLM 及其輸入和格式化輸出迹蛤;Prompt 模板支持自定義 Prompt 工程的快速實(shí)現(xiàn)以及和 LLMs 的對(duì)接民珍;Utils 組件提供了大模型常見(jiàn)的植入能力的封裝,如搜索引擎笤受、Python 編譯器穷缤、Bash 編譯器、數(shù)據(jù)庫(kù)等箩兽;Chains 組件則提供了大模型針對(duì)一系列任務(wù)的順序執(zhí)行邏輯鏈。
因此章喉,LangChain 的應(yīng)用場(chǎng)景非常廣泛汗贫,可以應(yīng)用于自然語(yǔ)言處理身坐、聊天機(jī)器人、智能客服落包、文本生成等多個(gè)領(lǐng)域部蛇。同時(shí),由于其開(kāi)源的特性咐蝇,LangChain 也可以被廣大開(kāi)發(fā)者用于定制開(kāi)發(fā)自己的 LLM 應(yīng)用涯鲁,從而推動(dòng)人工智能技術(shù)的不斷發(fā)展和創(chuàng)新。
LangChain 可觀測(cè)性體系
LangChain 本身并沒(méi)有提供可觀測(cè)性能力有序,但可以通過(guò)集成其他工具來(lái)實(shí)現(xiàn)對(duì) LangChain 應(yīng)用的可觀測(cè)性抹腿,以此來(lái)提高大模型的可解釋性和可控性。
- 日志:收集旭寿、存儲(chǔ)和分析 LangChain 應(yīng)用的日志數(shù)據(jù)警绩。通過(guò)日志數(shù)據(jù),可以監(jiān)控應(yīng)用程序的運(yùn)行狀態(tài)盅称、錯(cuò)誤日志肩祥、用戶行為等信息。
- 指標(biāo):使用監(jiān)控工具收集 LangChain 應(yīng)用的性能指標(biāo)缩膝,如響應(yīng)時(shí)間混狠、吞吐量、錯(cuò)誤率等疾层。這些指標(biāo)可以幫助你了解應(yīng)用程序的性能瓶頸和潛在問(wèn)題将饺,并及時(shí)進(jìn)行優(yōu)化和調(diào)整。
- 組件依賴(lài):監(jiān)控 LangChain 應(yīng)用所依賴(lài)的服務(wù)或組件云芦,如數(shù)據(jù)庫(kù)俯逾、API接口等。確保這些依賴(lài)服務(wù)的可用性和性能穩(wěn)定舅逸,以避免因依賴(lài)問(wèn)題導(dǎo)致的應(yīng)用故障桌肴。
- 自定義監(jiān)控:根據(jù)具體需求,可以編寫(xiě)自定義的監(jiān)控腳本或插件琉历,用于監(jiān)控特定的業(yè)務(wù)邏輯或功能坠七。例如,你可以編寫(xiě)腳本監(jiān)控某個(gè)特定任務(wù)的執(zhí)行情況旗笔、API 接口的調(diào)用頻率等彪置。
- 告警與通知:設(shè)置告警規(guī)則,當(dāng)監(jiān)控?cái)?shù)據(jù)達(dá)到預(yù)設(shè)的閾值時(shí)蝇恶,觸發(fā)告警并通知相關(guān)人員拳魁。這可以幫助你及時(shí)發(fā)現(xiàn)并處理潛在問(wèn)題,確保應(yīng)用程序的穩(wěn)定運(yùn)行撮弧。
需要注意的是潘懊,可觀測(cè)性方案的選擇和實(shí)施應(yīng)根據(jù)具體的應(yīng)用場(chǎng)景和需求進(jìn)行定制姚糊。
LangChain 可觀測(cè)性接入方案
準(zhǔn)備工作
#### 安裝 DataKit
token 在「觀測(cè)云控制臺(tái)」-「集成」-「Datakit」 上面獲取。
DK_DATAWAY="https://openway.guance.com?token=tkn_xxxxxx" bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"
DataKit 采集器配置
- 開(kāi)啟 DDTrace 采集器
DDTrace 采集器用于采集鏈路信息授舟,進(jìn)入到 DataKit 安裝目錄下救恨,執(zhí)行 `conf.d/ddtrace/`,復(fù)制 `ddtrace.conf.sample` 并重命名為 `ddtrace.conf` 释树。
- 開(kāi)啟 StatsD 采集器
StatsD 采集器用于采集指標(biāo)信息肠槽,默認(rèn)端口為 `8125` 。
- 重啟 DataKit
systemctl restart datakit
準(zhǔn)備 OpenAI API Key
在 Langchain 應(yīng)用中使用 OpenAI 的模型奢啥,需要一個(gè) API Key秸仙,點(diǎn)擊 https://platform.openai.com/account/api-keys 創(chuàng)建你的 API Key。
模擬 LLM 應(yīng)用并接入觀測(cè)云
主要實(shí)現(xiàn)了一個(gè)基于 OpenAI 的 GPT-3.5 模型的聊天對(duì)話系統(tǒng)扫尺,并設(shè)置了一個(gè)函數(shù)來(lái)跟蹤 API 令牌的使用情況筋栋。
- 安裝 Python 依賴(lài)
pip install langchain
pip install openai
pip install ddtrace
- 創(chuàng)建 LLM
使用 Langchain 創(chuàng)建 LLM,模型選擇 `gpt-3.5` 正驻。
llm = ChatOpenAI(model='gpt-3.5-turbo',temperature=0)
- 創(chuàng)建 ConversationChain 對(duì)象
創(chuàng)建一個(gè) `ConversationChain` 對(duì)象弊攘,傳入之前創(chuàng)建的 `llm` 對(duì)象,設(shè)置 verbose 為 `True`(表示輸出詳細(xì)的調(diào)試信息)姑曙,并使用 `ConversationBufferMemory` 作為記憶儲(chǔ)存襟交。
conversation = ConversationChain(
? ? llm=llm, verbose=True, memory=ConversationBufferMemory()
)
- 創(chuàng)建對(duì)話函數(shù)
定義一個(gè)函數(shù) `track_tokens_usage` ,它接受一個(gè)對(duì)話鏈和一個(gè)查詢作為參數(shù)伤靠。
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
通過(guò)回調(diào)函數(shù) `get_openai_callback` 創(chuàng)建一個(gè)回調(diào)對(duì)象 `cb` 捣域,并通過(guò)對(duì)象 `cb` 可以獲取請(qǐng)求相關(guān)信息:請(qǐng)求數(shù)、消耗金額宴合、令牌數(shù)量等焕梅。
- 調(diào)用
track_tokens_usage(conversation, "介紹一下觀測(cè)云可觀測(cè)性的產(chǎn)品及優(yōu)勢(shì)")
由于執(zhí)行完成后,進(jìn)程會(huì)退出卦洽,添加以下代碼阻止退出贞言,方便相關(guān)數(shù)據(jù)及時(shí)上報(bào)。
print("腳本執(zhí)行完成阀蒂,按 Enter 鍵退出...")
input()
- 執(zhí)行腳本
DD_SERVICE="my-langchain" DD_ENV="dev" DD_AGENT_HOST="localhost" DD_AGENT_PORT="9529" ddtrace-run python3 langchain_demo.py
LangChain 可觀測(cè)性實(shí)踐效果
- 指標(biāo)
- 調(diào)用鏈
常見(jiàn)問(wèn)題
Token 異常
如果沒(méi)有配置 Token该窗,則會(huì)報(bào)錯(cuò):
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)
關(guān)于 Token,可以在代碼中定義:
import os
os.environ["OPENAI_API_KEY"] = 'sk-...DcE2'
但不建議那么做蚤霞,可以使用環(huán)境變量方式:
>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'
## 參考資料