【LangChain】理论及应用实战(4):Memory

文章目录

  • 一、对话Memory的实现
    • 1.1 ConversationBufferMemory
  • 二、几种其他的memory
    • 2.1 ConversationBufferWindowMemory
    • 2.2 ConversationTokenBufferMemory
    • 2.3 ConversationSummaryBufferMemory
  • 三、自定义Memory
  • 四、为Chain增加Memory
    • 4.1 在LLMChain上使用Memory
    • 4.2 在ConversationChain上使用Memory
    • 4.3 同一个Chain合并使用多个Memory
    • 4.4 给一个多参数Chain增加Memory
  • 参考资料

本文主要内容参考资料:AI Agent智能体开发,一步步教你搭建agent开发环境(需求分析、技术选型、技术分解)

与大模型进行多轮对话时,并不是前面的对话真的被大模型记住了,其实还是通过prompt来实现的。也就是在进行多轮对话时,在没有令牌限制或其他限制的情况下,会将前面的对话内容放进目前对话的prompt中。

langchain当中通过memory模块当中的一系列方法来实现多轮对话的记忆存储。

一、对话Memory的实现

1.1 ConversationBufferMemory

langchain中国最常见的一种对话Memory的实现就是基于 ConversationBufferMemory 方法。该方法会保存历史对话的所有内容,并存储在内容中,属于短时记忆。启用的方式是构建一个对话的ConversationChain,将memory的方法作为参数传进去。还可以指定大模型、以及显示prompt的内容等。

示例代码:

import  os
import openai
from  langchain_community.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import  ConversationBufferMemoryos.environ["OPENAI_API_KEY"] = ''
openai.api_key = os.environ.get("OPENAI_API_KEY")llm = ChatOpenAI(model_name = 'gpt-3.5-turbo',temperature = 0.0)
memory = ConversationBufferMemory() # 全部存储conversation = ConversationChain(llm = llm,memory = memory,verbose = True # 开启查看每次prompt内容
)while 1:content = input('user:')print(conversation.predict(input=content))

输出如下:

user:Hi,my name is Rain.> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.Current conversation:Human: Hi,my name is Rain.
AI:> Finished chain.
Hello Rain! It's nice to meet you. How can I assist you today?
user:what is 1+1?
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
Current conversation:
Human: Hi,my name is Rain.
AI: Hello Rain! It's nice to meet you. How can I assist you today?
Human: what is 1+1?
AI:> Finished chain.
1 + 1 equals 2. Is there anything else you would like to know?user:what is my name?> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.Current conversation:
Human: Hi,my name is Rain.
AI: Hello Rain! It's nice to meet you. How can I assist you today?
Human: what is 1+1?
AI: 1 + 1 equals 2. Is there anything else you would like to know?
Human: what is my name?
AI:
> Finished chain.
Your name is Rain.

二、几种其他的memory

2.1 ConversationBufferWindowMemory

这个方法不同于上文提到的方法,可以通过参数设置需要记忆的对话轮数

from langchain.memory import  ConversationBufferWindowMemorymemory = ConversationBufferWindowMemory(k = 1) # K参数设置记忆的对话轮数

2.2 ConversationTokenBufferMemory

这个方法可以设置最大令牌上限,其实也是限制记忆的数量,毕竟大模型都是按Token数量收费的,当对话轮数很多时,每次对话记忆耗费的Token数量也会变得很大。指定llm参数是因为每种模型的token计算方式不同。

from langchain.memory import  ConversationTokenBufferMemorymemory = ConversationTokenBufferMemory(llm=llm,max_token_limit=30) # 设置令牌上限

2.3 ConversationSummaryBufferMemory

这个方法会将之前所有的对话轮数根据你设置的令牌上限进行总结,保证新对话的prompt不会超过这个令牌上限,同时又能最大程度保存一些历史对话信息。

from langchain.memory import  ConversationSummaryBufferMemorymemory = ConversationSummaryBufferMemory(llm=llm,max_token_limit=30) 

通过总结摘要的方式,可以实现长对话的记忆功能。

三、自定义Memory

[待更新…]

四、为Chain增加Memory

4.1 在LLMChain上使用Memory


from langchain.chains import LLMChain
from langchain_ollama import OllamaLLM
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate# 自定义模版
template = """你是一个可以和人类对话的机器人.
{chat_history}
人类:{human_input}
机器人:
"""prompt = PromptTemplate(template=template,input_variables={"chat_history", "human_input"}
)memory = ConversationBufferMemory(memory_key="chat_history"  # 和prompt中的input_variables中的占位符对应
)llm_model = OllamaLLM(model="llama3.1:8b")chain = LLMChain(llm=llm_model,prompt=prompt,memory=memory
)result = chain.predict(human_input="你知道我叫什么名字吗")
print(result)

4.2 在ConversationChain上使用Memory

from langchain.chains import ConversationChain
from langchain.llms import OpenAI
from langchain.memory import ConversationBufferMemoryllm = OpenAI(temperature=0,
)
memory = ConversationBufferMemory(memory_key="history",return_messages=True,
)
chain = ConversationChain(llm=llm,memory=memory,verbose=True,
)chain.predict(input="帮我做个一日游攻略")

4.3 同一个Chain合并使用多个Memory

[待更新…]

4.4 给一个多参数Chain增加Memory

[待更新…]

参考资料

AI Agent智能体开发,一步步教你搭建agent开发环境(需求分析、技术选型、技术分解)

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

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

相关文章

用于 RGB-D 显著目标检测的点感知交互和 CNN 诱导的细化网络

摘要 通过整合来自RGB图像和深度图的互补信息,能够提升在复杂且具有挑战性场景下的显著性目标检测(SOD)能力。近年来,卷积神经网络(CNNs)在特征提取和跨模态交互方面的重要作用已得到充分挖掘,但…

基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“校园周边美食探索及分享平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 校园周边美食探索及分享平台结构图…

chrome浏览器插件拓展捕获页面的响应体内容

因为chrome extension官方没有的直接获取响应体的方法,所以需要自己实现方法来获取,实现的方式有很多种,这是记录的第二种,第一种就是使用vconsole来实现,vconsole是一个开源框架,一个轻量、可拓展、针对手…

【Linux指北】Linux的重定向与管道

一、了解Linux目录配置标准FHS FHS本质:是一套规定Linux目录结构,软件建议安装位置的标准。 (使用Linux来开发产品或者发布软件的公司、个人太多,如果每家公司或者个人都按照自己的意愿来配置文件或者软件的存放位置,这无疑是一…

Qt6.8.2中JavaScript调用WebAssembly的js文件<1>

前段时间已经学习了如何在QtAssembly中编译FFmpeg资源了,接下来需要使用Html来调用QtCreator中WebAssembly套件写的功能,逐步实现javascrpt与c复杂功能的视线。 接下来我先为大家介绍一个非常简单的加法调用吧! 功能讲解 开发环境&#xf…

3.13-进程

进程 进程和程序 程序:编译好的二进制文件,不占用系统资源(内存)。进程:活跃的程序,不消耗系统图资源(内存)。 MMU PCB 进程控制块 本质:结构体:struct …

在 CentOS 7 上安装 PHP 7.3

在 CentOS 7 上安装 PHP 7.3 可以按照以下步骤进行操作: 1. 安装必要的依赖和 EPEL 仓库 EPEL(Extra Packages for Enterprise Linux)是为企业级 Linux 提供额外软件包的仓库,yum-utils 用于管理 yum 仓库。 sudo yum install -…

DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI…

C++从入门到入土(七)——多态

目录 前言 多态的概念 多态的定义 虚函数的介绍 虚函数的重写/覆盖 析构函数的重写 override和final关键字 纯虚函数和抽象类 重写/重载/隐藏总结 多态的原理 小结 前言 C一共有三个特性,封装、继承和多态,在前面的文章中,我们分别…

浅谈时钟启动和Systemlnit函数

时钟是STM32的关键,是整个系统的心脏,时钟如何启动,时钟源如何选择,各个参数如何设置,我们从源码来简单分析一下时钟的启动函数Systemlnit()。 Systemlnit函数简介 我们先来看一下源程序的注释…

【数据结构】6栈

0 章节 3.1到3.3小节。 认知与理解栈结构; 列举栈的操作特点。 理解并列举栈的应用案例。 重点 栈的特点与实现; 难点 栈的灵活实现与应用 作业或思考题 完成学习测试2,? 内容达成以下标准(考核…

HOT100——链表篇Leetcode160. 相交链表

文章目录 题目:Leetcode160. 相交链表原题链接思路代码 题目:Leetcode160. 相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表…

江科大51单片机笔记【16】AD/DA转换(下)

写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…

【CF】Day5——Codeforces Round 921 (Div. 2) BC

B. A Balanced Problemset? 题目: 思路: 这道题要我们分成n个子问题,我们假设这几个子问题分别是a1,a2,a3,...an, 那么就是让我们求 gcd(a1,a2,a3,....,an),我们假设这个值是d 那么就有 d | a1,d | a2…

Mininet 自定义拓扑类型详解

Mininet 通过 --topo 参数支持多种自定义网络拓扑结构&#xff0c;适用于不同场景的网络模拟需求。以下是所有内置拓扑类型及其参数说明&#xff1a; 一、基础拓扑类型 拓扑类型参数格式说明示例命令singlesingle,<n>单一交换机连接所有主机&#xff08;默认 2 台主机&a…

图论part3|101.孤岛的总面积、沉没孤岛、417. 太平洋大西洋水流问题

101. 孤岛的总面积 &#x1f517;&#xff1a;101. 孤岛的总面积思路&#xff1a;和昨天的岛的区别是&#xff1a;是否有挨着边的岛屿 所以可以先遍历四条边挨着的岛屿&#xff0c;把他们标记为非孤岛再计算其他岛屿当中的最大面积 代码&#xff1a;&#xff08;深度搜索&…

第十一届蓝桥杯单片机国赛

什么&#xff1f;4T模拟赛和省赛做起来轻轻松松&#xff1f;不妨来挑战一下第十一届国赛&#xff0c;这一届的国赛居然没考超声波、串口通信&#xff01;只要你正确地理解了题目的意思&#xff0c;规避出题人挖的坑&#xff0c;拿个国一轻轻松松。 附件&#xff1a;第十一届蓝桥…

【Unity6打包Android】游戏启动的隐私政策弹窗(报错处理)

Unity版本&#xff1a;Unity6000.0.24 增加弹窗步骤 1. 自定义AndroidManifest 1.1 在Player Setting > Publishing Settings > Build下勾选Custom Main Manifest&#xff0c;在Assets/Plugins/Android路径下生成AndroidManifest.xml文件 1.2 修改AndroidManifest.xml…

记录一个SQL自动执行的html页面

在实际工作场景中&#xff0c;需要运用到大量SQL语句更新业务逻辑&#xff0c;对程序员本身&#xff0c;写好的sql语句执行没有多大问题&#xff08;图1&#xff09;&#xff0c;但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面&#xff08;图2&#xff0…

mac安装mysql之后报错zsh: command not found: mysql !

在Mac上安装MySQL后&#xff0c;如果终端中找不到mysql命令&#xff0c;通常是 因为MySQL的命令行工具&#xff08;如mysql客户端&#xff09;没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…