LangChain实战快速入门笔记(四)--LangChain使用之Memory

langchain主要模块(四):Memory 首先,LangChain 提供了用于管理和操作以前的聊天消息的辅助工具。默认情况下,链式模型和代理模型都是无状态的,这意味着它们将每个传入的查询独立处理(就像底层的 LLMs 和聊天模型本身一样)。在某些应用程序中,比如聊天机器人,记住先前的交互是至关重要的。,我是张三\nAI: 你好,张三!{‘history’: ‘Human: 你知道我的姓名吗\nAI: 当然知道!2、有一些现成的可以完整特定功能的链,也可以理解为提高了工具方便使用。1、组件化了需要开发LLM所需要的功能,提供了很多工具,方便使用。 阅读详情

LangChain实战快速入门笔记(四)–LangChain使用之Memory


一、Memory概述

1. 🤖:为什么需要Memory?

大多数的大模型应用程序都会有一个会话接口,允许我们进行多轮的对话,并有一定的上下文记忆能力。

❗❗但实际上,

模型本身是不会记忆任何上下文的,只能依靠用户本身的输入去产生输出。
在这里插入图片描述

🤖:如何实现记忆功能呢?

  实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次请求时,把所有的历史信息都输入给模型,让模型输出最终结果。

而在 LangChain 中,提供这个功能的模块就称为
Memory(记忆) ,用于存储用户和模型交互的历史信息。

2. 🤖:什么是Memory?

  Memory,是LangChain中用于多轮对话中保存和管理上下文信息(比如文本、图像、音频等)的组件。它让应用能够记住用户之前说了什么,从而实现对话的感知的链式对话系统提供了基础。

3. Memory的设计理念

在这里插入图片描述

  1. 输入问题:({“question”: …})
  2. 读取历史消息:从Memory中READ历史消息({“past_messages”: […]})
  3. 构建提示(Prompt):读取到的历史消息和当前问题会被合并,构建一个新的Prompt
  4. 模型处理:构建好的提示会被传递给语言模型进行处理。语言模型根据提示生成一个输出。
  5. 解析输出:输出解析器通过正则表达式 regex(“Answer: (.*)”)来解析,返回一个回答({“answer”: …})给用户
  6. 得到回复并写入Memory:新生成的回答会与当前的问题一起写入Memory,更新对话历史。Memory会存储最新的对话内容,为后续的对话提供上下文支持。

问题:一个链如果接入了Memory 模块,其会与Memory模块交互几次呢?

Answer:链内部会与Memory 模块进行两次交互:读取和写入:
1、收到用户输入时,从记忆组件中查询相关历史信息,拼接历史信息和用户的输入到提示词中传给LLM。
2、返回响应之前,自动把LLM返回的内容写入到记忆组件,用于下次查询。

4. 🤖:不使用Memory模块,如何拥有记忆?

不借助LangChain情况下,我们如何实现大模型的记忆能力?

思考:通过messages 变量,不断地将历史的对话信息追加到对话列表中,以此让大模型具备上下文记忆能力。

import os
import dotenv
from langchain_openai import ChatOpenAI

dotenv.load_dotenv()

os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY')
os.environ['OPENAI_BASE_URL'] = os.getenv('OPENAI_BASE_URL')

# 创建大模型实例
llm = ChatOpenAI(model='gpt-4o-mini')
from langchain.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage

llm = ChatOpenAI(model='gpt-4o-mini')

def chat_with_model(question):
    # 步骤一: 初始化消息
    chat_prompt_template = ChatPromptTemplate.from_messages([
        ('system', '你是一位人工智能小助手'),
        ('human', '{question}')
    ])

    # 步骤二: 定义一个循环:
    while True:
        # 步骤三: 调用模型
        chain = chat_prompt_template | llm
        response = chain.invoke({'question': question})

        # 步骤四: 获取模型回答
        print(f"模型回答: {response.content}")

        # 询问用户是否还有其他问题
        user_input = input("您还有其他问题想问嘛?(输入'退出'结束对话) ")

        # 设置结束循环的条件
        if user_input == "退出":
            break

        # 步骤五: 记录用户回答
        chat_prompt_template.messages.append(AIMessage(content=response.content))
        chat_prompt_template.messages.append(HumanMessage(content=user_input))

chat_with_model("你好")

在这里插入图片描述
相应几次的问题分别是:
在这里插入图片描述
  这种形式是最简单的一种让大模型具备上下文知识的存储方式,任何记忆的基础都是所有聊天交互的历史记录。即使这些不全部直接使用,也需要以某种形式存储。

二、基础Memory模块的使用

1. Memory模块的设计思路

🤖:如何设计Memory模块?

层次1(最直接的方式):保留一个聊天消息列表

层次2(简单的新思路):只返回最近交互的k条消息

层次3(稍微复杂一点):返回过去k条消息的简洁摘要

层次4(更复杂):从存储的消息中提取实体,并且仅返回有关当前运行中引用的实体的信息

LangChain的设计:
  针对上述情况,LangChain构建了一些可以直接使用的Memory 工具,用于存储聊天消息的一系列集成。
在这里插入图片描述

2. ChatMessageHistory(基础)

  ChatMessageHistory是一个用于存储和管理对话消息的基础类,它直接操作消息对象(如HumanMessage, AIMessage 等),是其它记忆组件的底层存储工具。

  在API文档中,ChatMessageHistory 还有一个别名类:InMemoryChatMessageHistory;导包时,需
使用:from langchain.memory import ChatMessageHistory

特点:
• 纯粹是消息对象的“存储器”,与记忆策略(如缓冲、窗口、摘要等)无关。
• 不涉及消息的格式化(如转成文本字符串)

🌙场景1:记忆存储
  ChatMessageHistory是用于管理和存储对话历史的具体实现。

#1.导入相关包
from langchain.memory import ChatMessageHistory

#2.实例化ChatMessageHistory对象
history = ChatMessageHistory()

#3.添加UserMessage
history.add_user_message("hi")

#4.添加AIMessage
history.add_ai_message("whats up?")

#5.返回存储的所有消息列表
print(history.messages)

在这里插入图片描述
🌙场景2:对接LLM

from langchain.memory import ChatMessageHistory

history = ChatMessageHistory()

history.add_ai_message("我是一个无所不能的小智")
history.add_user_message("你好,我叫小明,请介绍一下你自己")
history.add_user_message("我是谁呢?")

print(history.messages)  # 返回List[BaseMessage]类型

在这里插入图片描述
继续👇

# 创建LLM
llm = ChatOpenAI(model_name = 'gpt-4o-mini')

llm.invoke(history.messages)

在这里插入图片描述

3. ConversationBufferMemory

  ConversationBufferMemory是一个基础的对话记忆(Memory)组件,专门用于按原始顺序存储完整的对话历史。

使用场景:对话轮次较少、依赖完整上下文的场景(如简单的聊天机器)

特点:
  • 完整存储对话历史
  • 简单、无裁剪、无压缩
  • 与 Chains/Models 无缝集成
  • 支持两种返回格式(通过 return_messages 参数控制输出格式)
    🌼return_messages=True 返回消息对象列表(List [BaseMessage])
    🌼return_messages=False(默认)返回拼接的纯文本字符串

🌙场景1:入门使用

举例1:

# 1.导入相关包
from langchain.memory import ConversationBufferMemory

# 2.实例化ConversationBufferMemory对象
memory = ConversationBufferMemory()

# 3.保存消息到内存中
memory.save_context(inputs = {'input': "你好,我是人类"}, outputs = {"output": "你好,我是AI助手"})
memory.save_context(inputs = {'input': "很开心认识你"}, outputs = {"output": "我也是"})

# 4.读取内存中消息(返回消息内容的纯文本)
print(memory.load_memory_variables({}))

在这里插入图片描述
注意:
  • 不管inputs、outputs的key用什么名字,都认为inputs的key是human,outputs的key是AI。
  • 打印的结果的json数据的key,默认是“history”。可以通过ConversationBufferMemory的
memory_key属性修改。

举例2:

# 1.导入相关包
from langchain.memory import ConversationBufferMemory

# 2.实例化ConversationBufferMemory对象
memory = ConversationBufferMemory(return_messages=True)

# 3.保存消息到内存中
memory.save_context({"input": "hi"}, {"output": "whats up?"})

# 4.读取内存中消息(返回消息)
print(memory.load_memory_variables({}))

# 5.读取内存中消息(访问原始消息列表)
print(memory.chat_memory.messages)

在这里插入图片描述

🌙场景2:结合chain

举例1:使用PromptTemplate

from langchain_openai import OpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate

# 初始化大模型
llm = OpenAI(model="gpt-4o-mini", temperature=0)

# 创建提示
# 有两个输入键:实际输入与来自记忆类的输入 需确保PromptTemplate和ConversationBufferMemory中的键匹配
template = """你可以与人类对话。
当前对话: {history}
人类问题: {question}
回复:
"""
prompt = PromptTemplate.from_template(template)

# 创建ConversationBufferMemory
memory = ConversationBufferMemory()

# 初始化链
chain = LLMChain(llm=llm, prompt=prompt, memory=memory)

# 提问
res1 = chain.invoke({"question": "我的名字叫Tom"})
print(res1)

在这里插入图片描述
继续👇:

res = chain.invoke({"question": "我的名字是什么?"})
print(res)

在这里插入图片描述
举例2:可以通过memory_key修改memory数据的变量名

from langchain_openai import OpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate

# 初始化大模型
llm = OpenAI(model="gpt-4o-mini", temperature=0)

# 创建提示
# 有两个输入键:实际输入与来自记忆类的输入 需确保PromptTemplate和ConversationBufferMemory中的键匹配
template = """你可以与人类对话。
当前对话: {chat_history}
人类问题: {question}
回复:
"""
prompt = PromptTemplate.from_template(template)

# 创建ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")

# 初始化链
chain = LLMChain(llm=llm, prompt=prompt, memory=memory)

# 提问
res1 = chain.invoke({"question": "我的名字叫Tom"})
print(str(res1) + "\n")

res = chain.invoke({"question": "我的名字是什么?"})
print(res)

在这里插入图片描述
说明:创建带Memory功能的Chain,并不能使用统一的LCEL语法。同样地,LLMChain也不能使用管道运算符接StrOutputParser。这些设计上的问题,个人推测也是目前Memory模块还是Beta版本的原因之一吧。

举例3:使用ChatPromptTemplate 和 return_messages

# 1.导入相关包
from langchain_core.messages import SystemMessage
from langchain.chains.llm import LLMChain
from langchain.memory import ConversationBufferMemory
from langchain_core.prompts import (
    MessagesPlaceholder,
    ChatPromptTemplate,
    HumanMessagePromptTemplate
)
from langchain_openai import ChatOpenAI

# 2.创建LLM
llm = ChatOpenAI(model_name='gpt-4o-mini')

# 3.创建Prompt
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个与人类对话的机器人。"),
    MessagesPlaceholder(variable_name='history'),
    ("human", "问题: {question}")
])

