ai
  • outline
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 1.面试问题
  • 2.参考答案
    • 2.1 记忆机制概述
    • 2.2 短期记忆(Short-term Memory)深度解析
      • 2.2.1 核心原理
      • 2.2.2 实现方式
    • 2.3 长期记忆(Long-term Memory)深度解析
      • 2.3.1 核心原理
      • 2.3.2 实现方式
      • 2.3.3 LangChain中的长期记忆模块
    • 2.4 记忆系统的使用流程
    • 2.5 总结与对比

1.面试问题 #

在大模型应用中,如何实现长短期记忆机制?请详细阐述其核心原理、实现方式以及LangChain等框架中的具体应用。

2.参考答案 #

2.1 记忆机制概述 #

在大型语言模型(LLM)应用中,为了维持对话的连贯性、理解上下文并处理复杂的多轮任务,记忆机制是不可或缺的。它允许模型在处理当前输入时,能够回顾和利用之前的交互信息。记忆机制通常分为短期记忆(Short-term Memory) 和长期记忆(Long-term Memory) 两种。

2.2 短期记忆(Short-term Memory)深度解析 #

短期记忆主要用于存储最近的对话或输入,其核心原理是依赖模型原生的上下文处理能力。

2.2.1 核心原理 #

短期记忆主要依赖于大型语言模型本身的上下文窗口(Context Window)。模型在处理输入时,会将最近的对话历史作为输入的一部分,从而在当前轮次中保持对近期上下文的理解。

2.2.2 实现方式 #

  1. 直接缓存(Direct Caching):

    • 原理:将最近的输入(包括用户查询和模型响应)全部保留在模型的上下文窗口中进行处理。
    • 示例:如GPT-4的32k tokens窗口或Claude的100k tokens窗口,直接将所有近期交互作为Prompt的一部分。
    • 特点:实现简单,但受限于模型最大输入长度。
  2. 滑动窗口(Sliding Window):

    • 原理:仅保留最近N轮对话的历史,当对话轮次超过N时,最早的对话会被移除。
    • 示例:如LangChain中的Buffer Window,可以配置保留固定轮次(例如5轮)的历史,有效防止过长历史消耗资源。
    • 特点:在固定资源下维持一定长度的上下文,避免历史过长导致成本和延迟增加。
  3. Token限制(Token Limit):

    • 原理:根据设定的Token数量上限来截断历史对话,确保总Token数不超过模型的最大输入限制。
    • 示例:例如仅保留最近12k tokens的历史。
    • 特点:直接控制输入长度,但可能导致重要信息被截断。

2.3 长期记忆(Long-term Memory)深度解析 #

长期记忆旨在突破模型原生上下文窗口的限制,通过外部存储和检索机制,持久化存储关键信息,并在需要时进行召回。

2.3.1 核心原理 #

长期记忆通过将历史信息进行外部存储(如知识图谱、数据库),并在需要时通过检索(Retrieval) 的方式获取相关信息,从而实现对海量、长期历史数据的利用。

2.3.2 实现方式 #

  1. 摘要压缩与分层管理(Summarization and Layered Management):

    • 原理:对历史对话内容进行周期性摘要,将多轮对话压缩为精炼的概括,模仿人类记忆的"模糊记忆"机制。
    • 示例:例如每10轮对话生成1段摘要。
    • LangChain应用:可以利用LangChain的SummaryBufferMemory模块,它结合了短期缓存和长期摘要,既能保留近期完整对话,又能对更早的对话进行总结。
  2. 检索增强生成(RAG - Retrieval Augmented Generation):

    • 原理:将历史信息(如对话记录、文档片段)嵌入为向量并存储在向量数据库中(如Milvus)。当有新查询时,通过语义检索动态召回与当前查询最相关的历史片段。
    • 特点:这种方式可以有效突破模型原生窗口限制,支持处理海量数据,并提供可追溯的证据。

2.3.3 LangChain中的长期记忆模块 #

LangChain提供了多种记忆模块来支持长期记忆的实现:

  • ConversationBufferMemory:存储完整的对话历史,适用于短期或中等长度的对话。
  • VectorStoreRetrieverMemory:将对话内容嵌入为向量并存储在向量数据库中,通过语义相似度检索相关片段,实现高效的长期记忆召回。
  • ConversationKGMemory:构建对话中的知识图谱,将实体和关系抽取出来,支持更复杂的实体关系查询,适用于需要结构化知识的场景。

2.4 记忆系统的使用流程 #

根据LangChain的介绍,记忆系统需要支持两个基本动作:Read(读取) 和 Write(写入)。

流程图解:

graph TD A[用户问题 question:...] --> B[Prompt: past_messages + question] B --> C[Model] C --> D[Output parser: regex Answer: .*] D --> E[模型答案 answer:...] subgraph Memory_Flow [Memory Flow] F[Memory Store] G[past_messages: array] F -- READ --> G G -.-> B E -- WRITE --> F end style F fill:#9370DB,stroke:#9370DB,stroke-width:2px,color:#fff style G fill:#E0FFFF,stroke:#E0FFFF,stroke-width:1px,color:#000
  1. Read (读取):在接收到初始用户输入后,但在执行核心逻辑(即模型推理)之前,系统会从记忆存储系统中读取相关的历史信息({"past_messages":[...]}),并将其与当前用户问题({"question":...})结合,形成一个增强的Prompt。
  2. Model (模型处理):大型语言模型接收并处理这个包含历史上下文的Prompt。
  3. Write (写入):在模型生成答案并返回给用户之前,当前轮次的输入和输出({"answer":...})会被写入到内存中,以便在未来的运行中被引用和利用。

2.5 总结与对比 #

  • 短期记忆:侧重于即时上下文的保持,依赖模型自身的上下文窗口和简单的截断/滑动策略,适用于维持对话连贯性。
  • 长期记忆:侧重于海量、持久化信息的存储和检索,通过摘要、向量数据库和RAG等技术突破模型窗口限制,适用于知识管理和复杂任务。

两者结合使用,能够使大模型在保持对话连贯性的同时,也能利用丰富的外部知识,从而实现更智能、更强大的应用。

访问验证

请输入访问令牌

Token不正确,请重新输入