【LangChain】少样本提示(Few-Shot Prompting)实战指南
少样本提示Few-Shot Prompting实战指南从 LangChain 的 FewShotPromptTemplate 出发理解少样本提示的核心机制与工程落地方法。一、什么是少样本提示少样本提示Few-Shot Prompting是向大语言模型LLM提供少量输入-输出示例引导模型按照示例的格式、风格或推理逻辑来回答新问题的技术。与零样本Zero-Shot直接提问不同少样本通过示范教学让模型照猫画虎显著提升输出的一致性和准确性。二、LangChain 中的 FewShotPromptTemplate2.1 核心组件fromlangchain.promptsimportPromptTemplate,FewShotPromptTemplate# 1. 定义单个示例的格式模板example_template(报警码:{code} 报警信息:{message} 根因分析:{root_cause}处理措施: {action})example_promptPromptTemplate.from_template(example_template)# 2. 准备示例数据字典列表examples[{code:E-616,message:Wp-Mag: chuck not clamped - Feed release MC locked!,root_cause:工件夹紧信号未到位导致进给释放被锁定,action:1. 检查夹具气压 2. 确认工件放置到位 3. 复位夹紧传感器},{code:W-617,message:Robot signal Chucks Closed not dropped during change,root_cause:换料时机器人夹具闭合信号未断开,action:1. 检查机器人IO信号线 2. 确认换料节拍 3. 手动触发信号测试}]# 3. 组装少样本模板promptFewShotPromptTemplate(examplesexamples,# 示例列表example_promptexample_prompt,# 单条示例格式prefix你是一名机床维护专家...,# 系统角色设定suffix现在遇到新报警\n报警码: {code}\n报警信息: {message}\n根因分析\n处理措施,# 实际问题模板input_variables[code,message]# 外部传入变量)# 4. 调用生成完整提示print(prompt.format(codeE-618,messageSpindle overload: current 85A))2.2 生成的 Prompt 结构┌─────────────────────────────────────────┐ │ prefix系统指令角色任务定义 │ ├─────────────────────────────────────────┤ │ 示例1完整输入-输出对 │ │ 示例2完整输入-输出对 │ │ ... │ ├─────────────────────────────────────────┤ │ suffix当前问题只给输入留空输出 │ └─────────────────────────────────────────┘三、示例数据的格式要求3.1 基本规则规则说明Key 匹配字典 key 必须等于 example_prompt 中的 {变量名}字符串值所有值最终会拼接到文本中建议均为 str顺序无关输出顺序由 example_prompt 模板决定数量灵活示例可包含多余变量但模板用到的必须存在3.2 常见错误# 错误key 名不匹配examples[{question:23,answer:5}]# key 是 question/answerexample_prompt算式: {input} 值: {output}# 模板要 input/output# 结果KeyError: input# 正确key 名完全一致examples[{input:23,output:5}]四、典型应用场景4.1 工业报警知识库故障诊断examples[{code:E-616,message:chuck not clamped,root_cause:工件夹紧信号未到位,action:检查夹具气压-确认工件放置-复位传感器},{code:E-600,message:Workpiece change not completed,root_cause:换料流程超时中断,action:检查托盘传感器-确认CYCLE 320流程-查看PLC状态}]价值将历史维修经验结构化新报警进来时模型自动按同样格式输出根因分析和处理步骤。4.2 SQL 语句生成examples[{schema:users(id, name, age, city),question:查询苏州所有用户,sql:SELECT * FROM users WHERE city 苏州;},{schema:orders(id, user_id, amount, create_time),question:统计本月订单总额,sql:SELECT SUM(amount) FROM orders WHERE create_time DATE_TRUNC(month, NOW());}]价值教会模型理解特定数据库的表结构生成符合团队规范的 SQL。4.3 代码审查意见examples[{code:for i in range(len(items)): print(items[i]),review:建议改用 for item in items:更Pythonic且避免索引开销。},{code:f open(data.txt); data f.read(); f.close(),review:建议使用 with open(...) as f: 上下文管理器确保异常时正确关闭。}]五、进阶动态示例选择Example Selector当示例库很大时全量拼接会浪费 token。LangChain 支持按语义相似度动态选择最相关的几条fromlangchain.promptsimportSemanticSimilarityExampleSelectorfromlangchain.vectorstoresimportChroma selectorSemanticSimilarityExampleSelector.from_examples(examplesexamples,# 全部历史示例embeddingsembedding_model,# 向量模型vectorstoreChroma,# 向量数据库k3# 只选最相似的 3 条)promptFewShotPromptTemplate(example_selectorselector,# 动态选择器替代固定 examplesexample_promptexample_prompt,prefix...,suffix...,input_variables[code,message])优势新问题进来时自动匹配最相关的历史案例减少 prompt 长度节省 token 成本避免无关示例干扰模型判断六、少样本 vs 其他提示策略策略示例数量适用场景成本Zero-Shot0 条通用知识问答最低One-Shot1 条简单格式模仿低Few-Shot2~10 条结构化输出、特定风格中等Fine-Tuning数百 条深度定制、高频任务高训练成本建议格式/风格问题 - Few-Shot 通常足够领域知识深度不足 - 考虑 RAG Few-Shot 结合高频固定任务 - 再评估 Fine-Tuning 性价比七、总结少样本提示的本质是**“用示例定义输出规范”**而非用指令描述输出规范。在工程落地中示例质量 数量精选 3~5 条高质量示例远胜于 20 条模糊示例变量命名要统一example_prompt 与 examples 的 key 必须严格匹配动态选择降本增效示例库膨胀后务必引入 ExampleSelector与 RAG 结合使用示例教格式检索教知识两者互补注本文示例基于 LangChain 框架核心思想适用于所有支持上下文学习的 LLM。