# 4.创建Memory
memory = ConversationBufferMemory(return_messages=True)

# 5.创建LLMChain
llm_chain = LLMChain(prompt=prompt, llm=llm, memory=memory)

# 6.调用LLMChain
res1 = llm_chain.invoke({"question": "中国首都在哪里?"})
print(res1, end="\n\n")

res2 = llm_chain.invoke({"question": "我刚刚问了什么?"})
print(res2)

在这里插入图片描述

二者对比

在这里插入图片描述
注意:
我们观察到的现象不是 bug,而是 LangChain 为保障对话一致性所做的刻意设计:

  1. 用户提问后,系统应立即"记住"该问题
  2. AI回答后,该响应应即刻加入对话上下文
  3. 返回给客户端的结果应反映最新状态

4. ConversationChain

ConversationChain实际上是就是对ConversationBufferMemory和LLMChain进行了封装,并且提供一个默认格式的提示词模版(我们也可以不用),从而简化了初始化ConversationBufferMemory的步
骤。

举例1:使用PromptTemplate

from langchain.chains.conversation.base import ConversationChain
from langchain_core.prompts.prompt import PromptTemplate
from langchain.chains import LLMChain

# 初始化大模型
llm = ChatOpenAI(model="gpt-4o-mini")

template = """以下是人类与AI之间的友好对话描述。AI表现得健谈,并提供了大量来自其上下文的具体细节。如果AI不知道问题的答案,它会真诚地表示不知道
当前对话:
{history}
Human: {input}
AI:"""
prompt = PromptTemplate.from_template(template)

