(一)從零開始:用 LangChain 和 ZhipuAI 搭建簡單對話

最近一直在研究如何用 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 參數或選擇更高效的模型,提升對話的流暢度和響應速度。
  • 應用場景擴展:嘗試將對話系統應用到客服、教育、娛樂等領域,探索更多可能性。

以上就是我的學習總結,祝我們學習愉快 😊

下一篇:(二)輸入輸出處理——打造智能對話的靈魂

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75766.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp地圖導航及后臺百度地圖回顯(v2/v3版本)

百度地圖申請地址&#xff1a;控制臺 | 百度地圖開放平臺 效果&#xff1a; 1.后臺 1.1申請百度地圖APi 1.2 引入百度地圖 <script type"text/javascript" src"//api.map.baidu.com/api?v3.0&ak自己百度生氣apikey"></script> 1.3 v2組…

Java模板方法模式詳解

模板方法模式詳解 一、模式定義 模板方法模式(Template Method Pattern)定義一個操作中的算法骨架&#xff0c;將某些步驟延遲到子類實現。 二、核心結構 1. 抽象模板類 public abstract class AbstractTemplate {// 模板方法&#xff08;final防止子類覆蓋&#xff09;pu…

(5)模擬后——Leonardo的可視化操作

1 引言 經過n天的模擬&#xff0c;模擬結果相信已經到手&#xff0c;但如何進行分析呢。 首先是可視化&#xff0c;可視化方法基本分為兩類 基于ENVI-met自帶軟件Leonardo的可視化操作基于NetCDF的可視化操作 2 模擬結果變量說明 首先&#xff0c;模擬結果會有以下幾個文件…

基于YOLO11實例分割與奧比中光相機的快遞包裹抓取點檢測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄&#xff0c;查看更多內容。 0 引言 項目采用六軸機械臂搭配末端真空吸盤&#xff0c;從無序包裹中抓取想要的包裹。AI算法需要提供各包裹的抓取點的3D坐標與3D姿態。由于快遞包裹含…

【學Rust寫CAD】31 muldiv255函數(muldiv255.rs)

源碼 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

藍橋云客--團隊賽

2.團隊賽【算法賽】 - 藍橋云課 問題描述 藍橋杯最近推出了一項團隊賽模式&#xff0c;要求三人組隊參賽&#xff0c;并規定其中一人必須擔任隊長。隊長的資格很簡單&#xff1a;其程序設計能力值必須嚴格大于其他兩名隊友程序設計能力值的總和。 小藍、小橋和小杯正在考慮報名…

#Linux內存管理# 假設設備上安裝了一塊2G的物理內存,在系統啟動時,ARM Linux內核是如何映射的?

在ARM Linux系統啟動過程中&#xff0c;對2GB物理內存的映射實現分為以下幾個關鍵階段&#xff1a; 一、設備樹解析與內存信息獲取 1.設備樹定義 物理內存范圍通過設備樹&#xff08;DTS&#xff09;的memory節點定義&#xff0c;例如&#xff1a; memory60000000 { device_ty…

使用MATIO庫讀取Matlab數據文件中的多維數組

使用MATIO庫讀取Matlab數據文件中的多維數組 MATIO是一個用于讀寫Matlab數據文件(.mat)的開源C庫。下面是一個完整的示例程序&#xff0c;展示如何使用MATIO庫讀取Matlab數據文件中的多維數組。 示例程序 #include <stdio.h> #include <stdlib.h> #include <…

react+antd中做一個外部按鈕新增 表格內部本地新增一條數據并且支持編輯刪除(無難度上手)

需求背景 做一個可以外部控制新增刷新表格 表格內部可以編輯刪除 類似下方需求圖 實現過程 因為我實現時有兩個這樣的表格 所以我的事件里面會有傳參用于判斷 可忽略傳參判斷部分 代碼中有formatMessage部分為國際化可忽略 <div style{{ marginBottom: 10px, margin…

【深度學習新浪潮】視覺與多模態大模型文字生成技術研究進展與產品實踐

一、研究進展 跨模態架構創新 原生多模態模型:微軟KOSMOS系列通過統一框架支持文本、圖像、語音等多模態輸入輸出,實現跨模態推理與遷移。例如,KOSMOS-2.5可處理文本密集圖像,生成結構化文本描述,并通過重采樣模塊優化視覺與語言的對齊。混合專家架構:第三代模型(如Deep…

重生之我是去噪高手——diffusion model

diffusion model是如何運作的&#xff1f; 想象一下&#xff0c;你有一張清晰的圖片。擴散模型的核心思想分為兩個過程&#xff1a; 前向過程&#xff08;Forward Process / Diffusion Process&#xff09;&#xff1a;逐步加噪反向過程&#xff08;Reverse Process / Denois…

華為項目管理“六步一法”方法論全解析:目標確認、項目活動分解與日事清系統協同

大家都知道&#xff0c;項目管理在現在各個行業里都是越來越重要了。 要是搞不好&#xff0c;項目就會拖沓&#xff0c;甚至走向失敗。 今天咱們就來聊聊華為是怎么做項目管理的&#xff0c;比較知名的就是它們的“六步一法”。華為通過“六步一法”來進行項目管理&#xff0…

OpenCV 圖形API(9)用于執行矩陣與標量之間的逐元素除法操作函數divC()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 矩陣除以標量。 該函數 divC 將矩陣 src 的每個元素除以給定的標量值&#xff1a; dst(I) saturate(src(I)*scale/divisor) \texttt{dst(I) s…

單例模式(懶漢模式/餓漢模式)

相關概念參考&#xff1a;【C】C 單例模式總結&#xff08;5種單例實現方法&#xff09;_單例模式c實現-CSDN博客 #include<iostream>class LazySingle{ public:static LazySingle& getInstance(){static LazySingle instance;return instance;}void hello(){std::c…

RocketMQ初認識

ProducerCustomerNameServer: Broker的注冊服務發現中心BrokerServer:主要負責消息的存儲、投遞和查詢以及服務高可用保證 RocketMQ的集群部署&#xff1a; 單個master的分支多個Master 模式&#xff1a;集群中有多個 Master 節點&#xff0c;彼此之間相互獨立。生產者可以將消…

Maven/Gradle的講解

一、為什么需要構建工具? 在理解 Maven/Gradle 之前,先明確它們解決的問題: ??依賴管理??:項目中可能需要引入第三方庫(如 Spring、JUnit 等),手動下載和管理這些庫的版本非常麻煩。??標準化構建流程??:編譯代碼、運行測試、打包成 JAR/WAR 文件等步驟需要自動…

基于SSM的車輛管理系統的設計與實現(代碼+數據庫+LW)

摘要 當下&#xff0c;正處于信息化的時代&#xff0c;許多行業順應時代的變化&#xff0c;結合使用計算機技術向數字化、信息化建設邁進。以前企業對于車輛信息的管理和控制&#xff0c;采用人工登記的方式保存相關數據&#xff0c;這種以人力為主的管理模式已然落后。本人結…

嵌入式硬件篇---JSON通信以及解析

文章目錄 前言一、JSON特點語法簡單數據格式靈活輕量化跨語言使用二、JSON數據結構對象數組三、JSON在單片機之間通信的應用數據封裝與傳輸四、JSON示例代碼五、JSON在上位機與單片機之間通信的應用數據交互六、JSON示例代碼七、JSON解析與生成解析生成八、Python中的數據解析1…

【C#】.net core 6.0 依賴注入常見問題之一,在構造函數使用的類,都需要注入到容器里,否則會提示如下報錯,讓DeepSeek找找原因,看看效果

&#x1f339;歡迎來到《小5講堂》&#x1f339; &#x1f339;這是《C#》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。&#x1f339; &#x1f339;溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01;&#…

《P1072 [NOIP 2009 提高組] Hankson 的趣味題》

題目描述 Hanks 博士是 BT&#xff08;Bio-Tech&#xff0c;生物技術) 領域的知名專家&#xff0c;他的兒子名叫 Hankson。現在&#xff0c;剛剛放學回家的 Hankson 正在思考一個有趣的問題。 今天在課堂上&#xff0c;老師講解了如何求兩個正整數 c1? 和 c2? 的最大公約數…