LangChain 实战第 2 章:搞懂消息结构,写出会“记住对话“的客服助手
LangChain 实战第 2 章搞懂消息结构写出会记住对话的客服助手 这是系列第 2 篇。上一篇我们已经搭好 Python 环境、配好 DeepSeek、跑通了第一次模型调用。这一篇往上走一步学会用消息结构和模型聊天并做出一个能连续对话的命令行客服。一、本章目标学完这一章你应该能够理解模型调用里role角色是什么用system消息控制助手是谁用human消息把用户问题传给模型把ai回复存起来形成多轮对话设置最常用的模型参数temperature亲手实现一个带上下文的命令行客服助手二、为什么不能只传字符串上一章我们是这样调用的response model.invoke(请用一句话介绍 LangChain 的作用)这样能跑但在真实项目里不够灵活。因为实际场景我们经常要同时告诉模型你是什么角色客服讲师翻译回答要遵守什么规则语气、长度、格式用户现在问了什么前面已经聊过什么把这些信息全塞进一个字符串里既难维护又容易出错。更好的办法是把它们拆成结构化的消息传给模型。三、三种消息角色system / human / ai大模型对话里有三类最常出现的消息角色作用system设置模型的角色、规则和回答风格human用户的输入ai模型的回复SystemMessage系统消息开发者设定——AI 是谁、能干啥、不能干啥、用什么语气、输出什么格式。HumanMessage用户消息普通人的提问、需求、问题。AIMessageAI 回复大模型返回的内容。在 LangChain 里这三个类是这样导入的from langchain_core.messages import AIMessage, HumanMessage, SystemMessage拼一组消息也很直观messages [ SystemMessage(content你是一名客服助手回答要礼貌、简洁。), HumanMessage(content我的订单什么时候发货), ] 记住这个组合system 定规则human 提问题ai 记回答。后面所有对话都建立在它之上。四、SystemMessage给 AI 定身份和规矩SystemMessage相当于在对话最开头给 AI 立好永久人设在一轮对话最前面发给模型优先级高于用户的所有提问HumanMessage整轮对话全程生效它对应 OpenAI 接口里的role: system。常见用途有限定角色你是电商客服 / Python 讲师限定语气礼貌、专业、口语化限定回答长度限定输出格式JSON、分点、不超过 N 字限定不能回答的范围示例SystemMessage(content你是一名 Python 讲师回答要适合初学者。)⚠️ 新手建议第一阶段的 system 规则别写太长太复杂。规则一多模型反而可能执行不稳定。先把角色 一句要求写清楚就够用了。五、HumanMessage把用户的话传进去HumanMessage表示用户输入也就是用户说了什么。HumanMessage(content我想查询订单物流)真实项目里用户输入通常来自这些地方命令行输入Web 页面的输入框App 的聊天框后端 API 的请求参数本章先用命令行输入来演示最容易看懂原理。六、AIMessage模型的回复也是下一轮的记忆AIMessage表示模型回复。它不只是拿到答案就完事——在多轮对话里必须把模型回复也加进历史消息否则模型根本不知道之前聊过什么。messages.append(AIMessage(contentresponse.content))加上这一行后下一次调用模型时它就能看到自己上一次的回答对话才连得起来。七、案例一一句话定好客服人设用system消息控制模型角色。创建01_customer_service.pyimport os from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain_core.messages import HumanMessage, SystemMessage load_dotenv() model init_chat_model( modeldeepseek-v4-flash, model_provideropenai, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), temperature0.5, ) messages [ SystemMessage( content( 你是一名电商客服助手。 回答要礼貌、简洁。 如果用户没有提供订单号就提醒用户提供订单号。 ) ), HumanMessage(content我的快递怎么还没到), ] response model.invoke(messages) print(response.content)运行python 01_customer_service.py重点观察两点模型是否用了客服语气是否提醒你提供订单号八、模型参数 temperature控制稳重还是脑洞temperature是最常用、也最该先搞懂的模型参数。它控制输出的随机性、创造性、幻觉程度取值范围0 ~ 2越接近0输出固定、严谨、重复度高几乎不瞎编越接近2脑洞大、自由发挥容易编造不存在的内容。取值区间特点适合场景 0完全确定性同输入同输出代码生成、RAG 知识库问答、数据提取、订单查询、数学计算0.1 ~ 0.4轻微随机逻辑稳、极少幻觉客服问答、RAG、文档解析、结构化提取、规范代码0.5 ~ 0.8创意与逻辑平衡文案、总结、普通聊天≥ 1.0高创造性易虚构写故事、诗歌、创意文案设置方式就是把temperature传给init_chat_modelmodel init_chat_model( modeldeepseek-v4-flash, model_provideropenai, api_keyos.getenv(DEEPSEEK_API_KEY), base_urlos.getenv(DEEPSEEK_BASE_URL), temperature0.3, ) 经验值问答 / 客服 / 知识库把temperature调低0.1~0.4文案 / 创意 / 改写可以调高0.7~1.0。第一阶段先把temperature用熟就够了别一上来追一堆参数。九、案例二能连续对话的命令行客服上面案例每次都只问一句话。真实客服要能接着聊。核心思路把每一轮的用户提问和模型回复都存进messages列表。创建02_chat_with_history.pyimport os from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain_core.messages import SystemMessage, HumanMessage, AIMessage load_dotenv() model init_chat_model( base_urlos.getenv(DEEPSEEK_BASE_URL), api_keyos.getenv(DEEPSEEK_API_KEY), modeldeepseek-v4-flash, temperature0.5, model_provideropenai ) messages [ SystemMessage(content你是一个快递客服回答问题要有礼貌假如对方没有提供单号请让其先提供快递单号) ] while True: question input(用户:) if question exit: break messages.append(HumanMessage(contentquestion)) response model.invoke(messages) print(客服的回答: response.content) messages.append(AIMessage(contentresponse.content))运行python 02_chat_with_history.py可以这样测试用户我要查物流 用户订单号是 A10086 用户那我可以申请退款吗因为程序把历史消息都保留了模型能看到前面的对话所以第三问它才知道你在说刚才那个订单。十、多轮对话的坑历史不能无限堆保存历史消息很有用但不能无限制地一直存。原因很现实消息越多每次请求花的钱越多上下文太长模型处理速度变慢超过模型上下文上限会直接报错太早的消息可能干扰当前回答本章先用保存全部历史这种最简单的方式。后面会专门讲怎么控制上下文长度。十一、案例三只保留最近几轮为了避免历史无限增长可以只保留最近几条消息。创建03_chat_with_limited_history.pyimport os from dotenv import load_dotenv from langchain.chat_models import init_chat_model from langchain_core.messages import SystemMessage, HumanMessage, AIMessage load_dotenv() model init_chat_model( base_urlos.getenv(DEEPSEEK_BASE_URL), api_keyos.getenv(DEEPSEEK_API_KEY), modeldeepseek-v4-flash, temperature0.5, model_provideropenai ) system SystemMessage(content你是一个快递客服回答问题要有礼貌假如对方没有提供单号请让其先提供快递单号) history [] while True: question input(用户:) if question.lower() exit: break history.append(HumanMessage(contentquestion)) print(history 的长度是: str(len(history))) messages [system] history[-6:] response model.invoke(messages) print(客服的回答: response.content) history.append(AIMessage(contentresponse.content))关键在这一行messages [system] history[-6:]history[-6:]表示只取最后 6 条历史消息。因为一轮对话通常包含用户消息 AI 回复两条所以 6 条 ≈ 最近 3 轮对话。 顺手复习一下 list 切片后面会经常用# lst[start:end:step]索引从 0 开始 a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] print(a[:4]) # [0, 1, 2, 3] print(a[3:]) # [3, 4, 5, 6, 7, 8, 9] print(a[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 倒序 print(a[::2]) # [0, 2, 4, 6, 8] 隔一个取 print(a[-1]) # 9 最后一位 print(a[-6:]) # [4, 5, 6, 7, 8, 9] 最后六个十二、进阶预告用模板更优雅地插历史本章我们是手动拼消息的messages [system_message] history[-6:]这种写法直观适合先理解原理。等学到ChatPromptTemplate可以用MessagesPlaceholder在模板里预留历史消息的位置更省心from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt_template ChatPromptTemplate.from_messages( [ (system, 你是一名电商客服助手回答要礼貌、简洁。), MessagesPlaceholder(variable_namehistory), (human, {question}), ] )其中history用来接收以前的HumanMessage和AIMessagequestion表示用户当前的问题本章只要知道有这种更方便的写法就行完整用法下一章讲 Prompt 模板时展开。十三、本章重点速记模型调用既可以传字符串也可以传消息列表SystemMessage设置角色和规则HumanMessage表示用户输入AIMessage表示模型回复多轮对话必须保存历史消息历史消息不能无限增长用history[-6:]截断temperature影响回答的稳定性和创造性十四、常见问题Q1为什么模型没严格按 system 规则回答大模型不是传统if/else程序。system 规则能提高按要求回答的概率但不保证 100% 执行。如果要求很重要后续可以配合更清晰的 Prompt、结构化输出、程序校验、后处理逻辑来兜底。Q2为什么多轮对话越来越慢因为每次请求都把历史消息一起发给了模型。历史越长请求内容越多、越慢。解决办法就是限制历史数量例如history[-6:]。

