当前位置: 首页 > news >正文

自然语言处理从入门到应用——LangChain:记忆(Memory)-[基础知识]

分类目录:《自然语言处理从入门到应用》总目录


默认情况下,链(Chains)和代理(Agents)是无状态的,这意味着它们将每个传入的查询视为独立的(底层的LLM和聊天模型也是如此)。在某些应用程序中(如:聊天机器人),记住先前的交互则非常重要。记忆(Memory)正是为此而设计的。 LangChain提供两种形式的记忆组件。首先,LangChain提供了用于管理和操作先前聊天消息的辅助工具,这些工具都被设计为模块化的使用方式。其次,LangChain提供了将这些工具轻松整合到链中的方法。

记忆涉及了在用户与语言模型的交互过程中保持状态的概念。用户与语言模型的交互被捕捉在ChatMessage的概念中,因此这涉及到对一系列聊天消息进行摄取、捕捉、转换和提取知识。有许多不同的方法可以实现这一点,每种方法都存在作为自己的记忆类型。通常情况下,对于每种类型的记忆,有两种使用记忆的方法。一种是独立的函数,从一系列消息中提取信息,另一种是在链中使用这种类型的记忆的方法。记忆可以返回多个信息(如:最近的 N N N条消息和所有先前消息的摘要),返回的信息可以是字符串或消息列表。在本文中,我们将介绍最简单形式的记忆:"缓冲"记忆。它只涉及保持先前所有消息的缓冲区。我们将展示如何在这里使用模块化的实用函数,然后展示它如何在链中使用(返回字符串和消息列表两种形式)。

聊天消息历史ChatMessageHistory

在大多数记忆模块的核心实用类之一是ChatMessageHistory类。这是一个超轻量级的包装器,提供了保存人类消息、AI 消息以及获取所有消息的便捷方法。如果我们在链外管理记忆,则可以直接使用此类。

from langchain.memory import ChatMessageHistoryhistory = ChatMessageHistory()
history.add_user_message("hi!")history.add_ai_message("whats up?")
history.messages[HumanMessage(content='hi!', additional_kwargs={}, example=False),AIMessage(content='whats up?', additional_kwargs={}, example=False)]

ConversationBufferMemory

现在我们展示如何在链中使用这个简单的概念。首先展示ConversationBufferMemory,它只是一个对ChatMessageHistory的包装器,用于提取消息到一个变量中。我们可以首先将其提取为一个字符串:

from langchain.memory import ConversationBufferMemorymemory = ConversationBufferMemory()
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
memory.load_memory_variables({})

输出:

{'history': 'Human: hi!\nAI: whats up?'}

我们还可以将历史记录作为消息列表获取:

memory = ConversationBufferMemory(return_messages=True)
memory.chat_memory.add_user_message("hi!")
memory.chat_memory.add_ai_message("whats up?")
memory.load_memory_variables({})

输出:

{'history': [HumanMessage(content='hi!', additional_kwargs={}, example=False),
AIMessage(content='whats up?', additional_kwargs={}, example=False)]}

在链中使用

最后,让我们看看如何在链中使用这个模块,其中我们设置了verbose=True以便查看提示。

from langchain.llms import OpenAI
from langchain.chains import ConversationChainllm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True, memory=ConversationBufferMemory()
)
conversation.predict(input="Hi there!")

日志输出:

> Entering new ConversationChain chain...
Prompt after formatting:
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.Current conversation:Human: Hi there!
AI:> Finished chain.

输出:

" Hi there! It's nice to meet you. How can I help you today?"

输入:

conversation.predict(input="I'm doing well! Just having a conversation with an AI.")

日志输出:

> Entering new ConversationChain chain...
Prompt after formatting:
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.Current conversation:
Human: Hi there!
AI: Hi there! It's nice to meet you. How can I help you today?
Human: I'm doing well! Just having a conversation with an AI.
AI: That's great! It's always nice to have a conversation with someone new. What would you like to talk about?
Human: Tell me about yourself.
AI:> Finished chain.

输出:

" Sure! I'm an AI created to help people with their everyday tasks. I'm programmed to understand natural language and provide helpful information. I'm also constantly learning and updating my knowledge base so I can provide more accurate and helpful answers."

保存消息记录

我们可能经常需要保存消息,并在以后使用时加载它们。我们可以通过将消息首先转换为普通的Python字典来轻松实现此操作,然后将其保存(如:保存为JSON格式),然后再加载。以下是一个示例:

import json
from langchain.memory import ChatMessageHistory
from langchain.schema import messages_from_dict, messages_to_dicthistory = ChatMessageHistory()history.add_user_message("hi!")history.add_ai_message("whats up?")
dicts = messages_to_dict(history.messages)
dicts

输出:

[{'type': 'human','data': {'content': 'hi!', 'additional_kwargs': {}, 'example': False}},{'type': 'ai','data': {'content': 'whats up?', 'additional_kwargs': {}, 'example': False}}]

输入:

new_messages = messages_from_dict(dicts)
new_messages

输出:

[HumanMessage(content='hi!', additional_kwargs={}, example=False),AIMessage(content='whats up?', additional_kwargs={}, example=False)]

参考文献:
[1] LangChain官方网站:https://www.langchain.com/
[2] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[3] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/

http://www.lryc.cn/news/117444.html

相关文章:

  • phpstorm添加vue 标签属性绑定提示和提示vue的方法提示
  • 从计算到人类知识:ChatGPT与智能演化
  • Leetcode每日一题:2681. 英雄的力量(2023.8.1 C++)
  • 【学习】若依源码(前后端分离版)之 “ 异常处理”
  • 天花板级,Python接口自动化测试-接口关联封装调用(实例)
  • yolov5代码解读之yolo.py【网络结构】
  • Docker之jenkins部署harbor在harbor中完成部署
  • 安装Jenkins
  • 大运空瓶行动,绘就生态文明画卷
  • tomcat7.exe 启动闪退解决
  • java修改jar包中的配置文件
  • 半导体器件||的学习
  • jenkins流水线
  • 视频监控汇聚EasyCVR平台WebRTC流地址无法播放的原因排查
  • NOSQL——redis的安装,配置与简单操作
  • 《合成孔径雷达成像算法与实现》Figure3.7
  • Linux 目录结构
  • 7天获英国名校邀请函|CSC青骨获批成功案例补记
  • ffmpeg ts列表合并为mp4
  • MATLAB程序初始化OpenFOAM颗粒位置
  • 软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?
  • CNN成长路:从AlexNet到EfficientNet(02)
  • 【Kubernetes】yaml文件格式
  • Python web实战之Django的文件上传和处理详解
  • android res中values-swxxdp计算
  • c动态内存申请
  • C#8.0本质论第一章--C#概述
  • geoserver编辑样式 【开发工具QGis的初次使用】
  • 【网络基础知识铺垫】
  • 一个利用oracle异常处理的函数