LangChain 学习第 2 课 - 提示词模板(Prompt Template)

本节课学到:

  1. PromptTemplate:纯文本模板(传统"补全式"模型风格,也适合拼长文本);
  2. ChatPromptTemplate:聊天消息模板,支持 system / human 多角色(最常用);
  3. FewShotChatMessagePromptTemplate:少样本示例,用几个例子"教"模型按格式输出;
  4. 模板本身不会调用模型,它只负责"拼提示词",拼好后再交给 LLM。
python 复制代码
"""
02 提示词模板(Prompt Template)------ LangChain 学习第 2 课
==========================================================

本节课你会学到:
  1. PromptTemplate:纯文本模板(传统"补全式"模型风格,也适合拼长文本);
  2. ChatPromptTemplate:聊天消息模板,支持 system / human 多角色(最常用);
  3. FewShotChatMessagePromptTemplate:少样本示例,用几个例子"教"模型按格式输出;
  4. 模板本身不会调用模型,它只负责"拼提示词",拼好后再交给 LLM。

运行方式:
    .venv\\Scripts\\python examples\\02_prompt_template.py
"""

import sys
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent.parent))

from langchain_core.prompts import (  # 提示词模板全家桶
    ChatPromptTemplate,
    FewShotChatMessagePromptTemplate,
    PromptTemplate,
)
from langchain_core.output_parsers import StrOutputParser  # 把 AIMessage 转成纯字符串

from config import get_chat_model, print_sub, print_title


def demo_prompt_template() -> None:
    """PromptTemplate:纯文本变量替换,用 {} 占位。"""
    print_sub("1. PromptTemplate:纯文本模板")
    # input_variables 会从 {占位符} 自动推断,也可以显式声明
    prompt = PromptTemplate.from_template(
        "我正在学习{language},请给我 3 个适合初学者的练手项目,每个一句话说明。"
    )
    # format() 只是本地字符串替换,不花钱、不调模型
    text = prompt.format(language="Python")
    print(f"拼出来的提示词:\n{text}\n")

    # 真正调用模型(模板 | 模型 是 LCEL 管道写法,第 4 课详讲)
    chain = prompt | get_chat_model(temperature=0.5) | StrOutputParser()
    print("模型回答:")
    print(chain.invoke({"language": "Python"}))


def demo_chat_prompt_template() -> None:
    """ChatPromptTemplate:多角色聊天模板,真实项目 90% 用它。"""
    print_sub("2. ChatPromptTemplate:system + human 多角色模板")
    prompt = ChatPromptTemplate.from_messages(
        [
            # (角色, 内容) 元组形式;角色支持 system / human / ai / placeholder
            ("system", "你是一位资深{role},回答必须通俗易懂,并举一个生活中的类比。"),
            ("human", "{question}"),
        ]
    )

    # invoke 时把所有变量一次性传进去
    messages = prompt.format_messages(
        role="后端架构师",
        question="什么是消息队列?不用它会怎样?",
    )
    print("拼出来的消息列表:")
    for m in messages:
        print(f"  [{type(m).__name__}] {m.content}")

    chain = prompt | get_chat_model(temperature=0.4) | StrOutputParser()
    print("\n模型回答:")
    print(chain.invoke({"role": "后端架构师", "question": "什么是消息队列?不用它会怎样?"}))


def demo_few_shot() -> None:
    """FewShot:给模型看几个标准问答示例,让它"照葫芦画瓢"。"""
    print_sub("3. FewShotChatMessagePromptTemplate:少样本示例(统一输出风格)")

    # 示例数据:每个元素是一组 human 提问 + ai 标准回答
    examples = [
        {"input": "这电影看得我睡着了", "output": "情感:负面 | 理由:观众感到无聊,说明影片不够吸引人"},
        {"input": "特效还行,剧情一塌糊涂", "output": "情感:负面 | 理由:明确批评剧情质量差"},
        {"input": "值回票价,结尾反转没想到", "output": "情感:正面 | 理由:认为值得且赞赏剧情反转"},
    ]

    # 单条示例的模板
    example_prompt = ChatPromptTemplate.from_messages(
        [("human", "{input}"), ("ai", "{output}")]
    )

    # 把示例组装进 few-shot 模板
    few_shot_prompt = FewShotChatMessagePromptTemplate(
        example_prompt=example_prompt,  # 每条示例长什么样
        examples=examples,              # 全部示例数据
    )

    # 最终模板:系统指令 + 几个示例 + 真正的用户输入
    final_prompt = ChatPromptTemplate.from_messages(
        [
            ("system", "你是影评情感分析器,严格模仿示例的格式输出,不要说废话。"),
            few_shot_prompt,  # 把少样本示例插在这里
            ("human", "{input}"),
        ]
    )

    chain = final_prompt | get_chat_model(temperature=0.0) | StrOutputParser()
    user_review = "演员演技在线,但是三个小时实在太长了,中间玩了半小时手机"
    print(f"用户评论:{user_review}")
    print(f"模型输出:{chain.invoke({'input': user_review})}")


def main() -> None:
    print_title("02 提示词模板:PromptTemplate / ChatPromptTemplate / FewShot")
    demo_prompt_template()
    demo_chat_prompt_template()
    demo_few_shot()
    print_sub("本课小结")
    print("模板 = 提示词的可复用模具:变量用 {name} 占位,format/invoke 时填值。")
    print("聊天场景优先用 ChatPromptTemplate;想强制输出格式/风格时用 FewShot 给示例。")
    print("模板只负责拼字符串,调用模型是下一步的事(见 03、04 课)。")


if __name__ == "__main__":
    main()
相关推荐
前进的李工20 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
我真会写代码21 小时前
LangChain 从0入门:模型、消息、Prompt、Tools、记忆、Agent与LangSmith实战
langchain·prompt
正在走向自律1 天前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
CCIE-Yasuo1 天前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
刘胡子大叔1 天前
评测驱动优化:失败样本回流 Prompt 的闭环
人工智能·prompt
La Pulga1 天前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
后台模板学习1 天前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
li星野1 天前
【学习记录】逻辑分析仪完全入门:从品牌方案到采样率、存储深度的核心概念解析
学习
旖旎夜光1 天前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
WEI_YANG_JU1 天前
初中数学教学中合作学习的研究与实践
学习