ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【LangChain】核心组件详解:提示词模板(Prompt Template)从入门到实战

2026/8/22 13:38:31 拓冰建站 浏览量
【LangChain】核心组件详解:提示词模板(Prompt Template)从入门到实战 草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. 提示词模板核心概念1.1 什么是提示词模板1.2 提示词模板解决的核心问题二. 字符串模板PromptTemplate2.1 基本使用方法2.2 源码解读三. 聊天消息模板ChatPromptTemplate3.1 基本使用方法3.2 源码解读四. 消息占位符MessagesPlaceholder4.1 基本使用方法4.2 简化写法五. 使用 LangChain Hub 的提示词模板5.1 环境准备5.2 实战使用 Prompt Maker 模板结尾前言在构建大语言模型LLM应用的过程中我们会发现一个非常普遍的问题大量的提示词编写工作都是重复且低效的。比如你可能需要反复写 “请将以下文本翻译成 {语言}”、“请介绍 {城市} 的历史” 这样的句子每次只是替换其中的变量。手动修改不仅容易出错还难以保证提示词风格和结构的一致性。LangChain 提供的提示词模板Prompt Template正是为了解决这个问题而生的核心组件。它允许我们创建可复用的提示词蓝图在运行时动态填充变量从而大幅提升开发效率和应用的可维护性。一. 提示词模板核心概念1.1 什么是提示词模板简单来说提示词模板就是一个带有占位符的提示词蓝图。你可以在模板中定义固定的文本结构和需要动态替换的变量然后在运行时用具体的值填充这些占位符生成最终发送给 LLM 的完整提示词。它的工作原理类似于编程中的字符串格式化功能模板请介绍{city}的历史 填充变量city 西安 最终提示词请介绍西安的历史1.2 提示词模板解决的核心问题提示词模板的出现解决了 LLM 应用开发中的四个关键痛点可复用性只需定义一个模板就可以用于无数个类似的查询避免重复编写相同的提示词关注点分离将提示词的结构和逻辑工程与具体的内容和数据分离开提示工程师专注于优化模板应用程序负责提供变量值一致性确保发送给 LLM 的提示词结构统一有助于获得更稳定、可预测的输出结果可维护性如果需要修改提示词的风格或结构只需修改一个模板文件而不用在代码的无数个地方进行修改二. 字符串模板PromptTemplate字符串模板是最基础也是最常用的提示词模板类型适用于生成简单的文本提示词。2.1 基本使用方法LangChain 提供了PromptTemplate类来实现字符串模板功能它有两种常用的初始化方式方式一使用from_template()方法推荐这是最简洁直观的方式直接从模板字符串创建模板对象fromlangchain_core.promptsimportPromptTemplate# 1. 定义模板prompt_templatePromptTemplate.from_template(Translate the following text into {language}:\n{text})# 2. 实例化模板填充变量promptprompt_template.invoke({language:Chinese,text:Hello, world!})print(prompt.text)# 输出Translate the following text into Chinese:# Hello, world!方式二直接初始化PromptTemplate类这种方式需要显式指定输入变量列表适合需要更精细控制的场景fromlangchain_core.promptsimportPromptTemplate prompt_templatePromptTemplate(input_variables[language,text],templateTranslate the following text into {language}:\n{text})promptprompt_template.invoke({language:French,text:I love programming.})print(prompt.text)# 输出Translate the following text into French:# I love programming.2.2 源码解读PromptTemplate类实现了 LangChain 的标准Runnable接口这意味着它可以像其他组件一样被链式调用。当我们调用invoke()方法时它会执行以下操作验证传入的变量是否与input_variables匹配使用 Python 的字符串格式化机制将变量填充到模板中返回一个StringPromptValue对象包含生成的提示词文本三. 聊天消息模板ChatPromptTemplate对于聊天模型Chat Model简单的字符串模板已经不够用了因为聊天模型的输入是一个包含系统消息、用户消息和助手消息的列表。LangChain 提供了ChatPromptTemplate专门用于构建聊天消息模板。3.1 基本使用方法ChatPromptTemplate允许我们构建包含多种角色消息的模板fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_openaiimportChatOpenAIfromlangchain_core.output_parsersimportStrOutputParser# 定义大模型modelChatOpenAI(modelgpt-4o-mini)# 1. 设置聊天消息模板prompt_templateChatPromptTemplate([(system,You are a professional translator. Translate the text into {language}.),(user,{text})])# 注意在 LangChain 0.2.24 版本后可以直接使用 ChatPromptTemplate() 初始化# 在 0.2.24 版本前需要使用 ChatPromptTemplate.from_messages() 初始化# 2. 实例化模板获取消息列表messagesprompt_template.invoke({language:Chinese,text:What is your name?}).to_messages()print(messages)# 输出# [# SystemMessage(contentYou are a professional translator. Translate the text into Chinese.),# HumanMessage(contentWhat is your name?)# ]# 3. 构建完整的链并调用chainprompt_template|model|StrOutputParser()# 流式输出结果fortokeninchain.stream({language:English,text:你好我叫斯蒂芬很高兴认识你}):print(token,end)# 输出Hello, my name is Stephen, nice to meet you.3.2 源码解读ChatPromptTemplate的invoke()方法会返回一个ChatPromptValue对象它包含了生成的消息列表。我们可以通过to_messages()方法将其转换为标准的 LangChain 消息对象列表SystemMessage、HumanMessage等这些消息对象可以直接传递给聊天模型。四. 消息占位符MessagesPlaceholder在实际应用中我们经常需要在模板的特定位置插入动态的消息列表比如多轮对话的历史记录。这时就需要使用MessagesPlaceholder。4.1 基本使用方法MessagesPlaceholder负责在模板的特定位置插入一个消息列表fromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.messagesimportHumanMessage,AIMessage# 定义包含消息占位符的模板prompt_templateChatPromptTemplate([(system,你是一个 helpful 的聊天助手),MessagesPlaceholder(chat_history),# 消息占位符(user,{question})])# 准备历史消息列表chat_history[HumanMessage(content中国首都是哪里?),AIMessage(content中国首都是北京。),HumanMessage(content那法国呢?)]# 填充模板formatted_promptprompt_template.invoke({chat_history:chat_history,question:那美国呢?})print(formatted_prompt.to_messages())# 输出# [# SystemMessage(content你是一个 helpful 的聊天助手),# HumanMessage(content中国首都是哪里?),# AIMessage(content中国首都是北京。),# HumanMessage(content那法国呢?),# HumanMessage(content那美国呢?)# ]4.2 简化写法除了显式使用MessagesPlaceholder类我们还可以使用更简洁的placeholder语法fromlangchain_core.promptsimportChatPromptTemplate prompt_templateChatPromptTemplate([(system,You are a helpful assistant),(placeholder,{chat_history}),# 简化写法(user,{question})])五. 使用 LangChain Hub 的提示词模板LangChain Hub 是一个用于上传、浏览、拉取和管理提示词的社区平台类似于代码界的 GitHub。它汇集了全球开发者分享的优质提示词模板我们可以直接拉取使用无需从零开始编写。5.1 环境准备申请 LangSmith API Key访问 https://smith.langchain.com/ 注册账号在 Settings 页面创建 API Key配置环境变量LANGSMITH_API_KEY你的 LangSmith API Key安装必要的包pipinstalllangsmith langchain-openai5.2 实战使用 Prompt Maker 模板我们以社区最受欢迎的hardkothari/prompt-maker模板为例它是一个强大的提示词生成器可以自动优化你的提示词fromlangchain_openaiimportChatOpenAIfromlangsmithimportClient# 1. 从 LangChain Hub 拉取提示词模板clientClient()promptclient.pull_prompt(hardkothari/prompt-maker,include_modelTrue)# 2. 定义大模型modelChatOpenAI(modelgpt-4o-mini)# 3. 构建链chainprompt|model# 4. 交互式使用whileTrue:taskinput(\n你的任务是什么?(输入 quit 退出聊天)\n)iftask.lower()quit:breaklazy_promptinput(\n你当前的提示是什么?(输入 quit 退出聊天)\n)iflazy_prompt.lower()quit:breakprint(\n优化后的提示词:)resultchain.invoke({lazy_prompt:lazy_prompt,task:task})result.pretty_print()运行示例你的任务是什么?(输入 quit 退出聊天) 写一个快排代码 你当前的提示是什么?(输入 quit 退出聊天) 开发专家,需中文回复 优化后的提示词: Ai Message 作为一名专注于算法和数据结构的编程专家请用 Python 编写一个详细的快速排序算法实现。 ### 要求 - 代码结构清晰每个步骤都有详细的注释说明 - 包含一个使用示例展示如何使用函数对整数列表进行排序并打印结果 - 实现应注重效率和可读性代码行数不超过 20 行 - 所有输出均使用中文 - 结构清晰便于具有基础编程知识的读者理解 ### 示例格式 python def quick_sort(arr): # 快速排序函数实现 return sorted_arr # 使用示例 unsorted_list [34, 7, 23, 32, 5, 62] print(quick_sort(unsorted_list))结尾 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语提示词模板是 LangChain 应用开发的基础掌握它的使用方法可以让你的代码更加简洁、高效和可维护。在下一篇文章中我们将继续深入学习 LangChain 的另一个核心组件——少样本提示Few-shot Prompting它可以通过提供示例来显著提升 LLM 的任务执行效果。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど