SEO教程

SEO教程

Products

当前位置:首页 > SEO教程 >

LangChain Memory:如何让对话有记忆?

96SEO 2026-08-06 14:35 25


一、LLM 的无状态之痛

使用者痛点:每次调用大语言模型时都像一次全新的 HTTP 请求。模型不记得上一次对话的内容,导致使用者体验极差。

LangChain Memory:如何让对话有记忆?

当我们调用大语言模型的 API 时每次请求本质上和 HTTP 请求一样,都是无状态的。怎么说呢,模型不会记住你上一轮说了什么也不会知道你的名字、喜好等上下文信息。

// index.js 中的无状态调用示例
const res = await model.invoke;console.log,// 模型可能回答:“你好陈昊,很高兴认识你...”
const res2 = await model.invoke;console.log,// 模型会茫然回答:“抱歉,我不知道你的名字。”

这就带来了一个主要问题:如何让 LLM 拥有记忆?

最朴素的方法就是维护一个对话历史记录每次调用 LLM 时都将历史记录带上。就像下面这样:

messages =

但这种方法有一个明显的副作用:历史记录会像滚雪球一样越滚越大,Token 开销会急剧增加而且每次请求都要重复发送完整的历史消息,效率低下。

LangChain 作为 LLM 应用开发的主流框架,提供了一套方案。下面通过两个完整的代码示例,看看如何使用 LangChain 为 DeepSeek 模型添加记忆能力。

二、环境准备与项目结构

使用者痛点:环境配置繁琐、依赖不明确导致项目难以启动。

需要安装必要的依赖:

pnpm add @langchain/core @langchain/deepseek dotenv langchain

项目结建立议如下:

.
├── index.js # 无状态调用示例
├── memory.js # 带记忆的多轮对话示例
├── readme.md # 学习笔记
├── package.json
└── .env # 存放 DEEPSEEK_API_KEY

在 .env 中配置你的 DeepSeek API Key:

DEEPSEEK_API_KEY=sk-xxxxxxxx

三、无记忆模式:index.js 逐行解析

使用者痛点:没有记忆导致连续提问时模型“失忆”,使用者体验极差。

// . 导入 ChatDeepSeek 类
import { ChatDeepSeek } from '@langchain/deepseek';// . 导入 dotenv 读取环境变量
import 'dotenv/config';// . 创建模型实例
const model = new ChatDeepSeek({
model这方面。'deepseek-chat',temperature: 0 // 输出更确定
});// . 第一次调用:告诉模型自己的名字和爱好
const res = await model.invoke;console.log,console.log;// . 第二次调用:询问自己的名字
const res2 = await model.invoke;console.log,

逐行解析

  • 导入模块:引入 LangChain 对 DeepSeek 的封装还有 dotenv 用于读取环境变量。
  • 创建模型实例:ChatDeepSeek 包含模型名称和;怎么说呢,温度设为 0` 可获得更确定性的答案。
  • .invoke 调用:`model.invoke` 向 DeepSeek API 发送单条消息并返回 `AIMessage` 对象,其 `content` 为模型回复。
  • 第二次调用:`invoke` 发送全新问题。却没有任何上下文,导致模型忘记前一次信息。

运行结果:

我叫张三,喜欢喝白兰地?
按理说,很高兴认识你,张三!
白兰地是一种很优雅的饮品。-----------------
抱歉,我不知道你的名字。如果你愿意告诉我,我会很高兴记住它。按理说,

可以看到第二次回答时模型已经完全“失忆”。这正是 **无状态 API** 的典型表现,也是多数使用者在实际使用中遇到的最大痛点。

四、LangChain Memory 主要概念概览

使用者痛点:#1 手动管理对话历史繁琐;按理说,#2 难以统一不同存储实现;#3 易忘记在每轮结束后追加记录。

组件作用说明
抽象基类 定义保存/读取/清除消息的标准接口
内存实现 适合开发调试
Pipelined Runnable 包装器 自动加载历史、注入 Prompt、并在结束后追加新消息
PROMPT 模板 {history} 占位符用于插入历史消息

`RunnableWithMessageHistory` 是 LangChain 实现记忆的

五、记忆模式:memory.js 逐行解析

代码全景

import { ChatDeepSeek } from '@langchain/deepseek';import { ChatPromptTemplate } from '@langchain/core/prompts';import { RunnableWithMessageHistory } from '@langchain/core/runnables';import { InMemoryChatMessageHistory } from '@langchain/core/chat_history';import 'dotenv/config';// 创建模型实例 const model = new ChatDeepSeek({ 至于model。'deepseek-chat',temperature: 0,});// 定义 Prompt。其中 {history} 会被自动替换为历史消息数组 const prompt = ChatPromptTemplate.fromMessages(,]);// 建立 Runnable 管道:Prompt → 调试节点 → Model const runnable = prompt .pipe => { console.log");console.log);return input;}) .pipe,老实说,// 创建内存中的消息历史对象 const messageHistory = new InMemoryChatMessageHistory;// 用 RunnableWithMessageHistory 包装,使其具备自动记忆能力 const chain = new RunnableWithMessageHistory({ runnable。getMessageHistory: async => messageHistory,inputMessagesKey: 'input',historyMessagesKey: 'history',});// ------------------- 第一轮对话 ------------------- const res1 = await chain.invoke( { input: '我叫张三。喜欢喝白兰地' },{ configurable: { sessionId: 'makefriend' } } );console.log,怎么说呢,// ------------------- 第二轮对话 ------------------- const res2 = await chain.invoke( { input: '我叫什么名字' }。{ configurable: { sessionId: 'makefriend' } } );console.log,

逐行详细说明

. 导入模块

  • `ChatDeepSeek` – DeepSeek 官方封装,实现了标准化聊天接口。
  • `ChatPromptTemplate` – 用于建立结构化 Prompt,可直接嵌入程序信息、占位符还有使用者输入。
  • `RunnableWithMessageHistory` – 主要提高器,让普通 Runnable 自动拥有「读写」历史功能。
  • `InMemoryChatMessageHistory` – 简易内存实现;生产环境可切换为 Redis / PostgreSQL 等持久化实现。话说回来,
  • `dotenv/config` – 自动加载 `.env` 中的 API Key。无需显式 `require.config`。

. 创建模型实例

  • `temperature: 0` 保证输出更确定。更适合需要准确答案的业务场景,例如客服查询或金融问答。
  • *此处不再需要手动传递 API Key,因为 `dotenv` 已经把 `process.env.DEEPSEEK_API_KEY` 注入到内部 SDK 中。*

. 定义 Prompt 模板

  • `` 为整个会话设定角色定位,使得后续回答更符合预期行为。
  • `` 是 **占位符**;在运行时会被 `RunnableWithMessageHistory` 替换成已保存的聊天记录数组。.
  • `
  • `` 表示本轮使用者真实输入,由 `invoke` 提供。
  • `
  • *模板采用元组语法,可直接映射到 OpenAI/Anthropic 等兼容聊天格式。*
  • `

. 建立 Runnable 管道

  • `prompt.pipe` 将 Prompt 与自定义调试函数相连。该函数仅打印最终发送给模型的数据结构。不影响业务逻辑,是排查「历史是否正确注入」的关键手段。
  • `
  • `pipe` 将调试后的 Prompt 输出直接喂给 `ChatDeepSeek` 实例,实现「Prompt → Model」的一站式流水线。
  • `
  • *整个 pipeline 本质上是一个实现了 `Runnable` 接口的对象。可继续链式拼接其他处理器,如 token 裁剪或摘要生成。*
  • `

. 创建消息历史存储

  • `new InMemoryChatMessageHistory` 在内存中维护一段 `{messages:Array}` 并提供增删查方法。*适用于快速原型或单机演示*;若要持久化,只需替换成对应实现即可。例如: import { RedisChatMessageHistory } from '@langchain/redis';话说回来,const messageHistory = new RedisChatMessageHistory;同一套代码无需改动,即可切换到 PostgreSQL、MongoDB 或文件程序实现。
  • `
  • 说到*注意*。内存实现随进程退出即丢失,会话数据不持久,请根据业务需求选型。说起来,
  • `

. 包装为带记忆链路

  • `runnable`: 前面建立好的 Prompt→调试→Model 流水线。
  • `
  • `getMessageHistory`: 一个异步工厂函数,根据当前 `configurable.sessionId` 返回对应会话的 `BaseChatMessageHistory` 实例。本例固定返回同一实例,实现单会话多轮对话;生产环境可根据 `sessionId` 动态查询 Redis/DB 中对应记录。
  • `
  • `inputMessagesKey`: 告诉包装器「哪一个字段是本轮使用者输入」,这里是 `'input'` 与 `invoke` 对应。
  • `
  • `historyMessagesKey`: 指定模板中占位符变量名,本例为 `'history'` 与 Prompt 中 `{history}` 对齐。
  • `
  • *包装完成后*,每一次 `chain.invoke` 都会:
    1. *加载* 当前会话历史;
    2. *拼接* 程序提示 + 历史 + 本轮输入形成完整 Prompt;不过,
    3. *发送* 给 LLM 并获取响应;
    4. *写回* 使用者输入 & AI 回复 到同一 History 实例,实现闭环。
    者无需手动管理任何「addUserMessage / addAIMessage」细节。

. 第一轮对话

  • 再看调用方式, chain.invoke;- 第一个参数提供本轮使用者输入;- 第二个参数携带 *sessionId*,用于区分不同会话。
  • 因为这是首次交互,messageHistory为空。所以模板中的 `{history}` 被渲染为空,仅包含程序提示 + 本轮输入。
  • 返回值 为 LLM 的响应对象,其中 `.content` 即为文本答案。
  • 控制台打印展示了「最终传给模型的信息」,直接能看到只有两条消息被发送: json { "messages":。] }

. 第二轮对话)

  • 使用相同 `sessionId='makefriend'`,所以包装器从 History 中读取第一轮产生的两条记录,并把它们拼接进 `{history}` 占位符。
  • 最终发送给 LLM 的消息数组将变为四条: json { "messages":。] }
  • LLM 能够基于完整上下文正确回答:「你叫张三,你喜欢喝白兰地。」 - 打印日志 验证了 History 注入成功。

运行结果示例 :

>> 最终传给模型的信息
{
"messages":,]
}
好的 张三。我记住了你喜欢喝白兰地,>> 最终传给模型的信息
{
"messages":。]
}
你叫张三,你喜欢喝白兰地。<
/ code>

关键收获:

  • 无需手动拼接 历史,只要配置好 RunnableWithMessageHistory 即可自动管理;
  • 多会话支持 :通过不同 sessionId 可同时维护多条独立对话;
  • 调试友好 :中间调试节点帮助确认历史是否正确注入;话说回来,< / ul>

方法 功能 返回类型
addUserMessage添加一条来自使用者的信息/Promise/
addAIMessage添加一条 AI 的回复/Promise/
getMessages获取全部已保存消息/Promise/
clear清空当前会话所有记录/Promise/

LangChain 官方提供多种实现。只需替换构造函数就可以完成迁移:

\ \# 实现类\<\/th\>\# 存储后端\<\/th\>\# 推荐场景\<\/th\>\<\/tr\>\<\/ad\>\ \ \\\InMemoryChatMess ageHist ory\<\/c ode \>\<\/t d\>\\内存,仅适用于单机测试\<\/t d\>\\快速原型\<\/t d\>\<\/tr \>\ \\\RedisCh atMess ageHist o ry\<\/c od e \>\<\/t d \>\\<\/t d \<\/t d \ Token 因为对话轮数线性增长,会导致成本飙升甚至触发 token 上限错误。LangChain 提供四大常用方案:
策略‍​‏‏‏‏‏‏‏‏‌‌‌‌‌‎‎‎‎­­­­­—⁠⁠⁠⁠⁠⁠⁠‌‍‍‍‌‌‌‌—‌—————----–––—–—––- 实现方式‎​ 原理​


标签: 深入浅出

SEO优化服务概述

作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。

百度官方合作伙伴 白帽SEO技术 数据驱动优化 效果长期稳定

SEO优化核心服务

网站技术SEO

  • 网站结构优化 - 提升网站爬虫可访问性
  • 页面速度优化 - 缩短加载时间,提高用户体验
  • 移动端适配 - 确保移动设备友好性
  • HTTPS安全协议 - 提升网站安全性与信任度
  • 结构化数据标记 - 增强搜索结果显示效果

内容优化服务

  • 关键词研究与布局 - 精准定位目标关键词
  • 高质量内容创作 - 原创、专业、有价值的内容
  • Meta标签优化 - 提升点击率和相关性
  • 内容更新策略 - 保持网站内容新鲜度
  • 多媒体内容优化 - 图片、视频SEO优化

外链建设策略

  • 高质量外链获取 - 权威网站链接建设
  • 品牌提及监控 - 追踪品牌在线曝光
  • 行业目录提交 - 提升网站基础权威
  • 社交媒体整合 - 增强内容传播力
  • 链接质量分析 - 避免低质量链接风险

SEO服务方案对比

服务项目 基础套餐 标准套餐 高级定制
关键词优化数量 10-20个核心词 30-50个核心词+长尾词 80-150个全方位覆盖
内容优化 基础页面优化 全站内容优化+每月5篇原创 个性化内容策略+每月15篇原创
技术SEO 基本技术检查 全面技术优化+移动适配 深度技术重构+性能优化
外链建设 每月5-10条 每月20-30条高质量外链 每月50+条多渠道外链
数据报告 月度基础报告 双周详细报告+分析 每周深度报告+策略调整
效果保障 3-6个月见效 2-4个月见效 1-3个月快速见效

SEO优化实施流程

我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:

1

网站诊断分析

全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。

2

关键词策略制定

基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。

3

技术优化实施

解决网站技术问题,优化网站结构,提升页面速度和移动端体验。

4

内容优化建设

创作高质量原创内容,优化现有页面,建立内容更新机制。

5

外链建设推广

获取高质量外部链接,建立品牌在线影响力,提升网站权威度。

6

数据监控调整

持续监控排名、流量和转化数据,根据效果调整优化策略。

SEO优化常见问题

SEO优化一般需要多长时间才能看到效果?
SEO是一个渐进的过程,通常需要3-6个月才能看到明显效果。具体时间取决于网站现状、竞争程度和优化强度。我们的标准套餐一般在2-4个月内开始显现效果,高级定制方案可能在1-3个月内就能看到初步成果。
你们使用白帽SEO技术还是黑帽技术?
我们始终坚持使用白帽SEO技术,遵循搜索引擎的官方指南。我们的优化策略注重长期效果和可持续性,绝不使用任何可能导致网站被惩罚的违规手段。作为百度官方合作伙伴,我们承诺提供安全、合规的SEO服务。
SEO优化后效果能持续多久?
通过我们的白帽SEO策略获得的排名和流量具有长期稳定性。一旦网站达到理想排名,只需适当的维护和更新,效果可以持续数年。我们提供优化后维护服务,确保您的网站长期保持竞争优势。
你们提供SEO优化效果保障吗?
我们提供基于数据的SEO效果承诺。根据服务套餐不同,我们承诺在约定时间内将核心关键词优化到指定排名位置,或实现约定的自然流量增长目标。所有承诺都会在服务合同中明确约定,并提供详细的KPI衡量标准。

SEO优化效果数据

基于我们服务的客户数据统计,平均优化效果如下:

+85%
自然搜索流量提升
+120%
关键词排名数量
+60%
网站转化率提升
3-6月
平均见效周期

行业案例 - 制造业

  • 优化前:日均自然流量120,核心词无排名
  • 优化6个月后:日均自然流量950,15个核心词首页排名
  • 效果提升:流量增长692%,询盘量增加320%

行业案例 - 电商

  • 优化前:月均自然订单50单,转化率1.2%
  • 优化4个月后:月均自然订单210单,转化率2.8%
  • 效果提升:订单增长320%,转化率提升133%

行业案例 - 教育

  • 优化前:月均咨询量35个,主要依赖付费广告
  • 优化5个月后:月均咨询量180个,自然流量占比65%
  • 效果提升:咨询量增长414%,营销成本降低57%

为什么选择我们的SEO服务

专业团队

  • 10年以上SEO经验专家带队
  • 百度、Google认证工程师
  • 内容创作、技术开发、数据分析多领域团队
  • 持续培训保持技术领先

数据驱动

  • 自主研发SEO分析工具
  • 实时排名监控系统
  • 竞争对手深度分析
  • 效果可视化报告

透明合作

  • 清晰的服务内容和价格
  • 定期进展汇报和沟通
  • 效果数据实时可查
  • 灵活的合同条款

我们的SEO服务理念

我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。

提交需求或反馈

Demand feedback