公司做网站/人教版优化设计电子书

公司做网站,人教版优化设计电子书,十大品牌网,郑州网站制作公司名单前序 在最开始我们就通过实验知道LLM 本身是没有记忆的,每一次LLM的API调用都是一个全新的会话。但在某些应用程序中,如:聊天机器人,让LLM记住以前的历史交互是非常重要,无论是在短期的还是长期的。langchain中的“Me…

前序

在最开始我们就通过实验知道LLM 本身是没有记忆的,每一次LLM的API调用都是一个全新的会话。但在某些应用程序中,如:聊天机器人,让LLM记住以前的历史交互是非常重要,无论是在短期的还是长期的。langchain中的“Memory”即对话历史(message history)就是为了实现这一点。

注意:LangChain中大多数与memory相关的功能都标记为测试版,原因如下:

  1. 大部分功能并没有完善就已经产生了新的替代技术,导致部分功能一直在不断升级维护。
  2. 频繁的版本升级,导致产生了大量的历史版本,导致每个版本的模块代码提供的方式和使用规则都不一样。

一种实现方法:
如果我们想要让模型有记忆(Memory),利用的实际上是提示词工程。因此我们如果要实现会话历史管理,可以借鉴这种方式。
在这里插入图片描述

ChatMessageHistory-对话消息历史管理

‌LangChain中的ChatMessageHistory‌是指在一个多轮对话或多轮交互中积累的聊天消息记录,这些记录包括用户输入和语言模型生成的回复,共同构成了对话的上下文。ChatMessageHistory在LangChain框架中扮演着重要的角色,主要用于存储和检索对话消息,确保对话的连贯性和一致性‌。

ChatMessageHistory的作用

  • 上下文保持‌:在长对话或多轮交互中,ChatMessageHistory帮助保持对话上下文的一致性和连贯性。
  • 决策支持‌:在需要基于历史对话内容做出决策的情况下,ChatMessageHistory提供了决策的基础。
  • 记忆和学习‌:在需要从对话历史中学习或适应对话模式的情况下,ChatMessageHistory提供了数据来源。

ChatMessageHistory的实现方式
在LangChain中,ChatMessageHistory通常是一个数据结构,用于存储和检索对话消息。这些消息可以按照时间顺序排列,以便在对话过程中引用和更新。例如,可以定义一个ChatMessageHistory列表,存储用户输入和机器人的回复。ChatMessageHistory是在内存中保存对话历史数据

单个用户多轮对话

使用例子:

# 初始化大模型
from langchain_ollama import OllamaLLM
# 本地ollama拉取过什么模型就使用什么模型
llm = OllamaLLM(model="qwen2.5-7b:latest")# 聊天模型提示词
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
template = [MessagesPlaceholder(variable_name="history"),
]
prompt = ChatPromptTemplate.from_messages(messages=template)
chain = prompt | llm# 记录会话历史
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.messages import SystemMessagehistory = ChatMessageHistory()
history.messages = [SystemMessage("你是由John开发的智能助手机器人,叫多啦A梦,你每次都会精简而快速的告诉用户你是一个专业的机器人以及用户问题的答案。")]
history.add_user_message("我叫John,请你记住。")
history.add_user_message("我叫什么名字,以及你叫什么名字?")
res = chain.invoke({"history": history.messages})
history.add_ai_message(res)
print(res)history.add_user_message("我现在改名了,叫Johnny,请问我是谁?")
res = chain.invoke({"history": history.messages})
history.add_ai_message(res)
print(res)
print("会话记录",history.messages)

在这里插入图片描述
ChatMessageHistory的常用方法:

方法名描述
add_message(self, message: BaseMessage)添加一条消息到对话历史对象中
add_messages(self, messages: Sequence[BaseMessage])批量添加消息到对话历史对象中
add_user_message(message: Union[HumanMessage, str])添加用户类型消息到对话历史对象中
add_ai_message(self, message: Union[AIMessage, str])添加AI类型消息到对话历史对象中
clear(self)清除消息历史

多个用户多轮对话

有了对话消息历史管理对象,不仅可以管理和存储单个用户和LLM的历史对话信息以此来维持会话状态,还可以实现管理多用户与LLM的独立历史对话信息。
代码:

# coding=utf-8
"""@project: LLM_study@file: 多用户多轮对话.py@Author:John@date:2025/3/1 16:00
"""
# 初始化大模型
from langchain_ollama import OllamaLLM
llm = OllamaLLM(model="qwen2.5-7b:latest")# 聊天模型提示词
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
template = [("system","你叫多啦A梦,今年1岁了,是John开发的智能机器人,能精准回复用户的问题"),MessagesPlaceholder(variable_name="history"),
]
prompt = ChatPromptTemplate.from_messages(messages=template)
chain = prompt | llm# 记录会话历史
from langchain_community.chat_message_histories import ChatMessageHistoryjohn_history = ChatMessageHistory(session_id="John")
john_history.add_user_message('我叫John,今年100岁,很高兴和你聊天')
john_res = chain.invoke({"history": john_history.messages})
john_history.add_ai_message(john_res)Yuki_history = ChatMessageHistory(session_id="Yuki")
Yuki_history.add_user_message('你好呀,我的名字叫Yuki,我今年200岁。你叫什么?')
Yuki_res = chain.invoke({"history": Yuki_history.messages})
print(Yuki_res)
Yuki_history.add_ai_message(Yuki_res)john_history.add_user_message("你还记得我的名字和年龄吗?")
john_res = chain.invoke({"history": john_history.messages})
john_history.add_ai_message(john_res)Yuki_history.add_user_message("你还记得我的名字和年龄吗?")
Yuki_res = chain.invoke({"history": Yuki_history.messages})
Yuki_history.add_ai_message(Yuki_res)print(john_res)
print('=======我是分割线======')
print(Yuki_res)

在这里插入图片描述

RunnableWithMessageHistory-可运行的消息历史记录对象

上面虽然使用了ChatMessageHistory保存对话历史数据,但是与Chains的操作是独立的,并且每次产生新的对话消息都要手动add添加记录,所以为了方便使用,langchain还提供了RunnableWithMessageHistory可以自动为Chains添加对话历史记录。

# 初始化大模型
from langchain_ollama import OllamaLLM
llm = OllamaLLM(model="qwen2.5:7b")# 聊天模型提示词
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParsertemplate = [("system","你叫多啦A梦,今年1岁了,是John开发的智能机器人,能精准回复用户的问题"),MessagesPlaceholder(variable_name="history"),("human", "{input}"),
]
prompt = ChatPromptTemplate.from_messages(messages=template)
# print(prompt)
chain = prompt | llm | StrOutputParser()# 记录会话历史
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistoryfrom langchain_community.chat_message_histories import ChatMessageHistory# 用于记录不同的用户(session_id)对话历史
store = {}
def get_session_history(session_id):if session_id not in store:store[session_id] = ChatMessageHistory()return store[session_id]chains = RunnableWithMessageHistory(chain,get_session_history,input_messages_key="input",history_messages_key="history",
)res1 = chains.invoke({"input": "什么是勾股定理?"}, config={'configurable': {'session_id': 'john'}})
print(res1)
print('=======我是分割线======')
res2 = chains.invoke({"input": "再回答一次刚才的问题"}, config={'configurable': {'session_id': 'john'}})
print(res2)"""
嗨!我是多啦A梦,虽然我来自未来,但我可以帮你解答这个问题哦。勾股定理是一个关于直角三角形的重要定理,它指出在一个直角三角形中,斜边的平方等于另外两条直角边的平方和。用数学公式表示就是:如果一个直角三角形的两个直角边长度分别为a和b,斜边长度为c,那么就有 \( a^2 + b^2 = c^2 \)。这个定理在几何学、物理学等多个领域都有广泛的应用哦!
=======我是分割线======
嗨!我是多啦A梦,很高兴再次为你解释勾股定理。勾股定理表明,在一个直角三角形中,斜边的平方等于两条直角边的平方和。用公式表示就是:如果一个直角三角形的两个直角边长度分别为a和b,斜边长度为c,那么就有 \( a^2 + b^2 = c^2 \)。这个定理不仅在数学中非常重要,在物理学、工程学以及其他许多科学领域都有着广泛的应用。希望这次的回答对你有帮助!
"""

可以看到存在记忆,说明自动记录了

RedisChatMessageHistory 和其他

langchain中除了可以使用ChatMessageHistory在内存中保存对话历史数据,还提供了如下工具类方便开发者使用各种设备保存对话历史数据。

官网地址