# memory = ConversationBufferMemory()
# 
# conversation = LLMChain(
#     llm=llm,
#     prompt = prompt,
#     memory=memory,
#     verbose=True,
# )

chain = ConversationChain(llm = llm, prompt = prompt, verbose=True)

chain.invoke({"input":"你好,你的名字叫小智"}) #注意,chain中的key必须是input,否则会报错

在这里插入图片描述

chain.invoke({"input":"你好,你叫什么名字?"})

在这里插入图片描述

举例2:使用内置默认格式的提示词模版(内部包含input、history变量)

# 1.导入所需的库
from langchain_openai import ChatOpenAI
from langchain.chains.conversation.base import ConversationChain

# 2.初始化大语言模型
llm = ChatOpenAI(model='gpt-4o-mini')

# 3.初始化对话链
conv_chain = ConversationChain(llm=llm)

# 4.进行对话
resut1 = conv_chain.invoke(input= "小明有1只猫")
# print(resut1)
resut2 = conv_chain.invoke(input= "小刚有2只狗")

# print(resut2)
resut3 = conv_chain.invoke(input= "小明和小刚一共有几只宠物?")
print(resut3)

在这里插入图片描述

5.ConversationBufferWindowMemory

  在了解了ConversationBufferMemory记忆类后,我们知道了它能够无限的将历史对话信息填充到History中,从而给大模型提供上下文的背景。但这会导致内存量十分大,并且消耗的token是非常多的,此外,每个大模型都存在最大输入的Token限制。

我们发现,过久远的对话数据往往并不能对当前轮次的问答提供有效的信息,LangChain 给出的解决方式是:ConversationBufferWindowMemory模块。该记忆类会保存一段时间内对话交互的列表,仅使用最近 K 个交互。这样就使缓存区不会变得太大。

