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

langchain 记忆力(memory),让语言大模型拥有记忆

1,简介

存储对话历史中的信息的能力称之为’记忆‘,这种工具可以单独使用,也可以无缝的集成到一条链中,记忆的存储长度是程序执行到结束,执行一次的所有记忆。
记忆的主要应用场景就是聊天机器人,聊天机器人的一个关键功能是它们能够使用先前对话的内容作为上下文。
记忆力在实际使用的逻辑:
在这里插入图片描述
记忆力在使用中可以分一下几个场景:
在这里插入图片描述
记忆力的几个重要的类:
ConversationBufferMemory会话缓冲区
如实的记录列表中记录的对话历史消息,并且是记录所有的历史消息,随着历史记录的增加,运行会越来越慢,直到大模型无法处理.适用于交互次数少,输入输出字符量不大的情况下
ConversationBufferWindowMemory会话缓冲窗口
持续记录对话历史,但只使用最近的k个交互。确保缓存大小不会过大,运行速度比较稳定
ConversationSummaryMemory会话摘要
随着时间的推移总结对话内容,并且将摘要存储在记忆中,需要的时候将摘要注入提示词或链中,缓存不会过大,运行稳定,但是运行速度比ConversationBufferWindowMemory慢很多,因为他在写入记忆的时候,做了一个摘要的操作.这使得她可以记住很长的交互记忆,不过随着交互的增加,摘要的内容不断迭代更换,使得某些内容会遗失.
VectorStoreRetrieverMemory向量存储
将记忆存储在向量存储中,并在每次调用时查询前K个最"显著"的文档。 与大多数其他记忆类不同的是,它不明确跟踪交互的顺序。 在这种情况下,"文档"是先前对话片段。这对于提及AI在对话中早些时候被告知的相关信息可能是有用的。这段话是官方文档的描述,猜测应该是将记忆做成了一个文档,使用文档阅读器来进行读取

2,使用代码示例

下面的示例没有使用上面四个重要的类,下面的示例主要使用让我们更加直观理解记忆力的运行逻辑。
手动一个简单聊天记录消息的记忆聊天
通过手动添加聊天消息,实现记忆力功能。

import os
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderos.environ["QIANFAN_AK"] = "*****"  # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "*****"  # 这里需要修改为自己的实际值def load_embedding_mode():return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',model_kwargs={'device': 'cpu'})model = QianfanChatEndpoint(streaming=True,model="ERNIE-Bot",
)##手动一个简单聊天记录消息的记忆聊天
##占位符
prompt = ChatPromptTemplate.from_messages([("system","你是一个乐于助人的助手。尽你所能回答所有的问题。",),MessagesPlaceholder(variable_name="messages"),]
)chain = prompt | model
rep = chain.invoke({"messages": [HumanMessage(content="将这句话从汉语翻译成英语:我喜欢编程。"),AIMessage(content="I love programming"),HumanMessage(content="你刚刚说什么?"),]}
)print(rep)
#content='我刚刚说的是:“I love programming”,意思是“我喜欢编程”。如果您有任何其他问题或需要进一步的解释,请随时告诉我。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 30, 'output_tokens': 24, 'total_tokens': 54}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-215d46b1-c8bf-4f7b-bbf3-50afaceb947e-0' usage_metadata={'input_tokens': 30, 'output_tokens': 24, 'total_tokens': 54}

聊天记录储存和加载
将聊天记录储存在内存中,读取内存的中记录实现记忆力聊天功能。

import os
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderos.environ["QIANFAN_AK"] = "*****"  # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "*****"  # 这里需要修改为自己的实际值def load_embedding_mode():return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',model_kwargs={'device': 'cpu'})model = QianfanChatEndpoint(streaming=True,model="ERNIE-Bot",
)
from langchain_community.chat_message_histories import ChatMessageHistoryprompt = ChatPromptTemplate.from_messages([("system","你是一个乐于助人的助手。尽你所能回答所有的问题。",),MessagesPlaceholder(variable_name="messages"),]
)chain = prompt | modeldemo_ephemeral_chat_history = ChatMessageHistory()
input1 = "这里的天气非常好,空气也干净"
demo_ephemeral_chat_history.add_user_message(input1)response = chain.invoke({"messages": demo_ephemeral_chat_history.messages}
)
demo_ephemeral_chat_history.add_ai_message(response)input2 = "你刚刚说了什么?"demo_ephemeral_chat_history.add_user_message(input2)rep = chain.invoke({"messages": demo_ephemeral_chat_history.messages}
)
print(rep)
#content='我刚刚说听起来你所在的地方天气很好,空气也很干净,是个适合居住的好地方。我还问了你是否有什么计划或者想法,想要在这样的好天气里做些什么。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 61, 'output_tokens': 34, 'total_tokens': 95}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-02d24630-5c6a-466a-83be-c1133bab7f70-0' usage_metadata={'input_tokens': 61, 'output_tokens': 34, 'total_tokens': 95}

自动聊天历史记录管理
这里加上了一个session_id用于区分不同的用户的消息记录,在实际中使用不可能都是一个人在使用。那么就要使用人加上id用以区分聊天记录。

import os
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderos.environ["QIANFAN_AK"] = "*****"  # 这里需要修改为自己的实际值
os.environ["QIANFAN_SK"] = "*****"  # 这里需要修改为自己的实际值def load_embedding_mode():return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',model_kwargs={'device': 'cpu'})model = QianfanChatEndpoint(streaming=True,model="ERNIE-Bot",
)
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistoryprompt = ChatPromptTemplate.from_messages([("system","你是一个乐于助人的助手。尽你所能回答所有的问题。",),MessagesPlaceholder(variable_name="chat_history"),("human", "{input}")]
)chain = prompt | modeldemo_ephemeral_chat_history_for_chain = ChatMessageHistory()
chain_with_message_history = RunnableWithMessageHistory(chain,lambda session_id: demo_ephemeral_chat_history_for_chain,input_messages_key="input",history_messages_key="chat_history",
)
rep = chain_with_message_history.invoke({"input": "这里的天气非常好,空气也干净"},{"configurable": {"session_id": "9999"}}
)
print(rep)
#content='那真是太好了!好的天气和清新的空气可以让人心情愉悦,也有益于身体健康。你可以享受这样的好天气,做些户外活动,比如散步、跑步或者骑自行车。这些活动不仅可以锻炼身体,还可以让你更加接近自然,感受大自然的美好。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 21, 'output_tokens': 48, 'total_tokens': 69}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-7d37d6da-96dd-4d9c-8198-d40992e3f51c-0' usage_metadata={'input_tokens': 21, 'output_tokens': 48, 'total_tokens': 69}rep1 = chain_with_message_history.invoke({"input": "刚刚说了什么?"},{"configurable": {"session_id": "9999"}}
)
print(rep1)
#content='您刚刚说:“这里的天气非常好,空气也干净。” 这是一个很好的观察,好的天气和清新的空气确实能给人带来愉悦和舒适的感觉。' additional_kwargs={} response_metadata={'token_usage': {'input_tokens': 73, 'output_tokens': 31, 'total_tokens': 104}, 'model_name': 'ERNIE-Bot', 'finish_reason': 'stop'} id='run-115dafff-81f1-4165-8d5b-ce16f0915349-0' usage_metadata={'input_tokens': 73, 'output_tokens': 31, 'total_tokens': 104}

以上就是记忆力的简单介绍和使用,为日后的使用中添加深入的理解。

相关文章:

  • SQL_over_partition_by_order_by
  • Java数据库连接jdbc
  • 广东高校建设AIGC实验室时需要注意哪几个关键点?
  • [JavaEE] 网络编程----UDP / TCP 回显服务器
  • neo4j:ubuntu环境下的安装与使用
  • Spring Boot 点餐系统:餐饮界的技术革新
  • 【mac开发入坑指南】能让你的终端好用一万倍的神仙组合iTerm2 + oh-my-zsh
  • 【Rust练习】16.方法和关联函数
  • 解决远程连接AlpineLinux Mysql/MariaDB 无法连接的问题
  • Nginx反向代理配置支持websocket
  • 第18周 第1章Ajax基础知识
  • Axure原型系统:药企内部管理平台原型设计
  • Html--笔记01:使用软件vscode,简介Html5--基础骨架以及标题、段落、图片标签的使用
  • TypeScript 设计模式之【单例模式】
  • 数据备份策略:保障数据安全的关键
  • 网络传输文件的问题
  • 5、React组件事件详解
  • bootstrap创建登录注册页面
  • CentOS6 编译安装 redis-3.2.3
  • CSS3 变换
  • Java,console输出实时的转向GUI textbox
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • k个最大的数及变种小结
  • Linux gpio口使用方法
  • mysql 5.6 原生Online DDL解析
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python_网络编程
  • storm drpc实例
  • vue-cli3搭建项目
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 听说你叫Java(二)–Servlet请求
  • Android开发者必备:推荐一款助力开发的开源APP
  • Java性能优化之JVM GC(垃圾回收机制)
  • Nginx实现动静分离
  • #数据结构 笔记三
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (pycharm)安装python库函数Matplotlib步骤
  • (二)PySpark3:SparkSQL编程
  • (六)软件测试分工
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (算法)求1到1亿间的质数或素数
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (一)UDP基本编程步骤
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • *Django中的Ajax 纯js的书写样式1
  • .libPaths()设置包加载目录
  • .net core docker部署教程和细节问题
  • .NET Core 发展历程和版本迭代
  • .net FrameWork简介,数组,枚举
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .Net插件开发开源框架
  • ??在JSP中,java和JavaScript如何交互?
  • @Conditional注解详解