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

langchain学习笔记(十一)

关于langchain中的memory,即对话历史(message history)

1、

Add message history (memory) | 🦜️🔗 Langchain

RunnableWithMessageHistory,可用于任何的chain中添加对话历史,将以下之一作为输入

(1)一个BaseMessage序列

(2)一个dict,其中一个键的值是一个BaseMessage序列

(3)一个dict,其中一个键的值存储最后一次对话信息,另外一个键的值存储之前的历史对话信息

输出以下之一

(1)一个可以作为AIMessage的content的字符串

(2)一个BaseMessage序列

(3)一个dict,其中一个键的值是一个BaseMessage序列

首先需要一个返回BaseChatMessageHistory实例的可调用函数,这里我们将历史对话存储在内存中,同时langchain也支持将历史对话存储在redis中(RedisChatMessageHistory)更持久的存储,

from langchain_community.chat_message_histories import ChatMessageHistory
def get_session_history(session_id):#一轮对话的内容只存储在一个key/session_idif session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]

(1)输入是一个BaseMessage序列的示例

from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_core.messages import HumanMessage
with_message_history=RunnableWithMessageHistory(ChatOpenAI(),get_session_history,
)
print(with_message_history.invoke(input=HumanMessage("介绍下王阳明"),config={'configurable':{'session_id':'id123'}}))

(2)输入是一个dict,其中一个键的值是一个BaseMessage序列的示例

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai.chat_models import ChatOpenAI
from langchain_core.messages import HumanMessage
from langchain_core.runnables.history import RunnableWithMessageHistory
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_messages([("system","你是一个助手,擅长能力{ability}。用20个字以内回答",),MessagesPlaceholder(variable_name="history"),("human", "{input}"),]
)
runnable = prompt | model
with_message_history = RunnableWithMessageHistory(runnable,get_session_history,input_messages_key="input",history_messages_key="history",
)
i1=with_message_history.invoke({"ability": "数学", "input": HumanMessage("什么是余弦定理")},config={"configurable": {"session_id": "abc123"}},#历史信息存入session_id
)
print(i1)
i2=with_message_history.invoke({"ability": "math", "input": HumanMessage("重新回答一次")},config={"configurable": {"session_id": "abc123"}},#历史信息存入session_id
)
print(i2)#记忆到了
print(store)

(3)前面的是dict输入message输出,下面是其他的方案

输入message,输出dict

from langchain_core.runnables import RunnableParallel
chain = RunnableParallel({"output_message": ChatOpenAI()})
with_message_history = RunnableWithMessageHistory(chain,get_session_history,output_messages_key="output_message",
)i1=with_message_history.invoke([HumanMessage(content="白雪公主是哪里的人物")],config={"configurable": {"session_id": "baz"}},
)
print(i1)

输入message,输出message:简易实现对话系统

from operator import itemgetter
with_message_history =RunnableWithMessageHistory(itemgetter("input_messages") | ChatOpenAI(),get_session_history,input_messages_key="input_messages",
)
while True:# print(store)query=input('user:')answer=with_message_history.invoke(input={'input_messages':query},config={'configurable':{'session_id':'id123'}})print(answer)

2、对话系统:ConversationBufferMemory

Adding memory | 🦜️🔗 Langchain

from operator import itemgetter
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
from langchain_openai import ChatOpenAI
model = ChatOpenAI()
prompt = ChatPromptTemplate.from_messages([("system","你是一个助手,擅长能力{ability}。用20个字以内回答",),MessagesPlaceholder(variable_name="history"),("human", "{input}"),]
)
memory = ConversationBufferMemory(return_messages=True)
chain = (RunnablePassthrough.assign(history=RunnableLambda(memory.load_memory_variables) | itemgetter("history"))| prompt| model
)
while True:import requery = input('user:')response = chain.invoke({"ability": "数学", "input": query})#<class 'langchain_core.messages.ai.AIMessage'>print(response.content)memory.save_context({"input": query}, {"output": response.content})

3、

[Beta] Memory | 🦜️🔗 Langchain

相关文章:

langchain学习笔记(十一)

关于langchain中的memory&#xff0c;即对话历史&#xff08;message history&#xff09; 1、 Add message history (memory) | &#x1f99c;️&#x1f517; Langchain RunnableWithMessageHistory&#xff0c;可用于任何的chain中添加对话历史&#xff0c;将以下之一作为…...

LabVIEW高温摩擦磨损测试系统

LabVIEW高温摩擦磨损测试系统 介绍了一个基于LabVIEW的高温摩擦磨损测试系统的软件开发项目。该系统实现高温条件下材料摩擦磨损特性的自动化测试&#xff0c;通过精确控制和数据采集&#xff0c;为材料性能研究提供重要数据支持。 项目背景 随着材料科学的发展&#xff0c;…...

基于YOLOv5的驾驶员疲劳驾驶行为​​​​​​​检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了疲劳驾驶行为检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析。 博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量…...

融合软硬件串流多媒体技术的远程控制方案

远程技术已经发展得有相当水平了&#xff0c;在远程办公&#xff0c;云游戏&#xff0c;云渲染等领域有相当多的应用场景&#xff0c;以向日葵&#xff0c;todesk rustdesk等优秀产品攻城略地&#xff0c;估值越来越高。占据了通用应用的方方面面。 但是细分市场&#xff0c;还…...

Spring中的数据校验---JSR303

介绍–什么是JSR303 JSR 303是Java中的一项规范&#xff0c;用于定义在Java应用程序中执行数据校验的元数据模型和API。JSR 303的官方名称是"Bean Validation"&#xff0c;它提供了一种在Java对象级别上执行验证的方式&#xff0c;通常用于确保输入数据的完整性和准…...

“揭秘网络握手与挥别:TCP三次握手和四次挥手全解析“

前言 在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;是一种重要的通信协议&#xff0c;用于在网络中的两台计算机之间建立可靠的连接并交换数据。TCP协议通过“三次握手”和“四次挥手”的过程来建立和终止连接&#xff0c;确保数据的准确传输。 一、三…...

Java开发工程师面试题(Spring)

一、Spring Bean的生命周期 生命周期可以分为以下几步&#xff1a; 通过Spring框架的beanFactory工厂利用反射机制创建bean对象。根据set方法或者有参构造方法给bean对象的属性进行依赖注入。判断当前bean对象是否实现相关aware接口&#xff0c;诸如beanNameAware、beanFactor…...

【C++】string类的基础操作

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 1. 基本概述 2. string类对象的常见构造 3. string类对象的容量操作 4. string类对象的访问及遍历操作 5. 迭代器 6.…...

Java项目:40 springboot月度员工绩效考核管理系统009

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本系统的功能分为管理员和员工两个角色 管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&#xff0c;添加管理员账号…...

opengl 学习(三)-----着色器

着色器 分类demo效果解析教程 分类 OPengl C demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>#include <string> #include <fstream> #include <sstream>…...

电销平台架构的演变与升级

简介 信也科技电销平台承载了公司400多坐席的日常外呼任务&#xff0c;随着公司业务规模不断增长&#xff0c;业务复杂度不断提升&#xff0c;营销模式需要多样化&#xff0c;营销流程需要更加灵活。为了更好地赋能业务、提高客户转化率&#xff0c;电销平台不断升级优化&#…...

轻薄蓝牙工牌室内人员定位应用

在现代化企业管理的背景下&#xff0c;轻薄蓝牙工牌人员定位应用逐渐崭露头角&#xff0c;成为提升企业效率和安全性的重要工具。本文将从轻薄蓝牙工牌的定义、特点、应用场景以及未来发展趋势等方面&#xff0c;对其进行全面深入的探讨。 一、轻薄蓝牙工牌的定义与特点 轻薄…...

好物周刊#46:在线工具箱

https://github.com/cunyu1943 村雨遥的好物周刊&#xff0c;记录每周看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;每周五发布。 一、项目 1. twelvet 一款基于 Spring Cloud Alibaba 的权限管理系统&#xff0c;集成市面上流行库&#xff0c;可以作用为快…...

20240306-1-大数据的几个面试题目

面试题目 1. 相同URL 题目: 给定a、b两个文件&#xff0c;各存放50亿个url&#xff0c;每个url各占64字节&#xff0c;内存限制是4G&#xff0c;让你找出a、b文件共同的url&#xff1f; 方案1&#xff1a;估计每个文件的大小为50G64320G&#xff0c;远远大于内存限制的4G。所以…...

Vue中如何处理用户权限?

在前端开发中&#xff0c;处理用户权限是非常重要的一个方面。Vue作为一种流行的前端框架&#xff0c;提供了很多便捷的方式来管理用户权限。本文将介绍一些Vue中处理用户权限的方法 1. 使用路由守卫 Vue Router提供了一个功能强大的功能&#xff0c;即导航守卫&#xff08;N…...

【STM32】HAL库 CubeMX教程---基本定时器 定时

目录 一、基本定时器的作用 二、常用型号的TIM时钟频率 三、CubeMX配置 四、编写执行代码 实验目标&#xff1a; 通过CUbeMXHAL&#xff0c;配置TIM6&#xff0c;1s中断一次&#xff0c;闪烁LED。 一、基本定时器的作用 基本定时器&#xff0c;主要用于实现定时和计数功能…...

2024年最新整理腾讯云学生服务器价格、续费和购买流程

2024年腾讯云学生服务器优惠活动「云校园」&#xff0c;学生服务器优惠价格&#xff1a;轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G配置842.4元一年&…...

【QT】重载的信号槽/槽函数做lambda表达式

重载的信号槽 函数指针&#xff1a; int fun(int a,long b) int (*funp)(int, long) fun; 实现回调函数就需要函数指针 信号重载 派生类槽函数发送两个信号 派生类给父类发两个信号 void (SubWidget::*mysigsub)() &SubWidget::sigSub;connect(&subw,mysigsub,t…...

C++之类(一)

