当前位置: 首页 > 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

http://www.lryc.cn/news/313068.html

相关文章:

  • LabVIEW高温摩擦磨损测试系统
  • 基于YOLOv5的驾驶员疲劳驾驶行为​​​​​​​检测系统
  • 融合软硬件串流多媒体技术的远程控制方案
  • Spring中的数据校验---JSR303
  • “揭秘网络握手与挥别:TCP三次握手和四次挥手全解析“
  • Java开发工程师面试题(Spring)
  • 【C++】string类的基础操作
  • Java项目:40 springboot月度员工绩效考核管理系统009
  • opengl 学习(三)-----着色器
  • 电销平台架构的演变与升级
  • 轻薄蓝牙工牌室内人员定位应用
  • 好物周刊#46:在线工具箱
  • 20240306-1-大数据的几个面试题目
  • Vue中如何处理用户权限?
  • 【STM32】HAL库 CubeMX教程---基本定时器 定时
  • 2024年最新整理腾讯云学生服务器价格、续费和购买流程
  • 【QT】重载的信号槽/槽函数做lambda表达式
  • C++之类(一)
  • 【工具类】repo是什么,repo常用命令,repo和git和git-repo的关系
  • Java中可以实现的定时任务策略
  • 【目标分类图像增强方法】
  • 游戏盾如何应对微商城网站DDoS攻击
  • 安卓手机如何使用JuiceSSH实现公网远程连接本地Linux服务器
  • 钉钉群内自定义机器人发送消息功能实现
  • 网站维护3年15000元,贵不贵?市场价多少
  • ROS 2基础概念#5:执行器(Executor)| ROS 2学习笔记
  • Unity 动画(旧版-新版)
  • Linux和Windows操作系统线程调度策略
  • [OpenWrt 22.03] ttylogin添加登录密码与禁止登录的配置
  • RK3568平台 USB数据包的收发格式