开源模型应用落地-LangChain高阶-记忆组件-ConversationBufferMemory正确使用(一)

news2024/12/24 15:41:45

一、前言

    LangChain 的记忆组件发挥着至关重要的作用,其旨在协助大语言模型(LLM)有效地留存历史对话信息。通过这一功能,使得大语言模型在对话过程中能够更出色地维持上下文的连贯性和一致性,进而能够像人类的记忆运作方式那样,进行更为自然、流畅且智能化的交互。

    它仿佛是为大语言模型赋予了一种类似人类记忆的能力,让其在处理对话时,不仅能够清晰地记住之前交流的内容,还能依据这些历史信息做出更贴合语境、更富有逻辑和更具有针对性的回应,极大地提升了交互的质量和效果。

    本篇学习如何正确使用ConversationBufferMemory组件。


二、术语

2.1.记忆组件

    记忆组件是一种用于帮助大语言模型(LLM)记住历史对话信息的工具。大语言模型本身是无状态的,不会记住之前的对话内容,而记忆组件通过存储和管理历史对话的相关信息,让 LLM 在对话中能够更好地保持上下文,从而进行更自然和智能的交互。

2.2.ConversationBufferMemory

    存储对话的所有消息,并能将这些消息抽取到一个变量中。它会如实记录所有历史消息,但随着对话延长,所需存储量会增大,向 LLM 发送的 token 成本也可能增加。

2.3.load_memory_variables方法

    用于获取当前存储在该记忆组件中的对话历史信息。通过调用这个方法,可以以特定的格式返回之前保存的对话内容。默认情况下,它可能会返回一个包含对话历史的变量字典,其中有一个名为"history"的变量存储了具体的对话记录。这些对话历史信息可以作为上下文提供给大语言模型,使其在生成回答时能够参考之前的对话内容,从而实现更自然和智能的交互,就像人类在对话中能够记住之前的讨论内容一样。

2.4.save_context方法

    用于将对话的上下文信息保存到记忆组件对象中。


三、前提条件 

3.1. 基础环境

  1.  操作系统:不限

3.2. 安装虚拟环境

conda create --name langchain python=3.10
conda activate langchain
pip install langchain langchain-openai langchain-community


四、技术实现

4.1.ConversationBufferMemory基础示例

import os

from langchain.chains.conversation.base import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


if __name__ == '__main__':
    memory = ConversationBufferMemory()

    memory.chat_memory.add_user_message("你好,我叫蜘蛛侠")
    memory.chat_memory.add_ai_message("很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?")

    variables = memory.load_memory_variables({})
    print(variables)

    llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.7, max_tokens=512)

    # 创建一个对话链
    conversation = ConversationChain(
        llm=llm,
        memory=memory,
        verbose=True
    )

    print(conversation.predict(input="Hi, 你还记得我叫什么名字吗?"))

调用结果:

说明:

ConversationBufferMemory类中的human_prefix、ai_prefix和memory_key属性分别对应到

  1. history: 'Human: 你好,我叫蜘蛛侠\nAI: 很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?'
  2. Human: 你好,我叫蜘蛛侠
  3. AI: 很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?

4.2.ConversationBufferMemory进阶示例

    指定memory_key属性

import os

from langchain.chains.conversation.base import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


if __name__ == '__main__':
    memory = ConversationBufferMemory(memory_key="chat_history")

    memory.chat_memory.add_user_message("你好,我叫蜘蛛侠")
    memory.chat_memory.add_ai_message("很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?")

    variables = memory.load_memory_variables({})
    print(variables)

    llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.7, max_tokens=512)

    template = ''' 仅根据以下上下文回答问题:
    {chat_history}

    问题: {input}
    '''
    prompt = ChatPromptTemplate.from_template(template)
    # 创建一个对话链
    conversation = ConversationChain(
        llm=llm,
        memory=memory,
        prompt=prompt,
        verbose=True
    )

    print(conversation.predict(input="Hi, 你还记得我叫什么名字吗?",chat_history = variables['chat_history']))

调用结果:

说明:

1. 为什么ConversationBufferMemory指定memory_key属性后,ConversationChain调用predict方法要显示指定chat_history?

