草莓熊Lotso个人主页❄️个人专栏:《C知识分享》 《Linux 入门到实践零基础也能懂》✨生活是默默的坚持毅力是永久的享受 博主简介文章目录前言一. 少样本提示核心原理1.1 什么是少样本提示1.2 LangChain 中的两种实现方式二. 实战案例 1推理引导字符串模板2.1 完整代码实现2.2 代码核心解读2.3 运行结果三. 实战案例 2结合结构化输出的信息提取3.1 需求说明3.2 完整代码实现3.3 代码核心解读3.4 运行结果四. 总结与最佳实践4.1 核心要点总结4.2 最佳实践前言大型语言模型LLM虽然拥有海量知识但在面对特定格式输出、复杂逻辑推理、专业领域任务时单纯的文字指令往往效果不佳。你可能遇到过这些问题要求模型输出 JSON 格式但它总是返回自然语言希望模型先分析再得出结论但它直接给出答案想从非结构化文本中提取特定信息但结果总是不准确。这时候少样本提示Few-Shot Prompting就派上了用场。它通过向模型提供少量 “输入 - 输出” 示例教会模型如何执行任务是提升 LLM 输出质量最有效、成本最低的方法之一。本文将从原理出发结合 LangChain 官方最佳实践通过两个完整实战案例带你掌握少样本提示的核心用法让你的 AI 应用输出更稳定、更精准。一. 少样本提示核心原理1.1 什么是少样本提示少样本提示是一种通过向 LLM 提供少量具体示例来引导模型按照预期格式、风格或逻辑生成输出的技术。它不需要对模型进行微调只需在提示词中加入示例就能显著提升模型在特定任务上的表现。我们用一个简单的例子理解零样本提示直接提问What is 2 9?模型可能回答“这不是一个标准的数学运算”少样本提示先给示例再提问2 2 4 2 3 5 What is 2 9?模型会通过示例推断出代表加法正确回答111.2 LangChain 中的两种实现方式LangChain 针对不同的提示格式提供了两种少样本提示模板模板类型适用场景核心特点FewShotPromptTemplate字符串提示适用于传统 LLM生成纯文本提示FewShotChatMessagePromptTemplate聊天消息提示适用于现代聊天模型GPT-4o、Claude 等保留对话结构两种模板的核心逻辑一致将示例集格式化后与用户查询组合成最终提示发送给模型。二. 实战案例 1推理引导字符串模板我们先从最基础的字符串模板开始实现一个多步推理问答系统。要求模型在回答问题时先列出需要解决的子问题再逐步推导最后给出结论。2.1 完整代码实现fromlangchain_core.promptsimportPromptTemplate,FewShotPromptTemplatefromlangchain_openaiimportChatOpenAI# 1. 定义示例集每个示例包含问题和预期回答examples[{question:李白和杜甫谁更长寿,answer: 是否需要后续问题是的。 后续问题李白享年多少岁 中间答案李白享年61岁。 后续问题杜甫享年多少岁 中间答案杜甫享年58岁。 所以最终答案是李白 },{question:腾讯的创始人什么时候出生,answer: 是否需要后续问题是的。 后续问题腾讯的创始人是谁 中间答案腾讯由马化腾创立。 后续问题马化腾什么时候出生 中间答案马化腾出生于1971年10月29日。 所以最终答案是1971年10月29日 }]# 2. 定义单个示例的格式化模板example_promptPromptTemplate.from_template(Question: {question}\n{answer})# 3. 创建少样本提示模板few_shot_promptFewShotPromptTemplate(examplesexamples,# 示例集example_promptexample_prompt,# 单个示例的格式化方式prefix你是一个善于推理的助手请按照示例的格式回答问题。,# 系统提示suffixQuestion: {input},# 用户查询的占位符input_variables[input]# 输入变量)# 4. 初始化模型并构建链modelChatOpenAI(modelgpt-4o-mini,temperature0)chainfew_shot_prompt|model# 5. 调用链并输出结果resultchain.invoke({input:《教父》和《星球大战》的导演来自同一个国家吗})result.pretty_print()2.2 代码核心解读示例集设计示例必须清晰、一致准确反映你希望模型输出的格式和逻辑。这里的示例展示了 “先分解问题→逐步解答→得出结论” 的推理过程。example_prompt定义单个示例如何被格式化。它将每个示例的question和answer字段填充到模板中生成 “Question: …\nAnswer: …” 的格式。**FewShotPromptTemplate**参数prefix放在所有示例之前的系统提示用于设定模型角色和任务要求suffix放在所有示例之后的用户查询占位符input_variables声明模板中需要用户传入的变量2.3 运行结果 Ai Message 是否需要后续问题是的。 后续问题《教父》的导演是谁 中间答案《教父》的导演是弗朗西斯·福特·科波拉。 后续问题弗朗西斯·福特·科波拉来自哪里 中间答案弗朗西斯·福特·科波拉来自美国。 后续问题《星球大战》的导演是谁 中间答案《星球大战》的导演是乔治·卢卡斯。 后续问题乔治·卢卡斯来自哪里 中间答案乔治·卢卡斯也来自美国。 所以最终答案是是可以看到模型完美遵循了示例的推理格式先分解问题再逐步解答输出结果清晰可追溯。三. 实战案例 2结合结构化输出的信息提取在企业级应用中我们经常需要从非结构化文本中提取结构化数据如人名、地址、金额等。将少样本提示与结构化输出结合可以实现极高精度的信息提取。3.1 需求说明从任意文本中提取人物信息包括姓名、身高、肤色、头发颜色。如果某个信息不存在则返回null。3.2 完整代码实现fromtypingimportList,OptionalfrompydanticimportBaseModel,Fieldfromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplate,MessagesPlaceholderfromlangchain_core.messagesimportSystemMessagefromlangchain_core.utils.function_callingimporttool_example_to_messages# 1. 定义结构化输出模型PydanticclassPerson(BaseModel):一个人的信息。name:Optional[str]Field(defaultNone,description这个人的名字)hair_color:Optional[str]Field(defaultNone,description如果知道这个人头发的颜色)skin_color:Optional[str]Field(defaultNone,description如果知道这个人的肤色)height_in_meters:Optional[str]Field(defaultNone,description以米为单位的高度)classData(BaseModel):提取关于人的数据。people:List[Person]# 2. 定义示例集每个示例包含输入文本和预期输出examples[(海洋是广阔而蓝色的。它有两万多英尺深。,Data(people[]),# 没有人物信息的情况),(小强从中国远行到美国。,Data(people[Person(name小强,height_in_metersNone,skin_colorNone,hair_colorNone),]),# 部分信息缺失的情况)]# 3. 定义提示词模板prompt_templateChatPromptTemplate([SystemMessage(content你是一个提取信息的专家只从文本中提取相关信息。如果不知道属性值返回null),MessagesPlaceholder(example_messages),# 示例消息占位符(user,{new_message}),])# 4. 将示例转换为模型可理解的聊天消息格式example_messages[]fortxt,tool_callinexamples:# 根据提取结果生成AI响应文本ai_response检测到人iftool_call.peopleelse未检测到人# 将示例转换为聊天消息列表example_messages.extend(tool_example_to_messages(inputtxt,tool_calls[tool_call],ai_responseai_response))# 5. 初始化模型并绑定结构化输出modelChatOpenAI(modelgpt-4o-mini,temperature0)structured_modelmodel.with_structured_output(schemaData)# 6. 构建链chainprompt_template|structured_model# 7. 测试信息提取resultchain.invoke({example_messages:example_messages,new_message:篮球场上身高两米的中锋王伟默契地将球传给一米七的后卫挚友李明完成一记绝杀。})print(\n提取结果)print(result)3.3 代码核心解读Pydantic 模型定义使用BaseModel定义输出结构每个字段通过Field添加描述模型会严格按照这个结构生成输出。tool_example_to_messages这是 LangChain 提供的工具函数专门用于将结构化示例转换为聊天模型能理解的消息格式。它会为每个示例生成 4 条消息HumanMessage输入文本AIMessage包含工具调用即结构化输出ToolMessage确认工具调用成功AIMessage自然语言响应MessagesPlaceholder用于在提示模板中插入动态的消息列表这里用来插入我们转换后的示例消息。3.4 运行结果提取结果 people[ Person(name王伟, hair_colorNone, skin_colorNone, height_in_meters2.0), Person(name李明, hair_colorNone, skin_colorNone, height_in_meters1.7) ]模型准确提取了文本中的两个人物信息对于缺失的头发颜色和肤色正确返回了None。四. 总结与最佳实践4.1 核心要点总结少样本提示是提升 LLM 输出质量的关键技术通过示例引导模型行为无需微调模型。LangChain 提供两种模板FewShotPromptTemplate适用于字符串提示FewShotChatMessagePromptTemplate适用于聊天消息提示结合结构化输出可以实现高精度的信息提取适合企业级应用。当示例集较大时使用示例选择器动态选择最相关的示例平衡效果和成本。4.2 最佳实践示例设计示例要清晰、一致准确反映预期输出格式覆盖常见的边界情况如信息缺失、多实体提取示例数量不宜过多通常 3-5 个足够模板选择现代聊天模型优先使用FewShotChatMessagePromptTemplate传统 LLM 使用FewShotPromptTemplate示例选择器对长度敏感的场景使用LengthBasedExampleSelector大多数场景推荐使用SemanticSimilarityExampleSelector需要多样性的场景使用MaxMarginalRelevanceExampleSelector 我是草莓熊 Lotso若这篇技术干货帮你打通了学习中的卡点 【关注】跟我一起深耕技术领域从基础到进阶见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好需要时直接查、随时用 【评论】分享你的经验或疑问比如曾踩过的技术坑一起交流避坑 ️ 【投票】用你的选择助力社区内容方向告诉大家哪个技术点最该重点拆解 技术之路难免有困惑但同行的人会让前进更有方向愿我们都能在自己专注的领域里一步步靠近心中的技术目标结语少样本提示是每个 LangChain 开发者必须掌握的基础技能。通过合理设计示例和选择合适的模板你可以让大模型在各种任务上都表现出色。✨把这些内容吃透超牛的放松下吧✨ʕ˘ᴥ˘ʔづきらど