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

【 LangChain v1.2 入门系列教程】【二】消息类型与提示词工程

系列文章目录【 LangChain v1.2 入门系列教程】【一】开篇入门 | 从零开始跑通你的第一个 AI Agent【 LangChain v1.2 入门系列教程】【二】消息类型与提示词工程【 LangChain v1.2 入门系列教程】【三】工具Tools开发让 Agent 连接外部世界【 LangChain v1.2 入门系列教程】【四】结构化输出让 Agent 返回可预测的结构【 LangChain v1.2 入门系列教程】【五】记忆管理让 Agent 记住对话【 LangChain v1.2 入门系列教程】【六】流式输出 让 Agent 告别“想好了再说”文章目录系列文章目录前言一、 LangChain 的 4 种核心消息类型1. 手动构建消息列表2. llm.invoke() 传入消息历史3.agent.invoke()传入消息历史4.ToolMessage 的传递二、提示词模板ChatPromptTemplate1. 基础用法方式一2. 基础用法方式二3. 基础用法方式三4. 基础用法方式四5、进阶用法MessagesPlaceholder三、系统提示System Prompt1. 系统提示词的设计原则四、 总结前言在上一篇中我们完成了环境搭建并跑通了第一个 AI Agent 。本文将带你深入 LangChain v1.2 的消息机制Messages并学习如何用提示词模板Prompt Templates像搭积木一样构建稳定、可控的对话。一、 LangChain 的 4 种核心消息类型LangChain 使用结构化的消息对象来与聊天模型交互每种消息对应对话中的一个角色消息类型角色作用SystemMessage系统消息给 AI 设定 “人设” 和规则比如 “你是一个资深博客专家”通常放在对话开头。HumanMessage用户消息用户说的话就是直接发给 AI 的提问或指令AIMessageAI 消息AI 回复的话ToolMessage工具消息当 AI 调用某个工具如上一篇中 get_weather后工具返回的结果1. 手动构建消息列表有时候我们需要手动维护把各类历史消息按顺序传回给模型作为上下文参考。例如importosfromdotenvimportload_dotenvfromlangchain.messagesimportAIMessage,HumanMessage,SystemMessagefromlangchain_openaiimportChatOpenAI load_dotenv()# api_key从硅基流动后台获取API_KEYos.getenv(API_KEY)#实例化模型llmChatOpenAI(modelQwen/Qwen3-8B,# 模型名称base_urlhttps://api.siliconflow.cn/v1,# 硅基流动的 API 地址api_keyAPI_KEY,# 你的-api-key)#手动构建对话历史messages[SystemMessage(content你是一位翻译专家将中文翻译成英文。),HumanMessage(content你好世界),AIMessage(contenthello, world),HumanMessage(content我正在写博客),#当前问题]#调用模型responsellm.invoke(messages)print(response.content)#输出Im writing a blog说明我们最初通过系统消息定义ai的角色是一名翻译专家“回答规则是把输入的中文翻译成英文第一轮用户提问“你好世界”ai翻译后回答“hello,world”。第二轮用户提问“我正在写博客”ai翻译后回答“I’m writing a blog”。从该示例中我们能深刻体会SystemMessage系统消息的作用。2. llm.invoke() 传入消息历史LangChain v1.2 我们使用 llm.invoke() 方法传入消息历史获取大模型回复入参有2种类型除了上面示例展示的List[BaseMessage]形式外它还支持字典格式List[dict]例如messages[{role:system,content:你是一位翻译专家将中文翻译成英文。},{role:user,content:你好世界},{role:assistant,content:hell,word},{role:user,content:我正在写博客},]# 调用模型responsellm.invoke(messages)print(response.content)# 输出Im writing a blog注意用户消息也兼容如下写法{“role”: “human”“content”: “你好世界”}3.agent.invoke()传入消息历史当你使用 create_agent() 创建 Agent invoke() 方法通常要求传入一个字典其中必须包含一个 “messages” 键其值为消息列表支持List[BaseMessage]或List[dict]格式例如importosfromdotenvimportload_dotenvfromlangchain.agentsimportcreate_agentfromlangchain.messagesimportAIMessage,HumanMessage,SystemMessagefromlangchain_openaiimportChatOpenAI load_dotenv()# api_key从硅基流动后台获取API_KEYos.getenv(API_KEY)# 实例化模型llmChatOpenAI(modelQwen/Qwen3-8B,# 模型名称base_urlhttps://api.siliconflow.cn/v1,# 硅基流动的 API 地址api_keyAPI_KEY,# 你的-api-key)# 创建Agentagentcreate_agent(modelllm)# 手动构建对话历史messages[SystemMessage(content你是一位翻译专家将中文翻译成英文。),HumanMessage(content你好世界),AIMessage(contenthell,word),HumanMessage(content我正在写博客),]# 调用模型responseagent.invoke({messages:messages})print(response[messages][-1].content)# 输出Im writing a blog从上述示例可以发现agent .invoke() 跟 llm.invoke()返回值不一样它是个字典包含“messages”字段打印下“messages”数据print(response[messages])打印数据如下[SystemMessage(content你是一位翻译专家将中文翻译成英文。,additional_kwargs{},response_metadata{},id9c5700dd-62b4-4e4c-9e03-21d42b307f24),HumanMessage(content你好世界,additional_kwargs{},response_metadata{},id893b5d7f-4555-4d0f-af15-2ad4bb428351),AIMessage(contenthell,word,additional_kwargs{},response_metadata{},id2da1c10d-f2b8-4422-aa5f-3e967abaf704,tool_calls[],invalid_tool_calls[]),HumanMessage(content我正在写博客,additional_kwargs{},response_metadata{},id973de492-98f3-4f2c-97e6-d69c3a076937),AIMessage(contentIm writing a blog.,additional_kwargs{refusal:None},response_metadata{token_usage:{completion_tokens:6,prompt_tokens:48,total_tokens:54,completion_tokens_details:{accepted_prediction_tokens:None,audio_tokens:None,reasoning_tokens:0,rejected_prediction_tokens:None},prompt_tokens_details:None},model_provider:openai,model_name:Qwen/Qwen3-8B,system_fingerprint:,id:019d207edbd5da788a852a998ba5082e,finish_reason:stop,logprobs:None},idlc_run--019d207e-db57-7e13-8cb9-e3e4bb6787c6-0,tool_calls[],invalid_tool_calls[],usage_metadata{input_tokens:48,output_tokens:6,total_tokens:54,input_token_details:{},output_token_details:{reasoning:0}})]可以发现这是完整的消息列表它由你传入的原始 messages 加上 AI 新生成的消息可能还有工具调用产生的消息合并而成。response[“messages”][-1] 就是列表中的最后一条消息。在大多数简单场景下它恰好是 AI 针对最后一个用户输入生成的新回复类型为 AIMessage其 content 属性即为回复文本。4.ToolMessage 的传递当 AI 调用了工具我们需要将工具执行结果以 ToolMessage 形式传回给模型。ToolMessage 除了 content还必须有 tool_call_id以关联对应的工具调用。fromlangchain_core.messagesimportToolMessage# 假设模型调用 get_weather 工具并生成了一个 tool_call_idtool_call_idcall_123# 构造工具返回的消息tool_messageToolMessage(content厦门的天气是晴朗20°C,tool_call_idtool_call_id)# 将 tool_message 添加到消息列表中继续对话messages.append(tool_message)# 然后再次调用模型responsellm.invoke(messages)二、提示词模板ChatPromptTemplate手动构建消息列表虽然直观但不够灵活。LangChain 提供ChatPromptTemplate 允许你定义消息模板动态注入变量重复使用模版。1. 基础用法方式一ChatPromptTemplate.from_template().format_messages() #单角色消息fromlangchain_core.promptsimportChatPromptTemplate# 提示词模版prompt_templateChatPromptTemplate.from_template(你是{role}专家,请用{style}风格回答问题,问题{question})# 格式化提示词messageprompt_template.format_messages(role文学,style幽默,question讲个故事)# 调用模型responsellm.invoke(message)print(response.content)2. 基础用法方式二ChatPromptTemplate.from_template() 链式调用 #单角色消息fromlangchain_core.output_parsersimportStrOutputParser# 提示词模版prompt_templateChatPromptTemplate.from_template(你是{role}专家,请用{style}风格回答问题,问题{question})#链式调用chainprompt_template|llm|StrOutputParser()#StrOutputParser:输出解析器提取纯文本内容# 调用模型contentchain.invoke({role:文学,style:幽默,question:讲个故事})print(content)ps:| 语法是一种类似 Unix 管道的链式操作符用于将前一个组件的输出直接作为后一个组件的输入从而串联起提示词模板、模型和输出解析器等组件形成一条可执行的处理链3. 基础用法方式三ChatPromptTemplate.from_messages().format_messages() #多角色消息# 提示词模版prompt_templateChatPromptTemplate.from_messages([(system,你是一个专业的翻译官把{input_language}翻译成{output_language}。),#系统消息(human,{question}),#用户消息])#格式化消息messagesprompt_template.format_messages(input_language中文,output_language英文,question你好世界)# 调用模型responsellm.invoke(messages)print(response.content)#Hello, world.4. 基础用法方式四ChatPromptTemplate.from_messages() 链式调用 #多角色消息# 提示词模版prompt_templateChatPromptTemplate.from_messages([(system,你是一个专业的翻译官把{input_language}翻译成{output_language}。),#系统消息(human,{question}),#人类消息])chain(prompt_template|llm|StrOutputParser())# StrOutputParser:输出解析器提取纯文本内容# 调用模型contentchain.invoke({input_language:中文,output_language:英文,question:你好世界})print(content)#hellow,world.5、进阶用法MessagesPlaceholder当需要插入不确定数量的历史消息时如多轮对话使用 MessagesPlaceholder动态插入消息列表fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholder#构建占位符消息模版prompt_templateChatPromptTemplate.from_messages([(system,你是一个友好的客服助手。),MessagesPlaceholder(variable_namechat_history),# 这里会插入任意多条历史消息(human,{question})#当前用户问题])# 对话历史history_messages[AIMessage(content您好请问有什么可以帮您),HumanMessage(content我想查一下订单状态。)]chainprompt_template|llm|StrOutputParser()contentchain.invoke({chat_history:history_messages,question:我的订单号是12345})print(content)#您的订单处于待发货状态三、系统提示System Prompt在LangChain v1.2中推荐使用create_agent() 创建智能体方式来调用大模型通过system_prompt参数非常方便设置系统提示SystemMessage系统消息例如#创建agentagentcreate_agent(modelllm,system_prompt你是一位翻译专家将中文翻译成英文#系统提示词)#调用模型responseagent.invoke({messages:[HumanMessage(你叫什么名字)]})print(response[messages][-1].content)#Whats your name?1. 系统提示词的设计原则系统提示词是影响 AI 行为最直接、成本最低的方式。好的系统提示词设计时遵循1角色定义清晰system_prompt 你是一位精通 Python 性能优化的资深工程师擅长识别代码中的瓶颈并给出量化改进建议。 2强制输出格式system_prompt你必须严格按照以下JSON格式回复 { thinking: 思考过程, answer: 最终答案, confidence: 0-1之间的数字 } 只输出JSON不要其他内容。3制定规则system_prompt 你必须遵守以下规则 1. 只使用 Markdown 格式回复。 2. 每条建议前必须加上「⚠️ 风险」或「 建议」。 3. 禁止输出任何未经测试的代码片段。 4. 禁止使用「可能」「大概」等模糊词汇。 4设定清晰边界system_prompt 你是一个医疗信息摘要助手。 - 如果你遇到用户描述的疑似急症如胸痛、呼吸困难必须回答“请立即就医我无法提供诊断。” - 对于其他健康问题你可以总结信息但不得给出具体治疗建议。 5提供示例system_prompt 你是一个数学解题助手输出格式先列出关键步骤再给出最终答案。 示例 用户2 3 × 4 助手 步骤 1. 先算乘法3 × 4 12 2. 再算加法2 12 14 最终答案14 四、 总结通过本文我们从 LangChain 的消息体系入手逐步掌握了以下核心技能理解四种消息角色SystemMessage、HumanMessage、AIMessage、ToolMessage并学会手动构建消息列表让 AI 在对话中“记住”上下文。灵活调用模型无论是直接使用 llm.invoke() 传入消息列表还是通过 agent.invoke() 传入字典格式的消息都能轻松实现多轮对话。告别硬编码借助 ChatPromptTemplate 和 MessagesPlaceholder我们可以像搭积木一样动态构建提示词模板支持变量注入、历史占位让代码更优雅、更易维护。用好系统提示词明确了角色定义、输出格式、边界约束等五大设计原则并通过示例展示了如何写出“指令明确”的优质提示词。当你掌握了消息与提示词这两大基石LangChain 的大门才算真正向你敞开。在下一篇文章中我们将深入 工具调用Tool Calling敬请期待

