(一)从零开始:用 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.mzph.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​ 的最大公约数…