🌟 LangChain 30 天保姆级教程 · Day 3|PromptTemplate 详解:让 AI 听你的话,精准输出不跑偏!

3 阅读4分钟

系列目标:30 天从 LangChain 入门到企业级部署
今日任务:掌握 PromptTemplateChatPromptTemplate → 构建结构化提示 → 实现可控、可靠、可复用的 AI 响应!


🔍 一、为什么 Prompt 工程是 LangChain 的核心?

大模型就像一个“聪明但自由散漫的学生”——你问“介绍一下 Python”,它可能写一篇万字论文,也可能只回一句“编程语言”。

PromptTemplate 就是你的“考卷模板”

  • 规定回答格式(JSON / 列表 / 表格)
  • 限定回答范围(只说事实,不编造)
  • 提供示例(Few-shot Learning)
  • 设置角色(你是一个客服/翻译/程序员)

✅ 用好 PromptTemplate,AI 才能从“玩具”变成“工具”!


🧱 二、LangChain 中的两种 Prompt 模板

类型适用模型特点推荐场景
PromptTemplate非聊天模型(如 text-davinci-003纯字符串模板老旧 API 或简单任务
ChatPromptTemplate聊天模型(GPT、Qwen、Llama3)✅支持 system/human/ai 多角色消息所有现代应用首选

💡 从 Day 2 开始我们就在用聊天模型(ChatOllama),所以今天重点讲 ChatPromptTemplate


🛠️ 三、基础用法:用模板控制输出格式

场景:用户输入城市名,AI 返回天气 + 建议(结构化文本)

# day3_prompt_template.py
from langchain_ollama import ChatOllama
from langchain_core.prompts import ChatPromptTemplate

# 初始化本地模型(支持中文)
llm = ChatOllama(model="qwen:7b", temperature=0.3)

# 定义模板:{city} 是占位符
template = """
你是一个贴心的旅行助手。
请根据用户提供的城市,用以下格式回答:

【城市】{city}
【天气】晴朗,25°C
【建议】适合穿短袖,记得防晒!

注意:不要添加额外说明,严格按上述格式输出。
"""

# 创建 Prompt 模板
prompt = ChatPromptTemplate.from_template(template)

# 构建简易 Chain(Day 4 会深入)
chain = prompt | llm

# 调用
response = chain.invoke({"city": "杭州"})
print(response.content)

▶️ 输出示例:

【城市】杭州
【天气】多云,22°C
【建议】适合户外散步,带薄外套。

✅ 占位符 {city} 自动被替换,AI 严格遵循格式!


🧪 四、进阶技巧 1:System Message 设定角色

ChatPromptTemplate 支持多消息类型,最常用的是 system + human


from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个严谨的数学老师,只回答计算题,不解释过程。"),
    ("human", "计算:{expression}")
])

chain = prompt | llm
print(chain.invoke({"expression": "123 + 456"}).content)
# 输出:579

🔒 System 消息在对话开始前设定“人格”,对控制行为极其有效!


🧪 五、进阶技巧 2:Few-shot 示例(给 AI 看样题)

当任务复杂时,光靠指令不够,直接给例子更有效!


prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个情感分析器,请判断用户评论的情绪,并返回 'positive' 或 'negative'。"),
    ("human", "这个手机电池太差了,一天充三次电!"),
    ("ai", "negative"),
    ("human", "屏幕超清晰,打游戏特别爽!"),
    ("ai", "positive"),
    ("human", "{comment}")
])

chain = prompt | llm
result = chain.invoke({"comment": "客服态度极差,再也不买了!"})
print(result.content)  # 输出:negative

💡 这就是 Few-shot Prompting,在小模型上效果尤为显著!


🔄 六、动态切换模型?模板不变!

无论你用 OpenAI 还是 Ollama,PromptTemplate 代码完全不用改


# 切换到 OpenAI(只需改这一行)
# from langchain_openai import ChatOpenAI
# llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

# 继续用 Ollama(本地免费)
from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen:7b", temperature=0)

✅ 真正实现“一次编写,多端运行”!


⚠️ 七、避坑指南 & 最佳实践

问题解决方案
AI 忽略格式要求在 system 或模板开头强调:“严格按以下格式回答,不要任何额外文字”
中文模型理解偏差使用 Qwen、GLM 等中文优化模型;示例也用中文
输出包含幻觉(编造数据)加入约束语句:“如果不知道,请回答‘未知’”
温度太高导致不稳定生产环境设 temperature=0
模板太长导致截断控制上下文长度,或使用 trim_extra_tokens(高级功能,后续讲)

🔐 重要原则:永远不要信任 AI 的原始输出!上线前务必做后处理或校验。


📦 八、配套代码结构(GitHub)

text
编辑
langchain-30-days/
├── day1/
│   └── hello_langchain.py
├── day2/
│   └── local_llm.py
└── day3/
    ├── basic_template.py       # 基础模板
    ├── few_shot_example.py     # Few-shot 示例
    └── role_setting.py         # System 角色设定

📝 九、今日小结

  • ✅ 学会了 ChatPromptTemplate.from_template() 基础用法
  • ✅ 掌握了 System Message 设定 AI 角色
  • ✅ 实践了 Few-shot 示例提升准确率
  • ✅ 实现了结构化、可控的 AI 输出
  • ✅ 模板与模型解耦,轻松切换后端