LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

这篇具有很好参考价值的文章主要介绍了LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 

如果您还没有看过我之前写的两篇博客,请先看一下,这样有助于对本文的理解:

LangChain与大型语言模型(LLMs)应用基础教程:Prompt模板

LangChain与大型语言模型(LLMs)应用基础教程:信息抽取

LangChain与大型语言模型(LLMs)应用基础教程:角色定义 

在默认情况下Chain和LLM都是无状态的,这意味着它们独立地处理每个传入的prompt(底层 LLM 和聊天模型也是如此),因此它们不具有记住上下文的能力,但是在很多应用场景中我们需要LLM具有记住上下文的能力,这样会使我们的机器人看起来更加“聪明”,从而给用户带来更好的用户体验。今天我们来介绍几种在LangChain中常用的记忆力组件。

首先我们需要安装如下的python包:

pip -q install openai langchain huggingface_hub transformers

1. ConversationBufferMemory

这是最简单的内存记忆力组件,它的功能是直接将用户和机器人之间的聊天内容记录在内存中。下面我们看一个例子:

from langchain.chains.conversation.memory import ConversationBufferMemory
from langchain import OpenAI
from langchain.chains import ConversationChain
import os
#你申请的openai的api_key
os.environ['OPENAI_API_KEY'] = 'xxxxxx'

#定义llm
llm = OpenAI(model_name='text-davinci-003', 
             temperature=0, 
             max_tokens = 256)

#定义记忆力组件
memory = ConversationBufferMemory()

#定义chain
conversation = ConversationChain(
    llm=llm, 
    verbose=True, 
    memory=memory
)

这里我们首先定义了一个openai的语言模型llm, 一个记忆力组件ConversationBufferMemory,和一个chain, Chain是Langchain中的核心组件,llm必须和Chain结合在一起才能正常工作。接下来就开始我们和openai语言模型的聊天:

