LangChain大模型应用开发指南-大模型Memory不止于对话

news2025/5/25 5:27:09

上节课,我我为您介绍了LangChain中最基本的链式结构,以及基于这个链式结构演化出来的ReAct对话链模型。

今天我将由简入繁,为大家拆解LangChain内置的多种记忆机制。本教程将详细介绍这些记忆组件的工作原理、特性以及使用方法。

【一一AGI大模型学习 所有资源获取处一一】

①人工智能/大模型学习路线

②AI产品经理资源合集

③200本大模型PDF书籍

④超详细海量大模型实战项目

⑤LLM大模型系统学习教程

⑥640套-AI大模型报告合集

⑦从0-1入门大模型教程视频

⑧LLM面试题合集

历史对话全带上,记忆居然如此低级

随着大模型的发展,语言模型已经能够进行逻辑自洽的对话。但是与人类智能相比,机器对话仍然存在短板,其中一个重要因素就是“记忆力”的缺失。何为记忆力?简单来说,就是机器需要能够记住之前的上下文和知识,并运用这些“记忆”,使对话更加流畅合理。

ConversationBufferMemory是LangChain中最基础的记忆组件。它的工作原理非常简单:将对话历史缓存到一个队列中,并提供接口获取历史对话。

这种缓存机制实现了最基本的对话“记忆”功能。当用户询问之前提到的问题时,ConversationBufferMemory可以查找相关记忆,从而使机器人的回答更加连贯合理。 组件结构示意图

# 导入所需的库
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferMemory

# 初始化大语言模型
# 大模型定义
api_key = ""

api_url = ""

modal= "baichuan"

llm = OpenAI(model_name=modal,openai_api_key=api_key,openai_api_base=api_url,temperature=0.0)

# 初始化对话链
conversation = ConversationChain(
    llm=llm,
    memory=ConversationBufferMemory()
)

# 第一天的对话
# 回合1
conversation("我姐姐明天要过生日,我需要一束生日花束。")
print("第一次对话后的记忆:", conversation.memory.buffer)

# 回合2
conversation("她喜欢粉色玫瑰,颜色是粉色的。")
print("第二次对话后的记忆:", conversation.memory.buffer)

# 回合3 (第二天的对话)
conversation("我又来了,还记得我昨天为什么要来买花吗?")
print("/n第三次对话后时提示:/n",conversation.prompt.template)
print("/n第三次对话后的记忆:/n", conversation.memory.buffer)



如以上代码和执行结果所示,ConversationBufferMemory会将所有的对话历史存储在buffer中,开发者可以通过’conversation.memory.buffer’,访问最近的对话历史。然后基于这些历史信息进行后续处理,从而实现机器人的“记忆”功能,执行结果截图如下:

这种Remember Everything的全历史记忆策略非常简单直接,但是同时也存在一些问题:

  1. 记忆容量有限,长对话下容易撑爆内存
  2. 对话噪声也全部记住,降低有效信息密度

所以这只是一个低级的记忆实现,我们还需要更智能的记忆机制,为了解决容量有限及,token耗费过高的问题,Langchain提供了时间窗口记忆组件。

容量有限?试试窗口记忆

既然全历史记忆有容量限制问题,那么可以试试只记住部分重要的对话片段。

ConversationBufferWindowMemory实现了基于时间窗口的记忆策略。

它与全历史缓存的差别在于,只维护一个滑动时间窗口,例如最近5轮对话。超出这个窗口的历史对话将被移出缓存。

# 导入所需的库
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferWindowMemory

# 初始化大语言模型
# 大模型定义
api_key = ""

api_url = ""

modal= "baichuan"

llm = OpenAI(model_name=modal,openai_api_key=api_key,openai_api_base=api_url,temperature=0.0)

# 初始化对话链
conversation = ConversationChain(
    llm=llm,
    memory=ConversationBufferWindowMemory(k=1)
)

# 第一天的对话
# 回合1
result = conversation("我姐姐明天要过生日,我需要一束生日花束。")
print(result)
# 回合2
result = conversation("她喜欢粉色玫瑰,颜色是粉色的。")
print("\n第二次对话后的记忆:\n", conversation.memory.buffer)
print(result)

# 第二天的对话
# 回合3
result = conversation("我又来了,还记得我昨天为什么要来买花吗?")
print(result)


如以上代码所示,buffer中只保留了最近一次对话的记忆。这种窗口机制实现了“遗忘”功能,有效控制了记忆容量,防止内存泄漏,执行结果截图如下:

与此同时,通过窗口大小调整,开发者可以平衡记忆容量和内容质量:

  • 窗口越大,记住的内容越多
  • 窗口越小,记忆更加重点和精炼

但是,本节的截断式遗忘依然是一个相对简单的解决方案。后续我们将探索有选择性地生成“记忆”,这才更符合人类智能的特点。

既要还要,这才算是AI记忆

之前的两种记忆机制要么占用过多容量,要么丢失太多重要信息。我们需要一种折中方案——保留关键信息,移除冗余Noise。

ConversationSummary系列组件通过生成语义摘要的方式实现这一目标。

# 导入所需的库
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationSummaryMemory

# 初始化大语言模型
# 大模型定义
api_key = ""

api_url = ""

modal= "baichuan"

llm = OpenAI(model_name=modal,openai_api_key=api_key,openai_api_base=api_url,temperature=0.0)

# 初始化对话链
conversation = ConversationChain(
    llm=llm,
    memory=ConversationSummaryMemory(llm=llm)
)

# 第一天的对话
# 回合1
result = conversation("我姐姐明天要过生日,我需要一束生日花束。")
print(result)
# 回合2
result = conversation("她喜欢粉色玫瑰,颜色是粉色的。")
print("\n第二次对话后的记忆:\n", conversation.memory.buffer)
print(result)

# 第二天的对话
# 回合3
result = conversation("我又来了,还记得我昨天为什么要来买花吗?")
print(result)

如以上代码所示,buffer中只保留的记忆并非历史的对话,而是历史对话的摘要,执行结果截图如下:

其工作流程是:

  1. 对对话历史进行语义分析,提取关键词、实体等语义信息
  2. 基于这些语义信息,生成文本摘要
  3. 将生成的摘要作为记忆,而不是完整的对话历史

这种策略融合了记忆质量和容量的考量。摘要只保留了最核心的语义信息,有效减少了冗余,同时质量也更高。

ConversationSummaryMemory会在每轮对话后更新一次摘要。而ConversationSummaryBufferMemory支持配置生成摘要的间隔,从而进一步降低计算消耗。

这里是推荐文章的第四部分内容:

图谱化,记忆向知识进化

前面讨论的几种记忆机制,都是在自然语言的水平上进行对话历史的记录和重用。那么如果能直接建模并记忆更抽象的知识和关系,将是更高一层的进化。

ConversationKGMemory实现了这一目标。它将对话中的实体和事件抽取出来,构建知识图谱;并在回答问题时,探索知识图谱寻找相关记忆。

from langchain.chains.conversation.memory import ConversationKGMemory
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.prompts.prompt import PromptTemplate

api_key = ""

api_url = ""

modal= "baichuan"

llm = OpenAI(model_name=modal,openai_api_key=api_key,openai_api_base=api_url,temperature=0.0)

template = """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. The AI ONLY uses information contained in the "Relevant Information" section and does not hallucinate.

Relevant Information:

{history}

Conversation:
Human: {input}
AI:"""
prompt = PromptTemplate(
    input_variables=["history", "input"], template=template)

conversation_with_kg = ConversationChain(
    llm=llm, 
    verbose=True, 
    prompt=prompt,
    memory=ConversationKGMemory(llm=llm)
)

conversation_with_kg("我姐姐明天要过生日,我需要一束生日花束。")

conversation_with_kg("她喜欢粉色玫瑰,颜色是粉色的。")

conversation_with_kg("我又来了,还记得我昨天为什么要来买花吗?")


print(conversation_with_kg.memory.kg)
print(conversation_with_kg.memory.kg.get_triples())

如以上代码所示,多次对话过后,模型进行了多个概念的关系组合,形成了一个小型的知识网络,执行结果截图如下:

这样,机器人的记忆获得了概念化的升华,从低级的语言序列,上升为关系网络的知识模型。这也使得记忆的应用更加灵活:

  • 可以进行知识推理,呈现更多潜在关联
  • 记忆容量也得到扩展

用好实体,AI也会联想

除了建模知识,大模型记忆的另一个途径是通过实体链接链接到大脑知识。ConversationEntityMemory通过实体链接、消歧实现这一目标。

例如用户提到“苹果”,实体识别组件会判断其为“苹果公司”,从Wikipedia等知识源关联大量相关背景常识。这样当用户询问“蒂姆库克”时,机器人也能很自然地联想到他是苹果公司的CEO这一事实。

from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationEntityMemory
from langchain.chains.conversation.prompt import ENTITY_MEMORY_CONVERSATION_TEMPLATE
from pydantic import BaseModel
from typing import List, Dict, Any

api_key = ""

api_url = ""

modal= "baichuan"

llm = OpenAI(model_name=modal,openai_api_key=api_key,openai_api_base=api_url,temperature=0.0)

conversation = ConversationChain(
    llm=llm, 
    verbose=True,
    prompt=ENTITY_MEMORY_CONVERSATION_TEMPLATE,
    memory=ConversationEntityMemory(llm=llm))

conversation("我姐姐明天要过生日,我需要一束生日花束。")

conversation("她喜欢粉色玫瑰,颜色是粉色的。")

print("\n记忆1:\n",conversation.memory.entity_cache)

conversation("你能帮我联系花店送货上门吗?")

print("\n记忆2:\n",conversation.memory.entity_cache)


如以上代码所示,在不同的对话阶段,模型提炼出了不同的对话实体,对对话内容的理解也更具关联性,执行结果截图如下:

实体和知识图谱可以有效地帮助机器人记住和扩展背景知识,从而支持更丰富、连贯的对话交互。与此同时,相比纯文本的对话历史,基于结构化知识的记忆也更加可解释。

这就是LangChain平台中几种主要的记忆组件。通过它们,开发者可以打造兼具智能对话和知识应用的AI助手。

总结

LangChain作为业内领先的大模型应用平台,提供了多种实用的记忆组件帮助开发者构建有“记忆力”的AI系统。

这些记忆组件从不同角度试图解决之前机器对话固有的遗忘问题:

  • ConversationBufferMemory:基于对话历史缓存实现简单的全记忆
  • ConversationBufferWindowMemory:利用时间窗口机制控制记忆容量
  • ConversationSummaryMemory:通过提取语义摘要,记住关键信息并舍弃Noise
  • ConversationKGMemory:将对话实体和事件图谱化,实现知识级记忆
  • ConversationEntityMemory:连接外部实体知识,辅助机器人记忆和联想

开发者可以根据实际需求选择使用不同的记忆组件,使AI对话内容更加深层次。此外,这些组件也可以进行定制与扩展,以开发出基于LangChain的创新型应用。

希望本教程能让更多开发者了解并掌握大模型强大的记忆功能,构建出与日俱进、知识渊博的AI助手。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

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

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

相关文章

二叉搜索树的第 k 大的节点

题目描述 给定一棵二叉搜索树,请找出其中第 k 大的节点。 解题基本知识 二叉搜索树(Binary Search Tree)又名二叉查找树、二叉排序树。它是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子…

C语言第九天笔记

数组的概念 什 么是数组 数组是 相同类型, 有序数据的集合。 数 组的特征 数组中的数据被称为数组的 元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类 型的变量空间) 衍生概念&…

数据安全、信息安全、网络安全区别与联系

关键字: 信息安全 数据安全 网络安全 [导读] 让人更好理解 “数据安全”、“信息安全”、“网络安全” 三者间的区别与联系了,我们汇总了官方机构给这三者的定义,并且网友也给出了自己的看法,一起来看看。 在 “互联网 ” 被广…

tomcat10环境的搭建及发布一个动态服务

Day 15 # 构建项目 [rootstatic-server eleme_web]# npm run build # 将静态的项目移动到nginx [rootstatic-server eleme_web]# ls [rootstatic-server eleme_web]# ls dist/ css favicon.ico index.html js [rootstatic-server eleme_web]# vim dist/index.html [r…

数据虚拟化和传统数据集成方式(如 ETL)有何区别?

要理解数据虚拟化,我们先说一下什么是虚拟化(Virtualization)? 所谓虚拟化(Virtualization),通常指的是对 IT 资源的抽象,它屏蔽了这些资源的物理性质和边界。IT 资源可以是服务器、…

DjangoRF-11-创建testcases子应用--任务模块

这里先写任务应用,再写套件,然后写接口,最后再写请求, 这个是新的应用,要创建子应用,然后添加到settings的注册里面 1、和往常一样先写模型,序列化,权限,视图&#xf…

【正版软件分享】FastCopy Pro:Windows 文件复制的加速器,让数据传输更高效

