系列目标:30 天从 LangChain 入门到企业级部署
今日任务:掌握PromptTemplate与ChatPromptTemplate→ 构建结构化提示 → 实现可控、可靠、可复用的 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 输出
- ✅ 模板与模型解耦,轻松切换后端