LangChain4j-ChatMessage的种类以及作用

在 LangChain4j 框架中,不同类型的消息(Message)用于构建多角色对话上下文,每种消息类型有特定的作用和结构。以下是详细解析:


1. 核心消息类型对比

消息类型 发送者 典型用途 数据结构示例(JSON)
UserMessage 真实用户 用户提问/指令 {"role": "user", "content": "你好"}
AiMessage AI模型 AI生成的回复 {"role": "assistant", "content": "你好!"}
SystemMessage 系统 设定AI行为/角色 {"role": "system", "content": "你是一名医生"}
ToolExecutionResultMessage 工具执行器 返回工具调用结果 {"role": "tool", "name": "get_weather", "content": "22°C"}
CustomMessage 开发者 扩展自定义逻辑 {"role": "custom", "metadata": {"priority": "high"}}

2. 详细作用解析

(1) UserMessage - 用户输入

java 复制代码
// 创建用户消息
UserMessage message = UserMessage.from("今天的天气怎么样?");

// 包含元数据(如用户ID)
UserMessage messageWithMeta = UserMessage.from(
    "推荐一部电影", 
    Metadata.of("user_id", "123")
);
  • 作用:代表终端用户的文本输入
  • 底层协议 :对应OpenAI API中的 {"role": "user"}

(2) AiMessage - AI响应

java 复制代码
// 普通AI回复
AiMessage response = AiMessage.from("今天晴天,气温22°C");

// 包含工具调用请求
AiMessage toolCallMessage = AiMessage.from(
    ToolExecutionRequest.builder()
        .name("get_weather")
        .arguments("{\"city\":\"北京\"}")
        .build()
);
  • 特殊能力 :
    • 可携带 ToolExecutionRequest 请求调用外部工具
    • 支持流式响应的中间结果(onNext 回调)

(3) SystemMessage - 系统指令

java 复制代码
SystemMessage systemMsg = SystemMessage.from("""
    你是一名资深影评人,回答需包含:
    1. 电影评分(IMDb/Rotten Tomatoes)
    2. 50字以内短评
    3. 类似推荐
    """);
  • 核心价值 :
    • 设定AI的角色 和回答风格
    • 通常放在对话历史最前面

(4) ToolExecutionResultMessage - 工具结果

java 复制代码
ToolExecutionResultMessage resultMsg = ToolExecutionResultMessage.from(
    toolRequest,  // 对应的ToolExecutionRequest
    "22°C"        // 工具执行结果
);
  • 工作流程 :

    graph LR A[UserMessage] --> B[AI生成ToolExecutionRequest] B --> C[执行外部工具] C --> D[返回ToolExecutionResultMessage] D --> E[AI生成最终回复]

(5) CustomMessage - 自定义扩展

java 复制代码
CustomMessage customMsg = CustomMessage.from(
    "session_event",
    Metadata.of("type", "user_session_start")
);
  • 应用场景 :
    • 记录对话生命周期事件(如会话开始/结束)
    • 注入非文本数据(如用户行为日志)

3. 完整对话流程示例

java 复制代码
List<Message> messages = new ArrayList<>();

// 1. 设定系统角色
messages.add(SystemMessage.from("你是一名天气预报员"));

// 2. 用户提问
messages.add(UserMessage.from("北京明天天气如何?"));

// 3. AI要求调用工具
messages.add(AiMessage.from(
    ToolExecutionRequest.builder()
        .name("get_weather")
        .arguments("{\"city\":\"北京\",\"date\":\"tomorrow\"}")
        .build()
));

// 4. 返回工具结果
messages.add(ToolExecutionResultMessage.from(
    toolRequest, 
    "{\"temp\":\"18°C\",\"condition\":\"多云\"}"
));

// 5. AI生成最终回复
messages.add(AiMessage.from("北京明天多云,气温18°C"));

4. 消息类型转换

转换场景 方法
Message → JSON Json.toJson(message)
JSON → Message Message.from(jsonString)
提取工具请求 aiMessage.toolExecutionRequest()

5. 设计最佳实践

  1. 对话历史管理:

    java 复制代码
    // 限制上下文长度(防止token超限)
    List<Message> trimmedHistory = TokenTrimmer.trim(messages, 2000);
  2. 工具调用模式:

    java 复制代码
    if (aiMessage.hasToolExecutionRequest()) {
        ToolExecutionRequest request = aiMessage.toolExecutionRequest();
        String result = toolExecutor.execute(request);
        return ToolExecutionResultMessage.from(request, result);
    }
  3. 系统消息优化:

    java 复制代码
    SystemMessage.builder()
        .content("你是一名金融顾问")
        .metadata("strict_mode", "true") // 可扩展元数据
        .build();

6. 常见问题解决

问题现象 解决方案
工具调用结果未被AI处理 检查是否在历史中包含 ToolExecutionResultMessage
系统指令未生效 确保 SystemMessage 是第一条消息
自定义消息被模型忽略 使用 Metadata 传递关键数据

通过合理组合这些消息类型,可以构建复杂的多轮对话系统,实现:

  • 角色扮演 (通过 SystemMessage)
  • 工具增强 (通过 Tool* 消息)
  • 上下文感知 (维护完整的 Message 历史)
相关推荐
泯泷2 小时前
一个小改动,让 Claude 在 SWE-bench 上刷新纪录:工具描述有多重要
llm·agent·claude
泯泷6 小时前
模型越聪明越健忘?“上下文腐烂”背后的 3 个解法
人工智能·llm·agent
吴凡wudianmei7 小时前
RAG 别只会向量检索:玄镜为什么加了「特征加权」
llm·agent
火山引擎开发者社区10 小时前
接大模型别再自己配 Key、搭代理了,火山引擎 IGA Pages 一步搞定
llm
承渊政道11 小时前
LangChainAI应用开发框架【LangChain与LangGraph介绍】
langchain·大模型·langgraph·ai应用开发
Flynn Liang11 小时前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang11 小时前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j
GISer_Jing13 小时前
Agent相关岗位时收集的各类技术面试题
后端·ai·langchain
Flynn Liang13 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
叼烟扛炮13 小时前
[LangChain] 学习笔记(08):工具调用底层闭环与第三方搜索(Tavily)实战
人工智能·笔记·学习·langchain