Prompt Template提示词模板
Prompt是与LLM交互的输入用于定义任务目标、背景和输出要求其设计质量直接影响模型效果。在实际业务中输入具有动态性固定Prompt难以复用且适配性有限。为此LangChain引入Prompt Template将静态字符串抽象为可复用模板并通过变量填充在运行时生成Prompt从而提升灵活性与可维护性。有关Prompt的更多内容详见提示词工程指北。PromptTemplate基础文本模板PromptTemplate是最基础的模板类型适用于生成纯文本形式的Prompt其核心能力是通过变量替换实现动态内容生成。PromptTemplate的具体使用见LangChain PromptTemplate 全解析。from langchain_core.prompts import PromptTemplateprompt PromptTemplate.from_template(“请生成一段话{task}”)prompt_text prompt.invoke({“task”: “介绍良好阅读习惯的重要性”}).textresponse chat_model.invoke(prompt_text)print(response.content)这种方式适用于结构简单的单轮任务。但随着任务复杂度提升仅使用PromptTemplate会逐渐暴露出结构不清晰、可控性不足的问题。ChatPromptTemplate对话模板在对话模型场景中直接拼接文本Prompt往往不够清晰因此LangChain提供了ChatPromptTemplate用于按角色组织Prompt结构。from langchain_core.prompts import ChatPromptTemplatechat_prompt ChatPromptTemplate.from_messages([(“system”, “你是一名文言文写作助手输出一段自然流畅的文字”),(“human”, “请完成任务{task}”)])messages chat_prompt.invoke({“task”: “介绍良好阅读习惯的重要性”})response chat_model.invoke(messages)print(response.content)通过显式区分system和human角色可以让Prompt结构更加清晰同时也更贴合对话模型的训练方式。不过当Prompt进一步复杂化时这种方式仍然存在复用困难的问题。https://superml.dev/langchain-prompt-templateMessagePromptTemplate消息模板组件为了支持更复杂的Prompt设计LangChain提供了MessagePromptTemplate将Prompt拆分为更细粒度的组件。from langchain_core.prompts import (ChatPromptTemplate,SystemMessagePromptTemplate,HumanMessagePromptTemplate)chat_prompt ChatPromptTemplate.from_messages([SystemMessagePromptTemplate.from_template(“你是一个擅长写说明性文字的助手输出必须为一段完整的表述”),HumanMessagePromptTemplate.from_template(“请生成一段话{task}”)])messages chat_prompt.invoke({“task”: “介绍良好阅读习惯的重要性”})response chat_model.invoke(messages)print(response.content)在这种方式下不同角色的Prompt可以独立定义并按需组合适用于复杂系统和团队协作开发。但即使结构清晰模型在输出格式上的稳定性仍难以完全保证。FewShotPromptTemplate少样本提示当需要模型稳定输出特定格式或风格时仅依赖Prompt往往不够。FewShotPromptTemplate通过提供示例引导模型模仿既有格式以示例替代规则使输出更加稳定和可预测。关于相关概念及更详细的使用说明可参考Langchain学习入门。简单示例如下from langchain_core.prompts import PromptTemplate, FewShotPromptTemplateexample_template PromptTemplate.from_template(“单词{word}, 英文翻译{translation}”)examples_data [{“word”: “苹果”, “translation”: “apple”},{“word”: “快乐”, “translation”: “happy”}]few_shot_template FewShotPromptTemplate(example_promptexample_template,examplesexamples_data,prefix“请给出一个单词及其英文翻译以下是示例”,suffix“单词{input_word}英文翻译”,input_variables[“input_word”])prompt_text few_shot_template.invoke({“input_word”: “计算机”}).to_string()print(prompt_text)response chat_model.invoke(prompt_text)print(response.content)在对话场景中也可以使用基于消息结构的FewShotChatMessagePromptTemplatefrom langchain_core.prompts import (ChatPromptTemplate,FewShotChatMessagePromptTemplate,)examples [{“input”: “你好”, “output”: “Hello”},{“input”: “谢谢你的帮助”, “output”: “Thank you for your help”},]example_prompt ChatPromptTemplate.from_messages([(“human”, “{input}”),(“ai”, “{output}”),])few_shot_prompt FewShotChatMessagePromptTemplate(example_promptexample_prompt,examplesexamples,)final_prompt ChatPromptTemplate.from_messages([(“system”,“你是一个翻译助手将中文翻译成英文。只输出翻译结果不要提供额外解释。”),few_shot_prompt,(“human”, “{input}”),])chain final_prompt | chat_modelprint(chain.invoke({“input”: “今天天气很好”}).content)print(chain.invoke({“input”: “请稍等一下”}).content)partial方法Prompt部分填充通过模板实现动态生成Prompt后常会遇到固定变量反复传递的问题如目标语言、角色设定或业务背景手动处理既繁琐又易出错。此时可用partial方法预先填入这些固定内容相当于提前构建好一部分Prompt。这样便可通过一个通用模板衍生多个可直接使用的版本简单又高效。from langchain_core.prompts import ChatPromptTemplatetemplate ChatPromptTemplate.from_messages([(“system”, “将以下文本翻译为{target_lang}保留原意”),(“human”, “{text}”)])zh_translator template.partial(target_lang“中文”)en_translator template.partial(target_lang“英文”)result_zh zh_translator.invoke({“text”: “Hello world”})result_en en_translator.invoke({“text”: “你好世界”})print(result_zh.to_messages())print(result_en.to_messages())2.4 Output Parser输出解析器LLM默认返回的是纯字符串而实际开发中为了进行后续处理通常需要结构化数据。为此必须先对模型的输出结果进行解析借助解析器将文本转换为特定的数据结构。在LangChain中这类解析器被定义为Output Parser并提供了多种实现以适配不同的输出格式。解析器名称 作用StrOutputParser 将模型输出直接解析为字符串JsonOutputParser 将模型输出解析为JSON格式的结构化数据CommaSeparatedListOutputParser 将逗号分隔的文本解析为Python列表XMLOutputParser 将模型输出解析为XML格式的结构化数据关于Output Parser的更多介绍见How to Master Output Parsers下面通过一个完整示例演示不同解析器的使用方式from langchain_core.prompts import PromptTemplatefrom langchain_core.output_parsers import (StrOutputParser,JsonOutputParser,CommaSeparatedListOutputParser,XMLOutputParser)1. 字符串解析器StrOutputParser最基础用法str_prompt PromptTemplate.from_template(“用一句话介绍什么是{name}”)str_chain str_prompt | chat_model | StrOutputParser()print(“StrOutput:”, str_chain.invoke({“name”: “LLM”}))2. JSON解析器JsonOutputParser结构化输出json_parser JsonOutputParser()json_prompt PromptTemplate(template“用一句话介绍什么是{name}。\n{format_instructions}”,input_variables[“name”],partial_variables{“format_instructions”: json_parser.get_format_instructions()})json_chain json_prompt | chat_model | json_parserprint(“JSON Output:”, json_chain.invoke({“name”: “LLM”}))3. 列表解析器CommaSeparatedListOutputParser列表结构list_parser CommaSeparatedListOutputParser()list_prompt PromptTemplate(template“列出{name}的3个特点。\n{format_instructions}”,input_variables[“name”],partial_variables{“format_instructions”: list_parser.get_format_instructions()})list_chain list_prompt | chat_model | list_parserprint(“List Output:”, list_chain.invoke({“name”: “LLM”}))4. XML解析器XMLOutputParser层级结构xml_parser XMLOutputParser()xml_prompt PromptTemplate(template“用XML格式输出什么是{name}。\n{format_instructions}”,input_variables[“name”],partial_variables{“format_instructions”: xml_parser.get_format_instructions()})xml_chain xml_prompt | chat_model | xml_parserprint(“XML Output:”, xml_chain.invoke({“name”: “LLM”}))2.5 Runnable的调用方式Runnable是LangChain中的核心执行抽象代表任何可接收输入并产生输出的可执行单元。可以把它理解为一个标准化的接口无论LLM、提示词模板、输出解析器、检索器、工具还是LangGraph定义的工作流只要遵循这一接口规范就都成为了Runnable。这种统一让不同组件可以像积木一样自由拼接和编排从而构建复杂的应用。在LangChain 1.x中这一抽象被进一步统一Prompt、Model、Parser、Retriever以及Tool等核心组件均被明确定义为Runnable。由于遵循相同的输入输出规范一个组件的输出可以直接成为下一个组件的输入实现模块间的无缝衔接与灵活组合。更详细的说明可阅读深入解析Runnable接口的统一、组合与流式处理。统一的执行抽象建立之后核心问题便转向调用方式。Runnable为此提供了一组标准方法以覆盖不同的使用场景方法 说明invoke 同步单次调用stream 流式输出batch 批量处理ainvoke 异步单次调用astream 异步流式输出abatch 异步批量处理下面通过简单示例来介绍这些调用方式的实际用法import asynciodef run_invoke():response chat_model.invoke(“你好”)print(“ invoke ”)print(response.content)print(response.response_metadata)def run_stream():print(“\n stream ”)for chunk in chat_model.stream(“写一篇500字文章”):print(chunk.content, end“”, flushTrue)def run_batch():print(“\n batch ”)responses chat_model.batch([“翻译hello”,“翻译world”,“翻译apple”])for r in responses:print(r.content)async def run_async():print(“\n ainvoke ”)response await chat_model.ainvoke(“异步调用”)print(response.content)print(\n astream ) async for chunk in chat_model.astream(讲一个简短故事): print(chunk.content, end, flushTrue) print() print(\n abatch ) responses await chat_model.abatch([ 异步翻译cat, 异步翻译dog ]) for r in responses: print(r.content)ifname “main”:run_invoke()run_stream()run_batch()asyncio.run(run_async())2.6 Bind方法bind方法解决了一个常见需求同一个模型在不同任务中往往需要不同的运行参数。例如做数学计算时希望输出稳定写文案时又希望富有变化。如果每次都重新实例化模型来切换参数既繁琐又低效。bind的作用就是在一个模型实例上临时附加一组运行参数比如temperature、max_tokens或stop等然后返回一个绑定了这些参数的新对象。该方法不会修改原始模型而是在其基础上生成一个绑定了特定参数的副本从而允许在不重新实例化模型的前提下灵活切换调用行为。这一机制常用于根据任务需求动态调整模型策略例如精确策略绑定temperature0.0, max_tokens200提升输出稳定性与确定性适用于信息抽取、数学计算等对准确性要求较高的任务创意策略绑定temperature0.9, max_tokens1000增强随机性与表达空间适用于写作、对话生成等需要开放创造力的任务。示例bind 生成不同策略的实例原模型不受影响precise_strategy chat_model.bind(temperature0.3, max_tokens200)creative_strategy chat_model.bind(temperature0.9, max_tokens1000)result_precise precise_strategy.invoke(“12*9?”)result_creative creative_strategy.invoke(“写一首关于夏天的诗”)print(“ 精确策略 ”)print(result_precise.content)print(“\n 创意策略 ”)print(result_creative.content)3 核心组件3.1 Chains与LCEL在LangChain中Chain可以理解为一条处理任务的流水线。数据会按照预先设定的步骤依次经过提示词模板、LLM和输出解析器等组件处理最终输出结果。关于Chain的详细介绍可参考LangChain最详细教程之Chains。LCELLangChain Expression Language用于以声明式方式描述这一结构将各组件组合为可执行表达式而不改变底层执行逻辑。最常见的写法是使用管道符|chain prompt | chat_model | parser该表达式自左向右执行prompt生成输入传递至chat_model进行推理再由parser完成结构化处理对应完整的Chain流程。可以理解为Chain定义执行结构LCEL负责表达结构|用于连接各Runnable组件并传递数据流。LangChain中Chains与LCEL的关系可以参考深度拆解LangChain Chains与LCEL。在实现层面参与组合的组件都需要实现Runnable接口。多个组件通过|连接后新的Chain本身仍然是一个Runnable因此既可以继续与其他组件组合也可以通过invoke、stream和batch等方式执行任务。示例from langchain_openai import ChatOpenAIfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.documents import Documentfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.runnables import RunnableLambdaMath Chainmath_prompt ChatPromptTemplate.from_template(“请计算下面数学问题{input}”)math_chain (math_prompt| chat_model| StrOutputParser())print(math_chain.invoke({“input”: “25乘以8等于多少”}))MultiPrompt / Router Chaintranslate_prompt ChatPromptTemplate.from_template(“请翻译下面内容\n{input}”)summary_prompt ChatPromptTemplate.from_template(“请总结下面内容\n{input}”)translate_chain (translate_prompt| chat_model| StrOutputParser())summary_chain (summary_prompt| chat_model| StrOutputParser())def router(x):text x[“input”]if “翻译” in text or “translate” in text.lower():return translate_chainreturn summary_chainrouter_chain RunnableLambda(router)print(router_chain.invoke({“input”: “Technology makes life better.”}))StuffDocumentsChainprompt ChatPromptTemplate.from_template(“请总结下面内容\n{context}”)docs [Document(page_content“LangChain是一个LLM开发框架。”),Document(page_content“它支持Prompt、Chain和Agent。”)]context “\n”.join([doc.page_content for doc in docs])stuff_chain (prompt| chat_model| StrOutputParser())print(stuff_chain.invoke({“context”: context}))