相关文章:

【 LangChain v1.2 入门系列教程】【二】消息类型与提示词工程

系列文章目录 【 LangChain v1.2 入门系列教程】【一】开篇入门 | 从零开始,跑通你的第一个 AI Agent 【 LangChain v1.2 入门系列教程】【二】消息类型与提示词工程 【 LangChain v1.2 入门系列教程】【三】工具(Tools)开发,让…...

教AI读小说:把《时光机器》变成一串数字的奇妙旅程

版权声明:本文同步发布于个人博客。欢迎交流与转载,但请务必注明出处。 导读:你有没有想过,人工智能是如何“读懂”人类语言的?其实,它们并不认识字。在AI眼里,莎士比亚的十四行诗和超市购物清单…...

拒绝“传话游戏”!DenseNet 如何让神经网络开启“群聊”模式

版权声明:本文同步发布于个人博客。欢迎交流与转载,但请务必注明出处。 摘要:在深度学习的演进史上,ResNet(残差网络)通过“快捷连接”解决了深层网络难以训练的问题。而它的继任者 DenseNet(稠…...

深度学习界的“任督二脉”:为什么 ResNet 只是简单加了个“x”就封神了?

版权声明:本文同步发布于个人博客。欢迎交流与转载,但请务必注明出处。 在深度学习的历史长河中,2015年是一个分水岭。这一年,何恺明团队提出了残差网络(ResNet),不仅拿下了ImageNet大赛冠军&am…...

深度学习里的“自动稳压器”:通俗解读批量规范化(Batch Normalization)

版权声明:本文同步发布于个人博客。欢迎交流与转载,但请务必注明出处。 导读:如果你正在训练深层神经网络,是否遇到过训练慢如蜗牛、学习率稍大就发散、或者网络深了就不收敛的烦恼?今天我们要聊的批量规范化&#xff…...

Camera Graph™:全域相机拓扑,无感跨镜跟踪,彻底解决 ID 跳变与视觉孤岛

一、技术概述 Camera Graph™ 全域相机拓扑网络,是镜像视界(浙江)科技有限公司自主研发的多摄像机空间智能协同核心引擎,属于公司SpaceOS™ 空间智能操作系统的关键底层基础设施。它以全域统一时空基准为骨架,将离散、…...

全文降AI率为什么比手动改更安全?深度解读背后逻辑

全文降AI率为什么比手动改更安全?深度解读背后逻辑 每年毕业季,都有大量同学在降AI率这件事上踩坑。最常见的情况是:辛辛苦苦手动改了好几天,结果AI率反而升了,或者降了但论文被改得面目全非,导师看完一脸懵…...

WorkshopDL:5分钟掌握跨平台Steam创意工坊模组下载的终极方案

WorkshopDL:5分钟掌握跨平台Steam创意工坊模组下载的终极方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在Epic Games Store或GOG平台购买了游戏&#x…...

如何在Windows上轻松构建词法语法分析器:WinFlexBison完整指南

如何在Windows上轻松构建词法语法分析器:WinFlexBison完整指南 【免费下载链接】winflexbison Main winflexbision repository 项目地址: https://gitcode.com/gh_mirrors/wi/winflexbison 如果你正在Windows平台上开发编译器或解释器,那么WinFle…...

Python Web开发入门(二十四)Python观察者模式与发布订阅模式:从紧耦合到事件驱动架构的演进之路

当订单系统新增一个“推送微信模板消息”需求时,看着已有500行代码的 place_order 函数,我突然意识到:每次业务扩张都要修改核心逻辑,这种“if-elif地狱”终将导致系统不可维护。从传统观察者模式到现代化发布订阅架构,我花了9年时间探索事件驱动的最佳实践。本文带你深入…...

如何一键解锁网易云音乐NCM格式:ncmdumpGUI完整使用指南

如何一键解锁网易云音乐NCM格式:ncmdumpGUI完整使用指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&am…...

告别手写UI!用Gui Guider 1.6 + LVGL 8.3,5分钟拖拽出你的第一个嵌入式界面

从零到一:用Gui Guider 1.6与LVGL 8.3快速构建嵌入式UI的实战指南 在嵌入式开发领域,用户界面(UI)设计往往是最耗时的环节之一。传统的手写代码方式不仅效率低下,还需要开发者深入掌握图形库的复杂API。而如今,借助Gui Guider这样…...

智能游戏助手:OnmyojiAutoScript如何彻底改变你的阴阳师游戏体验

智能游戏助手:OnmyojiAutoScript如何彻底改变你的阴阳师游戏体验 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 还在为阴阳师的日常任务感到疲惫吗?每天…...

Qwen3.5-2B模型轻量化原理剖析:适合移动与边缘计算

Qwen3.5-2B模型轻量化原理剖析:适合移动与边缘计算 1. 轻量化模型的崛起背景 在AI技术快速发展的今天,大模型展现出了惊人的能力,但同时也面临着计算资源消耗大、部署成本高等问题。特别是在嵌入式设备和边缘计算场景中,传统的百…...

Web安全攻防实战:常见漏洞分析与防御策略

基于最新的Web安全攻防资料,我为您整理了一份全面的常见漏洞分析与防御策略指南。以下是核心内容: 一、常见Web安全漏洞分析 1. SQL注入漏洞 原理:攻击者通过在用户输入中插入恶意SQL语句,利用应用程序未对输入进行充分验证的缺陷…...

本科生论文“求生”指南:我用百考通AI,通关了查重与AIGC检测

写在前面:如果你也正在为毕业论文的“双重审判”——查重率与AIGC(AI生成内容)检测率——而焦虑失眠,那么这篇经验分享,或许能为你照亮一条更清晰、更稳妥的路径。本文将带你深度了解一款我亲身使用、并认为切实有效的…...

Qwen3-4B开源大模型部署教程:device_map=‘auto‘适配全系GPU

Qwen3-4B开源大模型部署教程:device_mapauto适配全系GPU 1. 项目概述 Qwen3-4B Instruct-2507是阿里通义千问团队推出的纯文本大语言模型,专门针对文本处理场景进行了深度优化。这个版本移除了视觉相关的冗余模块,专注于代码编写、文案创作…...

深度解析League Akari:基于LCU API的模块化英雄联盟客户端工具集架构

深度解析League Akari:基于LCU API的模块化英雄联盟客户端工具集架构 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari…...

FUTURE POLICE语音模型Ubuntu 20.04部署全流程详解

FUTURE POLICE语音模型Ubuntu 20.04部署全流程详解 想试试那个能生成未来感、赛博朋克风格语音的FUTURE POLICE模型吗?自己动手在服务器上部署,听起来好像挺复杂,又是系统环境,又是GPU驱动,还有各种依赖包。别担心&am…...

2025网盘下载终极解决方案:八大平台直链解析助手完整使用指南

2025网盘下载终极解决方案:八大平台直链解析助手完整使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…...

【完整源码+数据集+部署教程】交通锥检测检测系统源码 [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

背景意义 随着城市化进程的加快,交通管理面临着日益严峻的挑战。交通锥作为一种重要的交通管理工具,广泛应用于道路施工、交通引导及安全防护等场景。其有效的使用不仅能够提高道路安全性,还能减少交通事故的发生。因此,开发一个高…...

AutoRunner365自动化测试工具保姆级安装指南(附注册流程详解)

AutoRunner365自动化测试工具从安装到实战的全流程解析 对于现代软件开发团队来说,自动化测试已经成为提升交付效率的关键环节。作为国内知名的测试工具之一,AutoRunner365凭借其友好的操作界面和稳定的测试性能,赢得了众多测试工程师的青睐。…...

WarcraftHelper:魔兽争霸III现代化兼容性修复与性能优化解决方案

WarcraftHelper:魔兽争霸III现代化兼容性修复与性能优化解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经典的即…...

如何在3分钟内完成原神成就导出?YaeAchievement工具完整指南

如何在3分钟内完成原神成就导出?YaeAchievement工具完整指南 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 还在为手动记录原神成就而烦恼吗?每次想要整理自己的成…...

Win11一键部署OpenClaw 无需命令行本地AI智能体搭建

前言 OpenClaw(小龙虾)是2026年现象级的本地AI自动化工具,不需要联网、不需要云端账号,只靠自然语言指令就能让AI自动帮你处理电脑上的所有重复工作。 安装前重要提醒(99% 失败都源于这里) ⚠️ 安装 / …...

实习07-混合大模型的学习

1 看架构(Configuration 配置文件) 首先,拿到代码,看配置文件里面的架构选型,其中 configuration.py 文件里面包含了模型每层的选型,以下是 layer 构建的代码: @propertydef layers_block_type(self):"""Returns a list of block types for each layer.…...

联邦学习实战:如何用Python快速搭建个性化推荐系统(附代码)

联邦学习实战:用Python构建隐私安全的个性化推荐系统 推荐系统早已渗透进我们数字生活的每个角落,从电商平台的"猜你喜欢"到视频网站的"推荐观看",背后都离不开算法的精准预测。但你是否想过,这些系统在收集和…...

如何用3秒将原神成就数据变成你的数字资产:YaeAchievement深度探索

如何用3秒将原神成就数据变成你的数字资产:YaeAchievement深度探索 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 想象一下,你在提瓦特大陆征战数百小时&#xff0…...

深入解析nvidia-smi命令:从GPU监控到显存优化实战

1. 认识nvidia-smi:GPU管理的瑞士军刀 第一次接触nvidia-smi是在大学实验室的服务器上,当时看着满屏跳动的数字完全摸不着头脑。现在回想起来,这个看似简单的命令行工具,其实是管理GPU资源最实用的利器。nvidia-smi全称NVIDIA Sys…...

运维人必备:用Docker Compose一键部署LibreSpeed,打造企业内部网络质量监控看板

企业级网络监控实战:基于Docker Compose与LibreSpeed构建智能测速平台 当企业网络规模扩张到数百个节点时,传统的"救火式"运维模式往往力不从心。某跨国公司的SRE团队曾发现,其亚太区办公室在每天上午10点的视频会议期间频繁出现卡…...