拆解LangChain的大模型记忆方案

简介: 之前我们聊过如何使用LangChain给LLM(大模型)装上记忆,里面提到对话链ConversationChain和MessagesPlaceholder,可以简化安装记忆的流程。下文来拆解基于LangChain的大模型记忆方案。

之前我们聊过如何使用LangChain给LLM(大模型)装上记忆,里面提到对话链ConversationChainMessagesPlaceholder,可以简化安装记忆的流程。下文来拆解基于LangChain的大模型记忆方案。

1. 安装记忆的原理

1.1. 核心步骤

给LLM安装记忆的核心步骤就3个:

  1. 在对话之前调取之前的历史消息。
  2. 将历史消息填充到Prompt里。
  3. 对话结束后,继续将历史消息保存到到memory记忆中。

1.2. 常规使用方法的弊端

了解这3个核心步骤后,在开发过程中,就需要手动写代码实现这3步,这也比较麻烦,不仅代码冗余,而且容易遗漏这些模板代码。

为了让开发者聚焦于业务实现,LangChain贴心地封装了这一整套实现。使用方式如下。

2. 记忆的种类

记忆分为 短时记忆 和 长时记忆。

在LangChain中使用ConversationBufferMemory作为短时记忆的组件,实际上就是以键值对的方式将消息存在内存中。

如果碰到较长的对话,一般使用ConversationSummaryMemory对上下文进行总结,再交给大模型。或者使用ConversationTokenBufferMemory基于固定的token数量进行内存刷新。

如果想对记忆进行长时间的存储,则可以使用向量数据库进行存储(比如FAISS、Chroma等),或者存储到Redis、Elasticsearch中。

下面以ConversationBufferMemory为例,对如何快速安装记忆做个实践。

3. 给LLM安装记忆 — 非MessagesPlaceholder

3.1. ConversationBufferMemory使用示例

使用ConversationBufferMemory进行记住上下文:

memory = ConversationBufferMemory()
memory.save_context(
    {"input": "你好,我的名字是半支烟,我是一个程序员"}, {"output": "你好,半支烟"}
)
memory.load_memory_variables({})

3.2. LLMChain+ConversationBufferMemory使用示例

# prompt模板
template = """
你是一个对话机器人,以下<history>标签中是AI与人类的历史对话记录,请你参考历史上下文,回答用户输入的问题。

历史对话:
<history>
{customize_chat_history}
</history>

人类:{human_input}
机器人:

"""

prompt = PromptTemplate(
    template=template,
    input_variables=["customize_chat_history", "human_input"],
)
memory = ConversationBufferMemory(
    memory_key="customize_chat_history",
)
model = ChatOpenAI(
    model="gpt-3.5-turbo",
)

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

chain.predict(human_input="你知道我的名字吗?")

# chain.predict(human_input="我叫半支烟,我是一名程序员")

# chain.predict(human_input="你知道我的名字吗?")

此时,已经给LLM安装上记忆了,免去了我们写那3步核心的模板代码。

对于PromptTemplate使用以上方式,但ChatPromptTemplate因为有多角色,所以需要使用MessagesPlaceholder。具体使用方式如下。

4. 给LLM安装记忆 — MessagesPlaceholder

MessagesPlaceholder主要就是用于ChatPromptTemplate场景。ChatPromptTemplate模式下,需要有固定的格式。

4.1. PromptTemplate和ChatPromptTemplate区别

ChatPromptTemplate主要用于聊天场景。ChatPromptTemplate有多角色,第一个是System角色,后续的是Human与AI角色。因为需要有记忆,所以之前的历史消息要放在最新问题的上方。

4.2. 使用MessagesPlaceholder安装

最终的ChatPromptTemplate + MessagesPlaceholder代码如下:

chat_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个乐于助人的助手。"),
        MessagesPlaceholder(variable_name="customize_chat_history"),
        ("human", "{human_input}"),
    ]
)

memory = ConversationBufferMemory(
    memory_key="customize_chat_history",
    return_messages=True,
)
model = ChatOpenAI(
    model="gpt-3.5-turbo",
)

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

chain.predict(human_input="你好,我叫半支烟,我是一名程序员。")

至此,我们使用了ChatPromptTemplate简化了构建prompt的过程。

5. 使用对话链ConversationChain

如果连ChatPromptTemplate都懒得写了,那直接使用对话链ConversationChain,让一切变得更简单。实践代码如下:

memory = ConversationBufferMemory(
    memory_key="history",  # 此处的占位符必须是history
    return_messages=True,
)
model = ChatOpenAI(
    model="gpt-3.5-turbo",
)

chain = ConversationChain(
    llm=model,
    memory=memory,
    verbose=True,
)

chain.predict(input="你好,我叫半支烟,我是一名程序员。")  # 此处的变量必须是input

