1. 小样本提示(Few-Shot Prompting)回顾
传统做法 |
模板化做法 |
---|---|
手动拼 N 条示例 + 1 条用户提问 |
模板+变量,示例与用户提问一次生成 |
复制粘贴易出错、难维护 |
改一个列表即可增删示例 |
示例格式固定,仅值不同 |
用同一模板重复渲染 |
2. 核心类:FewShotChatMessagePromptTemplate
位置:langchain.prompts.few_shot.FewShotChatMessagePromptTemplate
作用:把示例对话转成消息列表,并可与最终用户提问无缝拼接。
构造参数
• example_prompt:单条示例的模板(ChatPromptTemplate)
• examples:示例数据,列表套字典
3. 动手实战:年龄格式化机器人
3.1 安装 & 环境
pip install langchain langchain-deepseek
export DEEPSEEK_API_KEY=sk-xxxxxxxx
3.2 定义单条示例模板
from langchain.prompts import ChatPromptTemplate
# 一条示例 = 用户问 + AI 答
example_prompt = ChatPromptTemplate.from_messages([
("human", "我叫{name},今年{age}岁,来自{city}。"),
("ai", "{name},{age}岁,{city}市{province}人")
])
3.3 准备若干示例数据
examples = [
{"name": "张三", "age": 23, "city": "合肥", "province": "安徽"},
{"name": "李四", "age": 31, "city": "深圳", "province": "广东"},
{"name": "王五", "age": 19, "city": "成都", "province": "四川"},
]
3.4 创建 Few-Shot 模板
from langchain.prompts import FewShotChatMessagePromptTemplate
few_shot_tmpl = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples
)
3.5 加入最终用户提问
final_prompt = ChatPromptTemplate.from_messages([
few_shot_tmpl, # 3 条示例
("human", "{input}") # 真正的用户提问
])
4. 渲染并调用 DeepSeek
from langchain_deepseek import ChatDeepSeek
llm = ChatDeepSeek(model="deepseek-chat", temperature=0)
prompt_value = final_prompt.invoke({
"input": "我叫赵六,今年27岁,来自杭州"
})
messages = prompt_value.messages
print(messages)
response = llm.invoke(messages)
print(response.content)
5. 动态增删示例
只需改 examples
列表即可:
examples.append(
{"name": "孙七", "age": 42, "city": "武汉", "province": "湖北"}
)
无需改动模板代码。
6. 完整代码
from langchain.prompts import ChatPromptTemplate
from langchain.prompts import FewShotChatMessagePromptTemplate
from langchain_deepseek import ChatDeepSeek
# 一条示例 = 用户问 + AI 答
example_prompt = ChatPromptTemplate.from_messages([
("human", "我叫{name},今年{age}岁,来自{city}。"),
("ai", "{name},{age}岁,{city}市{province}人"),
])
# 准备示例数据
examples = [
{"name": "张三", "age": 23, "city": "合肥", "province": "安徽"},
{"name": "李四", "age": 31, "city": "深圳", "province": "广东"},
{"name": "王五", "age": 19, "city": "成都", "province": "四川"},
]
# Few Shot 模版
few_shot_tmpl = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples
)
# 最终提示词
final_prompt = ChatPromptTemplate.from_messages([
few_shot_tmpl,
("human", "{input}")
])
# 调用deepseek
llm = ChatDeepSeek(model="deepseek-chat", temperature=0)
prompt_value = final_prompt.invoke({
"input": "我叫赵六,今年27岁,来自杭州"
})
# 消息列表
messages = prompt_value.messages
print(messages)
response = llm.invoke(messages)
print(response.content)
7. 常见坑 & 小贴士
变量名必须一致:模板里的
{}
与examples
字典键一一对应。顺序即对话:示例按列表顺序渲染,确保
human
与ai
交替出现。token 开销:示例越多,消耗越长;可在
examples
里做截断或选样。调试技巧:先打印
prompt_value.messages
,确认格式正确再发模型。
8. 速查表
步骤 |
关键代码 |
---|---|
单条示例模板 |
ChatPromptTemplate.from_messages([...]) |
组合示例 |
FewShotChatMessagePromptTemplate(...) |
拼接用户提问 |
ChatPromptTemplate.from_messages([few_shot_tmpl, ("human", "{input}")]) |
渲染 |
prompt = chat_tmpl.invoke({"input": "..."}) |
发模型 |
ChatDeepSeek().invoke(prompt.messages) |