相关新闻

JavaScript数据类型详解:从基础到实践

JavaScript数据类型详解:从基础到实践

1. JavaScript数据类型概述JavaScript作为一门动态弱类型语言,其数据类型系统既有简单直观的一面,也有需要特别注意的细节。理解这些数据类型的特点和区别,是掌握JavaScript编程的基础。在JavaScript中,数据类型可以分为两大类&am…

2026/10/18 2:51:31 阅读更多 →
常州大型工业吊扇:高效节能,为企业省电又省钱

常州大型工业吊扇:高效节能,为企业省电又省钱

常州大型工业吊扇测评测评主体本次测评的主体包括:苏州市百川设备工程有限公司(以下简称“苏州百川”) 对标品牌A 对标品牌B统一测评维度、动作、环境及数据采集方法测评维度:风量、噪音、能耗、安装便捷性、安全性 测试环境&…

2026/10/18 2:53:32 阅读更多 →
独家逆向工程报告:Top5商用字幕API响应延迟对比(含GPU显存占用/并发吞吐/方言识别率),附可复现Benchmark数据集

独家逆向工程报告:Top5商用字幕API响应延迟对比(含GPU显存占用/并发吞吐/方言识别率),附可复现Benchmark数据集

更多请点击: https://kaifayun.com 第一章:AI视频字幕自动生成 AI视频字幕自动生成正迅速成为内容创作者、教育平台与无障碍服务的核心能力。该技术融合语音识别(ASR)、自然语言处理(NLP)和时间对齐算法&a…

2026/10/19 17:46:23 阅读更多 →

最新新闻

多轮对话在线强化学习更新频率怎么定?OpenClaw 框架原理与调参指南

多轮对话在线强化学习更新频率怎么定?OpenClaw 框架原理与调参指南

前两天有朋友问了我一个问题:OpenClaw 这类做多轮对话策略优化的框架,在线强化学习的更新频率到底怎么定?我当时愣了几秒,因为这个问题看着像参数调优,实际问的是整套在线强化学习方案的骨架。更新频率定得太高&#x…

2026/10/20 18:53:55 阅读更多 →
Spring AI Alibaba停更背后,Java开发者入局大模型应用的路径

Spring AI Alibaba停更背后,Java开发者入局大模型应用的路径

消息出来那天,微信群里不少人都在转同一句话:Spring AI Alibaba 停更了。紧接着就是一连串的追问——Java 是不是没希望了?Java 开发者是不是要被时代抛弃了?我第一反应不是跟着焦虑,而是想起这些年看过的无数开源项目…

2026/10/20 18:53:55 阅读更多 →
大模型生成PPT实战:从JSON大纲到python-pptx可编辑文件

大模型生成PPT实战:从JSON大纲到python-pptx可编辑文件

简介:本资源是一套面向开发者与办公人群的大模型生成PPT实战源码包,聚焦如何借助DeepSeek等大模型快速产出结构清晰、逻辑连贯的演示文稿。内容围绕需求描述、Markdown大纲生成、Kimi与通义千问等工具一键转PPT的完整链路展开,适合希望降低PP…

2026/10/20 18:53:55 阅读更多 →
AI时代软件工程:从辅助编码到确定性系统的架构与测试之道

AI时代软件工程:从辅助编码到确定性系统的架构与测试之道

今年我完整跟完一门编号为CS146S的课程,主题就是“AI时代的软件工程”。本来我以为这又是一门教你怎么用AI写代码的工具课,结果越听越发现,它真正在讨论的是另一个问题:当代码的生产方式从“人写”变成“人审、AI写”之后&#xf…

2026/10/20 18:53:55 阅读更多 →
小说漫画漫剧三合一复用架构:低成本IP开发方法论

小说漫画漫剧三合一复用架构:低成本IP开发方法论

1. 项目概述:为什么“小说漫画漫剧”正成为副业新三角?最近三个月,我陆续帮七八个朋友梳理过他们的内容副业路径,发现一个特别有意思的现象:几乎没人再单点押注“写小说”或“画漫画”了,而是不约而同地在问…

2026/10/20 18:53:55 阅读更多 →
Spec-Kit:轻量级规格治理方法论与机器可验证契约实践

Spec-Kit:轻量级规格治理方法论与机器可验证契约实践

1. Spec-Kit 不是“套件”,而是一套被严重误读的规格治理方法论Spec-Kit 这个词在最近三个月的技术社区讨论中出现频次陡增,但翻遍主流技术文档、开源仓库 README 和开发者问答平台,几乎找不到一份权威定义。它既不是 npm 包名,也…

2026/10/20 18:52:54 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →