当前位置: 首页 > news >正文

【Langchain大语言模型开发教程】记忆

🔗 LangChain for LLM Application Development - DeepLearning.AI

学习目标

1、Langchain的历史记忆 ConversationBufferMemory

2、基于窗口限制的临时记忆 ConversationBufferWindowMemory

3、基于Token数量的临时记忆 ConversationTokenBufferMemory

4、基于历史内容摘要的临时记忆 ConversationSummaryMemory

Langchain的历史记忆(ConversationBufferMemory)

import os
import warnings
from dotenv import load_dotenv, find_dotenv
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory_ = load_dotenv(find_dotenv())
warnings.filterwarnings('ignore')

 我们依然使用智谱的LLM,实例化一下Langchain的记忆模块,并构建一个带有记忆的对话模型

llm = ChatOpenAI(api_key=os.environ.get('ZHIPUAI_API_KEY'),base_url=os.environ.get('ZHIPUAI_API_URL'),model="glm-4",temperature=0.98)memory = ConversationBufferMemory()
conversation = ConversationChain(llm=llm,memory = memory,verbose=True
)

 进行对话

conversation.predict(input="Hi, my name is Andrew")
conversation.predict(input="What is 1+1?")
conversation.predict(input="What is my name?")

 模型确实可以记住我们的名字,打印一下记忆内容

#两种方式
print(memory.buffer)memory.load_memory_variables({})

 此外,Langchain还提供了一个函数来添加对话内容

memory.save_context({"input": "Hi"},{"output": "What's up"})

 基于窗口限制的临时记忆(ConversationBufferWindowMemory)

from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=1) #k表示我们保留最近几轮对话的数量

 我们先来添加两轮对话

memory.save_context({"input": "Hi"},{"output": "What's up"})
memory.save_context({"input": "Not much, just hanging"},{"output": "Cool"})

 通过对话历史可以发现,记忆中只保存了一轮的信息

memory.load_memory_variables({}){'history': 'Human: Not much, just hanging\nAI: Cool'}

 我们使用这种记忆方式来构建一个对话模型,发现他确实遗忘了第一轮的信息

llm = ChatOpenAI(api_key=os.environ.get('ZHIPUAI_API_KEY'),base_url=os.environ.get('ZHIPUAI_API_URL'),model="glm-4",temperature=0.98)
memory = ConversationBufferWindowMemory(k=1)
conversation = ConversationChain(llm=llm,memory = memory,verbose=False
)

基于Token数量的临时记忆 ConversationTokenBufferMemory

由于langchain中计算token数量的函数并不支持GLM4,所有使用这个函数会报错,根据源代码目前是支持gpt-3.5-turbo-0301、gpt-3.5-turbo、gpt-4,不知道以后会不会加入国产的这些模型。

memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=500)memory.save_context({"input": "AI is what?!"},{"output": "Amazing!"})
memory.save_context({"input": "Backpropagation is what?"},{"output": "Beautiful!"})
memory.save_context({"input": "Chatbots are what?"}, {"output": "Charming!"})

 基于历史内容摘要的临时记忆 ConversationSummaryMemory

同理哈,这个函数的作用就是,我们会将历史的对话信息进行总结然后存在我们的记忆单元中,由于这里同样涉及到token的计算,所以这里也是无法正常运行的了。

from langchain.memory import ConversationSummaryBufferMemory
# create a long string
schedule = "There is a meeting at 8am with your product team. \
You will need your powerpoint presentation prepared. \
9am-12pm have time to work on your LangChain \
project which will go quickly because Langchain is such a powerful tool. \
At Noon, lunch at the italian resturant with a customer who is driving \
from over an hour away to meet you to understand the latest in AI. \
Be sure to bring your laptop to show the latest LLM demo."memory = ConversationSummaryBufferMemory(llm=llm, max_token_limit=100)
memory.save_context({"input": "Hello"}, {"output": "What's up"})
memory.save_context({"input": "Not much, just hanging"},{"output": "Cool"})
memory.save_context({"input": "What is on the schedule today?"},{"output": f"{schedule}"})

构建一个对话模型 (verbose设置为true可以查看到我们历史的一些信息)

conversation = ConversationChain(llm=llm,memory = memory,verbose=True
)

尝试进行提问 

conversation.predict(input="What would be a good demo to show?")

总结(吴恩达老师视频中的内容)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • electron学习笔记
  • linux之网络子系统-本机发包到本机 实现
  • 1比25万基础电子地图(广东版)
  • 踏进互动科技世界使用Arduino
  • 【测开能力提升-Javascript】JavaScript运算符流程结构
  • 构建高效Node.js中间层:探索请求合并转发的艺术
  • 深入解析sizeof和strlen的区别与联系
  • 麒麟V10安装nginx、mysql报错缺少包:error while loading shared libraries libssl.so.10
  • Sparksql常用的json相关函数
  • PostgreSQL 中如何处理数据的唯一性约束?
  • JVM 21 的优化指南:如何进行JVM调优,JVM调优参数有哪些
  • 标签嵌套规则/行内元素/块元素的使用
  • 算法通关:006_1二分查找
  • 设计模式简述(一)
  • 【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十九章 Linux MISC驱动
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【笔记】你不知道的JS读书笔记——Promise
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • MobX
  • NSTimer学习笔记
  • VuePress 静态网站生成
  • 闭包--闭包作用之保存(一)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何使用 JavaScript 解析 URL
  • 收藏好这篇,别再只说“数据劫持”了
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • ###C语言程序设计-----C语言学习(6)#
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (九)One-Wire总线-DS18B20
  • (转)EXC_BREAKPOINT僵尸错误
  • .CSS-hover 的解释
  • .gitignore文件_Git:.gitignore
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Core与存储过程(一)
  • .net framework4与其client profile版本的区别
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET中使用Redis (二)
  • /bin/rm: 参数列表过长"的解决办法
  • @property python知乎_Python3基础之:property
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [20160902]rm -rf的惨案.txt
  • [Android]Android开发入门之HelloWorld
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [C/C++]数据结构 堆的详解