【Java 转 AI 开发必看:LangChain1.0 从入门到精通,一文搞定生产级 AI 应用开发 Message 消息类型与对话管理】

张开发
2026/6/4 0:58:24 15 分钟阅读
【Java 转 AI 开发必看:LangChain1.0 从入门到精通,一文搞定生产级 AI 应用开发 Message 消息类型与对话管理】
前言这是一个系统学习LangChain 1.0和LangGraph 1.0的实践仓库涵盖从基础概念到实战项目的完整学习路径。前期知识回顾Java 转 AI 开发必看LangChain1.0 从入门到精通一文搞定生产级 AI 应用开发 基础调用LLM提示词模板 (Prompt Templates)Java 转 AI 开发必看LangChain1.0 从入门到精通一文搞定生产级 AI 应用开发 Prompt提示词Message消息类型区分Prompt与Message核心概念Prompt 是提示词的模板主要作用是生成可以复用的蓝图是编译前的模具。Message是消息类型是承载对话内容与角色的数据对象是运行的实例。使用对比messagedeftest_messages():message[{role:user,content:10 加 20 等于多少},{role:assistant,content:30}]responseagent.invoke(message)print(response)promentdeftest_prompt():templateChatPromptTemplate.from_messages([(system,你是一个{role}。{instruction}),(user,{question1}),(assistant,{answer1}),(user,{question2})])messagestemplate.format_messages(rolePython 专家,instruction回答要简洁、准确,question1什么是列表,answer1列表是 Python 中的有序可变集合用方括号 [] 表示。,question2它和元组有什么区别)# 基于上下文的问题model.invoke(messages)总结消息是数据模板是工具。消息负责表达对话内容模板负责高效生产消息。实际开发中二者通常结合使用以ChatPromptTemplate构建结构以Message管理上下文。三种消息类型核心概念:SystemMessage:系统消息HumanMessage:用户消息AIMessagellm大模型消息两种不同格式字典格式消息对象推荐用字典消息对象messages_obj[SystemMessage(content你是 Python 导师),HumanMessage(content什么是列表)]responsemodel.invoke(messages_obj)print(f回复:{response.content[:100]}...)字典格式messages_dict[{role:system,content:你是 Python 导师},{role:user,content:什么是列表}]responsemodel.invoke(messages_dict)print(f回复:{response.content[:100]}...)对话历史管理核心概念难点如何正确管理对话历史关键每次调用都要传递完整历史 将上一轮的消息存放在assistant角色中。defexample_2_conversation_history():print(\n*70)print(示例 2对话历史管理重点)print(*70)# 初始化对话历史conversation[{role:system,content:你是一个简洁的助手回答限制在50字内}]# 第一轮print(\n【第 1 轮】)conversation.append({role:user,content:什么是 Python})print(f用户:{conversation[-1][content]})r1model.invoke(conversation)print(fAI:{r1.content})# 关键保存 AI 回复到历史conversation.append({role:assistant,content:r1.content})# 第二轮测试记忆print(\n【第 2 轮】)conversation.append({role:user,content:它有什么特点})print(f用户:{conversation[-1][content]})r2model.invoke(conversation)print(fAI:{r2.content})conversation.append({role:assistant,content:r2.content})# 第三轮测试上下文print(\n【第 3 轮】)conversation.append({role:user,content:我第一个问题问的是什么})print(f用户:{conversation[-1][content]})r3model.invoke(conversation)print(fAI:{r3.content})print(f\n 对话历史共{len(conversation)}条消息)print( AI 记住了之前的内容因为每次都传递了完整历史)对话历史的优化核心概念痛点对话太长容易消耗多余的token解决方案保留最近的几条消息保留system消息# 分离 system 消息和对话消息system_msgs[mforminmessagesifm.get(role)system]conversation_msgs[mforminmessagesifm.get(role)!system]实现类defkeep_recent_messages(messages,max_pairs3): 保留最近的 N 轮对话 参数: messages: 完整消息列表 max_pairs: 保留的对话轮数 返回: 优化后的消息列表 # 分离 system 消息和对话消息system_msgs[mforminmessagesifm.get(role)system]conversation_msgs[mforminmessagesifm.get(role)!system]# 只保留最近的消息每轮 user assistantmax_messagesmax_pairs*2recent_msgsconversation_msgs[-max_messages:]# 返回system 最近对话returnsystem_msgsrecent_msgs实战操作构建一个简单的聊天机器人核心概念添加一个系统消息{role: system, content: 你是一个友好的助手}将没一轮的问题添加到user角色中将每一轮的ai回答存放到assistant中defexample_5_simple_chatbot(): 实战构建一个记住对话的聊天机器人 print(\n*70)print(示例 5实战 - 简单聊天机器人)print(*70)conversation[{role:system,content:你是一个友好的助手}]questions[我叫李明今年25岁,我喜欢编程,我叫什么名字,我今年多大,我喜欢什么]fori,qinenumerate(questions,1):print(f\n--- 第{i}轮 ---)print(f用户:{q})conversation.append({role:user,content:q})responsemodel.invoke(conversation)print(fAI:{response.content})conversation.append({role:assistant,content:response.content})print(f\n 总共{len(conversation)}条消息)print( AI 完美记住了所有信息)

更多文章