LangChain 中少样本提示(Few-shot Prompting)

一、核心概念:什么是 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 定义单个示例的格式 PromptTemplateChatPromptTemplate
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

八、最佳实践建议

  1. 明确任务目标:确定是否需要控制输出风格或逻辑
  2. 选择合适的模板类 :根据模型类型决定使用哪种 FewShot*Template
  3. 设计清晰的示例:确保每个示例都体现期望的输出模式
  4. 合理设置 prefix 和 suffix:增强上下文信息
  5. 避免过多示例:一般 3~5 个即可,太多会增加 token 开销

九、扩展应用方向

应用场景 说明
风格迁移 让模型模仿特定语气(如正式、幽默、礼貌)
格式化输出 强制输出为 JSON、表格、Markdown 等
逻辑推理引导 展示分步推理过程(如数学题解法)
任务分类 提供不同类别问题的示例,辅助分类判断

结论

Few-shot prompting 是提升大模型可控性的关键技术之一

LangChain 通过 FewShotPromptTemplateFewShotChatMessagePromptTemplate 提供了强大的工具支持,使得开发者可以轻松构建具备"学习能力"的提示系统。

掌握要点:

  • 理解 examplesexample_promptprefixsuffix 的作用
  • 区分文本模型与聊天模型的使用差异
  • 合理设计示例以引导模型行为
相关推荐
北冥有一鲲7 小时前
LangChain.js:Tool、Memory 与 Agent 的深度解析与实战
开发语言·javascript·langchain
七夜zippoe7 小时前
使用OpenLLM管理轻量级大模型服务
架构·langchain·大模型·kv·轻量
玖日大大21 小时前
LangGraph 深度解析:构建强大智能体的新一代框架
人工智能·语言模型·架构·langchain
Tinero1 天前
LangChain 的核心概念与实现案例
langchain
Mr.朱鹏1 天前
大模型入门学习路径(Java开发者版)下
java·python·学习·微服务·langchain·大模型·llm
哥本哈士奇1 天前
Streamlit + LangChain 1.0 简单实现智能问答前后端
langchain·streamlit
大模型真好玩1 天前
LangGraph1.0速通指南(二)—— LangGraph1.0 条件边、记忆、人在回路
人工智能·langchain·agent
蜂蜜黄油呀土豆1 天前
RAG 的基石:文本嵌入模型与向量数据库
langchain·大语言模型·embedding·向量数据库·rag
vv_5011 天前
大模型 langchain-组件学习(中)
人工智能·学习·langchain·大模型