【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是消息类型,是承载对话内容与角色的数据对象,是运行的实例。
使用对比:
message
deftest_messages():message=[{"role":"user","content":"10 加 20 等于多少?"},{"role":"assistant","content":"30"}]response=agent.invoke(message)print(response)proment
deftest_prompt():template=ChatPromptTemplate.from_messages([("system","你是一个{role}。{instruction}"),("user","{question1}"),("assistant","{answer1}"),("user","{question2}")])messages=template.format_messages(role="Python 专家",instruction="回答要简洁、准确",question1="什么是列表?",answer1="列表是 Python 中的有序可变集合,用方括号 [] 表示。",question2="它和元组有什么区别?")# 基于上下文的问题model.invoke(messages)总结:消息是数据,模板是工具。消息负责表达对话内容,模板负责高效生产消息。实际开发中,二者通常结合使用,以ChatPromptTemplate构建结构,以Message管理上下文。
三种消息类型
核心概念:
SystemMessage:系统消息
HumanMessage:用户消息
AIMessage:llm大模型消息
两种不同格式:
字典格式
消息对象(推荐用字典)
消息对象:
messages_obj=[SystemMessage(content="你是 Python 导师"),HumanMessage(content="什么是列表?")]response=model.invoke(messages_obj)print(f"回复:{response.content[:100]}...")字典格式:
messages_dict=[{"role":"system","content":"你是 Python 导师"},{"role":"user","content":"什么是列表?"}]response=model.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']}")r1=model.invoke(conversation)print(f"AI:{r1.content}")# 关键:保存 AI 回复到历史conversation.append({"role":"assistant","content":r1.content})# 第二轮(测试记忆)print("\n【第 2 轮】")conversation.append({"role":"user","content":"它有什么特点?"})print(f"用户:{conversation[-1]['content']}")r2=model.invoke(conversation)print(f"AI:{r2.content}")conversation.append({"role":"assistant","content":r2.content})# 第三轮(测试上下文)print("\n【第 3 轮】")conversation.append({"role":"user","content":"我第一个问题问的是什么?"})print(f"用户:{conversation[-1]['content']}")r3=model.invoke(conversation)print(f"AI:{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_pairs=3):""" 保留最近的 N 轮对话 参数: messages: 完整消息列表 max_pairs: 保留的对话轮数 返回: 优化后的消息列表 """# 分离 system 消息和对话消息system_msgs=[mforminmessagesifm.get("role")=="system"]conversation_msgs=[mforminmessagesifm.get("role")!="system"]# 只保留最近的消息(每轮 = user + assistant)max_messages=max_pairs*2recent_msgs=conversation_msgs[-max_messages:]# 返回:system + 最近对话returnsystem_msgs+recent_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})response=model.invoke(conversation)print(f"AI:{response.content}")conversation.append({"role":"assistant","content":response.content})print(f"\n💡 总共{len(conversation)}条消息")print(" AI 完美记住了所有信息!")