相关新闻

macOS终端自动化部署Claude Code AI编程助手实战

macOS终端自动化部署Claude Code AI编程助手实战

1. 项目概述:Claude Code在macOS终端的一键部署方案作为长期在macOS环境下工作的开发者,我最近被Claude Code这款新兴的AI编程助手彻底改变了工作流。但每次在新设备上手动配置环境总需要重复操作,于是萌生了开发自动化安装脚本的想法。本文将…

2026/7/23 3:21:05阅读更多 →
鸿蒙Flutter JSON解析与序列化:json_serializable代码生成详解

鸿蒙Flutter JSON解析与序列化:json_serializable代码生成详解

概述 json_serializable 是Flutter生态中最流行的JSON序列化代码生成工具,它可以自动生成 toJson() 和 fromJson() 方法,大大减少手动编写序列化代码的工作量。本文将详细介绍 json_serializable 的配置、使用方法和高级特性,帮助开发者实现自…

2026/7/23 3:21:05阅读更多 →
技术文章标题优化:三段式结构、SEO规范与实战案例

技术文章标题优化:三段式结构、SEO规范与实战案例

1. 背景与核心概念在技术开发领域,标题优化不仅是内容创作的重要环节,更是影响文章传播效果的关键因素。一个好的技术文章标题能够准确传达核心内容,吸引目标读者点击,同时符合平台搜索规范,提升文章的可发现性。本文将…