print(conversation.predict(input='你好,我是王老六'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 这里我们看到在内存中存放了两部分信息,首先是一个前缀信息:The following is ....,然后是机器人和用户之间的聊天内容。这里的前缀信息有助于让机器人明确自己的角色定义,从而限制机器人不能随心所欲的回答用户提出的问题。

print(conversation.predict(input='你叫什么名字啊?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input="那就叫你大聪明吧,怎么样?"))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input="你还记得我叫什么名字吗?"))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

这里我们注意到我们和机器人之间的多轮的对话内容全部被自动保存在了内存中。这样机器人就有了记忆力,它能记住我之前说过的话。

 2. ConversationBufferWindowMemory

ConversationBufferWindowMemory组件与之前的ConversationBufferMemory组件的差别是它增加了一个窗口参数,它的作用是可以指定保存多轮对话的数量:

#定义openai的语言模型
llm = OpenAI(model_name='text-davinci-003', 
             temperature=0, 
             max_tokens = 256)

#定义内存组件,k=2表示只保存最近的两轮对话内容
window_memory = ConversationBufferWindowMemory(k=2)

#定义chain
conversation = ConversationChain(
    llm=llm, 
    verbose=True, 
    memory=window_memory
)

这里ConversationBufferWindowMemory的参数k=2表示在内存中只保存最近的2轮对话内容,因此更早的对话内容将被抛弃掉。

print(conversation.predict(input='你好,我是王老六'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你叫什么名字啊?'))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='那就叫你大聪明吧,怎么样?'))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你还记得我叫什么吗?'))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 这里我们观察到,在内存中只保留了Human-AI,Human-AI两轮对话内容再加当前用户提出的问题。更早之前的Human-AI的对话内容会被抛弃掉,所以最后机器人不记得我叫什么名字了。

3. ConversationSummaryMemory

与ConversationBufferMemory不同,ConversationSummaryMemory它不会将用户和机器人之前的所有对话都存储在内存中。它只会存储一个用户和机器人之间的聊天内容的摘要,这样做的目的可能是为了节省内存开销和token的数量,因为像openai这样的语言模型是按token数量来收费的,所以能省则省。

#定义openai的语言模型
llm = OpenAI(model_name='text-davinci-003', 
             temperature=0, 
             max_tokens = 256)
#定义内存组件
summary_memory = ConversationSummaryMemory(llm=OpenAI())
#定义Chain
conversation = ConversationChain(
    llm=llm, 
    verbose=True, 
    memory=summary_memory
)

这里我们将内存组件换成了ConversationSummaryMemory,它会在内存中产生聊天内容的摘要信息。

print(conversation.predict(input='你好,我是王老六'))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你叫什么名字啊?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 这里我们看到在内存中会保留前缀信息,之前多轮对话的摘要信息,以及用户当前提出的问题这三部分内容。

print(conversation.predict(input='那就叫你大聪明吧,怎么样?'))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你还记得我叫什么吗?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

4. ConversationSummaryBufferMemory

ConversationSummaryBufferMemory结合了前面的ConversationBufferWindowMemory,ConversationSummaryMemory两种工作方式,即在内存中保留一部分聊天内容的摘要,和一部分的多轮聊天内容,但是要在内存中保留多少轮聊天内容,这取决于参数max_token_limit,如果将max_token_limit设置为较小的值时,那么大部分之前的聊天内容都被转换成了摘要,少部分的聊天内容被保存下来,相反当max_token_limit设置为较大的值时,小部分的之前聊天内容被转换成摘要,而大部分聊天内容被保留下来。

from langchain.chains.conversation.memory import ConversationSummaryBufferMemory
from langchain import OpenAI
from langchain.chains import ConversationChain
import os

os.environ['OPENAI_API_KEY'] = 'xxxxx'


llm = OpenAI(model_name='text-davinci-003', 
             temperature=0, 
             max_tokens = 256)

memory = ConversationSummaryBufferMemory(llm=OpenAI(), max_token_limit=256) 

conversation = ConversationChain(
    llm=llm, 
    memory=memory, 
    verbose=True
)

这里我们将max_token_limit设置为256,表示当我们多轮聊天内容的prompt长度超过256时,较早的聊天内容将会被转换成摘要,同时小于256个token的聊天内容会被保留下来。

print(conversation.predict(input='你好,我是王老六'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你叫什么名字啊?'))

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='我给你取个名字叫大聪明吧,怎么样?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你还记得我叫什么吗?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='你还记得我给你起的名字吗?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

print(conversation.predict(input='我生病了,肚子疼,还呕吐发烧,你说我是自己吃点药对付一下呢还是去医院看一下比较好?'))

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 从上述多伦聊天内容中我们可以发现,随着聊天轮次的增加,内存中的摘要信息量也在增加,而内存中的多轮聊天内容的长度被限制在256个token,当有新的聊天内容进到内存中后,较早的聊天内容将会被转换成摘要从而被踢出内存中的多伦聊天记录。

5.ConversationKGMemory

我们知道像ChatGPT这样的LLM最大的问题是会“产生幻觉(hallucinate)”,也就是当llm不知道正确答案的情况下,往往会天马行空自由发挥从而导致llm给出了完全不正确的答案,为了避免llm产生幻觉,Langchain提供了ConversationKGMemory组件即“对话知识图谱记忆”组件,该组件可以从和用户的对话中提取出知识图谱信息,即一些核心的关键信息,这些信息比之前的ConversationSummaryMemory组件所保存的信息更为精简。llm将会严格依据知识图谱的中的相关内容来回答用户的问题,从而避免产生幻觉。

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

llm = OpenAI(temperature=0)


template = """下面是一段人与AI的友好对话。 人工智能很健谈,并根据其上下文提供了许多具体细节。
如果 AI 不知道问题的答案,它会如实说它不知道。 AI 仅使用“相关信息”部分中包含的信息,不会产生幻觉。

相关信息:

{history}

对话内容:
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)
)

这里我们创建了一个prompt模板,模板中有三部分信息:前缀信息, 相关信息,对话内容。前缀信息之前已经介绍过,这里不再说明,相关信息指的是从之前的多轮对话中提取出来的知识图谱信息,即精简的核心关键信息,对话内容则只保留用户当前所提出的问题。

conversation_with_kg.predict(input="你好")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation_with_kg.predict(input="我叫大神,我有一位朋友叫小明,他是一位宠物医院的医生。")

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation_with_kg.predict(input="小明是做什么的?")

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation_with_kg.predict(input="小明的爸爸也是一位宠物医生")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation_with_kg.predict(input="不过你小明的妈妈是位老师")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation_with_kg.predict(input="小明的哥哥是个老板")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation_with_kg.predict(input="小明的妈妈是做什么的?")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

6.Entity Memory

在自然语言处理(NLP)技术中一项基本的功能就是:命名实体识别(Named Entity Recognition,简称NER)又称作专名识别、命名实体,是指识别文本中具有特定意义的实体,主要包括人名、地名、机构名、专有名词等,以及时间、数量、货币、比例数值等文字。Langchain提供的实体记忆(Entity Memory)组件能自动提取AI与人类交互过程中的实体信息,并将其以字典的形式保存在内存中。实体的正确识别能帮助AI能更准确的回答人类提出的关于实体的相关问题。下面我们来看一个例子:

from langchain import OpenAI, 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

这里我们会使用一个ENTITY_MEMORY_CONVERSATION_TEMPLATE的模板,该模板为内存记忆的固定格式,下面我们看一下该模板的主要内容:

## The propmpt
print(ENTITY_MEMORY_CONVERSATION_TEMPLATE.template)

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 我们将其翻译成中文:

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 该模板基本上也是由3部分组成:前缀信息, 上下文,历史聊天信息,其中,“上下文”中记录的是历史聊天信息中提取出来的实体信息。

conversation.predict(input="你好,我家的小狗生病了怎么办?")

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation.predict(input="我突然想起来我有一个朋友叫小明,他是一位宠物医生。")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation.predict(input="可我听说他只会给小猫看病,不会给小狗看病,怎么办?")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation.predict(input="我还是去找小王吧,他是一个更专业的兽医。")

 LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

conversation.predict(input="请问小明会给小狗看病吗?")

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 通过上述简单的几轮对话,我们看到聊天记录中的实体信息被提取出来,并且AI能够根据实体信息来准确回答我的问题。下面我们看一下实体信息中的完整内容:

from pprint import pprint
pprint(conversation.memory.entity_store.store)

LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件

 总结

今天我们学习了Langchain提供的6种记忆力组件它们分别是:

  • ConversationBufferMemory
  • ConversationBufferWindowMemory
  • ConversationSummaryMemory
  • ConversationSummaryBufferMemory
  • ConversationKGMemory
  • Entity Memory

它们有着各自不能的功能和特点,根据不同的应用场景我们可以选择不同的记忆力组件,当我们开发一个与AI交互的应用程序时选择正确的记忆力组件能够成倍的提高AI的工作效率,同时让AI在回答人类的问题时更加准确,自然,而不会产生幻觉。

参考资料

LangChain官方文档文章来源地址https://www.toymoban.com/news/detail-422391.html

到了这里,关于LangChain与大型语言模型(LLMs)应用基础教程:记忆力组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自然语言处理从入门到应用——LangChain:模型(Models)-[大型语言模型(LLMs):缓存LLM的调用结果]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月16日
    浏览(39)
  • LangChain:大型语言模型(LLMs)-- ChatGLM

    1. 介绍 LangChain 是一个领先的框架,用于构建由大型语言模型(LLM)驱动的应用程序。在这个框架内,ChatGLM 作为一个重要的组件,为用户提供了强大的双语(中文-英文)对话功能。ChatGLM 基于通用的语言模型(GLM)框架,拥有数十亿级别的参数,确保了其对话的流畅性和准确

    2024年04月09日
    浏览(35)
  • 使用langchain打造自己的大型语言模型(LLMs)

    我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案,另外用户向机器人提问的字符串(prompt)长度

    2024年02月02日
    浏览(37)
  • LangChain大型语言模型(LLM)应用开发(五):评估

    LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的

    2024年02月15日
    浏览(37)
  • LangChain大型语言模型(LLM)应用开发(六):Agents

    LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的

    2024年02月16日
    浏览(34)
  • LangChain大型语言模型(LLM)应用开发(三):Chains

    LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的

    2024年02月12日
    浏览(35)
  • LangChain大型语言模型(LLM)应用开发(四):Q&A over Documents

    LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的

    2024年02月16日
    浏览(39)
  • LangChain大型语言模型(LLM)应用开发(一):Models, Prompts and Output Parsers

    LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的

    2024年02月16日
    浏览(35)
  • Generative AI 新世界 | 大型语言模型(LLMs)概述

    在上一篇《Generative AI 新世界:文本生成领域论文解读》中,我带领大家一起梳理了文本生成领域(Text Generation)的主要几篇论文:InstructGPT,RLHF,PPO,GPT-3,以及 GPT-4。本期文章我将帮助大家一起梳理另一个目前炙手可热的话题: 大型语言模型 (Large Language Models,或简写为

    2024年02月07日
    浏览(31)
  • 照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

    ✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目,建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目,建立在OOTDiffusion的基础上。通过使用Magic Clothing,可以在不同的场景下达到根据服装设计或者需求

    2024年04月26日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包