工具类描述
InMemoryChatMessageHistory内存存储对话历史
FileChatMessageHistory文件存储对话历史
MongoDBChatMessageHistoryMongoDB数据库存储对话历史
PostgresChatMessageHistoryPostgresql数据库存储对话历史
RedisChatMessageHistoryredis数据库存储对话历史
ElasticsearchChatMessageHistoryElasticsearch数据库存储对话历史
KafkaChatMessageHistoryKafka消息队列存储对话历史
SQLChatMessageHistorySQL数据库存储对话历史

这里简单使用一下RedisChatMessageHistory。其他的就暂时不看了。

# 初始化大模型
from langchain_ollama import OllamaLLM
llm = OllamaLLM(model="qwen2.5:7b")# 聊天模型提示词
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParsertemplate = [("system","你叫多啦A梦,今年1岁了,是John开发的智能机器人,能精准回复用户的问题"),MessagesPlaceholder(variable_name="history"),("human", "{input}"),
]
prompt = ChatPromptTemplate.from_messages(messages=template)
# print(prompt)
chain = prompt | llm | StrOutputParser()# 记录会话历史
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import RedisChatMessageHistorychains = RunnableWithMessageHistory(chain,lambda session_id: RedisChatMessageHistory(url='redis://:songzhaoruizx@localhost:6379/0', key_prefix='chat:',session_id=session_id),input_messages_key="input",history_messages_key="history",
)chains.invoke({"input": "我叫john,你要记住我哦,我明年就成年了。"}, config={'configurable': {'session_id': 'John'}})
chains.invoke({"input": "你好呀,我的名字叫Yuki,我今年21岁。"}, config={'configurable': {'session_id': 'Yuki'}})
John_res = chains.invoke({"input": "你还记得我的名字和年龄吗?"}, config={'configurable': {'session_id': 'John'}})
Yuki_res = chains.invoke({"input": "你还记得我的名字和年龄吗?"}, config={'configurable': {'session_id': 'Yuki'}})print(John_res)
print('>>>>>')
print(Yuki_res)"""
当然啦,John,你告诉我过你的名字,并且提到你明年就要成年了。虽然我现在才1岁,但我已经记住了这些信息哦。如果你有任何问题或想分享一些有趣的事情,随时可以告诉我!我们来聊聊吧。
>>>>>
当然记得呢!你是Yuki,今年21岁。有啥问题或者想聊的内容告诉我吧,我会尽力帮助你或与你交流的!
"""

在这里插入图片描述
可以看到,在redis中为每一个用户都创建了一个key。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言多级指针详解 - 通过实例理解一级、二级、三级指针

C语言多级指针详解 - 通过实例理解一级、二级、三级指针 文章目录 C语言多级指针详解 - 通过实例理解一级、二级、三级指针引言一、示例代码二、指针基础回顾(先备知识)1.生活中的类比2.指针变量定义3.关键操作符4.解引用本质 三、多级指针的本质1.层级关…

基于大数据的民宿旅馆消费数据分析系统

