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/8/10 3:03:36 阅读更多 →
常州大型工业吊扇:高效节能,为企业省电又省钱

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

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

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

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

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

2026/8/17 10:48:19 阅读更多 →

最新新闻

智能体决策可重构性实践:基于锚点实现跨SDK决策追溯

智能体决策可重构性实践:基于锚点实现跨SDK决策追溯

1. 项目缘起:从“黑盒”到“白盒”的决策追溯困境在智能体(Agent)开发领域,尤其是当我们深度集成来自不同供应商的SDK来构建复杂决策系统时,一个长期困扰开发者和算法工程师的痛点日益凸显:我们常常无法清晰…

2026/8/18 6:55:17 阅读更多 →
Git全流程开发指南:从配置到协作最佳实践

Git全流程开发指南:从配置到协作最佳实践

1. Git贡献全流程概述作为一个分布式版本控制系统,Git已经成为现代软件开发中不可或缺的工具。无论是个人项目还是团队协作,掌握完整的Git贡献流程都是程序员必备的核心技能。这套流程不仅仅是一系列命令的堆砌,更是一种高效协作的方法论。在…

2026/8/18 6:55:17 阅读更多 →
STM32串口中断接收:从轮询到中断的实战指南与避坑技巧

STM32串口中断接收:从轮询到中断的实战指南与避坑技巧

1. 从“轮询”到“中断”:为什么串口通信必须迈出这一步如果你刚开始接触STM32的串口通信,大概率是从HAL库的HAL_UART_Transmit和HAL_UART_Receive这两个函数入门的。它们简单直接:调用Transmit,程序就卡在那里,直到所…

2026/8/18 6:55:17 阅读更多 →
智能体原生组织设计:构建流体协作与刚性记录的分层框架

智能体原生组织设计:构建流体协作与刚性记录的分层框架

1. 从“流体”与“刚性”的悖论谈起:为什么传统组织设计在智能体时代失灵了最近和几位在搞AI Agent创业的朋友聊天,大家普遍被一个看似矛盾的问题困扰:一方面,我们构建的Agent组织需要像流体一样灵活,能根据任务流实时…

2026/8/18 6:55:17 阅读更多 →
混合Max与Sum类型Agent的防策略设施选址与委员会选举机制设计

混合Max与Sum类型Agent的防策略设施选址与委员会选举机制设计

1. 问题背景:当“公平选址”遇上“委员会选举”在算法机制设计这个领域里,有两个看似不同但底层逻辑相通的核心问题:设施选址和委员会选举。乍一听,一个像是城市规划部门要考虑的“把医院建在哪里能让居民看病最方便”&#xff0c…

2026/8/18 6:55:17 阅读更多 →
Python自动化金融信息监控:构建英格兰银行公告抓取机器人

Python自动化金融信息监控:构建英格兰银行公告抓取机器人

1. 项目概述:什么是Python BOE Bot?如果你在金融、交易或者数据分析圈子里混过一阵子,大概率听说过“BOE”这个词。它不是什么新潮的缩写,而是指“Bank of England”,也就是英格兰银行。对于全球金融市场,尤…

2026/8/18 6:54:17 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →