介紹
當前,人工智能大模型公司如雨后春筍般迅速涌現,例如 OpenAI、文心一言、通義千問等,它們提供了成熟的 API 調用服務。然而,隨之而來的是不同公司的繁瑣協議接入過程,這讓許多開發者感到頭疼不已。有沒有一種統一的工具,能夠讓我們一次性接入所有公司的 API 協議,并且基于它們的底層能力封裝出各種酷炫功能呢?今天,這樣的工具終于來了——Langchain,它以堅實的步伐走來,為我們帶來了極大的便利和創新。
Langchain 是一個專為適配各家大模型 API 而生的框架,不僅如此,它還封裝了各種重要模塊,使得大家能夠輕松搭建出各種令人驚嘆的人工智能應用。以下代碼基于 langchain 2.0 版本實現
模塊介紹:
-
Model:?這一模塊的重要性不言而喻。Langchain 的 Model 模塊致力于適配各大模型公司的接口協議,使得接入過程更加簡單和高效。不再需要為每個公司的特殊協議而煩惱,Langchain 幫助您一次性搞定。
-
Prompt:?提示詞的運用是大模型輸出準確性的關鍵。Langchain 的 Prompt 模塊不僅讓大模型能更準確地輸出我們期望的回答,還衍生出了“提示工程”。建議在使用大模型之前先查看提示工程,以獲得更好的結果和體驗。
-
History:?大模型本身并不具備記憶功能,這帶來了一個看似矛盾的問題:為什么像 ChatGPT 這樣的模型能夠聯系到我們之前的提問并給出相關回復呢?Langchain 的 History 模塊揭示了這個謎團的解答。其實,實現原理非常簡單,只需將你的上一個提問一并發送給大模型即可。當然,實際實現中還涉及一些問題,比如如何標識同一輪對話、信息存儲位置、處理過多文本等等。因此,需要自行實現部分邏輯,但 Langchain 為您提供了思路和基礎。
言歸正傳,讓我們開始實戰代碼,探索 Langchain 帶來的無限可能吧!
快速開始
1. 先安裝依賴,以openai為例
pip install langchainpip install -qU langchain-openai
2. 初始化model
import osos.environ["OPENAI_API_KEY"] = "sk-xxx"from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-3.5-turbo")
3. 發起請求
from langchain_core.messages import HumanMessageresponse = model.invoke([HumanMessage(content="你好")])response.content
4.得到回答
'你好!有什么可以幫助你的嗎?'
🎉 恭喜你,你已經可以成功使用langchain調用大模型api了
加入歷史記憶實現連續對話
經過以上步驟,你已經可以跟大模型進行聊天,但是有個問題,現在他是不會記憶上一輪的回答的,你上一句問他東西,他轉頭就忘了,那該怎么辦呢?那就給他加上歷史記憶好了
# 沒有 history memoryfrom langchain_core.messages import HumanMessagequestion_1 = "你好,我叫小明"
result_1 = model.invoke([HumanMessage(content=f"{question_1}")])
print(result_1.content)question_2 = "我叫什么名字"
result_2 = model.invoke([HumanMessage(content=f"{question_2}")])
print(result_2.content)
返回結果
你好,小明!有什么可以幫助你的嗎?
抱歉,我無法回答這個問題,因為我不知道您的名字。您可以告訴我您的名字嗎?我會很高興稱呼您的名字。
開頭也說了,大模型是沒有記憶功能的,目前業界的實現方式都是通過各自實現存儲,在聊天中將上一輪的問答也一起發送過去,讓大模型有了“記憶”,那最簡單的方法就是用個list存儲,然后每次回答都帶上去就好了
# 簡單實現 history memoryfrom langchain_core.messages import HumanMessagestore = []question_1 = "你好,我叫小明"
result_1 = model.invoke([HumanMessage(content=f"{question_1}")])
print(result_1.content)store.append({"human": question_1, "ai": result_1.content})question_2 = "我叫什么名字"
result_2 = model.invoke([HumanMessage(content=f"history: {store} {question_2} ")])
print(result_2.content)
返回結果:
你好,小明!有什么可以幫助你的嗎?
你的名字是小明。有什么可以幫助你的嗎?如果有任何問題,隨時問我吧!
神奇的事情發生了,大模型有“記憶”了?
當然,langchain也為我們提供了方便的實現,讓我們不用顯式的寫history
pip install langchain_community
# 使用官方模塊實現from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistorystore = {}def get_session_history(session_id: str) -> BaseChatMessageHistory:if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]with_message_history = RunnableWithMessageHistory(model, get_session_history)config = {"configurable": {"session_id": "abc2"}}question_1 = "你好,我叫小明"
result_1 = with_message_history.invoke([HumanMessage(content=f"{question_1}")],config=config)
print(result_1.content)question_2 = "我叫什么名字"
result_2 = with_message_history.invoke([HumanMessage(content=f"{question_2}")],config=config)
print(result_2.content)
你好小明,有什么可以幫助你的嗎?
你告訴我你叫小明。
同時langchain還提供了更多類型的memory實現,讓我們可以使用redis去存儲歷史記錄,這個就留給大家自己實現了 ?Redis | 🦜?🔗 LangChain
加入提示詞prompt格式化回答
在上述的實現中,我們的做法就是簡單的字符串拼接發送給大模型,使用prompt可以讓我們更好的格式化我們的輸入
# 加入promptfrom langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderstore = {}def get_session_history(session_id: str) -> BaseChatMessageHistory:if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]prompt = ChatPromptTemplate.from_messages([("system","在每一句話結尾都加上 回復完畢",),MessagesPlaceholder(variable_name="messages"),]
)chain = prompt | modelwith_message_history = RunnableWithMessageHistory(chain, get_session_history)config = {"configurable": {"session_id": "abc2"}}question_1 = "你好,我叫小明"
result_1 = with_message_history.invoke([HumanMessage(content=f"{question_1}")],config=config)
print(result_1.content)question_2 = "我叫什么名字"
result_2 = with_message_history.invoke([HumanMessage(content=f"{question_2}")],config=config)
print(result_2.content)
你好,小明。有什么可以幫助你的嗎?回復完畢
您的名字是小明。回復完畢
🎉 這樣你就完成了一個能連續對話的ai機器人啦