当前位置: 首页 > news >正文

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

前言

这是一个系统学习LangChain 1.0LangGraph 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 完美记住了所有信息!")
http://www.jsqmd.com/news/661104/

相关文章:

  • 2026年4月新消息:陕西美缝服务如何选?这家本地实力公司受关注 - 2026年企业推荐榜
  • 探寻电磁超声测厚仪个性化服务厂家,哪家值得选 - myqiye
  • 2026届毕业生推荐的降重复率神器解析与推荐
  • HunyuanVideo-Foley镜像安全加固:非root运行、最小权限原则与漏洞扫描
  • AI代码告警生成落地避坑清单(SITS2026工程师内部手册):避开7类典型集成陷阱,上线周期缩短60%
  • Python的__init_subclass__钩子方法与类注册模式的实现
  • 速通 理论计算机科学导论(上学期)
  • 别再复制粘贴了!STM32F103C8T6驱动ADXL345的IIC代码避坑指南(附完整工程)
  • Java的java.lang.foreign竞技场
  • 2026年3月灰库(粉仓、料仓)设备订制厂家推荐,灰库(粉仓、料仓)设备供应商技术实力与市场典范解析 - 品牌推荐师
  • SITS2026认证工程师必修课:掌握影响边界判定的6维评估矩阵(含Service Mesh/Serverless适配手册)
  • AI写论文的秘密武器,4款AI论文生成工具,开启期刊论文写作新体验!
  • 5种高效自动化策略:ILSpy批量处理实战配置方案
  • 2026年实测:打破AIGC重复壁垒的高效降重指南 - 降AI实验室
  • 终极指南:如何让10美元鼠标在Mac上超越Apple触控板
  • Kandinsky-5.0-I2V-Lite-5s性能剖析:操作系统级监控与调优实战
  • Spring Boot WebFlux 响应式架构优化
  • MySQL 表锁与行锁性能对比
  • 别再到处找安装包了!手把手教你用Deepin-Wine把Windows版QQ打包成Deb,在UOS/Deepin上自己动手
  • G-Helper:华硕笔记本的轻量控制革命,告别臃肿原生软件
  • FanControl终极指南:Windows系统风扇控制与静音散热完整解决方案
  • 终极指南:3步实现百度网盘Mac版免费高速下载
  • 从ARM汇编ldrex/strex入手,彻底搞懂Linux原子操作的硬件实现原理
  • 单机版神魔大陆v0.51.0架设指南:从零开始的冰火荣耀之旅
  • LangGPT结构化提示词设计:5分钟从新手到专家的终极指南
  • 为什么92%的AI生成代码在CI/CD阶段失败?3步诊断法+4个不可绕过的语义断点检测规则
  • 3分钟掌握EmojiOne Color:免费彩色表情字体完全指南
  • 【智能代码生成与代码自愈融合实战指南】:20年架构师亲授3大落地范式、5类典型故障自愈闭环及企业级集成避坑清单
  • DAMOYOLO-S模型API安全设计:身份认证、限流与访问日志
  • 让老旧Windows游戏在Linux上流畅运行:DXVK技术深度解析与实战应用