LangChain中的Message

news/2025/3/26 4:28:04/文章来源:https://www.cnblogs.com/qianingmeng/p/18788714

在LangChain框架中,SystemMessageHumanMessageAIMessageChatMessage是用于构建对话流程的核心消息类。它们的区别主要体现在角色定位、功能用途以及对大语言模型(LLM)行为的影响上。以下是详细解析:


一、各类消息的定义与核心作用

1. SystemMessage(系统消息)

  • 定义SystemMessage是对话中的初始化指令,用于设置LLM的行为模式、上下文或背景信息。通常作为对话的首条消息传入。
  • 核心功能
    • 角色设定:例如“你是一个机器学习专家”。
    • 行为约束:限制LLM的响应范围,如“禁止回答AI相关问题”。
    • 风格控制:定义回答的语气(正式/幽默)或格式(JSON/列表)。
  • 参数特性
    • content:必填的指令内容(字符串)。
    • additional_kwargs:存储工具调用等附加数据。
    • response_metadata:包含响应头、token计数等元信息。
  • 对LLM的作用:直接影响模型对后续对话的理解方向,确保输出符合预设规则。

2. HumanMessage(用户消息)

  • 定义:表示用户向LLM发送的输入,对应对话中的“用户”角色。
  • 核心功能
    • 传递用户请求:如提问“帮我翻译这段文本”。
    • 支持多模态输入:可包含文本、图像、音频等混合内容。
  • 参数特性
    • content:支持字符串或字典列表(多模态)。
    • name:可选用户标识,用于区分不同用户。
  • 对LLM的作用:作为模型生成响应的直接依据,决定对话的具体内容。

3. AIMessage(AI消息)

  • 定义:表示LLM生成的响应,可能包含文本或工具调用请求。
  • 核心功能
    • 返回结果:如回答用户问题或执行函数调用。
    • 携带元数据:包含工具调用参数、错误日志等信息。
  • 参数特性
    • tool_calls:记录模型请求调用的工具及参数。
    • usage_metadata:记录token消耗等资源使用情况。
  • 对LLM的作用:在多轮对话中,历史AIMessage可作为上下文,影响后续响应。

4. ChatMessage(通用消息)

  • 定义:一种灵活的消息类型,允许自定义role字段(如“admin”),但需注意模型兼容性。
  • 核心功能
    • 非标准角色支持:适用于特定场景(如自定义角色“审核员”)。
  • 局限性:部分模型可能不支持自定义角色,需优先使用前三类。

二、四类消息的核心区别

类别 角色 发送方 典型位置 内容特性 模型依赖
SystemMessage system 开发者/系统 对话首位 行为指令、上下文 部分模型需通过API参数传递
HumanMessage user 用户 对话中间 用户输入(可多模态) 所有模型支持
AIMessage assistant LLM 对话中间或末尾 模型响应(含工具调用) 所有模型支持
ChatMessage 自定义(如admin 任意方 灵活 任意内容,需手动指定role 部分模型不支持

三、对LLM的作用机制

  1. SystemMessage的全局控制

    • 通过首条消息设定LLM的“人格”,例如让模型以专家身份回答,避免无效发散。
    • 实验表明,合理使用SystemMessage可提升响应准确性30%以上。
  2. HumanMessage的输入驱动

    • 用户输入的质量直接影响模型输出。例如,多模态输入(如图像分析)需依赖特定模型支持(如Gemini Vision)。
  3. AIMessage的上下文延续

    • 在多轮对话中,历史AIMessage会被LLM作为参考。例如,模型调用工具后返回的结果需通过ToolMessage反馈给LLM。
  4. ChatMessage的灵活性与风险

    • 自定义角色可能破坏模型对标准角色的理解,需谨慎使用。例如,定义role="validator"可能导致模型忽略指令。

四、典型使用场景示例

场景1:受限对话

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAImodel = ChatOpenAI()
messages = [SystemMessage(content="你是一个只会回答烹饪问题的助手,其他问题一律拒绝。"),HumanMessage(content="量子力学的基本原理是什么?")
]
response = model.invoke(messages)  # 输出:"我仅回答烹饪相关问题。"
  • 作用:通过SystemMessage限制模型响应范围。

场景2:多模态处理

message = HumanMessage(content=[{"type": "text", "text": "描述这张图片"},{"type": "image_url", "image_url": "https://example.com/cat.jpg"}]
)
response = model.invoke([message])  # 输出图片描述文本
  • 作用:利用HumanMessage传递混合内容。

场景3:工具调用

# AIMessage返回工具调用请求
ai_msg = AIMessage(content="",tool_calls=[{"name": "get_weather", "args": {"location": "北京"}}]
)
# 后续通过ToolMessage返回工具执行结果
tool_msg = ToolMessage(content="北京天气晴,25℃", tool_call_id="call_123")
  • 作用:实现LLM与外部工具的交互。

五、最佳实践与注意事项

  1. SystemMessage优化

    • 简洁性:避免过长指令(建议<200 tokens),以免挤占上下文窗口。
    • 优先级:部分模型(如GPT-4)对首条SystemMessage更敏感。
  2. HumanMessage设计

    • 结构化输入:使用content列表分隔复杂问题,提升模型解析效率。
    • 安全性:过滤用户输入中的敏感信息,防止提示注入攻击。
  3. AIMessage处理

    • 工具调用验证:检查tool_calls的合法性,避免执行恶意代码。
    • 元数据分析:通过usage_metadata监控资源消耗,优化成本。
  4. ChatMessage慎用

    • 仅在标准角色无法满足需求时使用,并确保目标模型支持自定义角色。

六、总结

在LangChain框架中,四类消息通过角色分工实现对LLM的精细化控制:

  • SystemMessage是“导演”,设定对话规则;
  • HumanMessage是“用户代理”,传递具体需求;
  • AIMessage是“执行者”,生成响应或触发工具;
  • ChatMessage是“灵活扩展”,但需谨慎使用。

理解它们的差异与协作机制,是构建高效、可靠LLM应用的关键。

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

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

相关文章

使用LattePanda V1制作了一个简单的基于batocera的游戏仿真站

现在,我们正在使用我们最近开发的Batocera arcade Box使用PS1模拟器运行Roadrash。我们使用的是Batocera Linux,这是一个开源且完全免费的复古游戏发行版本,旨在将任何计算机或单板计算机变成游戏控制台。 在这里,我们在相当旧的Latte Panda V1单板计算机上启动了Batocera,…

河北省科级政策app 连接MySQL数据库

项目结构 在连接数据库的时候要把localhost改为自己电脑的IP地址 开放mysql数据库远程访问的权限 使用jdbc的方法把jar包导入项目中

【Guava工具类】StringsInts

String相关工具 Strings Guava 提供了一系列用于字符串处理的工具: 对字符串为null或空的处理nullToEmpty(@Nullable String string):如果非空,则返回给定的字符串;否则返回空字符串 public static String nullToEmpty(@Nullable String string) {//如果string为null则返回…

我开发的【巨大娘的玩耍♥】游戏正在众筹中,参与即可获得限量优惠回报

大家好,我开发的【巨大娘的玩耍♥】游戏正在众筹中,参与即可获得限量优惠回报 游戏目前正在爱发电上众筹,众筹总额达成5千元即可开发和发布正式版。众筹截止日期:2025年7月23日 支持者可获得 8折激活码、获得所有玩家可见的特殊成就、上感谢名单 等 限量 回报~ 点我查看具体…

用于遥控车的先进PCB

该定制板集成了大功率电机控制,无线通信和高效电源管理在RC汽车的世界里,精确控制和效率是至关重要的。为了推动性能的极限,我专门为RC汽车设计了一个先进的PCB。这种定制板集成了大功率电机控制,无线通信和高效的电源管理,使其成为爱好者和机器人爱好者的理想选择。 为了…

读DAMA数据管理知识体系指南29文件和内容管理活动

读DAMA数据管理知识体系指南29文件和内容管理活动1. 规划生命周期的管理 1.1. 从文件的创建或接收文件后的分发、存储、检索、归档和潜在的销毁 1.2. 规划包括开发分类/索引系统和分类法,以实现文件的存储和检索 1.3. 重要的是,生命周期规划中需要为档案建立具体的制度 1.4. …

c语言实验2

1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 5 #define N 56 7 int main() {8 int number;9 int i; 10 11 srand(time(0)); // 以当前系统时间作为随机种子 12 for(i = 0; i < N; ++i) { 13 number = r…

使用 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化全攻略

使用 Browser-Use WebUI + DeepSeek 实现浏览器AI自动化全攻略 环境准备 1. 安装 Python 环境版本要求:Python 3.11 或更高版本 验证安装:命令行执行 python --version 注意:安装时需勾选 "Add to PATH" 选项(Windows用户)2. 核心工具安装 # 安装 browser-use 框…

20234214 2024-2025-2 《Python程序设计》实验一报告

20234214 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2342 姓名: 唐果儿 学号:20234214 实验教师:王志强 实验日期:2025年3月18日 必修/选修: 公选课 1.实验内容 (一)实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; …

WinForm 使用 Win32 API 实现的无边框窗口

WinForm 使用 Win32 API 实现的无边框窗口前言 时光荏苒,转眼已近是2025年了。不知不觉两年多没有研究代码了,在这期间 .NET 10 都快 RC 了,前几天刷手机看到张队公众号里有关于 .NET 9.0 AOT 发布的内容,所以写了这些代码来测试一下 AOT 编译的效果,并评估未来是否开发支…

C语言打卡学习第4天(2025.3.23)

今天只写了几道基础题,又看了下数组和冒泡排序,概念搞懂了但是写代码还是比较困难,准备明天把排序这类题好好看看。

一文速通Python并行计算:01 Python多线程编程-基本概念、切换流程、GIL锁机制和生产者与消费者模型

多线程允许程序同时执行多个任务,提升效率和响应性。线程分为新建、就绪、运行、阻塞和死亡五种状态。Python的GIL锁限制多线程并行执行,适合I/O密集型任务。生产者-消费者模型通过共享缓冲区和条件变量实现线程协作,解决数据共享问题。一文速通 Python 并行计算:01 Python…