什么是LangChain
langchain 是一個(gè)框架, 用于連接大語(yǔ)言模型的框架租漂, 它提供了一整套工具、組件和接口颊糜,簡(jiǎn)化上層應(yīng)用與大語(yǔ)言模型哩治,聊天模型的的過(guò)程,可輕松管理與模型的交互衬鱼,以及跟多組件鏈接起來(lái)业筏。
在 LangChain 中 提供 5 大模塊助力于引用的開(kāi)發(fā)
- 模型(models) : LangChain 支持的各種模型類(lèi)型和模型集成。
- 提示(prompts) : 包括提示管理鸟赫、提示優(yōu)化和提示序列化蒜胖。
- 內(nèi)存(memory) : 內(nèi)存是在鏈/代理調(diào)用之間保持狀態(tài)的概念。LangChain 提供了一個(gè)標(biāo)準(zhǔn)的內(nèi)存接口惯疙、一組內(nèi)存實(shí)現(xiàn)及使用內(nèi)存的鏈/代理示例翠勉。
- 索引(indexes) : 與您自己的文本數(shù)據(jù)結(jié)合使用時(shí),語(yǔ)言模型往往更加強(qiáng)大——此模塊涵蓋了執(zhí)行此操作的最佳實(shí)踐霉颠。
- 鏈(chains) : 鏈不僅僅是單個(gè) LLM 調(diào)用对碌,還包括一系列調(diào)用(無(wú)論是調(diào)用 LLM 還是不同的實(shí)用工具)。LangChain 提供了一種標(biāo)準(zhǔn)的鏈接口蒿偎、許多與其他工具的集成朽们。LangChain 提供了用于常見(jiàn)應(yīng)用程序的端到端的鏈調(diào)用怀读。
- 代理(agents) : 代理涉及 LLM 做出行動(dòng)決策、執(zhí)行該行動(dòng)骑脱、查看一個(gè)觀察結(jié)果菜枷,并重復(fù)該過(guò)程直到完成。LangChain 提供了一個(gè)標(biāo)準(zhǔn)的代理接口叁丧,一系列可供選擇的代理啤誊,以及端到端代理的示例。
以上內(nèi)容引用于LangChain ????? 中文網(wǎng)
使用 LangChain前期準(zhǔn)備
前期準(zhǔn)備內(nèi)容
Python 環(huán)境 version>=3.0
OPENAI_API_KEY 自行準(zhǔn)備拥娄,用于體驗(yàn)與語(yǔ)言模型交互
-
安裝 LangChain依賴(lài)
pip install langchain openai
簡(jiǎn)單實(shí)用示例
構(gòu)建簡(jiǎn)單的 LLM 模型
from langchain import OpenAI
llm = OpenAI(
temperature=0,
openai_api_key='<OPENAI_API_KEY>',
model_name="gpt-3.5-turbo-16k"
)
# --------- 不具備上下文理解能的調(diào)用方式
while True:
print("輸入問(wèn)題")
ls = input()
print("\n-----\n")
print(track_tokens_usage(llm, ls))
print("\n 回答結(jié)束 \n")
具體的使用結(jié)果
[圖片上傳失敗...(image-db2c43-1689201283644)]
<img src="https://blogimg.50xr.com/markdown/202307122158605.png" alt="image-20230712215815549" style="zoom:50%;" />
從以上簡(jiǎn)單的示例中可以看出蚊锹,在每次簡(jiǎn)單調(diào)用的時(shí)候, 不具備理解上下文的內(nèi)容稚瘾, 這個(gè)使用我們需要結(jié)合使用memory模型了牡昆,
memory模式的使用
- ConversationBufferMemory
- ConversationSummaryMemory
以上兩個(gè)類(lèi)都是在調(diào)用接口的時(shí)候使用內(nèi)存存儲(chǔ)上下文內(nèi)容, 但是存在本質(zhì)上的區(qū)別
區(qū)別 | ConversationBufferMemory | ConversationSummaryMemory |
---|---|---|
存儲(chǔ)形式 | 使用原始內(nèi)容進(jìn)行記錄 | 會(huì)調(diào)用接口生成摘要 |
token消耗 | 與聊天內(nèi)容成正比 | 整體為正比關(guān)系摊欠,但是后期消耗 token 比前期少 |
請(qǐng)求次數(shù) | 只有一次請(qǐng)求 | 有兩次請(qǐng)求丢烘, 其中一次會(huì)回去全部聊天內(nèi)容的摘要 |
使用示例
- 具體代碼
from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
# 定義 LLM 模型
llm = OpenAI(
temperature=0,
openai_api_key='<OPENAI_API_KEY>',
model_name="gpt-3.5-turbo-16k"
)
# 定義 memory 對(duì)象
conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory())
# conversation = ConversationChain(llm=llm, memory=ConversationSummaryMemory(llm=llm))
while True:
print("輸入問(wèn)題")
ls = input()
print("\n-----\n")
# 這里可以去掉空格,標(biāo)點(diǎn)
print(chain_tokens_usage(conversation, ls))
print("*********************** 打印具體的保存內(nèi)容 *************************")
print(conversation.memory.buffer)
print("*********************** 打印具體的保存內(nèi)容 *************************")
print("\n 回答結(jié)束 \n")
- 執(zhí)行結(jié)果, 提問(wèn)與上面相同
[圖片上傳失敗...(image-c58378-1689201283645)]
[圖片上傳失敗...(image-9786b1-1689201283645)]
上圖是采用ConversationSummaryMemory 模式進(jìn)行的問(wèn)答些椒,從上圖中可以看出已經(jīng)具備一定的上下文理解能力播瞳。 采用 ConversationBufferMemory 模式的可以自己嘗試一下
統(tǒng)計(jì) token 使用以及費(fèi)用
具體代碼如下
from langchain.callbacks import get_openai_callback
def track_tokens_usage(llm, query):
"""直接使用大模型進(jìn)行調(diào)用openai 接口"""
with get_openai_callback() as cb:
result = llm(query)
# 以下為打印真實(shí)的消耗和具體費(fèi)用
print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Successful Requests: {cb.successful_requests}")
print(f"Total Cost (USD): ${cb.total_cost}")
return result
def chain_tokens_usage(chain, query):
"""使用 chain 調(diào)用 openai 接口"""
with get_openai_callback() as cb:
result = chain.run(query)
# 以下為打印真實(shí)的消耗和具體費(fèi)用
print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Successful Requests: {cb.successful_requests}")
print(f"Total Cost (USD): ${cb.total_cost}")
return result
寫(xiě)在最后
- 這只是一個(gè)簡(jiǎn)單的使用示例, langchain 還有很多強(qiáng)大而有用的內(nèi)容等待一步步的學(xué)習(xí)
- 第一次學(xué)習(xí) python 相關(guān)內(nèi)容摊沉, 如有用詞不當(dāng)狐史,不正確的地方痒给,敬請(qǐng)諒解