什么是memory

存储对话历史中的信息的能力称之为’记忆‘,这种工具可以单独使用,也可以无缝的集成到一条链中,记忆的存储长度是程序执行到结束,执行一次的所有记忆。

记忆组件需要支持

  • 读取
  • 写入

每条链定义了核心执行逻辑,期望某些输入,一些来自用户,一些来自记忆组件,在一次与LLM的交互中,链与记忆组件交互两次

  1. 读取记忆:将之前的交互内容进行读取,放入到本次交互中
  2. 写入记忆:将本次的交互内容写入到记忆当中

为什么需要使用记忆组件

在langchain中,直接使用llm.invoke进行大模型对话,llm的记忆范围只有层序执行到运行结束,再次对话就是新的开始,没有以前的记忆内容,当提问’我刚刚说了什么’时,他就回答不出前一次的交互内容.

python
复制代码
from langchain_community.llms import Tongyi
llm=Tongyi()
print("第一次对话:",llm.invoke("今天天气真好啊"),"\n\n第二次对话:",llm.invoke("我刚刚说了什么"))

运行结果就是

image.png 而使用记忆组件就可以让llm有记忆能力,能够将进行上下文联想.让与大模型对话时有和真人对话的感觉.

这里依然使用的是阿里云的通义千问大模型,如果你还没白嫖成功,请进入白嫖传送门

传送门:langchain入门一:python+langchain+通义千问,白嫖qwen大模型实现自己的聊天机器人 - 掘金 (juejin.cn)

使用步骤

需要四个部件组合起来使用,大模型,提示词模板,链,记忆组件

  1. 实例化一个LLM
  2. 定义记忆组件
  3. 创建提示词模板
  4. 使用链将他们链接起来

四种记忆组件

ConversationBufferMemory会话缓冲区

如实的记录列表中记录的对话历史消息,并且是记录所有的历史消息,随着历史记录的增加,运行会越来越慢,直到大模型无法处理.适用于交互次数少,输入输出字符量不大的情况下

使用方法

python
复制代码
import os
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
DASHSCOPE_API_KEY=os.environ["DASHSCOPE_API_KEY"]
from langchain_community.llms import Tongyi
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import (ConversationBufferMemory)
   
llm=Tongyi()
template='''你是一个美少女,你的名字是燕砸,你的任务是用温柔的语气回答人类的问题。
        {chat_memory}
       human:{question}
    '''
prompt=PromptTemplate(
        template=template,
        input_variables=["question"]
)
#ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_memory",return_messages=False)
chain = LLMChain(
        llm=llm,
        prompt=prompt,
        memory=memory,
        verbose=True
        )

chain.invoke("我喜欢美食,我最喜欢的美食是清蒸鲈鱼")
chain.invoke("你是谁?")
chain.invoke("今天的天气真好啊")
res = chain.invoke("我最开始跟你聊的什么呢?")
print(res['text'])

在prompt中的template里面有一个{chat_memory},这就是记忆组件的输入也就是链与记忆组件的第一次交互

在memory定义中需要将这个记忆组件的输入定义出来

memory = ConversationBufferMemory(memory_key="chat_memory",return_messages=False)中的 memory_key就是记忆组件的输入,return_messages是返回值中是否带有记忆内容.

.env文件内容

python
复制代码
DASHSCOPE_API_KEY="你的apikey"

看看输出结果:

image.png

ConversationBufferWindowMemory会话缓冲窗口

持续记录对话历史,但只使用最近的k个交互。确保缓存大小不会过大,运行速度比较稳定

使用方法
python
复制代码
import os
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
DASHSCOPE_API_KEY=os.environ["DASHSCOPE_API_KEY"]
from langchain_community.llms import Tongyi
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import (ConversationBufferMemory,ConversationBufferWindowMemory,ConversationSummaryMemory)
   
llm=Tongyi()
template='''你是一个美少女,你的名字是燕砸,你的任务是用温柔的语气回答人类的问题。
        {chat_memory}
       human:{question}
    '''
prompt=PromptTemplate(
        template=template,
        input_variables=["question"]
)
#ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(memory_key="chat_memory",k=2,return_messages=False)

chain = LLMChain(
        llm=llm,
        prompt=prompt,
        memory=memory,
        verbose=True
        )

chain.invoke("我喜欢美食,我最喜欢的美食是清蒸鲈鱼")
chain.invoke("你是谁?")
chain.invoke("今天的天气真好啊")
res = chain.invoke("我最开始跟你聊的什么呢?")
print(res['text'])

