一、核心概念:什么是 Few-shot Prompting?
定义
少样本提示(Few-shot Prompting) 是一种通过在提示中提供少量"输入-输出"示例(即"few-shot examples"),来引导大语言模型(LLM)按照指定风格或逻辑回答新问题的技术。
目标
- 让 LLM 学会某种特定的响应模式(如语气、格式、推理步骤)
- 不需要重新训练模型,仅靠提示即可调整行为
- 提升模型对复杂任务的理解能力(如分类、翻译、问答)
作用
| 功能 | 说明 |
|---|---|
| 指导意图 | 帮助模型理解用户期望的回答风格 |
| 引导推理 | 显式展示如何处理类似问题 |
| 控制输出格式 | 确保输出符合预期结构(如 JSON、列表等) |
示例:让模型总是以"美女,..."开头回答问题
二、Few-shot Prompt 实现机制
LangChain 提供了专门的类来支持少样本提示:
| 类型 | 适用场景 | 对应模板类 |
|---|---|---|
| 文本模型(BaseLLM) | 单次文本推理 | FewShotPromptTemplate |
| 聊天模型(ChatModel) | 多轮对话交互 | FewShotChatMessagePromptTemplate |
三、示例1:使用 FewShotPromptTemplate(文本模型)
代码解析
from langchain_core.prompts.few_shot import FewShotPromptTemplate
from langchain_core.prompts import PromptTemplate
examples = [
{
"question": "你好吗?",
"answer": "美女,我很好"
},
{
"question": "今天周几?",
"answer": "美女,今天星期二"
},
{
"question": "天气好吗?",
"answer": "美女,是的,今天天气很好"
}
]
example_prompt = PromptTemplate.from_template(
template="问题:{question}\n答案:{answer}"
)
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="问题:{input}",
input_variables=["input"]
)
print(prompt.format(input="明天星期几?"))
输出结果:
问题:你好吗?
答案:美女,我很好
问题:今天周几?
答案:美女,今天星期二
问题:天气好吗?
答案:美女,是的,今天天气很好
问题:明天星期几?
分析:
examples:包含多个"输入-输出"对example_prompt:定义每个示例的格式(如"问题:xxx\n答案:yyy")suffix:表示新输入的位置(待填入)input_variables:声明变量名(此处为"input")
四、示例2:结合本地 LLM 使用 FewShotPromptTemplate
完整流程
from langchain_core.prompts.few_shot import FewShotPromptTemplate
from langchain_core.prompts import PromptTemplate
from langchain_ollama.llms import OllamaLLM
llm = OllamaLLM(model="qwen3:4b")
# 定义示例数据:包含问题和答案的字典列表
examples = [
{"question": "你好吗?", "answer": "美女,我很好"},
{"question": "今天周几?", "answer": "美女,今天星期二"},
{"question": "天气好吗?", "answer": "美女,是的,今天天气很好"}
]
# 创建示例模板:定义如何格式化每个示例
example_prompt = PromptTemplate.from_template("问题:{question}\n答案:{answer}")
# 创建少样本提示词模板
few_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="你是一个礼貌的助手,总是以'美女'开头回答问题。以下是示例:\n",
suffix="问题:{input}\n答案:",
input_variables=["input"]
)
formatted_prompt = few_prompt.format(input="明天星期几?")
print(formatted_prompt)
print("*" * 100)
res = llm.invoke(formatted_prompt)
print(res)
输出结果:
你是一个礼貌的助手,总是以'美女'开头回答问题。以下是示例:
问题:你好吗?
答案:美女,我很好
问题:今天周几?
答案:美女,今天星期二
问题:天气好吗?
答案:美女,是的,今天天气很好
问题:明天星期几?
答案:
****************************************************************************************************
美女,明天星期三
prefix:添加上下文描述(如角色设定)suffix:包含用户输入,并预留输出位置- 最终提示词由
prefix + 示例 + suffix组成
五、示例3:用于聊天模型的 FewShotChatMessagePromptTemplate
代码解析
from langchain_core.prompts import (
ChatPromptTemplate,
FewShotChatMessagePromptTemplate
)
from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen3:8b", base_url="http://localhost:11434")
examples = [
{"question": "你好吗?", "answer": "美女,我很好"},
{"question": "今天周几?", "answer": "美女,今天星期二"},
{"question": "天气好吗?", "answer": "美女,是的,今天天气很好"}
]
# 定义每个示例的消息格式
example_prompt = ChatPromptTemplate.from_messages([
("human", "{question}"),
("ai", "{answer}")
])
# 创建少样本提示模板
few_shot_prompt = FewShotChatMessagePromptTemplate(
example_prompt=example_prompt,
examples=examples
)
# 构建最终提示(含系统指令 + 少样本 + 用户输入)
final_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个礼貌的助手,总是以'美女'开头回答问题。"),
few_shot_prompt,
("human", "{input}")
])
# 格式化并调用
messages = final_prompt.format_messages(input="明天星期几?")
print(messages)
print("*" * 100)
res = llm.invoke(messages)
print(res)
输出结果:

[SystemMessage(content="你是一个礼貌的助手,总是以'美女'开头回答问题。", additional_kwargs={}, response_metadata={}), HumanMessage(content='你好吗?', additional_kwargs={}, response_metadata={}), AIMessage(content='美女,我很好', additional_kwargs={}, response_metadata={}), HumanMessage(content='今天周几?', additional_kwargs={}, response_metadata={}), AIMessage(content='美女,今天星期二', additional_kwargs={}, response_metadata={}), HumanMessage(content='天气好吗?', additional_kwargs={}, response_metadata={}), AIMessage(content='美女,是的,今天天气很好', additional_kwargs={}, response_metadata={}), HumanMessage(content='明天星期几?', additional_kwargs={}, response_metadata={})]
****************************************************************************************************
content='美女,明天是星期三' additional_kwargs={} response_metadata={'model': 'qwen3:8b', 'created_at': '2025-12-21T14:00:01.442018Z', 'done': True, 'done_reason': 'stop', 'total_duration': 31613376600, 'load_duration': 275564000, 'prompt_eval_count': 91, 'prompt_eval_duration': 595258000, 'eval_count': 107, 'eval_duration': 30640268300, 'model_name': 'qwen3:8b'} id='run--37288b93-6c39-449d-b9a4-1ff454bd6a51-0' usage_metadata={'input_tokens': 91, 'output_tokens': 107, 'total_tokens': 198}
六、关键组件详解
| 组件 | 说明 | 示例 |
|---|---|---|
examples |
输入-输出对列表 | [{"question": "...", "answer": "..."}] |
example_prompt |
定义单个示例的格式 | PromptTemplate 或 ChatPromptTemplate |
prefix |
提示词前缀(可选) | 角色设定、指令说明 |
suffix |
提示词后缀(含输入变量) | "问题:{input}" |
input_variables |
变量列表 | ["input"] |
format() / format_messages() |
生成最终提示 | 用于文本/聊天模型 |
七、对比总结:文本 vs 聊天模型
| 特性 | FewShotPromptTemplate(文本) |
FewShotChatMessagePromptTemplate(聊天) |
|---|---|---|
| 适用模型 | OllamaLLM, OpenAI 非聊天接口 |
ChatOllama, ChatOpenAI |
| 输入类型 | str |
List[BaseMessage] |
| 格式化方法 | .format() |
.format_messages() |
| 示例格式 | PromptTemplate |
ChatPromptTemplate |
| 是否支持角色 | 不支持 | 支持 system/human/ai |
推荐:
- 若只需简单问答 → 使用
FewShotPromptTemplate- 若需多轮对话 → 使用
FewShotChatMessagePromptTemplate
八、最佳实践建议
- 明确任务目标:确定是否需要控制输出风格或逻辑
- 选择合适的模板类 :根据模型类型决定使用哪种
FewShot*Template - 设计清晰的示例:确保每个示例都体现期望的输出模式
- 合理设置 prefix 和 suffix:增强上下文信息
- 避免过多示例:一般 3~5 个即可,太多会增加 token 开销
九、扩展应用方向
| 应用场景 | 说明 |
|---|---|
| 风格迁移 | 让模型模仿特定语气(如正式、幽默、礼貌) |
| 格式化输出 | 强制输出为 JSON、表格、Markdown 等 |
| 逻辑推理引导 | 展示分步推理过程(如数学题解法) |
| 任务分类 | 提供不同类别问题的示例,辅助分类判断 |
结论
Few-shot prompting 是提升大模型可控性的关键技术之一 。
LangChain 通过
FewShotPromptTemplate和FewShotChatMessagePromptTemplate提供了强大的工具支持,使得开发者可以轻松构建具备"学习能力"的提示系统。
掌握要点:
- 理解
examples、example_prompt、prefix、suffix的作用 - 区分文本模型与聊天模型的使用差异
- 合理设计示例以引导模型行为