[LangChain] 17. Memory基础

news/2025/11/14 15:07:00/文章来源:https://www.cnblogs.com/Answer1215/p/19222121

大模型本身是无状态的,每次调用都只看当前输入。如果要在多轮对话中维持上下文,就需要 Memory 模块来存储和管理对话历史。

LangChain.js 针对 Memory 提供了多个工具类,先来学习最常用的 ChatMessageHistory

快速上手案例:

import { ChatMessageHistory } from "@langchain/classic/stores/message/in_memory";
import { HumanMessage, AIMessage } from "@langchain/core/messages";const history = new ChatMessageHistory();await history.addMessage(new HumanMessage("你好,我叫小明"));
await history.addMessage(new AIMessage("你好,小明!有什么我可以帮助你的吗?"));const messages = await history.getMessages();
messages.forEach((msg, i) => {const role = HumanMessage.isInstance(msg)? "用户": AIMessage.isInstance(msg)? "AI": "❓ Unknown";console.log(`[${i + 1}] ${role} ➜ ${msg.content}`);
});

常用方法

文档:https://v03.api.js.langchain.com/classes/_langchain_core.chat_history.BaseChatMessageHistory.html

  1. addMessage:添加消息
  2. addMessages:添加消息
  3. getMessages:获取所有消息
  4. clear:清除所有消息

实战案例

和大模型进行对话,大模型可以记住前面的对话内容

stream() 方法,方法签名如下:

stream(input: Input,options?: RunnableConfig
): AsyncGenerator<StreamEvent<Output>>

1. 输入参数 (input)

类型:Input

invoke() 方法保持一致:

  • 如果是 LLM:可以传字符串、BaseMessageBaseMessage[]

    const model = new Ollama(model: "llama3");
    model.stream("你好");
    
  • 如果是 Chain / Runnable:则是该 Chain 约定的输入对象(例如 { input: "..." }

  • 如果是 Embeddings:通常是字符串或字符串数组

换句话说,input 的类型由具体的 Runnable 实例 决定。

2. 配置参数

类型:RunnableConfig(可选)
常见字段包括:

  • configurable:运行时传入的上下文配置(例如用户 ID、对话 ID,用于内存/持久化关联)。
  • tags:给运行标记,用于调试、Tracing。
  • metadata:附加元信息,方便日志或监控。
  • callbacks:传入回调函数(如 handleLLMNewToken 等),可用于实时处理 token。
  • maxConcurrency:并发控制。
  • timeout:超时设置。

-EOF-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/965425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Exchanger

Java Exchanger Exchanger 是 JDK 1.5 起提供的并发工具类,主要用于两个工作线程之间交换数据,兼具特定的同步特性与应用场景。 核心特性对外操作是同步的,确保线程间数据交换的有序性。 专门用于成对出现的线程之间…

2025 最新净化工程厂家推荐排行榜 实验室 / 手术室 / 医药 / 食品 / 厂房洁净工程优质服务商医药/食品净化工程/净化车间工程公司推荐

引言 在医疗健康、生物制药、电子制造等核心领域的高速发展驱动下,净化工程已成为保障生产研发环境安全的核心基础设施,市场需求持续攀升。据国际洁净室与相关受控环境协会(ICCCS)最新测评数据显示,全球合格净化工…

通配符优化 dp 学习笔记

闵可夫斯基和 优化 dp \(\left( \min/\max,+\right)\) 卷积 形如: \[f_i=\max ^i_{j=0}/\min ^i_{j=0} {g_j+h_{i-j}} \]的式子被称为 \(\left( \min/\max,+\right)\) 卷积。 闵可夫斯基和 以 \(\min\) 为例,要求 \(…

2025年尖角方管实力厂家权威推荐榜单:玻璃幕墙精致钢/直角方矩管/精制钢源头厂家精选

在高端幕墙与精密制造领域,尖角方管凭借其精准的直角轮廓和卓越的结构性能,已成为实现现代建筑美学与安全的关键材料。 根据行业调研数据,2025年全球精制钢市场规模预计将保持稳定增长,其中幕墙用精制钢的年复合增…

20232308 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 1.1本周学习内容 网络信息搜集 网络踩点 网络扫描 网络查点 1.2实验目标 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息: DNS注册人及联系方式 该域名对应IP地…

TurboWarp 部署云变量服务

从GitHub下载cloud-server代码https://github.com/TurboWarp/cloud-serverg 根据README文档部署云变量服务 cloud-server‌是一个为Scratch 3设计的云数据服务器,被forkphorus和TurboWarp使用。 它使用的协议与Scrat…

Java 信号量机制实现

Java 信号量机制实现 信号量 Semaphore 信号量可限制访问共享资源的线程数。线程访问资源前需从信号量获取许可,访问结束后需将许可归还信号量。场景介绍 一个停车场只有5个车位,现有100辆车争抢这5个车位。理想情况…

习题解析之:字母查找

习题解析之:字母查找【问题描述】 定义一个函数来判断单词m是否可以由字符串n中出现的字母来组成。本题保证字符串中出现的字母均为小写字母,且不考虑n中的字母使用次数。在两行中分别输入两个字符串m,n如果输入的m包…

lc:338练习的一点思考

public int[] CountBits(int n) { int[] res = new int[n + 1]; for (int i = 0; i <= n; i++) { res[i] = CountOnesWithBitOperation(i); } return res; } …

京东商品评论接口深度逆向:从加密参数破解到情感倾向分析

京东商品评论接口因涉及用户行为数据,其反爬机制比商品详情、搜索接口更为严格,不仅采用多层参数加密,还引入了基于用户行为轨迹的动态验证。本文将突破传统的单一接口模拟思路,通过逆向评论加载的完整链路,实现评…

JSC2023 Max Degree Sum

并查集+贪心维护边权超小的动态 MST显然有一个暴力是按 \([u_i\leq k]+[v_i\leq k]\) 为边权跑最大生成树,但是看起来不是很好维护的样子。 发现我们只需要考虑当前边权为 \(1\) 或 \(2\) 的边。于是最多我们只需要考…

还在求Sora2邀请码?我已经用Sora2 API批量生成无水印视频了!(附免费去水印+Api调用教程)

还记得Sora 2刚发布时,它生成的视频带给你的那种冲击感吗? “这真的是AI生成的?”“太逼真了吧!”“我还以为是真的!” sora2这次带来的画面,已经逼真到肉眼难以分辨真假。有些视频一旦去掉水印,很多人根本看不…

[LangChian] 18. 自动维护聊天记录

上一节我们体验了“手动维护聊天记录”,每次都要:把用户发言添加到 history 把模型输出添加到 history 每轮都手动调用 getMessages() 构造上下文await history.addMessage(new HumanMessage(input)); await history…

2025年燃生物质有机热载体锅炉生产厂家权威推荐榜单:燃生物质热水锅炉/生物质专用锅炉/生物质热水锅炉源头厂家精选

在“双碳”目标持续推进的背景下,燃生物质有机热载体锅炉凭借其清洁、可再生、低碳排放的特性,正成为工业供热领域的重要选择。 根据行业报告数据,2025年生物质能在中国可再生能源消费中的占比预计将稳步提升,其中…

二进制掩码规律

& 0x1 = & 0b1 → 保留 1 位 (范围: 0-1) & 0x3 = & 0b11 → 保留 2 位 (范围: 0-3) & 0x7 = & 0b111 → 保留 3 位 (范围: 0-7) & 0xF = & 0b1111 …

jenkins构建生成docker镜像

pipeline {agent anyenvironment {CODE_DIR = "/jenkins_data/springboot_test"DATE = new Date().format(YYYYMMddHHmmss)TAG = "${DATE}"IMAGE_NAME = springtestIMAGE_NAME_ALIYUN = "reg…

2025年复合风管板权威推荐榜单:铝箔复合风管/酚醛复合风管/彩钢酚醛复合风管源头厂家精选

复合风管板作为现代建筑通风系统中不可或缺的核心材料,其市场需求正随着绿色建筑标准的提升和建筑节能要求的加强而持续增长。本文将基于详实的行业数据,为您推荐2025年度在复合风管板领域表现卓越的Top 3制造厂,通…

在线文档大全

go文档 go高级编程 go中文文档 go框架gin go-zero 开源项目地址 https://github.com/Mikaelemmmm/go-zero-looklook goframeweb3.0

AI大事记12:Transformer 架构——重塑 NLP 的革命性技能(下)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

记一次多线程插入或者更新数据库表操作优化过程

背景:有个数百万的数据,需要尽快入库,使用了多线程处理,先查询数据库是否存在,存在则更新;否则插入; 问题:数据库相同key的数据,有时候插入多条。 解决办法:String lockKey =getLockKey(t); //根据md5算法,…