[LangChain] 06. Message消息对象

news/2025/10/23 13:41:51/文章来源:https://www.cnblogs.com/Answer1215/p/19160331
类名 用途
ChatPromptTemplate 构造整个多轮提示词结构
SystemMessagePromptTemplate 设置系统规则 / 行为模式
HumanMessagePromptTemplate 模拟用户输入
AIMessagePromptTemplate 模拟模型输出(上下文中使用)

简单回忆一下:

import {ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate, 
} from "@langchain/core/prompts";// 定义一个聊天 prompt 模版
const chatPrompt = ChatPromptTemplate.fromMessages([SystemMessagePromptTemplate.fromTemplate("你是一个乐于助人的助手"),HumanMessagePromptTemplate.fromTemplate("请把以下句子翻译成英文:{text}"),
]);// 渲染成消息数组
const messages = await chatPrompt.formatMessages({ text: "你好" });console.log(messages);

效果:

[SystemMessage {"content": "你是一个乐于助人的助手","additional_kwargs": {},"response_metadata": {}},HumanMessage {"content": "请把以下句子翻译成英文:你好","additional_kwargs": {},"response_metadata": {}}
]

Message对象

Message 模块是 LangChain.js 中和大模型进行交互的 基本单位,用来表达谁说了什么,并且能携带额外的元信息。

常见的 Message 类型有:

  1. HumanMessage:用户输入
  2. AIMessage:模型输出
  3. SystemMessage:系统指令,例如告诉模型「你是一个助手」这种角色设定
  4. FunctionMessage / ToolMessage:Function Calling 或 MCP 工具调用的结果
  5. ChatMessage:通用的消息格式,可以指定角色

对象成员

源码地址:https://github.com/langchain-ai/langchainjs/blob/cc568c195b85d69c3417f6e2e2a5e561d609d741/langchain-core/src/messages/base.ts

1. content

消息的主要内容,最核心的字段。

  • 一般是 字符串(最常见)
  • 也可以是 对象数组(比如多模态:文字 + 图片)

例子 1:纯文本

new HumanMessage("你好!")
{ content: "你好!" }

例子 2:多模态内容

new HumanMessage({content: [{ type: "text", text: "请描述这张图片" },{ type: "image_url", image_url: "https://example.com/cat.png" }]
})
{content: [{ type: "text", text: "请描述这张图片" },{ type: "image_url", image_url: "https://example.com/cat.png" }]
}

2. additional_kwargs

附加参数,用来保存与 OpenAI/其他模型 API 兼容的扩展字段

它通常是空的 {},但在某些场景下会被用到,例如 Function Calling 的场景:

new AIMessage({content: "",additional_kwargs: {function_call: {name: "getWeather",arguments: '{ "city": "北京" }'}}
})

这是早期的 OpenAI Function Calling 格式(GPT-3.5/4 2023-06-13 那一代)。这种格式只支持一次函数调用。

  • 字段名是 function_call,里面直接放 name + arguments
  • arguments 是 JSON 字符串,需要开发者自己 JSON.parse()
new AIMessage({content: "",additional_kwargs: {tool_calls: [{id: "tool_123",type: "function",function: { name: "search", arguments: "{ \"query\": \"LangChain\" }" }}]}
})

这是 OpenAI 新版 Tool Calling 格式(从 GPT-4-1106-preview 开始引入)。

  • 支持 多次调用tool_calls 是数组,可以一次性返回多个工具调用)
  • 每个调用有 id(唯一标识符),方便你追踪调用 → 响应
  • type 明确标注了调用类型(现在主要是 "function"
  • LangChain.js 会自动解析成标准化的 tool_calls 字段,arguments 会从字符串转成对象

不过现在,在最新的 LangChain.js 中,推荐使用tool_calls 字段,而非塞到 additional_kwargs 里:

new AIMessage({content: "",tool_calls: [{id: "tool_123",name: "getWeather",args: { city: "北京" },},],
});

3. invalid_tool_calls

当模型给出的工具调用结果无法被 LangChain 标准化时(例如 解析失败结构不合法),这些调用不会出现在 AIMessage.tool_calls,而是被放进 AIMessage.invalid_tool_calls,方便你做兜底与修复。

4. response_metadata

用于保存「消息是怎么来的」的元信息,常见于 模型输出。里面的内容取决于 LLM 的返回信息,比如:

例子 1:OpenAI 返回的 token 消耗

new AIMessage({content: "你好,我是 AI 助手。",response_metadata: {tokenUsage: { promptTokens: 10, completionTokens: 20, totalTokens: 30 },model_name: "gpt-4o-mini",finish_reason: "stop"}
})

例子 2:Ollama 返回的时间戳

new AIMessage({content: "好的。",response_metadata: {created: 1724453430,model: "llama3"}
})

例子 3:自定义的元信息

new HumanMessage({content: "请帮我翻译",response_metadata: { source: "wechat" }
})

5. text

获取纯文本内容的便捷取值器。

import { HumanMessage } from "@langchain/core/messages";
const msg = new HumanMessage({content: [{ type: "text", text: "请描述这张图片" },{ type: "image_url", image_url: "https://example.com/cat.png" },],
});
console.log(msg.text); // 请描述这张图片
console.log(msg.content); // [{type:...},{type:...}]

6. getType()方法

返回消息类型。

import { HumanMessage } from "@langchain/core/messages";
const msg = new HumanMessage({content: [{ type: "text", text: "请描述这张图片" },{ type: "image_url", image_url: "https://example.com/cat.png" },],
});
console.log(msg.getType()); // human

getType() 方法常用语根据不同消息类型进行不同的处理。

@langchain/core/messages 里面还提供了一组守卫方法:

import { HumanMessage, isHumanMessage } from "@langchain/core/messages";const msg = new HumanMessage("你好,我叫小明");
console.log(isHumanMessage(msg)); // true

课堂练习:执行下面的代码,观察其结果

import { ChatOllama } from "@langchain/ollama";
import { HumanMessage } from "@langchain/core/messages";const chatModel = new ChatOllama({model: "llama3",temperature: 0.7,
});const response = await chatModel.invoke([new HumanMessage("用中文给我讲一个笑话"),
]);console.log(response);

-EOF-

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

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

相关文章

2025年市面上热浸锌桥架品牌排名前十权威解析

摘要 热浸锌桥架作为电气布线系统中的关键组件,近年来随着基础设施建设和智能电网发展,行业需求持续增长。2025年,市场上涌现出众多品牌,产品质量和口碑成为用户选择的核心依据。本文基于行业数据、用户评价和专家…

jsoup解析本地html网页到本地2

在之前的jsoup解析本地html网页到本地中,虽然可以实现不同食物的解析,但是每个食物单独写一个方法实在太麻烦了 注意到所有食物均属于Food的子类,且解析方法中有许多重复代码 可将Food food以及Element foodDiv这两…

Java 9 代码整洁之道:GeeCON大会技术实践

GeeCON参会体验 上周,我有幸参加了GeeCON大会。GeeCON是JVM领域中知名的会议,今年是其10周年纪念。在波兰克拉科夫举行的3天会议中,有1200多人参加了4个分会场的80多场演讲,演讲者超过70人。 这是我第一次参加GeeC…

2025 年新疆旅游线路服务最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析

根据文旅部数据统计,2024年新疆接待游客总量突破2.8亿人次,同比增长31%,其中定制化旅游服务需求增幅达45%。本文通过对17家新疆地接服务商进行多维数据分析,从企业资质、导游团队规模、服务品类覆盖、客户满意度等…

硬件编写_基于STM32单片机的汽车急控优秀的系统

硬件编写_基于STM32单片机的汽车急控优秀的系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

升级windows 11 25h2的步骤(xjl456852原创)

我自己电脑是windows11 的23h2,经过多次尝试,多次修改终于升级成功,遇到很多问题,现在记录一下。 环境准备 首先卸载电脑上的安全软件,如360,火绒,lock my pc之类的. 其他开机启动软件禁用启动项. 环境检查 通过文…

Prompt Optimizer 提示词优化器安装启用

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

【转载】cap,pcap文件中的ipv4数据包转成ipv6数据包

来源:https://blog.csdn.net/mincheat/article/details/78180656 cap , pcap文件结构(解析),网上多得是,这里就不写了。 写这个,主要是工作中正好需要大量的ipv6数据包,但是ipv6数据包不太好找,干脆就直接写个…

华为FusionCompute超融合上传ISO镜像方法教程

华为FusionCompute超融合上传ISO镜像方法教程 1、登录后点资源池,点存储2、点文件3、点上传文件4、选择镜像,点开始上传。5、等待上传完成,就可以选择华为FusionCompute超融合里面的ISO镜像了

QMPlay 编译

编译环境介绍 win11,msys2,vscode, cmake 首先下载相关依赖; 本文使用的ffmpeg5.1,qt6,libass。 安装libass pacman -S mingw-w64-x86_64-libass # 64位系统安装Ninja pacman -S mingw-w64-x86_64-ninja # 64位系…

2025 氧气/氮气/工业/氩气/高纯/液态/气体公司推荐榜:港骅 5 星领跑,黄骅及周边全品类供应,这些细分领域服务商更懂生产需求

随着工业生产对气体供应的稳定性、品类适配性要求提升,优质工业气体服务商成为保障生产效率的关键。这份结合供应能力、区域覆盖与用户口碑的推荐榜中,黄骅市港骅工业气体销售有限公司以 5 星实力稳居榜首,其余品牌…

Linux 命令 - 教程

Linux 命令 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Co…

详细介绍:如何实现多人协同文档编辑器

详细介绍:如何实现多人协同文档编辑器pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

Java基础全面复盘:从入门到进阶的核心要点梳理

引言 Java作为一门经典的面向对象编程语言,自1995年诞生以来,始终保持着旺盛的生命力。无论你是刚刚接触Java的初学者,还是希望巩固基础的开发者,进行一次全面的基础复盘都大有裨益。本文将系统性地梳理Java核心知…

【STM32H743IIT6 系列】通过 LTDC接口驱动的 TFTLCD(RGB屏)显示

前言 SDRAM 配置 在开始此篇文章之前,首先要把 SDRAM 配置好,可以看我的上一篇文章:【STM32H743IIT6 系列】将外部SDRAM作为内部RAM使用的超简单方法没有将 SDRAM 作为内部 RAM 使用的朋友可以选择性看上面这篇文章…

10.22 —— 2024icpc沈阳D,E,B,M

D. Dot Product Game 首先将对两个数组的操作转变为对一个数组的操作:可以发现,对 \(a\) 的某个子数组循环左移 \(r\) 位 与 对 \(b\) 的某个子数组循环右移 \(r\) 位是等价的,因此修改某个情形,只需要对其中一个序…

AGV 系统的内部物流与装配智能化方案设计:应用场景与核心优势详解 - 实践

AGV 系统的内部物流与装配智能化方案设计:应用场景与核心优势详解 - 实践2025-10-23 12:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: …

报表过滤框设置默认组织提示死循环

原因:首次赋值当前组织时,BeforeSetItemValueByNumber中过滤范围权限,导致赋值失败,组织字段重新为空,又触发值更新,再次赋值。 解决:实体服务规则中不勾选“值更新”,即值更新时不触发。

第九章-NOP Team dmz-C

第九章-NOP Team dmz-C 1、攻击者通过攻击DMZ-B机器发现有密钥可以免密登录到DMZ-C机器里,,然后攻击者上传了一个挖矿程序,请将该挖矿程序的名称提交, 我们使用DMZ-B下载的私钥进行登录查看当前pytho版本启用交互式…

高级语言设计第二次作业

这个作业属于哪个课程:https://edu.cnblogs.com/campus/fzu/gjyycx 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/gjyycx/homework/13570 学号:102500309 姓名:郑睿杰 一、课后练习:(具体思路都在代…