1&#xff0c;封装 1.1 封装的引用 封装是C面向对象三大特性之一 封装的意义&#xff1a; 将属性和行为作为一个整体&#xff0c;表现生活中的事物 将属性和行为加以权限控制 1.1.1 封装意义一&#xff1a; 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表…...

【工具类】repo是什么,repo常用命令,repo和git和git-repo的关系

1. repo 1. repo 1.1. repo是什么1.2. 安装1.3. repo 命令 1.3.1. repo help1.3.2. repo init1.3.3. repo sync1.3.4. repo upload1.3.5. repo start1.3.6. repo forall 1.4. mainfest 文件1.5. git-repo简介(非android repo)1.6. 参考资料 1.1. repo是什么 Repo 是一个 go…...

2026 LinkedIn账号安全机制分析与稳定运营实践

随着 LinkedIn 风控机制的不断完善&#xff0c;账号的登录环境、行为模式以及网络条件&#xff0c;都会直接影响账号的稳定性。对于需要长期运营账号的用户来说&#xff0c;理解平台的风控逻辑&#xff0c;比单纯增加操作频率更为重要。本文将从使用场景、常见环境问题、账号行…...

会用AI的人,早已拉开职场差距!全岗位工作范式重构进行时

AI深度融入职场&#xff0c;正在改写工作的底层逻辑&#xff0c;会用AI的从业者&#xff0c;已在工作效率与职业发展上形成明显优势。从开发人员的研发流程&#xff0c;到方案人员的工作模式&#xff0c;再到各行各业的基础岗位&#xff0c;AI不再只是简单的效率工具&#xff0…...

ESLyric歌词源高效配置与避坑指南:Foobar2000用户进阶教程

ESLyric歌词源高效配置与避坑指南&#xff1a;Foobar2000用户进阶教程 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric-LyricsSource是Foobar2000…...

别再死记硬背公式了!Cesium中Entity姿态(HPR)的获取与设置,一个例子讲透

Cesium中Entity姿态控制的本质&#xff1a;从HPR到四元数的思维跃迁 当你第一次在Cesium中加载一个3D模型&#xff0c;却发现它头朝下或者背对镜头时&#xff0c;那种挫败感我深有体会。传统教程往往直接扔给你一堆转换公式&#xff0c;却很少解释为什么需要这些看似复杂的数学…...

5V与3.3V MCU串口电平转换电路设计

不同工作电压MCU间的串口电平转换电路设计1. 项目概述1.1 问题背景在现代嵌入式系统设计中&#xff0c;经常遇到不同工作电压的微控制器(MCU)之间需要进行串口通信的场景。例如&#xff1a;MCU1工作电压&#xff1a;5VMCU2工作电压&#xff1a;3.3V若直接将两个MCU的TX、RX引脚…...

RustDesk 中继服务器搭建指南:告别卡顿,实现高效远程控制

1. 为什么你需要自建RustDesk中继服务器 远程办公已经成为现代工作方式的标配&#xff0c;但很多人在使用公共远程控制服务时都遇到过令人抓狂的卡顿问题。想象一下&#xff0c;你正在紧急处理服务器故障&#xff0c;画面却卡成了PPT&#xff1b;或者需要远程协助家人修电脑&a…...

大厂速报:小红书期权涨麻,字节年终暴击,AI赛道卷疯了

互联网圈没有岁月静好&#xff0c;只有暗潮涌动——大厂裁员传闻从未断档&#xff0c;AI内卷卷到凌晨三点&#xff0c;打工人一边焦虑KPI&#xff0c;一边蹲守大厂福利&#xff0c;有人靠期权实现财富跃迁&#xff0c;有人被组织调整撞个正着。一、核心福利&#xff5c;打工人狂…...

从SOP到AI Society:MGX多智能体协作平台如何重塑软件开发流程

1. MGX平台如何用SOP机制颠覆传统开发模式 我第一次接触MGX平台时&#xff0c;被它的标准化操作流程&#xff08;SOP&#xff09;惊艳到了。这就像把一个混乱的施工现场变成了井然有序的装配线&#xff0c;每个智能体都知道自己该在什么时候做什么事。传统开发中&#xff0c;我…...

QobuzDownloaderX-MOD:一站式高品质音乐下载解决方案

QobuzDownloaderX-MOD&#xff1a;一站式高品质音乐下载解决方案 【免费下载链接】QobuzDownloaderX-MOD Downloads streams directly from Qobuz. Experimental refactoring of QobuzDownloaderX by AiiR 项目地址: https://gitcode.com/gh_mirrors/qo/QobuzDownloaderX-MOD…...

ChineseChess-AlphaZero技术架构与实践指南:从环境搭建到模型训练

ChineseChess-AlphaZero技术架构与实践指南&#xff1a;从环境搭建到模型训练 【免费下载链接】ChineseChess-AlphaZero Implement AlphaZero/AlphaGo Zero methods on Chinese chess. 项目地址: https://gitcode.com/gh_mirrors/ch/ChineseChess-AlphaZero 副标题&…...