”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > LangChain部分利用LangChain中的内存和存储:综合指南

LangChain部分利用LangChain中的内存和存储:综合指南

发布于2024-08-25
浏览:121

LangChain Part  Leveraging Memory and Storage in LangChain: A Comprehensive Guide

LangChain 第 4 部分 - 在 LangChain 中利用内存和存储:综合指南

代码可以在这里找到:GitHub - jamesbmour/blog_tutorials:

在对话式人工智能和语言模型不断发展的世界中,维护上下文和有效管理信息流是构建智能应用程序的关键组成部分。 LangChain 是一个强大的框架,专为处理大型语言模型 (LLM) 而设计,为内存管理和数据持久性提供了强大的工具,从而能够创建上下文感知系统。

在本指南中,我们将深入探讨利用 LangChain 中的内存和存储来构建更智能、响应速度更快的应用程序的细微差别。

1. 在 LangChain 中使用内存

LangChain中的内存管理允许应用程序保留上下文,使交互更加连贯和上下文相关。让我们探索不同的内存类型及其用例。

1.1.记忆的类型

LangChain提供了多种内存类型来应对不同的场景。在这里,我们将重点关注两种关键类型:

ConversationBufferMemory

这种记忆类型非常适合短期上下文保留、捕捉和回忆对话中最近的互动。

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory()
memory.save_context({"input": "Hi, I'm Alice"}, {"output": "Hello Alice, how can I help you today?"})
memory.save_context({"input": "What's the weather like?"}, {"output": "I'm sorry, I don't have real-time weather information. Is there anything else I can help you with?"})

print(memory.load_memory_variables({}))

对话摘要内存

对于较长的对话,ConversationSummaryMemory 是一个不错的选择。它总结了要点,保持了上下文,但没有过多的细节。

from langchain.memory import ConversationSummaryMemory
from langchain.llms import Ollama 

llm = Ollama(model='phi3',temperature=0)
memory = ConversationSummaryMemory(llm=llm)
memory.save_context({"input": "Hi, I'm Alice"}, {"output": "Hello Alice, how can I help you today?"})
memory.save_context({"input": "I'm looking for a good Italian restaurant"}, {"output": "Great! I'd be happy to help you find a good Italian restaurant. Do you have any specific preferences or requirements, such as location, price range, or specific dishes you're interested in?"})

print(memory.load_memory_variables({}))

1.2.为您的使用案例选择正确的内存类型

选择合适的内存类型取决于几个因素:

  • 持续时间和复杂性:短会话受益于 ConversationBufferMemory 的详细上下文保留,而长期交互可能需要通过 ConversationSummaryMemory 进行总结。
  • 细节与概述:确定详细的交互历史记录还是高级摘要对您的应用程序更有价值。
  • 性能:考虑内存大小和检索速度之间的权衡。

用例:

  • ConversationBufferMemory:快速客户支持或常见问题解答式交互的理想选择。
  • ConversationSummaryMemory:最适合长期参与,例如项目管理或持续的客户互动。

1.3.将内存集成到链和代理中

内存可以无缝集成到LangChain链和代理中,以增强会话能力。

from langchain.chains import ConversationChain  
from langchain.memory import ConversationBufferMemory
# llm = OpenAI(temperature=0)
memory = ConversationBufferMemory()
conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

conversation.predict(input="Hi, I'm Alice")
conversation.predict(input="What's my name?")

此示例说明了如何使用 ConversationBufferMemory 记住以前的交互,从而实现更自然的对话。

2. 保存和检索数据

持久存储可确保跨会话维护对话历史记录和上下文,从而实现交互的连续性。

2.1.存储对话历史记录和状态

对于基本持久性,您可以将基于文件的存储与 JSON 结合使用:

import json

class PersistentMemory:
    def __init__(self, file_path):
        self.file_path = file_path
        self.load_memory()

    def load_memory(self):
        try:
            with open(self.file_path, 'r') as f:
                self.chat_memory = json.load(f)
        except FileNotFoundError:
            self.chat_memory = {'messages': []}

    def save_memory(self):
        with open(self.file_path, 'w') as f:
            json.dump({'messages': self.chat_memory['messages']}, f)

# Usage
memory = PersistentMemory(file_path='conversation_history.json')
print(memory.chat_memory)

此方法允许您以简单、人类可读的格式保存对话历史记录。

2.2.与数据库和存储系统集成

为了实现更可扩展和更高效的存储,建议与 SQLite 等数据库集成:

import sqlite3