特点:
  • 适合长对话场景。
  • 与 Chains/Models 无缝集成
  • 支持两种返回格式(通过 return_messages 参数控制输出格式)
    🌼return_messages=True返回消息对象列表(List[BaseMessage]
    🌼return_messages=False(默认) 返回拼接的纯文本字符串

🌙场景1:入门使用

通过内置在LangChain中的缓存窗口(BufferWindow)可以将meomory"记忆"下来。

举例1:

# 1.导入相关包
from langchain.memory import ConversationBufferWindowMemory

# 2.实例化ConversationBufferWindowMemory对象,设定窗口阈值
memory = ConversationBufferWindowMemory(k=2)

# 3.保存消息
memory.save_context({"input": "你好"}, {"output": "怎么了"})
memory.save_context({"input": "你是谁"}, {"output": "我是AI助手"})
memory.save_context({"input": "你的生日是哪天?"}, {"output": "我不清楚"})

# 4.读取内存中消息(返回消息内容的纯文本)
print(memory.load_memory_variables({}))

在这里插入图片描述

举例2:
ConversationBufferWindowMemory 也支持使用聊天模型(Chat Model)的情况,同样可以通过
return_messages=True参数,将对话转化为消息列表形式。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

# 1.导入相关包
from langchain.memory import ConversationBufferWindowMemory

# 2.实例化ConversationBufferWindowMemory对象,设定窗口阈值
memory = ConversationBufferWindowMemory(k=2, return_messages=True)

# 3.保存消息
memory.save_context({"input": "你好"}, {"output": "怎么了"})
memory.save_context({"input": "你是谁"}, {"output": "我是AI助手小智"})
memory.save_context({"input": "初次对话,你能介绍一下你自己吗?"}, {"output": "当然可以了。我是一个无所不能的小智。"})

# 4.读取内存中消息(返回消息内容的纯文本)
print(memory.load_memory_variables({}))

在这里插入图片描述

🌙 场景2:结合chain

借助提示词模版去构建LangChain

from langchain.memory import ConversationBufferWindowMemory
# 1.导入相关包
from langchain_core.prompts.prompt import PromptTemplate
from langchain.chains.llm import LLMChain

# 2.定义模板
template = """以下是人类与AI之间的友好对话描述。AI表现得健谈,并提供了大量来自其上下文的具体细节。如果AI不知道问题的答案,它会表示不知道。
当前对话:
{history}
Human: {question}
AI:"""

# 3.定义提示词模板
prompt_template = PromptTemplate.from_template(template)

# 4.创建大模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 5.实例化ConversationBufferWindowMemory对象,设定窗口阈值
memory = ConversationBufferWindowMemory(k=1)

# 6.定义LLMChain
conversation_with_summary = LLMChain(
    llm=llm,
    prompt=prompt_template,
    memory=memory,
    verbose=True,
)

# 7.执行链(第一次提问)
respon1 = conversation_with_summary.invoke({"question": "你好,我是孙悟空"})
# print(respon1)

# 8.执行链(第二次提问)
respon2 = conversation_with_summary.invoke({"question": "我还有两个师傅,一个是唐三藏,一个是菩提老祖"})
# print(respon2)

# 9.执行链(第三次提问)
respon3 = conversation_with_summary.invoke({"question": "我今年高考,竟然考上了711"})
# print(respon3)

# 10.执行链(第四次提问)
respon4 = conversation_with_summary.invoke({"question": "我叫什么?"})
print(respon4)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思考:将参考 k=1 替换成 k=3,会怎样呢?
在这里插入图片描述

三、其他Memory模块

1. ConversationTokenBufferMemory

  ConversationTokenBufferMemory 是 LangChain 中一种基于Token 数量控制的对话记忆机制。如果字符数量超出指定数目,它会切掉这个对话的早期部分,以保留与最近的交流相对应的字符数量。

特点:
• Token 精准控制
• 原始对话保留

原理:
在这里插入图片描述
举例:情况1:

# 1.导入相关包
from langchain.memory import ConversationTokenBufferMemory
from langchain_openai import ChatOpenAI

# 2.创建大模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 3.定义ConversationTokenBufferMemory对象
memory = ConversationTokenBufferMemory(
    llm=llm,
    max_token_limit=10  # 设置token上限
)

# 添加对话
memory.save_context({"input": "你好吗?"}, {"output": "我很好,谢谢!"})
memory.save_context({"input": "今天天气如何?"}, {"output": "晴天,25度"})

# 查看当前记忆
print(memory.load_memory_variables({}))

在这里插入图片描述

情况2:

# 1.导入相关包
from langchain.memory import ConversationTokenBufferMemory
from langchain_openai import ChatOpenAI

# 2.创建大模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 3.定义ConversationTokenBufferMemory对象
memory = ConversationTokenBufferMemory(
    llm=llm,
    max_token_limit=50  # 设置token上限 token越大,先显示最近的消息
)

# 添加对话
memory.save_context({"input": "你好吗?"}, {"output": "我很好,谢谢!"})
memory.save_context({"input": "今天天气如何?"}, {"output": "晴天,25度"})

# 查看当前记忆
print(memory.load_memory_variables({}))

在这里插入图片描述

2. ConversationSummaryMemory

前⾯的⽅式发现,如果全部保存下来太过浪费,截断时⽆论是按照对话条数还是token都是⽆法保证既节省内存⼜保证对话质量的,所以推出ConversationSummaryMemory、
ConversationSummaryBufferMemory

ConversationSummaryMemory是 LangChain 中一种
智能压缩对话历史的记忆机制,它通过大语言模型(LLM)自动生成对话内容的精简摘要,而不是存储原始对话文本。

这种记忆方式特别适合长对话和需要保留核心信息的场景。

特点:
  • 摘要生成
  • 动态更新
  • 上下文优化

原理:
在这里插入图片描述

🌙场景1:

如果实例化ConversationSummaryMemory前,没有历史消息,可以使用构造方法实例化

# 1.导入相关包
from langchain.memory import ConversationSummaryMemory, ChatMessageHistory
from langchain_openai import ChatOpenAI

# 2.创建大模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 3.定义ConversationSummaryMemory对象
memory = ConversationSummaryMemory(llm=llm)

# 4.存储消息
memory.save_context({"input": "你好"}, {"output": "怎么了"})
memory.save_context({"input": "你是谁"}, {"output": "我是AI助手小智"})
memory.save_context({"input": "初次对话,你能介绍一下你自己吗?"}, {"output": "当然可以了。我是一个无所不能的小智。"})

# 5.读取消息(总结后的)
print(memory.load_memory_variables({}))

在这里插入图片描述

🌙场景2:

  如果实例化ConversationSummaryMemory前,已经有历史消息,可以调用from_messages()实例化

# 1.导入相关包
from langchain.memory import ConversationSummaryMemory, ChatMessageHistory
from langchain_openai import ChatOpenAI

# 2.定义ChatMessageHistory对象
llm = ChatOpenAI(model="gpt-4o-mini")

# 3.假设原始消息
history = ChatMessageHistory()
history.add_user_message("你好,你是谁?")
history.add_ai_message("我是AI助手小智")

# 4.初始化ConversationSummaryMemory实例
memory = ConversationSummaryMemory.from_messages(
    llm=llm,
    # 是生成摘要的原材料 保留完整对话供必要时回溯。当新增对话时,LLM需要结合原始历史生成新摘要
    chat_memory=history,
)

print(memory.load_memory_variables({}))  # 新摘要信息

memory.save_context(inputs={"human": "我的名字叫小明"}, outputs={"AI": "很高兴认识你"})

print(memory.load_memory_variables({}))

print(memory.chat_memory.messages)

在这里插入图片描述

3. ConversationSummaryBufferMemory

  ConversationSummaryBufferMemory 是 LangChain 中一种混合型记忆机制,它结合了ConversationBufferMemory(完整对话记录)和 ConversationSummaryMemory(摘要记忆)的优
点,在保留最近对话原始记录的同时,对较早的对话内容进行智能摘要。

特点:
  • 保留最近N条原始对话:确保最新交互的完整上下文
  • 摘要较早历史:对超出缓冲区的旧对话进行压缩,避免信息过载
  • 平衡细节与效率:既不会丢失关键细节,又能处理长对话

原理:
在这里插入图片描述

🌙场景1:入门使用

情况1:构造方法实例化,并设置max_token_limit

# 1.导入相关的包
from langchain.memory import ConversationSummaryBufferMemory
from langchain_openai import ChatOpenAI

# 2.定义模型
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)

# 3.定义ConversationSummaryBufferMemory对象
memory = ConversationSummaryBufferMemory(
    llm=llm, max_token_limit=40, return_messages=True
)

# 4.保存消息
memory.save_context({"input": "你好,我的名字叫小明"}, {"output": "很高兴认识你,小明"})
memory.save_context({"input": "李白是哪个朝代的诗人"}, {"output": "李白是唐朝诗人"})
memory.save_context({"input": "唐宋八大家里有苏轼吗?"}, {"output": "有"})

# 5.读取内容
print(memory.load_memory_variables({}))

print(memory.chat_memory.messages)

在这里插入图片描述
情况2:

# 1.导入相关的包
from langchain.memory import ConversationSummaryBufferMemory
from langchain_openai import ChatOpenAI

# 2.定义模型
llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)

# 3.定义ConversationSummaryBufferMemory对象
memory = ConversationSummaryBufferMemory(
    llm=llm, max_token_limit=100, return_messages=True
)

# 4.保存消息
memory.save_context({"input": "你好,我的名字叫小明"}, {"output": "很高兴认识你,小明"})
memory.save_context({"input": "李白是哪个朝代的诗人"}, {"output": "李白是唐朝诗人"})
memory.save_context({"input": "唐宋八大家里有苏轼吗?"}, {"output": "有"})

# 5.读取内容
print(memory.load_memory_variables({}))

print(memory.chat_memory.messages)

在这里插入图片描述

🌙场景2:客服

from langchain.memory import ConversationSummaryBufferMemory
from langchain.openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains.llm import LLMChain

# 1. 初始化大语言模型
llm = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.5,
    max_tokens=500
)

# 2. 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是电商客服助手,用中文友好回复用户问题,保持专业亲切的语气。"),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}")
])

# 3. 创建带摘要缓冲的记忆系统
memory = ConversationSummaryBufferMemory(
    llm=llm,
    max_token_limit=400,
    memory_key="chat_history",
    return_messages=True
)

# 4. 创建对话链
chain = LLMChain(
    llm=llm,
    prompt=prompt,
    memory=memory,
)

# 5. 模拟多轮对话
dialogue = [
    ("你好,我想查询订单12345的状态", None),
    ("这个订单是上周四下的", None),
    ("我现在急着用,能加急处理吗", None),
    ("等等,我可能把订单号写错了,应该是12346", None),
    ("对了,你们退换政策是怎样的", None)
]

# 6. 执行对话
for user_input, _ in dialogue:
    response = chain.invoke({"input": user_input})
    print(f"用户: {user_input}")
    print(f"客服: {response['text']}\n")

# 7. 查看当前记忆状态
print("=== 当前记忆内容 ===")
print(memory.load_memory_variables({}))

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. ConversationEntityMemory(了解)

ConversationEntityMemory 是一种基于实体的对话记忆机制,它能够智能地识别、存储和利用对话中出现的实体信息(如人名、地点、产品等)及其属性/关系,并结构化存储,使 AI 具备更强的上下文理解和记忆能力。

好处:解决信息过载问题
  • 长对话中大量冗余信息会干扰关键事实记忆
  • 通过对实体摘要,可以压缩非重要细节(如删除寒暄等,保留价格/时间等硬性事实)

**应用场景:**在医疗等高风险领域,必须用实体记忆确保关键信息(如过敏史)被100%准确识别和拦截。
在这里插入图片描述

使用ConversationSummaryMemory

在这里插入图片描述
使用ConversationEntityMemory

在这里插入图片描述

对比:ConversationSummaryMemory 和 ConversationEntityMemory

在这里插入图片描述
举例:

from langchain.chains.conversation.base import LLMChain
from langchain.memory import ConversationEntityMemory
from langchain.memory.prompt import ENTITY_MEMORY_CONVERSATION_TEMPLATE
from langchain_openai import ChatOpenAI

# 初始化大语言模型
llm = ChatOpenAI(model_name='gpt-4o-mini', temperature=0)

# 使用LangChain为实体记忆设计的预定义模板
prompt = ENTITY_MEMORY_CONVERSATION_TEMPLATE

# 初始化实体记忆
memory = ConversationEntityMemory(llm=llm)

# 提供对话链
chain = LLMChain(
    llm=llm,
    prompt=ENTITY_MEMORY_CONVERSATION_TEMPLATE,
    memory=ConversationEntityMemory(llm=llm),
    # verbose=True, # 设置为True可以看到链的详细推理过程
)

# 进行几轮对话,记忆组件会在后台自动提取和存储实体信息
chain.invoke(input="你好,我叫蜘蛛侠。我的好朋友包括钢铁侠、美国队长和绿巨人。")

chain.invoke(input="我住在纽约。")
chain.invoke(input="我使用的装备是由斯塔克工业提供的。")

# 查询记忆体中存储的实体信息
print("\n当前存储的实体信息:")
print(chain.memory.entity_store.store)

# 基于记忆进行提问
answer = chain.invoke(input="你能告诉我蜘蛛侠住在哪里以及他的好朋友有哪些吗?")
print("\nAI的回答:")
print(answer)

在这里插入图片描述

5. ConversationKGMemory(了解)

  ConversationKGMemory是一种基于知识图谱(Knowledge Graph)的对话记忆模块,它比ConversationEntityMemory 更进一步,不仅能识别和存储实体,还能捕捉实体之间的复杂关系,形成结构化的知识网络。

特点:
  • 知识图谱结构 将对话内容转化为**(头实体, 关系, 尾实体)** 的三元组形式
  • 动态关系推理

举例:

pip  install  networkx
# 1.导入相关包
from langchain.memory import ConversationKGMemory
from langchain.chat_models import ChatOpenAI

# 2.定义LLM
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# 3.定义ConversationKGMemory对象
memory = ConversationKGMemory(llm=llm)

# 4.保存会话
memory.save_context({"input": "向山姆问好"}, {"output": "山姆是谁"})
memory.save_context({"input": "山姆是我的朋友"}, {"output": "好的"})

# 5.查询会话
memory.load_memory_variables({"input": "山姆是谁"})

在这里插入图片描述

memory.get_knowledge_triplets("她最喜欢的颜色是红色")

在这里插入图片描述

6. VectorStoreRetrieverMemory(了解)

VectorStoreRetrieverMemory是一种基于向量检索的先进记忆机制,它将对话历史存储在向量数据库中,通过语义相似度检索相关信息,而非传统的线性记忆方式。每次调用时,就会查找与该记忆关联最高的k个文档。(只提取相关信息给大模型,减少冗余)

**适用场景:**这种记忆特别适合需要长期记忆和语义理解的复杂对话系统。

原理:
在这里插入图片描述
举例:

import os
import dotenv
from langchain_openai import OpenAIEmbeddings

dotenv.load_dotenv()

os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")

embeddings_model = OpenAIEmbeddings(
    model="text-embedding-ada-002"
)
# 1.导入相关包
from langchain_openai import OpenAIEmbeddings
from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import FAISS
from langchain.memory import ConversationBufferMemory

# 2.定义ConversationBufferMemory对象
memory = ConversationBufferMemory()
memory.save_context({"input": "我最喜欢的食物是披萨"}, {"output": "很高兴知道"})
memory.save_context({"Human": "我喜欢的运动是跑步"}, {"AI": "好的,我知道了"})
memory.save_context({"Human": "我最喜欢的运动是足球"}, {"AI": "好的,我知道了"})

# 3.定义向量嵌入模型
embeddings_model = OpenAIEmbeddings(
    model="text-embedding-ada-002"
)

# 4.初始化向量数据库
vectorstore = FAISS.from_texts(memory.buffer.split("\n"), embeddings_model)  # 空初始化

# 5.定义检索对象
retriever = vectorstore.as_retriever(search_kwargs=dict(k=1))

# 6.初始化VectorStoreRetrieverMemory
memory = VectorStoreRetrieverMemory(retriever=retriever)

print(memory.load_memory_variables({"prompt": "我最喜欢的食物是"}))

在这里插入图片描述

总结

记得关注么么哒

LangChain的Memory的4种用法(一) LangChain是一个基于语言模型开发应用程序的开源框架,用于构建基于大语言模型(LLMs)的端到端语言模型应用。它的核心理念是为各种大语言模型应用提供通用的接口,简化开发过程,并提供一套工具、组件和接口来创建由LLMs和聊天模型支持的应用程序。LangChain提供了多种组件来简化我们开发大语言模型应用的难度,本文来介绍其中Memory的使用方式。 阅读详情

相关推荐

【AutoGPT】LangChain 快速入门指南 ( English )

【AutoGPT】LangChain 快速入门指南 ( English )

AI天才研究院 1万+

【LangChain系列5】【Memory模块详解】

LangChain给自身的定位是:用于开发由大语言模型支持的应用程序的框架。它的做法是:通过提供标准化且丰富的模块抽象,构建大语言模型的输入输出规范,利用其核心概念chains,灵活地连接整个应用开发流程。这里是LangChain系列的第五篇,主要介绍LangChain的Memory模块。

艰难困苦,玉汝于成。 2858

Lumerical FDTD新手教程:5步搞定MMI波导光谱模拟(附避坑指南)

本文提供Lumerical FDTD新手教程,详细讲解5步完成MMI波导光谱模拟的实用方法,包括环境准备、结构建模、光源配置、仿真优化和结果分析。特别针对多模干涉耦合器(MMI)的模拟难点,提供避坑指南和优化策略,帮助光学工程师快速掌握FDTD仿真技术。

kite3的博客 352

LangChain - Memory

一、内存记忆 ( Memory ) 入门 聊天消息历史 (ChatMessageHistory) ConversationBufferMemory Using in a chain 保存消息历史 二、如何为 LLMChain 添加记忆 三、对多输入 Chain 添加记忆 四、向代理添加记忆 五、向代理添加由数据库支持的消息记忆 六、会话缓存内存 ConversationBufferMemory 在链中使用 七、会话缓冲窗口记忆 ( Conversation buffer window memory ) 在链

AI工程化、开源分享、文档翻译、代码笔记 2264

OPNET卫星节点仿真避坑指南:为什么你的STK轨道文件导入后位置不对?

本文深入解析OPNET卫星节点仿真中STK轨道文件导入后位置异常的常见问题,揭示坐标系差异(ECI与ECF)、时间基准不匹配等关键因素。通过修改.SA文件头标识、统一时间基准等解决方案,帮助工程师避免仿真失真,提升卫星通信系统仿真的准确性。特别适用于STK与OPNET协同工作的卫星网络仿真场景。

weixin_30335575的博客 598

离线AI实战指南:本地部署大模型处理PDF/Word/Excel

离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发

weixin_31968639的博客 448

LangChain实战快速入门笔记(一)--LangChain使用概述

LangChain 是2022 年 10 月,由哈佛大学的(哈里森・蔡斯)发起研发的一个开源框架,用于开发由大语言模型(LLMs)驱动的应用程序。比如,搭建 “智能体”(Agent)、问答系统(QA)、对话机器人、文档搜索系统、企业私有知识库等。简而言之:LangChain 之于 LLMs,类似 Spring 之于 JavaLangChain 之于 LLMs,类似 Django、Flask 之于 Python顾名思义,

weixin_43665177的博客 1245

国标Gb28181里Contact和Route的使用

国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。 现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达

wwyyxx26的专栏 5506

LangChain 入门系列④:核心组件之 Memory 快速入门指南

大多数的大模型应用程序都会有一个会话接口,允许我们进行多轮的对话,并有一定的上下文记忆能力。

瓦罗兰特顶级C位的博客 1191

非结构化数据在大数据湖中的应用实践

想象一下,你正在整理一个杂乱的书房。有些书整整齐齐地放在书架上,每本书都有明确的标题、作者和出版日期——这些就是结构化数据,它们像数据库中的表格,有固定的格式和字段。但书房里还有更多东西:散落的照片、手写的笔记、录音带、视频光盘、甚至还有画作。这些物品没有固定的格式,每件都独一无二——这就是非结构化数据。在技术术语中,非结构化数据是指没有预定义数据模型或组织形式的信息。文本文档(Word、PDF、TXT)电子邮件和社交媒体内容图像和照片(JPG、PNG)音频文件(MP3、WAV)

软件工程实践的博客 358

RV1126 ISP调参实战:3A算法参数调节的7个技巧

││ │ DEMOSAIC (去马赛克) │ ││ │ GAMMA (Gamma 校正) │ ││ │ DPC (坏点校正) │ ││。

小灰灰的博客 646

LangChain 框架指南:从入门到实战

本文介绍了LangChain框架的核心概念与使用指南。LangChain是一个用于构建大语言模型应用程序的开源框架,采用组件化和链式调用的设计理念,包含Models、Prompts、Chains、Agents等核心组件。文章详细讲解了安装配置方法,并通过代码示例展示了如何创建基础提示模板、聊天提示模板以及少样本提示。此外,还介绍了LLMChain、SequentialChain等链式调用方法,帮助开发者快速构建语言模型应用工作流。全文提供了从入门到实战的完整指导,适合不同层次的开发者学习使用LangChai

深山技术宅的博客 1736

AI测试:手把手教你用AI做桌面自动化「喂饭教程」

本文介绍了基于MCP协议的DesktopCommanderMCP自动化工具,通过自然语言指令实现桌面操作。系统采用客户端-服务器架构,支持应用程序管理、文件操作、屏幕控制等功能。详细说明了环境搭建步骤,包括Python和Node.js依赖安装、API密钥配置及MCP服务部署。通过实战案例展示了文件整理、批量截图等典型应用场景,并分享了任务描述优化、权限控制等最佳实践。该方案能显著提升重复性桌面操作的效率,让AI成为智能办公助手。

blues_C的博客 845

Langchain 快速入门

【摘要】LangChain是哈佛大学Harrison Chase于2022年推出的开源框架,旨在简化基于大语言模型的AI应用开发。本文系统介绍了其核心架构和实战应用: 框架解析 六大核心组件:模型I/O、数据连接、记忆系统、架构封装(Chain/Agent)、回调机制 特色功能:模型集成、工具连接、记忆存储、模块化设计 配套工具:LangServe(API部署)、LangSmith(调试监控) 关键技术 文档处理:支持PDF等格式加载,提供文本分割/嵌入/检索全流程工具 智能代理:支持7种Agent类型,实