在数字化时代,数据的快速、安全传输是每个用户和企业的核心需求。今天,我们将深入探讨一款名为 FastCopy Pro 的 Windows 文件复制、备份和删除软件,它以其卓越的性能和易用性在众多工具中脱颖而出。 FastCopy Pro 简介 FastCopy Pro 是一款…

jetbrain插件市场无法下载插件/idea插件install无效

最近把电脑重装了一次系统,发现idea插件市场可以搜到插件,但是不显示overview之类的信息,点install也没反应。 于是打算直接到插件市场的官网plugins.jetbrains.com下载插件安装。 结果发现同样可以搜索到插件,但是无法下载。 在…

多地气温连创新高,快递小哥高温补贴有多少

被热浪笼罩的多个城市,再度进入“烧烤模式”。朋友圈都在被同一句话刷屏——“我和烤肉之间只差一撮孜然的距离”。 在如此炎热时,快递小哥们依旧头顶烈日,穿梭在城市的车水马龙和摩天大楼之间,电话不离耳、腿脚不停歇&#xff0…

LLaMA-Factory私有化部署 -- PAI-DSW

LLaMA-Factory是一款比较流行的大语言模型微调框架。本文主要记录在阿里云人工智能平台PAI的DSW实例中部署LLaMA-Factory的过程,主要参考的教程是B站视频LLaMA-Factory私有化部署。 LLaMA-Factory的私有化部署与部署大模型的过程大体相同,都包括创建Pyt…

培训第十九天(安装nginx代理tomcat)

上午 1、构建vue发行版本 [rootserver ~]# cd eleme_web/[rootserver eleme_web]# npm run buid //项目未执行时运行该命令,创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件[rootserver dist]# lscss favicon.ico img in…

git创建远程仓库

注册 请自行注册github账号 创建远程仓库 自己在上图那里可以创建一个远程仓库 克隆远程仓库 我们需要将远程仓库克隆到本地之后,在本地修改最后上传到远程仓库,关系如下: 由于我们的仓库是私密仓库,需要通过ssh密钥的方法才…

day19(安装nginx代理 + tomcat)

1、构建vue发行版本 [rootserver ~]# cd eleme_web/ [rootserver eleme_web]# npm run buid //项目未执行时运行该命令,创建发行版本 [rootserver eleme_web]# cd dist/ //dist中包含发行版本的所有文件 [rootserver dist]# ls css favicon.ico img index…

⌈ 传知代码 ⌋ 基于矩阵乘积态的生成模型

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

SQL语句分类;查看MySQL存储引擎

文章目录 SQL语句分类查看MySQL存储引擎存储引擎对比 SQL语句分类 数据本身权限:定义 修改 DDL【data definition language】 数据定义语言,用来维护存储数据的结构 代表指令: create, drop, alterDML【data manipulation language】 数据操纵语言&…

第十九天内容

上午 1、构建vue发行版本 2、java环境配置 jdk软件包路径: https://download.oracle.com/java/22/latest/jdk-22_linux-x64_bin.tar.gz 下午 1、安装tomcat软件 tomcat软件包路径: https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.26/bin/apache-to…

水库大坝安全自动监测系统位移测点布设

水库大坝安全自动监测系统中的位移测点布设是大坝安全监测的重要环节,其目的是为了及时、准确地获取大坝的位移信息,评估大坝的稳定性,确保大坝的安全运行。位移测点的布设需要综合考虑大坝的结构特点、地质条件、运行工况及监测需求等多方面…

tomcat多实例配置-Linux(CentOS)

多实例配置 一、安装 tomcat二、多实例配置 tomcat 官网 tomcat 安装包下载地址 一、安装 tomcat 解压tomcat压缩包到 /usr/local 下 tar xf apache-tomcat-*.gz -C /usr/local/# 可选 添加一个软链接,方便查找 ln -s /usr/local/apache-tomcat-* /usr/local/tom…

python实现发票信息识别和处理

公司需要发票报销,一定周期的发票攒在一起,处理报销单特别繁琐,遂萌生用python简化报销流程。 明确需求 公司报销单需要发票代码(短码),金额,总计金额,如下图 开始编码 首先需要一个读取pdf的类库 pdf…

AEAD:AES-CCM简介

目录 1. CCM模式 2.认证加密过程 3.校验解密过程 1. CCM模式 CCM(Counter with CBC-MAC) 首先使用 CBC-MAC 来保证数据完整性和真实性,然后使用 CTR 模式来保证数据机密性。 在CCM中,受保护的数据被称为payload,简…