在未显示指定memory_key时,默认以history来存储历史对话内容,符合PromptTemplate的输入变量,如下图所示:

在predict方法中,未显示指定历史对话存储的key时,将提示以下异常:

langchain Got unexpected prompt input variables. The prompt expects ['history', 'input'], but got ['chat_history'] as inputs from memory, and input as the normal input key. (type=value_error)

4.3.save_context使用示例

import os

from langchain.chains.conversation.base import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"


if __name__ == '__main__':
    memory = ConversationBufferMemory(memory_key="chat_history")

    # memory.chat_memory.add_user_message("你好,我叫蜘蛛侠")
    # memory.chat_memory.add_ai_message("很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?")

    memory.save_context({"input":"你好,我叫蜘蛛侠"},{"output":"很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?"})

    variables = memory.load_memory_variables({})
    print(variables)

    llm = ChatOpenAI(model_name='gpt-3.5-turbo-1106', temperature=0.7, max_tokens=512)

    template = ''' 仅根据以下上下文回答问题:
    {chat_history}

    问题: {input}
    '''
    prompt = ChatPromptTemplate.from_template(template)
    # 创建一个对话链
    conversation = ConversationChain(
        llm=llm,
        memory=memory,
        prompt=prompt,
        verbose=True
    )

    print(conversation.predict(input="Hi, 你还记得我叫什么名字吗?",chat_history = variables['chat_history']))

调用结果:

说明:

memory.save_context({"input":"你好,我叫蜘蛛侠"},{"output":"很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?"})

等价于

memory.chat_memory.add_user_message("你好,我叫蜘蛛侠")
memory.chat_memory.add_ai_message("很高兴认识你,蜘蛛侠!作为一名人工助理,我会尽我所能为你提供帮助。你有什么需要我协助的吗?")

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

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

相关文章

【网络安全】构建稳固与安全的网络环境:从“微软蓝屏”事件中汲取的教训

发生什么事了? 近日,一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅成为科技领域的热点新闻,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件,源于美国电脑安全技术公司“众击”提供的一个…

中断和EXIT原理介绍

中断和EXIT原理介绍 一、中断的介绍?二、EXIT的介绍1.EXIT作用2.EXIT的详情3.EXIT中AFIO复用的作用4.STM32中AFIO复用作用 一、中断的介绍? 二、EXIT的介绍 EXTI(Extern Interrupt)外部中断 1.EXIT作用 EXTI可以监测指定GPIO口…

Java学习笔记(五)数组、冒泡排序

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java数组、冒泡排序使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 …

力扣SQL50 指定日期的产品价格 双重子查询 coalesce

Problem: 1164. 指定日期的产品价格 coalesce 的使用 简洁版 &#x1f468;‍&#x1f3eb; 参考题解 select distinct p1.product_id,coalesce((select p2.new_pricefrom Products p2where p2.product_id p1.product_id and p2.change_date < 2019-08-16order by p2.…

Web前端Promise

Promise介绍与使用 Promise是什么&#xff1f; 1.抽象表达&#xff1a; Promise是一门新的技术&#xff08;ES6规范&#xff09;Promise是JS中进行异步编程的新解决方案备注&#xff1a;旧方案是单纯使用回调函数 2.具体表达&#xff1a; 从语法上来说&#xff1a;Promise…

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时&#xff0c;只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格&#xff0c;分成了4级 步骤&#xff1a; 1、我们可以先按照这个层级设置下空列&#xff08;后买你会用到这个空列&#xff09; 二级不用加、三级前面加一列、四级前面加…

前端:Vue学习 - 购物车项目

前端&#xff1a;Vue学习 - 购物车项目 1. json-server&#xff0c;生成后端接口2. 购物车项目 - 实现效果3. 参考代码 - Vuex 1. json-server&#xff0c;生成后端接口 全局安装json-server&#xff0c;json-server官网为&#xff1a;json-server npm install json-server -…

C++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法&#xff0c;并不是一个固定使用的搭配&#xff0c;就算是普通switch语句&#xff0c;Map&#xff0c;乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多&#xff0c;主要是其的侧…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

若依Vue前后端分离版如何部署(windows)(超详细)

一、项目环境准备 下面是项目所需要准备的环境 Node.js redis 1、Node.js下载 下面进入官网可以下载Node.js — 在任何地方运行 JavaScript (nodejs.org)https://nodejs.org/zh-cn 下载完成安装后&#xff0c;需要配置环境变量&#xff0c;首先复制以下nodejs的安…

商汤提出的BRECQ量化框架是个什么?

商汤提出的BRECQ量化框架是个什么&#xff1f; 引言 近年来&#xff0c;深度学习在多个领域取得了显著进展&#xff0c;但其巨大的计算成本和内存占用问题逐渐凸显。为了压缩和加速已训练好的网络&#xff0c;量化成为了一种重要的技术手段。量化主要分为两类&#xff1a;量化…

DAMA学习笔记(七)-数据集成和互操作

1.引言 数据集成和互操作(DII)描述了数据在不同数据存储、应用程序和组织这三者内部和之间进行移动和整合的相关过程。数据集成是将数据整合成物理的或虚拟的一致格式。数据互操作是多个系统之间进行通信的能力。数据集成和互操作的解决方案提供了大多数组织所依赖的基本数据管…

数据库解析一维和二维简易JSON,

项目还在使用Oracle11&#xff0c;不支持后续官方的json解析方式&#xff0c; 在 前年、去年、今年 接连 遇到json解析问题后&#xff08;其实是公司的轮子效率太慢&#xff0c;太复杂&#xff0c;决定自己造个轮子&#xff0c;看看到底为什么慢&#xff0c;是不是真的很复杂&a…

计算机网络八股文(四)

目录 61.客户端调用close()后的断开流程是怎样的&#xff1f; 62.没有accept可以建立TCP连接吗&#xff1f; 63.没有listen可以建立TCP连接吗&#xff1f; 64.什么是TCP半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;accept队列&#xff09;&#xff…

质量问题到底是谁的责任?

在竞争日益激烈的市场环境中&#xff0c;产品质量是企业生存与发展的基石。每当谈及生产企业的质量问题&#xff0c;我们往往不由自主地思考&#xff1a;在这一复杂而精细的生产链条中&#xff0c;究竟是谁该为质量问题负责&#xff1f; 必须明确一个无可争议的事实&#xff1…

MySQL多实例的配置

步骤1 环境准备 安装多实例数据库 1&#xff09;安装好数据库mariadb yum -y install mariadb-server 2&#xff09;创建mysql多实例数据文件目录 mkdir /data/mysql/3307/{data,etc,socket,log,bin,pid} -pv mkdir /data/mysql/3308/{data,etc,socket,log,bin,pid} –pv ch…

51单片机15(直流电机实验)

一、序言&#xff1a;我们知道在单片机当中&#xff0c;直流电机的控制也是非常多的&#xff0c;所以有必要了解一些这个电机相关的一些知识&#xff0c;以及如何使用单片机来控制这个电机&#xff0c;那么在没有学习PWM之前&#xff0c;我们先简单的使用GPIO这个管脚来控制电机…

【MySQL】Ubuntu22.04 安装 MySQL8 数据库详解

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》《MySQL》《Qt》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、安装目录 1.1 更新软件源 sheepAron:/root$ sudo apt update1.2 安装mysql_ser…

手持式气象监测设备

手持式气象监测设备以其小巧轻便、功能齐全的特点&#xff0c;逐渐成为了现代气象观测的便携新选择。 一、手持式气象监测设备的优势 手持式气象监测设备最大的优势在于其便携性。相比传统的气象监测站&#xff0c;手持式气象监测设备体积小巧、重量轻&#xff0c;用户可以轻松…

聊一聊 Node.js V22.5 有啥重要更新

大家好&#xff0c;今天我们来聊聊 Node.js 最新发布的 V22.5 版本。作为一名开发者&#xff0c;每次看到新的版本更新&#xff0c;总是让人期待不已。V22.5 中新增了许多强大且实用的功能&#xff0c;让我们的开发工作更加高效便捷。在这篇文章中&#xff0c;我们将重点讨论以…