memory = ConversationBufferWindowMemory(memory_key="chat_memory",k=3,return_messages=False)中的k就是记录交互的次数,其余两个参数与上一个一致

这里将k设置成2,看看输出结果:

image.png 可以看到大模型确实有记忆,但是她只记得k=2个交互.

ConversationSummaryMemory会话摘要

随着时间的推移总结对话内容,并且将摘要存储在记忆中,需要的时候将摘要注入提示词或链中,缓存不会过大,运行稳定,但是运行速度比ConversationBufferWindowMemory慢很多,因为他在写入记忆的时候,做了一个摘要的操作.这使得她可以记住很长的交互记忆,不过随着交互的增加,摘要的内容不断迭代更换,使得某些内容会遗失.

使用方法
python
复制代码
import os
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv())
DASHSCOPE_API_KEY=os.environ["DASHSCOPE_API_KEY"]
from langchain_community.llms import Tongyi
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import (ConversationBufferMemory,ConversationBufferWindowMemory,ConversationSummaryMemory)
   
llm=Tongyi()
template='''你是一个美少女,你的名字是燕砸,你的任务是用温柔的语气回答人类的问题。
        {chat_memory}
       human:{question}
    '''
prompt=PromptTemplate(
        template=template,
        input_variables=["question"]
)
#ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm, memory_key="chat_memory",return_messages=False)
chain = LLMChain(
        llm=llm,
        prompt=prompt,
        memory=memory,
        verbose=True
        )

chain.invoke("我喜欢美食,我最喜欢的美食是清蒸鲈鱼")
chain.invoke("你是谁?")
chain.invoke("今天的天气真好啊")
res = chain.invoke("我最开始跟你聊的什么呢?")
print(res['text'])

这个类型的记忆组件需要传入一个llm参数memory = ConversationSummaryMemory(llm=llm, memory_key="chat_memory",return_messages=False),使用llm来进行对话摘要. 看看输出结果:

image.png 从输出内容看得出,确实有记忆,但是结果好像不太对,这可能就是摘要的缺点吧

再来看看最后一次输出的摘要内容:

image.png 大致意思就是我问她最开始聊的什么,她提醒谈话内容是天气并且描述天气.她已经完全把鲈鱼搞没了

VectorStoreRetrieverMemory向量存储

将记忆存储在向量存储中,并在每次调用时查询前K个最"显著"的文档。 与大多数其他记忆类不同的是,它不明确跟踪交互的顺序。 在这种情况下,"文档"是先前对话片段。这对于提及AI在对话中早些时候被告知的相关信息可能是有用的。这段话是官方文档的描述,猜测应该是将记忆做成了一个文档,使用文档阅读器来进行读取

使用方式
python
复制代码
from datetime import datetime
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
import faiss

from langchain.docstore import InMemoryDocstore
from langchain.vectorstores import FAISS

embedding_size = 1536 # OpenAIEmbeddings的维度
index = faiss.IndexFlatL2(embedding_size)
embedding_fn = OpenAIEmbeddings().embed_query
vectorstore = FAISS(embedding_fn, index, InMemoryDocstore({}), {})
llm = OpenAI(temperature=0) # 可以是任何有效的LLM
_DEFAULT_TEMPLATE = """以下是人类和AI之间友好的对话。AI健谈并从其上下文中提供了许多具体细节。如果AI不知道问题的答案,它会真诚地说自己不知道。

先前对话的相关部分:
{history}

(如果不相关,您无需使用这些信息)

当前对话:
人类:{input}
AI:"""
PROMPT = PromptTemplate(
    input_variables=["history", "input"], template=_DEFAULT_TEMPLATE
)
conversation_with_summary = ConversationChain(
    llm=llm, 
    prompt=PROMPT,
    # 出于测试目的,我们将max_token_limit设置得非常低。
    memory=memory,
    verbose=True
)
conversation_with_summary.predict(input="Hi, 我叫Perry,有什么新鲜事?")

这是官方的实例代码,有兴趣的可以进行尝试,这里就不过多展示.

总结

对于一个聊天机器人,在对话中可能需要进行上下文联想,分析的操作,或者是进行一个情景对话,记忆组件都是不可或缺的重要组成部分.在langchain的早期版本中,记忆组件运行速度非常的慢,如果作为一个请求内容返回给前端百分百会超时,在稳定的版本出来之后就流畅很多了,应用到实际的应用中也更具有体验感.在这样的条件下,对大模型进行角色定制,对话中这个角色的丰富度就会高很多.也能做出更多更有意思的聊天机器人

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

在这里插入图片描述

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

在这里插入图片描述

Logo

NVIDIA官方入驻,分享最新的官方资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