2026/7/23 3:19:05阅读更多 →
智能广告竞价模型Bid2X:跨场景统一建模与零样本迁移

智能广告竞价模型Bid2X:跨场景统一建模与零样本迁移

1. 项目背景与核心挑战在数字广告生态系统中,自动出价技术正经历从规则驱动到智能驱动的范式转变。传统方法如线性规划(LP)和比例-积分-微分(PID)控制虽然能实现基础自动化,但存在三个致命缺陷:…

2026/7/23 4:43:15阅读更多 →
基于Gemma 4 12B构建视频推理可视化系统的完整指南

基于Gemma 4 12B构建视频推理可视化系统的完整指南

在实际 AI 项目开发中,将大型语言模型(LLM)与视频内容理解相结合,并实现推理过程的可视化,是评估模型决策逻辑、优化算法效果的关键环节。Gemma 作为 Google 推出的开源大语言模型家族,其 7B、12B 等参数规…

2026/7/23 4:43:15阅读更多 →
HybridSim:毫米波雷达人体感知的数字孪生仿真平台实践

HybridSim:毫米波雷达人体感知的数字孪生仿真平台实践

如果你正在开发基于毫米波雷达的人体感知应用,可能已经体会过数据采集的艰辛:租用专业设备、招募测试人员、处理海量原始信号数据……整个过程既耗时又昂贵。更让人头疼的是,一旦部署环境发生变化,模型性能就可能大幅下降。这正是…

2026/7/23 4:43:15阅读更多 →
TMS320DM6467 USB 2.0主机电气合规性测试全解析

TMS320DM6467 USB 2.0主机电气合规性测试全解析

1. 项目概述与测试背景在嵌入式系统开发,尤其是涉及音视频处理、数据采集或工业控制的应用中,TMS320DM6467这类高性能数字媒体处理器扮演着核心角色。它集成了强大的DSP和ARM核心,而USB 2.0高速主机控制器则是其连接外部存储、摄像头、调试工…

2026/7/23 4:43:15阅读更多 →
2026年了,便宜平台和专业SaaS的AI建站有什么区别吗现在?

2026年了,便宜平台和专业SaaS的AI建站有什么区别吗现在?

2026年了,便宜平台和专业SaaS的AI建站有什么区别吗现在?据《2026年中国企业数字化建站白皮书》披露,某珠三角五金外贸企业在2025年底选用了一款年费不足200元的极简建站工具,上线半年后遭遇两个问题:谷歌完全未收录&am…

2026/7/23 4:43:15阅读更多 →
达梦数据库单机主备集群搭建实战指南

达梦数据库单机主备集群搭建实战指南

1. 前言达梦数据库(DM Database)作为国产数据库的代表,其高可用方案是保障业务连续性的关键。主备集群(DataWatch)是达梦数据库实现高可用的核心组件,通过实时同步数据,在主库故障时能够快速切换…

2026/7/23 4:41:15阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/22 18:55:50阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/22 18:55:50阅读更多 →