免费POC, 零成本试错
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


我要投稿

跟我学LangChain:提示词模板,PromptTemplate包装器,工程化管理你的提示词

发布日期:2025-12-26 20:22:45 浏览次数: 1514
作者:StarkLi

微信搜一搜,关注“StarkLi”

推荐语

LangChain提示词模板帮你告别混乱的字符串拼接,实现Prompt工程化管理,提升LLM应用开发效率。

核心内容:
1. LangChain提示词模板的设计思想与核心价值
2. PromptTemplate和ChatPromptTemplate的基础用法解析
3. 通过FewShotPromptTemplate实现标准化、模块化提示词构建

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

在开发基于大语言模型(LLM)的应用时,常常会面临两个挑战:一是,如何将复杂的用户输入、上下文指令和任务示例,组合成模型能理解的提示词(Prompt);二是,在应用迭代中,如何避免 Prompt 代码的散落和重复,实现高效复用与维护。

早期的“字符串拼接”方式脆弱且混乱,而手工编写的 Prompt 也难以保证一致性与最佳效果。这正是 LangChain 提示词模板(Prompt Templates) 所要解决的根本问题,想要将 Prompt 从“一段文本”提升为“一个可管理、可组合、可测试的工程化组件”的关键模块。

本文将系统剖析 LangChain 提示词模板的设计思想与使用实践。不仅可以了解到 PromptTemplate 和 ChatPromptTemplate 等基础模板的用法,更能掌握如何通过 FewShotPromptTemplate 注入示例、利用管道组合复杂流程,从而构建出标准化、模块化且易于迭代的LLM应用



01

LangChain 的提示词模板


在 LangChain 中使用提示词模板,是一个将零散的指令和变量,标准化、模块化为可复用组件的过程

在 LangChain 框架中,提示词是由 PromptTemplate 这个包装器对象生成的。每一个 PromptTemplate 类的实例都定义了一种特定类型的提示词格式和生成规则。想要构造提示词,就要学会使用这个包装器的使用。

一般会包含以下 3 个元素:
(1)明确的指令:指导大模型理解用户的需求,并按照特定的方式进行回应。
(2)少量示例:帮助大模型更好地理解任务,并生成更专缺的响应。
(3)用户输入:用户的交互内容,可以直接引导大模型生成特定回应。