class SQLiteMemory:
    def __init__(self, db_path):
        self.db_path = db_path
        self.conn = sqlite3.connect(db_path)
        self.create_table()

    def create_table(self):
        cursor = self.conn.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS conversations
            (id INTEGER PRIMARY KEY, input TEXT, output TEXT)
        ''')
        self.conn.commit()

    def save_context(self, inputs, outputs):
        cursor = self.conn.cursor()
        cursor.execute('INSERT INTO conversations (input, output) VALUES (?, ?)',
                       (inputs['input'], outputs['output']))
        self.conn.commit()

    def load_memory_variables(self, inputs):
        cursor = self.conn.cursor()
        cursor.execute('SELECT input, output FROM conversations ORDER BY id DESC LIMIT 10')
        rows = cursor.fetchall()
        history = "\\n".join([f"Human: {row[0]}\\nAI: {row[1]}" for row in reversed(rows)])
        return {"history": history }

# Usage
memory = SQLiteMemory('conversation_history.db')

print(memory.load_memory_variables({}))

3 优化内存使用和性能

为了确保您的应用程序保持响应,请考虑以下优化策略:

  • 高效数据结构:使用双端队列等结构来管理固定大小的缓冲区。
  • 缓存策略:通过对经常访问的数据实施缓存来减少数据库查询。
  • 数据修剪:定期修剪或汇总旧数据以保持可管理的内存大小。

这是具有基本缓存的内存类的示例:

import time

class CachedSQLiteMemory(SQLiteMemory):
    def __init__(self, db_path, cache_ttl=60):
        super().__init__(db_path)
        self.cache = None
        self.cache_time = 0
        self.cache_ttl = cache_ttl

    def load_memory_variables(self, inputs):
        current_time = time.time()
        if self.cache is None or (current_time - self.cache_time) > self.cache_ttl:
            var = self.cache
            self.cache = super().load_memory_variables(inputs)
            self.cache_time = current_time
            return self.cache

memory = CachedSQLiteMemory('conversation_history.db', cache_ttl=30)

此实现会缓存指定时间的数据库查询结果,减少数据库的负载并提高频繁访问内存数据的应用程序的性能。

结论

有效的内存管理是构建智能、上下文感知的对话式人工智能应用程序的基石。 LangChain提供了灵活而强大的内存管理框架,允许开发人员根据特定用例定制内存类型,实现持久存储解决方案,并优化大规模应用程序的性能。

通过选择正确的内存类型、集成持久存储并利用自定义内存类别和缓存策略等先进技术,您可以构建复杂的 AI 系统,即使在规模和复杂性方面也能维护上下文、改善用户体验并高效运行互动增加。

有了这些可用的工具和技术,您就可以充分利用 LangChain 的全部潜力来创建响应式、智能和情境感知的人工智能应用程序。无论您是开发客户支持机器人、虚拟助理还是复杂的对话系统,掌握 LangChain 中的内存和存储都将是您成功的关键因素。

如果您想支持我的写作或给我买啤酒:
https://buymeacoffee.com/bmours

版本声明 本文转载于:https://dev.to/jamesbmour/langchain-part-4-leveraging-memory-and-storage-in-langchain-a-comprehensive-guide-h4m?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Web UX:向用户显示有意义的错误
    Web UX:向用户显示有意义的错误
    拥有一个用户驱动且用户友好的网站有时可能会很棘手,因为它会让整个开发团队将更多时间花在不会为功能和核心业务增加价值的事情上。然而,它可以在短期内帮助用户并在长期内增加价值。对截止日期严格要求的项目经理可能会低估长期的附加值。我不确定苹果网站团队是否属实,但他们缺少一些出色的用户体验。 最近,我尝试从...
    编程 发布于2024-11-06
  • 小型机械手
    小型机械手
    小型机械臂新重大发布 代码已被完全重构并编码为属性操作的新支持 这是一个操作示例: $classFile = \Small\ClassManipulator\ClassManipulator::fromProject(__DIR__ . '/../..') ->getC...
    编程 发布于2024-11-06
  • 机器学习项目中有效的模型版本管理
    机器学习项目中有效的模型版本管理
    在机器学习 (ML) 项目中,最关键的组件之一是版本管理。与传统软件开发不同,管理机器学习项目不仅涉及源代码,还涉及随着时间的推移而演变的数据和模型。这就需要一个强大的系统来确保所有这些组件的同步和可追溯性,以管理实验、选择最佳模型并最终将其部署到生产中。在这篇博文中,我们将探索有效管理 ML 模型...
    编程 发布于2024-11-06
  • 如何在 PHP 中保留键的同时按列值对关联数组进行分组?
    如何在 PHP 中保留键的同时按列值对关联数组进行分组?
    在保留键的同时按列值对关联数组进行分组考虑一个关联数组的数组,每个数组代表一个具有“id”等属性的实体和“名字”。面临的挑战是根据特定列“id”对这些数组进行分组,同时保留原始键。为了实现这一点,我们可以使用 PHP 的 foreach 循环来迭代数组。对于每个内部数组,我们提取“id”值并将其用作...
    编程 发布于2024-11-06
  • 如何在 Gradle 中排除特定的传递依赖?
    如何在 Gradle 中排除特定的传递依赖?
    用 Gradle 排除传递依赖在 Gradle 中,使用应用程序插件生成 jar 文件时,可能会遇到传递依赖,您可能想要排除。为此,可以使用排除方法。排除的默认行为最初,尝试排除 org.slf4j:slf4j- 的所有实例log4j12 使用以下代码:configurations { runt...
    编程 发布于2024-11-06
  • 极简生活的艺术
    极简生活的艺术
    什么是极简生活? 极简生活是一种有意减少拥有的财产数量和生活中杂乱的生活方式。这不仅是为了整理您的空间,也是为了简化您的生活,专注于真正重要的事情,并减少干扰。 为什么采用极简主义? 头脑清晰:拥有的东西越少,需要担心的事情就越少,头脑就越清晰。 财务自由:通过减少...
    编程 发布于2024-11-06
  • Java 混淆之谜
    Java 混淆之谜
    Come play with our Java Obfuscator & try to deobfuscate this output. The price is the free activation code! Obfuscated Java code Your goal...
    编程 发布于2024-11-06
  • 如何在没有图像的 Outlook 电子邮件中创建圆角?
    如何在没有图像的 Outlook 电子邮件中创建圆角?
    在没有图像的 Outlook 中设置圆角样式使用 CSS 在电子邮件客户端中创建圆角可以非常简单。但是,使用 CSS border-radius 属性的传统方法在 Microsoft Outlook 中不起作用。在设计具有圆角元素的电子邮件时,此限制提出了挑战。不用担心,有一种解决方案可以让您在 O...
    编程 发布于2024-11-06
  • 如何在Python中高效比较字典中相等的键值对?
    如何在Python中高效比较字典中相等的键值对?
    比较字典是否相等的键值对在Python中,比较字典以检查键值对是否相等是一项常见任务。一种方法是迭代字典并使用 zip 和 iteritems 方法比较每一对字典。然而,还有一些替代方法可以提供更好的代码优雅性。其中一种方法是使用字典理解来创建仅包含共享键值对的新字典。代码如下:shared_ite...
    编程 发布于2024-11-06
  • 如何在 PHP 中使用数组函数向左旋转数组元素?
    如何在 PHP 中使用数组函数向左旋转数组元素?
    在 PHP 中向左旋转数组元素在 PHP 中旋转数组,将第一个元素移动到最后一个元素并重新索引数组,可以使用 PHP 的 array_push() 和 array_shift() 函数组合来实现。PHP 函数:PHP 没有专门用于旋转的内置函数数组。但是,以下代码片段演示了如何模拟所需的旋转行为:$...
    编程 发布于2024-11-06
  • 如何解决Java访问文件时出现“系统找不到指定的路径”错误?
    如何解决Java访问文件时出现“系统找不到指定的路径”错误?
    解决 Java 中遇到“系统找不到指定的路径”时的文件路径问题在 Java 项目中,尝试访问文本时遇到错误来自指定相对路径的文件。此错误是由于 java.io.File 类无法定位指定路径而产生的。要解决此问题,建议从类路径中检索文件,而不是依赖文件系统。通过这样做,您可以消除相对路径的需要,并确保...
    编程 发布于2024-11-06
  • Laravel 中的 defer() 函数如何工作?
    Laravel 中的 defer() 函数如何工作?
    Taylor Otwell 最近宣布了 Laravel 中的新函数 defer()。这只是对 defer() 函数如何工作以及使用它可能遇到的问题进行非常基本的概述。 找出问题 还记得您曾经需要从 API 获取某些内容,然后在幕后执行一些用户不关心但仍在等待的操作的路由吗?是的,我们都至少经历过一次...
    编程 发布于2024-11-06
  • 在 Python Notebook 中探索使用 PySpark、Pandas、DuckDB、Polars 和 DataFusion 的数据操作
    在 Python Notebook 中探索使用 PySpark、Pandas、DuckDB、Polars 和 DataFusion 的数据操作
    Apache Iceberg Crash Course: What is a Data Lakehouse and a Table Format? Free Copy of Apache Iceberg the Definitive Guide Free Apache Iceberg Crash ...
    编程 发布于2024-11-06
  • Vue + Tailwind 和动态类
    Vue + Tailwind 和动态类
    我最近在做的一个项目使用了Vite、Vue和Tailwind。 使用自定义颜色一段时间后,我遇到了一些困惑。 在模板中添加和使用自定义颜色不是问题 - 使用 Tailwind 文档使该过程非常清晰 // tailwind.config.js module.exports = { them...
    编程 发布于2024-11-06
  • 端到端(E 测试:综合指南
    端到端(E 测试:综合指南
    端到端测试简介 端到端(E2E)测试是软件开发生命周期的重要组成部分,确保整个应用程序流程从开始到结束都按预期运行。与专注于单个组件或几个模块之间交互的单元或集成测试不同,端到端测试从用户的角度验证整个系统。这种方法有助于识别应用程序不同部分交互时可能出现的任何问题,确保无缝且无错误的用户体验。 ...
    编程 发布于2024-11-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3