Langchain 筆記
[TOC]
AI大模型開(kāi)發(fā)做什么
LangChain 是什么?
LangChain是一個(gè)用于開(kāi)發(fā)由語(yǔ)言模型驅(qū)動(dòng)的應(yīng)用程序的框架。
Langchain是一個(gè)開(kāi)源框架,它允許開(kāi)發(fā)人員將像GPT-4這樣的大型語(yǔ)言模型與外部的計(jì)算和數(shù)據(jù)
源結(jié)合起來(lái)。
- 具有上下文感知能力:將語(yǔ)言模型連接到上下文來(lái)源(提示指令,少量的示例,需要回應(yīng)的內(nèi)容等)
- 具有推理能力:依賴語(yǔ)言模型進(jìn)行推理(根據(jù)提供的上下文如何回答,采取什么行動(dòng)等)
核心組件
這個(gè)框架由幾個(gè)部分組成。
- LangChain 庫(kù):Python 和 JavaScript 庫(kù)。包含了各種組件的接口和集成,一個(gè)基本的運(yùn)行時(shí),用于將這些組件組合成鏈和代理,以及現(xiàn)成的鏈和代理的實(shí)現(xiàn)。
- LangChain 模板:一系列易于部署的參考架構(gòu),用于各種任務(wù)。
- LangServe:一個(gè)用于將 LangChain 鏈部署為 REST API 的庫(kù)。
- LangSmith:一個(gè)開(kāi)發(fā)者平臺(tái),讓你可以調(diào)試、測(cè)試、評(píng)估和監(jiān)控基于任何 LLM 框架構(gòu)建的鏈,并且與 LangChain 無(wú)縫集成
這些產(chǎn)品一起簡(jiǎn)化了整個(gè)應(yīng)用程序的生命周期:
- 開(kāi)發(fā):在 LangChain/LangChain.js 中編寫你的應(yīng)用程序。使用模板作為參考,快速開(kāi)始。
- 生產(chǎn)化:使用 LangSmith 來(lái)檢查、測(cè)試和監(jiān)控你的鏈,這樣你可以不斷改進(jìn)并有信心地部署。
- 部署:使用 LangServe 將任何鏈轉(zhuǎn)換為 API。
為什么要用LangChain ?
- 數(shù)據(jù)連接: 允許將大型語(yǔ)言模型鏈接到自己的數(shù)據(jù)源,數(shù)據(jù)庫(kù)、pdf文件或其他文檔
- 行動(dòng)執(zhí)行:根據(jù)信息執(zhí)行特定操作 ,如發(fā)送郵件
LangChain 底層原理
應(yīng)用場(chǎng)景:
個(gè)人助手
學(xué)習(xí)輔助
數(shù)據(jù)分析和數(shù)據(jù)科學(xué)
LangChain 庫(kù)
LangChain 包的主要價(jià)值主張是:
- 組件:用于處理語(yǔ)言模型的可組合工具和集成。無(wú)論你是否使用 LangChain 框架的其余部分,組件都是模塊化的,易于使用
- 現(xiàn)成的鏈:用于完成高級(jí)任務(wù)的組件的內(nèi)置組合
現(xiàn)成的鏈?zhǔn)沟瞄_(kāi)始變得容易。組件使得定制現(xiàn)有鏈和構(gòu)建新鏈變得容易。
LangChain 庫(kù)本身由幾個(gè)不同的包組成。
-
langchain-core
:基礎(chǔ)抽象和 LangChain 表達(dá)式語(yǔ)言。 -
langchain-community
:第三方集成。 -
langchain
:構(gòu)成應(yīng)用程序認(rèn)知架構(gòu)的鏈、代理和檢索策略
。
核心
開(kāi)始使用
LangChain 環(huán)境和監(jiān)控
LangChain 開(kāi)發(fā)賬戶密碼
zhzxweijing@126.com
PAq!@#00
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
openAPI_KEY = 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
#智譜清言
2333506a5aea4dcca0798aacd92ebb20.iqTdy7YjClLmTWsB
LangChain 調(diào)用LLM
import os
from langchain_core.output_parsers import StrOutputParser
from langchain_zhipu import ChatZhipuAI
from langchain_core.messages import HumanMessage, SystemMessage
# os.environ['http_proxy'] = '127.0.0.1:7890'
# os.environ['https_proxy'] = '127.0.0.1:7890'
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = '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'
os.environ["ZHIPUAI_API_KEY"] = '2333506a5aea4dcca0798aacd92ebb20.iqTdy7YjClLmTWsB'
# revoke llm
# LLM model revoke api
# 1. create model
model = ChatZhipuAI(model='glm-4-0520')
# 2. msg
msg = [
SystemMessage(content="你是個(gè)翻譯助手"),
HumanMessage(content=" 將下列文本內(nèi)容翻譯為英語(yǔ) < 故宮、 天壇 都有著各自不錯(cuò)的風(fēng)景>")
]
print("AI模型輸出回復(fù)結(jié)果:")
result = model.invoke(msg)
print(result)
# 3. parser
#
# result_str = StrOutputParser().invoke(result)
# print(result_str)
parser = StrOutputParser()
# 4. chain
chain = model | parser
result = chain.invoke(msg)
print(result)
在Python中,
chain = model | parser
這種語(yǔ)法并不是Python內(nèi)置的語(yǔ)法,而是特定庫(kù)(如langchain
)中定義的鏈?zhǔn)讲僮鞣KǔS糜趯⒍鄠€(gè)操作或組件連接在一起,形成一個(gè)處理鏈。在這個(gè)例子中,model
和parser
是兩個(gè)組件,|
操作符將它們連接起來(lái),形成一個(gè)處理鏈。具體來(lái)說(shuō):
?model
是一個(gè)語(yǔ)言模型(如ChatZhipuAI
),用于生成文本。
?parser
是一個(gè)輸出解析器(如StrOutputParser
),用于將模型的輸出解析為字符串。通過(guò)
chain = model | parser
,你將模型和解析器連接在一起,形成一個(gè)處理鏈。當(dāng)你調(diào)用chain.invoke(msg)
時(shí),輸入msg
會(huì)先經(jīng)過(guò)model
處理,生成的結(jié)果再傳遞給parser
進(jìn)行解析,最終輸出解析后的結(jié)果。這種鏈?zhǔn)讲僮鞣氖褂梅绞筋愃朴诠艿溃╬ipe)操作,常見(jiàn)于流式處理或任務(wù)鏈的場(chǎng)景。它使得代碼更加簡(jiǎn)潔和易讀,尤其是在處理多個(gè)步驟的任務(wù)時(shí)。
如果你想了解更多關(guān)于鏈?zhǔn)秸{(diào)用的內(nèi)容,可以參考和中的相關(guān)介紹。
LangChain提示模板(PromptTemplate)
prompt_template = ChatPromptTemplate.from_messages([
('system', '將下文內(nèi)容翻譯為{language}'),
('user', '{text}')])
# 4. chain
chain = prompt_template | model | parser
# result = chain.invoke(msg)
result = chain.invoke({"language": "韓語(yǔ)", "text": "故宮、天壇都有著各自不錯(cuò)的風(fēng)景"})
print(result)
LangServer 部署應(yīng)用程序
pip install "langserve[all]"
# 4. chain
chain = prompt_template | model | parser
# result = chain.invoke(msg)
result = chain.invoke({"language": "韓語(yǔ)", "text": "故宮、天壇都有著各自不錯(cuò)的風(fēng)景"})
print(result)
app = FastAPI(title='我langchain 服務(wù)', version='0.0.1', description='我langchain翻譯服務(wù)')
from langserve import add_routes # 導(dǎo)入add_routes函數(shù)
add_routes(app,chain,path="/chain")
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
聊天機(jī)器人:
需要安裝: `pip install langchain_community`
-
Chat History: 機(jī)器人
-
流式輸出
循環(huán):往復(fù) ==流式== 輸出
向量數(shù)據(jù)庫(kù)和檢索器
支持從向量數(shù)據(jù)庫(kù)和其他來(lái)源檢索數(shù)據(jù),以便與LLM(大型語(yǔ)言言模型)工作流程集成。它們對(duì)于應(yīng)用程序來(lái)說(shuō)非常重要,這些應(yīng)用程序需要獲取數(shù)據(jù)以作為模型推理的一部分進(jìn)行推理,就像檢索增強(qiáng)生成(RAG)的情況一樣
需要安裝
pip install langchain-chroma
檢索器和模型結(jié)合
Tavily 檢索工具
LangChain 構(gòu)建代理
語(yǔ)言模型本身無(wú)法執(zhí)行動(dòng)作,它們只能輸出文本。代理是使用大型語(yǔ)語(yǔ)言模型(LLM)作為推理引擎來(lái)確定要執(zhí)行的操作以及這些操作的輸入應(yīng)該是什么。然后,這些操作的結(jié)果可以反饋到代理中,代理將決定是否需要更多的操作,或者是否可以結(jié)束。
pip install langgraph 用來(lái)創(chuàng)建代理的API
-
定義工具
1. 無(wú)代理場(chǎng)景 
<img src="https://upload-images.jianshu.io/upload_images/12905269-27c858c59b29e088.png" style="zoom: 90%;" />
- 有代理場(chǎng)景
- Travily 作為代理使用
-
創(chuàng)建代理

Agent代理使用
LangChaing構(gòu)建RAG 的對(duì)話應(yīng)用
- 加載
-
分割
注: 檢索器 也需要引入上下文 理解
LangChain 讀取數(shù)據(jù)庫(kù)
采用鏈模式
采用代理模式
整合數(shù)據(jù)庫(kù)
LangChain 檢索視頻字幕
sqlite: 小型數(shù)據(jù)庫(kù), 實(shí)際存儲(chǔ)的是元文件, 實(shí)際數(shù)據(jù)存儲(chǔ)在文件目錄里
根據(jù)檢索條件進(jìn)行檢索
提取結(jié)構(gòu)化數(shù)據(jù)
自動(dòng)生成數(shù)據(jù)
langChain文本分類
langChain 自動(dòng)摘要
填充Stuff :
注:只能處理 token限制范圍內(nèi)的 ,小文本
映射-歸約Map-reduce: 【分而治之】 思想
注:超出文本數(shù)量, 切割 → 進(jìn)行匯總 ;適合大文本
細(xì)化refine:
詳解 TransFormer
TransFormer 之位置編碼
注 : 自注意力機(jī)制 → 特征提取 ( 提取到有用的句子)
- Scale → 縮小規(guī)模
- Mask →掩碼
- SoftMax → 歸一概率 0~1
多頭注意力機(jī)制:
-
位置編碼
RNN 網(wǎng)絡(luò): 不需要位置編碼 ,為何transform 需要
RNN: 向后傳 → 自帶前后順序 → 并行機(jī)制
transform: 不考慮順序,并行處理 ,需要位置編碼
embedding : i 詞向量長(zhǎng)度、2i偶數(shù)位、 sin角度 , Dmodel 超參數(shù)
Decoder
全部傳遞 → Mssk Inference(推理)
輸出層
decode → Linear + Softmax
Bert
注:預(yù)訓(xùn)練 雙向深度 →
本文由mdnice多平臺(tái)發(fā)布