1、提示词模板的输入

    在 LangChain 中,开发这向提示词模板殊途的数据有很多来源,可以分为内部数据和外部数据。

    内部数据是指被 LangChain 框架封装好的数据,以及开发者写的案例和需求描述文本,这些提示词被预先定义在源码 prompt.py 文件中,使用时导入即可。

    外部数据是指开发者自由添加的数据。最主要的外部数据是用户的输入、用户和模型的历史聊天记录,以及开发者额外增加的知识库、运行的上下文信息等。

    2、提示词模板的输出

      在 LangChain 中,提示词模板输出的是适用于各种模型平台 API 类型的提示词。可以这样理解,当开发者调用 ChatGPT API 接口时,本来是需要按照接口规范进行对接,现在 LangChain 框架已经封装好了,在调用时 PromptTemplate 包装器会生成符合 API 要求的提示词。


      02


      PromptTemplate 包装器


      1、PromptTemplate 包装器
      PromptTemplate 是 LangChain 提示词组件中最核心的一个类,构造提示词的步骤本质上是实例化这个类的过程。PromptTemplate 包装器接受内部数据(实例化定义的 template 和 input_variables)和外部数据,在使用链调用时,外部数据是通过链组件传递的,不是直接传递给提示词模板包装器的。

      from langchain import PromptTemplate
      template = """你是一个旅游专家,请根据用户提出的描述:{msg},给出建议。"""
      # 实例化模板的第一种方式prompt = PromptTemplate(template=template, input_variables=["msg"])# 实例化模板的第二种方式# prompt = PromptTemplate.from_template(template)
      # 将用户的输入通过 format 方法嵌入提示词模板,并且做格式化处理final_prompt = prompt.format(msg="xxx")print(final_prompt)

      运行后:


      2、ChatPromptTemplate 包装器
      ChatPromptTemplate 包装器与 PromptTemplate 包装器不同,ChatPromptTemplate 的构造的提示词是消息列表,支持输出 Message 对象。

      LangChain 提供了内置的聊天提示词模板和角色消息提示词模板。角色消息提示词模板包括 AIMessagePromptTemplate、SystemMessagePromptTemplate、HumanMessagePromptTemplate 这3种。

      from langchain.prompts import (    ChatPromptTemplate,    PromptTemplate,    SystemMessagePromptTemplate,    AIMessagePromptTemplate,    HumanMessagePromptTemplate)
      template = """你是一个旅游专家。"""
      system_message_prompt = SystemMessagePromptTemplate.from_template(template)
      human_template = "请根据用户提出的描述:{msg},给出建议"human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
      chat_prompt = ChatPromptTemplate.from_messages([        system_message_prompt,        human_message_prompt    ])
      final_prompt = chat_prompt.format_prompt(msg="xxx")
      print(final_prompt.to_string())

      运行后(与上面是一样的效果,可以对比下):


      3、FewShotPromptTemplate 包装器
      FewShotPromptTemplate 是 LangChain 内置的一个少样本提示词模板,其独特在于支持动态添加示例和选择示例

      FewShotPromptTemplate 类在参数上多了一些内容,比如 examples 和 example_selector,这些参数可以在实例化时添加,也可以在运行时动态添加

      from langchain.prompts import FewShotPromptTemplate
      template = """词语:{input},反义词是:{output}"""
      example_prompt = PromptTemplate(template=template, input_variables=["input""output"])
      examples = [    {"input""高""output""矮"},    {"input""胖""output""瘦"},    {"input""黑""output""白"},]
      few_shot_prompt = FewShotPromptTemplate(    examples=examples,    example_prompt=example_prompt,    prefix="来玩个游戏,我说正义词,你回答它的反义词",    suffix="现在轮到你了,正义词:{input},反义词",    input_variables=["input"])
      final_prompt = few_shot_prompt.format(input="高")print(final_prompt)

      运行后:


      4、PipelinePromptTemplate 包装器
      PipelinePromptTemplate 是 LangChain 中用于组合串联多个子提示模板的高级工具。它的核心设计思想是 “分治”与“组装”,将一个复杂的提示工程任务,拆解为多个逻辑独立、可复用的子模板,再像管道一样将它们有序地连接,形成最终的完整提示。
      from langchain.prompts import PromptTemplate
      # 1. 角色定义模板:定义助手的基本身份和风格role_template = """你是一名{company}的{style}技术支持专家。你必须根据提供的产品知识库和对话历史来回答问题。如果知识库中没有相关信息,请如实告知,切勿编造。"""
      role_prompt = PromptTemplate.from_template(role_template)
      # 2. 知识库模板:从外部系统查询并注入相关知识kb_template = """【相关产品知识】{knowledge_base}"""
      kb_prompt = PromptTemplate.from_template(kb_template)
      # 3. 历史对话模板:管理多轮对话的上下文history_template = """【对话历史】{dialog_history}"""
      history_prompt = PromptTemplate.from_template(history_template)
      # 4. 当前问题模板:格式化用户的最新输入question_template = """【用户当前问题】{human_input}"""
      question_prompt = PromptTemplate.from_template(question_template)
      # 定义最终提示的“总装图纸”final_template = """{role_instruction}{knowledge_context}{conversation_context}请基于以上信息,专业、清晰地回答用户问题:{final_question}"""
      final_prompt = PromptTemplate.from_template(final_template)
      # 创建 PipelinePromptTemplate,建立子模板到最终模板变量的映射关系from langchain.prompts import PipelinePromptTemplate
      pipeline_prompt = PipelinePromptTemplate(final_prompt=final_prompt, # 指定最终组装的模板pipeline_prompts=[# 格式: (在final_prompt中的变量名, 对应的子模板)        ("role_instruction", role_prompt),        ("knowledge_context", kb_prompt),        ("conversation_context", history_prompt),        ("final_question", question_prompt)    ])# 准备输入变量(通常来自应用的不同模块)input_data = {  "company""天颖科技",  "style""耐心且专业",  "knowledge_base""产品‘天颖AI’支持OCR等功能。最新版本为v2。",  "dialog_history""用户:天颖AI支持什么功能?\n助手:支持图生图功能。",  "human_input""那它的最新版本是多少?"}
      # 格式化管道提示,引擎会自动按顺序调用所有子模板并组装full_prompt_text = pipeline_prompt.format(**input_data)print(full_prompt_text)

      运行后:


      可以看出在复杂的情形下,需要用到组合模板。


      03


      技巧与避坑


      1、小技巧
      (1)优先使用 from_template 方法
      这是最简洁的创建方式,能自动提取变量名,避免手动声明 input_variables 的错误。
      # 推荐prompt = PromptTemplate.from_template(“翻译成{language}:{text}“)
      # 繁琐且易错prompt = PromptTemplate(input_variables=[“language“, “text“], template=“...”)

      (2)为变量提供清晰的描述或示例
      在模板注释或变量名中说明期望的输入,这对协作非常有帮助。
      template = """角色:{role_description}   # 例如:'一位严格的历史老师'任务:根据以下大纲,生成一份{output_length}的课程讲义。大纲:{outline}"""

      2、常见陷阱
      (1)变量不匹配:确保 format() 时提供的变量名与模板中定义的完全一致。善用 .partial() 可以减少此类错误。
      (2)特殊字符转义:如果模板内容中包含 { 或 } 但不作为变量,需根据模板格式(f-string 或 Jinja2)进行正确转义。
      (3)忘记调用 .to_messages():使用 ChatPromptTemplate 格式化后,发送给模型前务必调用 .to_messages(),而不是直接传递字符串。

      之前看到有留言说到 LangChain1.0 版本问题,因为 1.0 版本今年下半年刚升级,有很多存量项目还是以前的版本,后续也会更新 LangChain1.0 相关文章,其实主要还是以思想为主,编程思想更重要。

      辛勤创作,用心分享,请大家打赏三五块,是对我持续创作的支持

      如果您有AI应用困难,如果您有企业AI需求,欢迎关注交流。持续分享实企业AI解决方案、电商应用、模型定制、RPA等实战经验。致力为中小企业提供实用的企业级AI解决方案!

      推荐阅读
      跟我学LangChain:模型包装器,一站式解锁多平台AI能力
      跟我学LangChain:入门指南,基于LLM构建强大AI应用的“魔法框架”
      开发实测:豆包编程模型Doubao-Seed-Code+Claude Code实现商品列表页,国内首个视觉编程模型,极致性价比
      Agent平台选型:Coze、difyManus与GPTs如何选择?" data-itemshowtype="0" linktype="text" data-linktype="2">AI Agent平台选型:Coze、Dify、Manus与GPTs如何选择?
      细说Prompt:有哪些提示词设计方法?主流的提示词框架有哪些?
      MCP在企业中的应用场景和实现思路" data-itemshowtype="0" linktype="text" data-linktype="2">一文看懂:AI Agent是什么?智能体融合MCP在企业中的应用场景和实现思路
      一文掌握:AI Agent Prompt是什么?智能体Prompt如何设计?
      DeepSeek构建会思考的企业知识库!" data-itemshowtype="0" linktype="text" data-linktype="2">【AI实战系列】每天5分钟、学习AI知识:企业知识管理混乱?RAG+LangChain+DeepSeek构建会思考的企业知识库!

      53AI,企业落地大模型首选服务商

      产品:场景落地咨询+大模型应用平台+行业解决方案

      承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

      联系我们

      售前咨询
      186 6662 7370
      预约演示
      185 8882 0121

      微信扫码

      添加专属顾问

      回到顶部

      加载中...

      扫码咨询