最近一直在研究如何用 LangChain 和 ZhipuAI 搭建一個智能對話系統,發現這個組合真的非常強大,而且實現起來并不復雜。今天就來分享一下我的學習過程和一些心得體會,希望能幫到同樣在探索這個領域的小伙伴們。
一、 環境搭建:從零開始
首先,搭建一個智能對話系統的第一步是環境的配置。我們需要用到 LangChain AI應用開發框架和 ZHIPU AI開放平臺 的AI模型 。LangChain 是將AI模型集成到應用中,而 ZhipuAI 提供了模型支持,比如 GLM-4-Flash。
以下代碼均在jupyter上實現。
安裝相關包
pip install langchain
pip install langchain_community
pip install zhupuai
# 若后續報錯提示缺少包,則根據提示再安裝就好
添加API key
質譜AI開放平臺→個人中心(鼠標移到右上角,一個人的圖標)→項目管理(左側欄)→API keys(點擊)→添加新的API key(右上角)
導入依賴庫的代碼如下:
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
然后,我們需要配置 ZhipuAI 的 API 密鑰。這一步很簡單,只需要將密鑰填入環境變量中:
import os
os.environ["ZHIPUAI_API_KEY"] = "你的API key"
到這里,環境就搭建好了。是不是很簡單?不過,別小看這一步,API 密鑰的正確配置是后續一切順利運行的基礎。
二、 模型初始化:選擇 GLM-4-Flash
接下來是模型的初始化。這里我選擇了 ZhipuAI 提供的 GLM-4-Flash 模型,它在對話任務中表現非常出色。初始化代碼如下:
chat = ChatZhipuAI(model="glm-4-flash",temperature=0.5,
)
temperature
參數是用來控制模型輸出的隨機性的,值越高,輸出越隨機。我這里設置為 0.5,是一個比較平衡的選擇。
三、 單輪對話:最簡單的開始
單輪對話是最基礎的功能,只需要調用 chat.invoke()
方法,傳入一個 HumanMessage
對象即可:
response = chat.invoke([HumanMessage(content="用一句話解釋 LangChain")])
print(response.content)
運行這段代碼后,模型會返回一個關于 LangChain 的簡短解釋。這一步非常簡單,但也很有趣,因為你可以直接看到模型的輸出。
結果如下:(模型不同結果可能不同)
LangChain是一個構建和擴展自然語言處理應用的開源框架。
四、 多輪對話:手動管理歷史
單輪對話雖然簡單,但實際應用中我們更需要多輪對話。多輪對話需要管理對話歷史,這里可以通過手動維護一個歷史列表來實現:
history = [HumanMessage(content="推薦一部電影"), # 用戶輸入的內容AIMessage(content="我推薦肖申克的救贖"), # AI根據上面用戶輸出的內容(我們手動指定)HumanMessage(content="請介紹這部電影") # 用戶再次輸入的內容
]
new_response = chat.invoke(history)
print(new_response.content)
手動管理歷史的好處是靈活性高,但缺點是需要自己維護歷史記錄,容易出錯。
結果如下:(模型不同結果可能不同)
《肖申克的救贖》(The Shawshank Redemption)是一部1994年上映的美國劇情片,由弗蘭克·德拉邦特(Frank Darabont)執導,根據斯蒂芬·金(Stephen King)的短篇小說《麗塔·海華絲及肖申克監獄的救贖》改編。這部電影以其深刻的主題、出色的表演和精湛的敘事技巧而聞名。以下是關于《肖申克的救贖》的一些詳細信息:**劇情簡介**:
故事發生在1947年的美國,銀行家安迪·杜弗雷恩(Andy Dufresne)被錯誤地定罪謀殺了他的妻子和她的情人,并被判處兩個無期徒刑。他被送到了肖申克監獄,這是一所位于緬因州的環境惡劣的監獄。在那里,他遇到了各種各樣的人物,包括監獄長和他的腐敗官員,以及監獄里的其他囚犯。安迪在監獄中展現了他的智慧和堅韌不拔,他幫助其他囚犯改善生活條件,并秘密地教授他們閱讀和寫作。隨著時間的推移,安迪和監獄中的一位老囚犯瑞德(Red)建立了深厚的友誼。瑞德成為了安迪的知己,并見證了他的希望和堅持。**主要角色**:
- 安迪·杜弗雷恩(由蒂姆·羅賓斯飾演):一個聰明、冷靜、有毅力的銀行家,被錯誤定罪。
- 埃利斯·“瑞德”·雷丁(由摩根·弗里曼飾演):一個經驗豐富的囚犯,后來成為安迪的朋友。
- 威爾·霍金斯(由鮑勃·岡頓飾演):肖申克監獄的監獄長,一個腐敗的官員。**電影特點**:
- **主題**:《肖申克的救贖》探討了希望、友誼、救贖和自由的主題。它展示了即使在最黑暗的環境中,人們仍然可以保持希望和尊嚴。
- **敘事**:電影的敘事節奏緩慢而引人入勝,通過一系列的閃回和現實場景,逐漸揭示故事的細節。
- **表演**:蒂姆·羅賓斯和摩根·弗里曼的表演被認為是電影史上的經典之一,他們的角色深入人心。
- **音樂**:電影的音樂由托馬斯·紐曼創作,以其悠揚的旋律和情感深度而著稱。《肖申克的救贖》雖然在上映時并未獲得巨大的商業成功,但隨著時間的推移,它逐漸獲得了廣泛的認可和贊譽,被認為是電影史上最偉大的電影之一。
五、 多輪對話:自動管理歷史
為了更方便地管理對話歷史,LangChain 提供了 ConversationBufferMemory
,可以自動記錄歷史。代碼如下:
# 實例化緩存對話歷史
memory = ConversationBufferMemory()
conversation = ConversationChain(llm=chat, memory=memory)# 第一次對話
print(conversation.run("用一句話介紹肖申克的救贖")) print("--------------------------以下是第二輪對話---------------------------")# 第二次對話(自動攜帶歷史)
print(conversation.run("類似的電影"))
這里 ConversationChain
會自動將歷史記錄傳遞給模型,開發者完全不需要手動管理歷史。這種方式非常適合需要頻繁交互的場景。
《肖申克的救贖》是一部改編自史蒂芬·金的短篇小說的電影,講述了一個銀行家安迪·杜佛蘭在監獄中通過智慧和毅力最終獲得自由的故事。
--------------------------以下是第二輪對話---------------------------
《肖申克的救贖》這樣的電影通常被歸類為勵志片或劇情片,強調人性的光輝和希望的力量。以下是一些類似的電影:1. 《勇敢的心》(Braveheart)- 史蒂文·斯皮爾伯格執導,講述蘇格蘭民族英雄威廉·華萊士的故事。2. 《辛德勒的名單》(Schindler's List)- 史蒂文·斯皮爾伯格執導,描述了二戰期間德國商人奧斯卡·辛德勒如何拯救上千名猶太人的故事。3. 《美麗心靈》(A Beautiful Mind)- 根據諾貝爾經濟學獎得主約翰·納什的真實故事改編,講述了他與精神疾病斗爭并最終取得成功的故事。4. 《阿甘正傳》(Forrest Gump)- 根據溫斯頓·格魯姆的同名小說改編,講述了一個智力有限但心地善良的男子在美國歷史中的奇遇。5. 《海上鋼琴師》(The Legend of 1900)- 講述了一個在船上出生并長大的鋼琴天才的故事。6. 《當幸福來敲門》(The Pursuit of Happyness)- 威爾·史密斯主演,講述了一個父親如何在逆境中努力為兒子創造一個更好的生活。這些電影都通過主人公的奮斗和成長,展現了人性的堅韌和生命的價值。
六、 總結
通過以上步驟,我們已經成功搭建了一個基于 LangChain 和 ZhipuAI 的智能對話。無論是單輪對話還是多輪對話,都可以輕松實現。不過,這只是開始,未來還有很多可以優化的地方,比如:
- 更復雜的對話邏輯:結合 RAG(Retrieval-Augmented Generation)技術,讓對話系統可以基于外部數據進行回答。
- 性能優化:通過調整
temperature
參數或選擇更高效的模型,提升對話的流暢度和響應速度。 - 應用場景擴展:嘗試將對話系統應用到客服、教育、娛樂等領域,探索更多可能性。
以上就是我的學習總結,祝我們學習愉快 😊
下一篇:(二)輸入輸出處理——打造智能對話的靈魂