ConversationChain提供了包含AI角色和人类角色的对话摘要格式。ConversationChain实际上是对Memory和LLMChain和ChatPrompt进行了封装,简化了初始化Memory和构建ChatPromptTemplate的步骤。

6. ConversationBufferMemory

6.1. memory_key

ConversationBufferMemory有一个入参是memory_key,表示内存中存储的本轮对话的,后续可以根据找到对应的值。

6.2. 使用"chat_history"还是"history"

ConversationBufferMemorymemory_key,有些资料里是设置是memory_key="history",有些资料里是"chat_history"

这里有2个规则,如下:

  • 在使用MessagesPlaceholderConversationBufferMemory时,MessagesPlaceholdervariable_nameConversationBufferMemorymemory_key可以自定义,只要相同就可以。比如这样:
chat_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个乐于助人的助手。"),
        MessagesPlaceholder(variable_name="customize_chat_history"),
        ("human", "{input}"),
    ]
)

memory = ConversationBufferMemory(
    memory_key="customize_chat_history",  # 此处的占位符可以是自定义
    return_messages=True,
)
model = ChatOpenAI(
    model="gpt-3.5-turbo",
)

chain = ConversationChain(
    llm=model,
    memory=memory,
    prompt=chat_prompt,
    verbose=True,
)

chain.predict(input="你好,我叫半支烟,我是一名程序员。")  # 此处的变量必须是input
  • 如果只是使用ConversationChain又没有使用MessagesPlaceholder的场景下,ConversationBufferMemory的memory_key,必须用history

7. MessagesPlaceholder的使用场景

MessagesPlaceholder其实就是在与AI对话过程中的Prompt的一部分,它代表Prompt中的历史消息这部分。它提供了一种结构化和可配置的方式来处理这些消息列表,使得在构建复杂Prompt时更加灵活和高效。

说白了它就是个占位符,相当于把从memory读取的历史消息插入到这个占位符里了。

比如这样,就可以表示之前的历史对话消息:

chat_prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一个乐于助人的助手。"),
        MessagesPlaceholder(variable_name="customize_chat_history"),
        ("human", "{human_input}"),
    ]
)

是否需要使用MessagesPlaceholder,记住2个原则:

  • PromptTemplate类型的模板,无需使用MessagesPlaceholder
  • ChatPromptTemplate 类型的聊天模板,需要使用MessagesPlaceholder。但是在使用ConversationChain时,可以省去创建ChatPromptTemplate的过程(也可以不省去)。省去和不省去在输出过程中有些区别,如下:

8. 总结

本文主要聊了安装记忆的基本原理、快速给LLM安装记忆、ConversationBufferMemoryMessagesPlaceholder的使用、对话链ConversationChain的使用和原理。希望对你有帮助!

=====>>>>>> 关于我 <<<<<<=====

本篇完结!欢迎点赞 关注 收藏!!!

原文链接:https://mp.weixin.qq.com/s/cRavfyu--AjBOO3-1aY0UA

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
11月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
3582 1
|
11月前
|
人工智能 自然语言处理 NoSQL
超越基础提示:用RAG为你的大模型注入“新鲜记忆”
超越基础提示:用RAG为你的大模型注入“新鲜记忆”
428 110
|
存储 人工智能 文字识别
医疗病历结构化处理系统技术白皮书——基于多模态AI的医联体数据治理方案
本系统基于双端协同架构,集成移动端OCR识别与云端数据分析,实现医疗文档高效结构化处理。采用PaddleOCR轻量引擎与隐私计算技术,支持离线识别与敏感信息脱敏。后端构建分布式数据仓库与多租户机制,满足PB级存储与数据安全合规要求。实测OCR准确率达96.2%(印刷体)与88.7%(手写体),字段抽取F1值92.4%,显著提升病历处理效率与质量。
1302 3
|
10月前
|
存储 监控 算法
1688 图片搜索逆向实战:CLIP 多模态融合与特征向量落地方案
本文分享基于CLIP模型与逆向工程实现1688图片搜同款的实战方案。通过抓包分析破解接口签名,结合CLIP多模态特征提取与Faiss向量检索,提升搜索准确率至91%,单次响应低于80ms,日均选品效率提升4倍,全程合规可复现。
|
人工智能 数据库
智能体(AI Agent)开发实战之【LangChain】(四)结合大模型基于RAG实现本地知识库问答和纠错
本文介绍如何基于RAG实现知识库问答系统的输入内容纠错功能。通过加载本地知识库、构建向量数据库,结合大语言模型对输入文本进行检索比对与纠错优化,提升问答准确性。
|
数据采集 存储 人工智能
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
|
人工智能 自然语言处理 数据挖掘
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化

热门文章

最新文章