【LangChain系列】第六篇:内存管理简介及实践

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 【5月更文挑战第20天】【LangChain系列】第六篇:内存管理简介及实践

[toc]


聊天机器人和虚拟助手正变得越来越普遍,在对话中保持上下文和连续性的能力很重要。想象一下,你正在与聊天机器人进行有趣的对话,结果对方却在对话中完全忘记了上下文,不过不要害怕,LangChain的内存管理功能为您提供了支持。内存管理允许对话式 AI 应用程序保留和回忆过去的交互,从而实现无缝和连贯的对话。LangChain提供不同类型的内存类型,每种类型都是为满足特定需求和优化性能而量身定制的。
image.png

一、内存类型

LangChain提供了多种内存类型,每种内存类型都旨在处理不同的用例和场景。让我们来探讨一些最常用的类型:
image.png

1. ConversationBufferMemory

ConversationBufferMemory 按原样存储整个对话历史记录,无需任何更改,使其成为聊天机器人和其他需要准确上下文的应用程序的有用工具。想象一下,您正在为客户支持聊天机器人构建一个虚拟助手。借助 ConversationBufferMemory,您的聊天机器人可以回忆起以前的交互,从而根据用户的特定查询或问题提供个性化且相关的响应。

下面是一个简单的示例来说明其用法:

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

# Set up the LLM and memory
llm_model = "gpt-3.5-turbo"
llm = ChatOpenAI(temperature=0.0, model=llm_model)
memory = ConversationBufferMemory()

# Create the conversation chain
conversation = ConversationChain(llm=llm, memory=memory, verbose=True)

# Start the conversation
response = conversation.predict(input="Hi, my name is Rutam")
print(response)  
# Output: Hello Rutam! It's nice to meet you. How can I assist you today?

response = conversation.predict(input="What is 1 + 1")
print(response)  
# Output: 1 + 1 equals 2. Is there anything else you would like to know?

response = conversation.predict(input="Whats my name?")
print(response)  
# Output: Your name is Rutam. Is there anything else you would like to know or discuss?

如您所见,ConversationBufferMemory 允许聊天机器人记住用户的名称并在后续响应中引用它,从而创建更自然和个性化的对话流程。

2. ConversationBufferWindowMemory

虽然 ConversationBufferMemory 存储整个会话历史记录,但在某些情况下,您可能希望将内存限制为最近交换的固定窗口。当您不希望内存无限增长时,此内存类型特别有用。假设您正在为一个简单的天气应用程序构建一个聊天机器人。您可能只需要记住用户在当前对话中的位置,然后将其丢弃。

下面介绍如何使用 ConversationBufferWindowMemory 实现此目的:

from langchain.memory import ConversationBufferWindowMemory

# Set the window size to 1 (remember only the most recent exchange)
memory = ConversationBufferWindowMemory(k=1)

# ... (continue with setting up the LLM and conversation chain as before)

# Start the conversation
response = conversation.predict(input="What's the weather like in New York today?")
print(response)  
# Output: I'm sorry, I don't have enough context to provide the weather for New York. Could you please provide your location?

response = conversation.predict(input="New York City")
print(response)  
# Output: Here's the current weather forecast for New York City: ...

在此示例中,k=1 的 ConversationBufferWindowMemory 会忘记用户之前的输入(“今天纽约的天气怎么样?”),迫使聊天机器人再次询问位置。一旦用户提供了位置,聊天机器人就可以做出相应的响应。

3. ConversationTokenBufferMemory

使用语言模型时,关键考虑因素之一是令牌使用和成本优化。LLM(大型语言模型)通常根据处理的令牌数量收费,因此有效管理内存至关重要。ConversationTokenBufferMemory:一种内存类型,用于根据令牌数限制存储的对话。此功能与许多 LLM 的定价模型完全一致,允许您在保持对话上下文的同时控制成本。假设您正在为产品推荐系统构建一个聊天机器人。您希望将对话集中在当前正在讨论的产品上,而不会从以前的交互中积累不必要的令牌使用。

下面介绍如何使用 ConversationTokenBufferMemory:

from langchain.memory import ConversationTokenBufferMemory

# Set the maximum token limit
memory = ConversationTokenBufferMemory(llm=llm, max_token_limit=100)

# ... (continue with setting up the LLM and conversation chain as before)

# Start the conversation
response = conversation.predict(input="I'm looking for a new laptop")
print(response)  
# Output: Okay, great! What are your main priorities for the new laptop? (e.g., portability, performance, battery life)

response = conversation.predict(input="Portability and long battery life are important to me")
print(response)  
# Output: Got it. Based on your priorities, I'd recommend checking out the [laptop model] ...

在此示例中,ConversationSummaryBufferMemory 汇总了对话详细信息,允许虚拟助手在保持指定令牌限制的同时维护整体上下文,从而确保高效且经济实惠的内存管理。

二、其他类型

image.png

虽然我们已经探索了LangChain中一些最常用的内存类型,该库提供了其他几个选项来满足不同的用例。

矢量数据内存:如果您熟悉单词嵌入和文本嵌入,则此存储器类型存储对话的矢量表示,从而可以使用矢量相似度计算高效检索相关上下文。

实体内存:当您需要在对话上下文中记住有关实体(如人、地点或对象)的特定详细信息时,此内存类型特别有用。例如,如果您的聊天机器人正在讨论特定的朋友或同事,实体记忆可以存储和回忆有关该人的重要事实,从而确保更加个性化和上下文对话。

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

conversation = ConversationChain(
    llm=llm,
    verbose=True,
    prompt=ENTITY_MEMORY_CONVERSATION_TEMPLATE,
    memory=ConversationEntityMemory(llm=llm)
)
conversation.predict(input="Deven & Sam are working on a hackathon project")
# Output: That sounds like a great project! What kind of project are they working on?

conversation.memory.entity_store.store
# Output:     {'Deven': 'Deven is working on a hackathon project with Sam, which they are entering into a hackathon.',
#              'Sam': 'Sam is working on a hackathon project with Deven.'}

conversation.predict(input="They are trying to add more complex memory structures to Langchain")
# Output: That sounds like an interesting project! What kind of memory structures are they trying to add?

conversation.predict(input="They are adding in a key-value store for entities mentioned so far in the conversation.")
# Output: That sounds like a great idea! How will the key-value store help with the project?

conversation.predict(input="What do you know about Deven & Sam?")
# Output: Deven and Sam are working on a hackathon project together, trying to add more complex memory structures to Langchain, including a key-value store for entities mentioned so far in the conversation. They seem to be working hard on this project and have a great idea for how the key-value store can help.

三、组合多种内存类型

LangChain的一个强大方面是能够组合多种内存类型,以创建更全面和量身定制的解决方案。例如,可以使用 ConversationBufferMemory 或 ConversationSummaryBufferMemory 来维护整体对话上下文,同时还可以利用实体内存来存储和调用有关对话中提到的个人或对象的特定详细信息。这种方法使您能够在捕获对话流程和保留特定于实体的重要信息之间取得完美平衡,使您的聊天机器人或虚拟助手能够提供更明智和个性化的响应。

四、集成数据库

虽然LangChain的内置内存类型提供了强大的功能来管理会话上下文,但在某些情况下,您可能需要存储整个会话历史记录,以便进行审计、分析或将来的参考。在这种情况下,您可以将LangChain与传统数据库(例如键值存储或SQL数据库)无缝集成。这种方法允许您利用LangChain内存管理的优势,同时保持所有对话的持久性和可访问性记录。

例如,您可以将每个对话交换存储在数据库表中,其中包含用于用户输入、聊天机器人响应和其他元数据。这种全面的记录对下面场景非常有用:

  • 对话审核:回顾过去的对话,以确定需要改进的领域或确保符合法规要求。
  • 对话数据分析:分析对话模式、情绪和用户行为,以获得洞察力并改善整体聊天机器人体验。
  • 个性化和上下文丰富:通过引用过去的对话,您可以为回访用户提供更加个性化和上下文化的体验,从而提高参与度和客户满意度。

小节

今天我们学习的是LangChain的内存管理模块,通过将LangChain的内存管理功能与强大的数据库解决方案相结合,您可以创建一个强大的对话式AI系统,该系统不仅可以在实时交互期间维护上下文,还可以保留全面的记录,以供将来的分析和优化。

无论您是处理通用文本、Markdown 文档、代码片段还是其他类型的内容,LangChain 的文本拆分器都提供了灵活性和自定义选项,可以有效地拆分您的文档。通过了解文档拆分中涉及的细微差别和注意事项,可以优化语言模型和下游任务的性能和准确性。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
20天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
31 6
|
4月前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
13天前
|
安全 Java 程序员
Java内存模型的深入理解与实践
本文旨在深入探讨Java内存模型(JMM)的核心概念,包括原子性、可见性和有序性,并通过实例代码分析这些特性在实际编程中的应用。我们将从理论到实践,逐步揭示JMM在多线程编程中的重要性和复杂性,帮助读者构建更加健壮的并发程序。
|
1月前
|
JSON 数据可视化 NoSQL
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
本文介绍了LangChain的LLM Graph Transformer框架,探讨了文本到图谱转换的双模式实现机制。基于工具的模式利用结构化输出和函数调用,简化了提示工程并支持属性提取;基于提示的模式则为不支持工具调用的模型提供了备选方案。通过精确定义图谱模式(包括节点类型、关系类型及其约束),显著提升了提取结果的一致性和可靠性。LLM Graph Transformer为非结构化数据的结构化表示提供了可靠的技术方案,支持RAG应用和复杂查询处理。
104 2
基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
|
4月前
|
安全 Java 开发者
Java 内存模型解析与实践
在Java的世界中,理解内存模型对于编写高效、线程安全的代码至关重要。本文将深入探讨Java内存模型的核心概念,并通过实例分析其对并发编程的影响,旨在为读者提供一套实用的策略和思考方式来优化多线程应用的性能与安全性。
69 0
|
1月前
|
存储 监控 Java
深入理解计算机内存管理:优化策略与实践
深入理解计算机内存管理:优化策略与实践
|
2月前
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
44 6
|
2月前
|
SQL 安全 算法
ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)
ChatGPT高效提问—prompt实践(漏洞风险分析-重构建议-识别内存泄漏)
44 0
|
2月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
4月前
|
数据采集 Rust 安全
Rust在网络爬虫中的应用与实践:探索内存安全与并发处理的奥秘
【8月更文挑战第31天】网络爬虫是自动化程序,用于从互联网抓取数据。随着互联网的发展,构建高效、安全的爬虫成为热点。Rust语言凭借内存安全和高性能特点,在此领域展现出巨大潜力。本文探讨Rust如何通过所有权、借用及生命周期机制保障内存安全;利用`async/await`模型和`tokio`运行时处理并发请求;借助WebAssembly技术处理动态内容;并使用`reqwest`和`js-sys`库解析CSS和JavaScript,确保代码的安全性和可维护性。未来,Rust将在网络爬虫领域扮演更重要角色。
85 1

热门文章

最新文章