AI全栈 和 IT 编程相关分享 2244

基于嵌入式Linux设计的智能车库(GEC6818)

随着城市化进程的加快,传统停车管理方式存在效率低下、人工成本高、车主体验差等问题。为解决这些问题,本项目基于嵌入式Linux技术,设计并实现了一套智能车库管理系统。该系统采用GEC6818开发板作为核心控制器,运行Qt应用程序,并结合USB免驱摄像头进行车牌识别,RFID模块完成刷卡支付,SQLite数据库存储车主信息和停车记录。系统提供车主注册、用户管理、出入库管理、停车费结算、车辆查询等功能,并具备语音播报提示,提高用户体验。通过本系统,停车场管理更加高效、智能,有助于提升停车服务质量,减少人工干预,适

436

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

大模型从入门到应用——LangChain:快速入门-[链(Chains)、代理(Agent:)和记忆(Memory)]

在本系列文章中我们会用最简练的语言与范例带领大家快速调试并上手LangChain,读者读完本系列的文章后,就会对LangChain有一个大致的了解并可以将LangChain运用到自己开发的程序中。但如果读者想对LangChain的各个模块进行更深入的了解,可以继续学习《》系列文章。本文主要是阐述了LangChain的。

冯·诺依曼 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Langchain实战快速入门

LangChain是由哈佛大学Harrison Chase于2022年10月开发的开源框架,用于构建基于大语言模型(LLMs)的应用程序。它类似于Spring之于Java,提供标准化组件来简化AI应用开发。LangChain支持智能体、问答系统、文档检索等功能,并能连接外部数据源。相比直接使用模型API,LangChain降低了开发复杂度,提供了统一的调用方式和现成的链式组装功能。

写代码的渣渣苏 1097

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LangChain 入门:从核心概念到实战上手

简单场景(聊天):用ChatOpenAI;文档问答场景:用「Loader+Splitter+VectorDB+RetrievalQA」;复杂场景(工具调用):用AgentTools。先跑通上面的 3 个案例,再根据具体需求(比如做公司知识库问答、AI 数据分析)拓展组件,很快就能上手实际开发。

xintaitehao的博客 1573

使用 LangChain 快速构建 RAG 应用,langchain从入门到精通,收藏这篇就足够了

今天主要给大家介绍一下如何使用 LangChain 快速构建 RAG 应用。

Langchain的博客 703

LangChain(0.0.340)官方文档一:快速入门

LangChain是一个用于开发由语言模型驱动的应用程序的框架。上下文感知(context-aware):连接语言模型与上下文来源(提示说明、少量示例、用于构建响应的内容等)。推理(Reason):依赖语言模型进行推理(根据提供的上下文考虑如何回答,采取什么行动等)。LangChain库:Python和JavaScript库。包含用于各种组件的接口和集成,用于将这些组件组合成链和代理的基本运行时,以及链和代理的现成实现。:提示模板,一系列易于部署的参考体系结构,适用于各种任务。LangServe。

qq_56591814的博客 8425

第九章 LangChain快速入门

大语言模型(LLM)本身是"无状态"的——你给它一个问题,它给你一个回答。我们需要让 LLM记住上下文(Memory)我们需要让 LLM查询外部数据(RAG)我们需要让 LLM调用工具和API(Agent)我们需要把多个 LLM 调用串联成工作流(Chain)LangChain 就是为了解决这些问题而生的。它提供了一套统一的抽象,让开发者可以像搭积木一样构建复杂的 LLM 应用。"""自定义 Chain:将代码从一种语言翻译到另一种语言。

qq_53460854的博客 1678

LangChain实战入门(四):融合篇——打造有记忆、能协作的AI应用

现在,我们的AI已经具备了很强的单次任务处理能力。但在真实的人机交互中,我们期望的不仅仅是"一问一答",而是连续的、有上下文的对话,是能够记住历史、理解语境的智能体验。

优秀、有趣的AI知识共享! 1927

LangChain实战:快速接入阿里通义千问

本文详细介绍了如何将阿里灵积平台的通义千问大模型接入LangChain框架。首先通过dotenv管理API密钥,使用OpenAI SDK裸调API验证链路。然后引入LangChain抽象层,通过ChatTongyi适配器简化调用流程。重点讲解了如何利用ConversationBufferMemory实现多轮对话记忆功能,使模型能自动维护上下文。

小L的博客 4284

LangChain 常用Memory模块的分类和使用

本文介绍了LangChain中的6种常见记忆模块,重点讲解了ChatMessageHistory、ConversationBufferMemory、ConversationBufferWindowMemory和ConversationTokenBufferMemory四种模块。这些模块可帮助大模型实现对话记忆功能,各有特点:ChatMessageHistory是基础存储工具;ConversationBufferMemory保存完整对话历史;ConversationBufferWindowMemory仅保留最

qq_49438920的博客 1245
上一篇: LangChain实战快速入门笔记(三)--LangChain使用之Chains
下一篇: LangChain实战快速入门笔记(五)--LangChain使用之Tools
Jack___Xue
博客等级 码龄8年 191粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值