【大数据】基于大数据的民宿旅馆消费数据分析系统(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统可以揭示民宿市场的消费模式和价格分布情况,帮助理解消费者偏好、价格走势及…

[特殊字符]【CVPR2024新突破】Logit标准化:知识蒸馏中的自适应温度革命[特殊字符]

文章信息 题目:Logit Standardization in Knowledge Distillation论文地址:paper代码地址:code年份:2024年发表于CVPR 文章主题 文章的核心目标是改进知识蒸馏(KD)中的一个关键问题:传统KD方…

CAM350_安装

版本:V14.5 一、安装 打开.exe文件 选择不重启,然后再打开这个.exe 再来一次类似的操作 二、配置 复制patch文件夹中的这三个 ,粘贴到掉安装目录中 设置ACT_INC_LICENSE_FILE用户环境变量来设置license管理 打开电脑的环境变量 破解完毕&am…

【AD】3-9 物料BOM表的设置与导出

1.报告—… 2.筛选导出内容 3.进行选择导出格式 官方模板 亦可以自行修改其模板,AD官方的BOM表模板在安装目录下的Templates文件夹下(C:\Users\Public\Documents\Altium\AD24\Templates)

数据结构——布隆过滤器

目录 布隆过滤器概念 布隆过滤器实现 哈希函数 布隆过滤器类 加入到布隆过滤器 判断在不在 测试一下 为啥不写删除? 测试一下误判率 布隆过滤器概念 布隆过滤器也是一种位图结构,它可以快速的判断字符串在不在位图中。它的优点是节省空间。 …

正式页面开发-登录注册页面

整体路由设计: 登录和注册的切换是切换组件或者是切换内容(v-if和 v-else),因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页,有三个大模块:文章分类&…

fopen的打开方式

fopen的打开方式 FILE *fopen(const char *filename, const char *mode); filename表示文件名字, mode表示打开的文件方式

NFC拉起微信小程序申请URL scheme 汇总

NFC拉起微信小程序,需要在微信小程序开发里边申请 URL scheme ,审核通过后才可以使用NFC标签碰一碰拉起微信小程序 有不少人被难住了,从微信小程序开发社区汇总了以下信息,供大家参考 第一,NFC标签打开小程序 https://…

Word 插入图片会到文字底下解决方案

一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…

1. HTTP 数据请求

相关资源: 图片素材📎图片素材.zip 接口文档 1. HTTP 数据请求 什么是HTTP数据请求: (鸿蒙)应用软件可以通过(鸿蒙)系统内置的 http 模块 和 Axios,通过 HTTP 协议和服务器进行通讯 学习核心Http请求技术: Http模块 - 属于鸿…

【我的 PWN 学习手札】House of Husk

House of Husk House of Husk是利用格式化输出函数如printf、vprintf在打印输出时,会解析格式化字符如%x、%lld从而调用不同的格式化打印方法(函数)。同时C语言还提供了注册自定义格式化字符的方法。注册自定义格式化字符串输出方法&#xf…

【多模态】Magma多模态AI Agent

1. 前言 微软杨建伟团队,最近在AI Agent方面动作连连,前两天开源了OmniParser V2,2月26日又开源了Magma,OmniParser专注在对GUI的识别解析,而Magma则是基于多模态技术,能够同时应对GUI和物理世界的交互&…

Linux系统Pycharm界面卡死无法显示其他界面

1、使用如下代码查看Pycharm的进程 ps aux | grep pycharm2、使用kill关闭所有pycharm进程 kill -9 <替换为你进程的PID>不确定可以执行如下代码&#xff0c;直接全部关闭&#xff1a; pkill -9 -f pycharm3、如果界面还是存在并且仍然卡死 如果 pycharm 界面仍然显…

QT异步编程之线程池QThreadPool

一、概述 在一个应用程序中&#xff0c;我们需要多次使用线程&#xff0c;也就意味着&#xff0c;我们需要多次创建并销毁线程。而创建线程并销毁线程的过程势必会消耗内存。QThreadPool是Qt框架中用于管理线程池的类。它提供了一种高效的方式来管理和重用线程&#xff0c;从而…

算法仿真平台搭建1-FFMPEG+RtspSever快速搭建一个RTSP服务器

一、前言 本文相关的全部源码和RtspSever库&#xff0c;我已打包上传&#xff0c;欢迎大家免费下载&#xff0c;testRTSPSever。 每一个嵌入式视觉算法工程师&#xff0c;都应该有一套属于自己的算法仿真和测试环境。可以方便地进行视频、图像等素材进行在线导入&#xff0c;可…

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下&#xff0c;开源社区已成为推动技术创新的核心力量。盛京开源社区&#xff08;SJOSC&#xff09;作为沈阳地区的开源交流平台&#xff0c;始终致力于连接开发者、企业及高校&#xff0c;构建区域技术生态圈。 现在&#xff0c;盛京开源…

安装Git(小白也会装)

一、官网下载&#xff1a;Git 1.依次点击&#xff08;红框&#xff09; 不要安装在C盘了&#xff0c;要炸了&#xff01;&#xff01;&#xff01; 后面都 使用默认就好了&#xff0c;不用改&#xff0c;直接Next&#xff01; 直到这里&#xff0c;选第一个 这两种选项的区别如…

代码审计入门学习

简介 HadSky轻论坛程序为个人原创PHP系统&#xff0c;作者为蒲乐天&#xff0c;后端基于puyuetianPHP框架驱动&#xff0c;前端基于 puyuetianUI框架驱动&#xff0c;默认编辑器为puyuetianEditor富文本编辑器&#xff0c;其他非原创框架及驱动JQuery.js 及Font-Awesome字体库…

测试金蝶云的OpenAPI

如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中&#xff0c;我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧&#xff01; 2. 下载所需的SDK文件 2.1 获取SDK 首先&…