ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

LangChain AI应用开发框架核心组件的使用 - 提示词模板组件的使用(2) : 少样本提示,少样本提示的推理引导,使用示例数据增强 LangChain 信息提取能力

2026/9/10 23:23:04 拓冰建站 浏览量
LangChain AI应用开发框架核心组件的使用 - 提示词模板组件的使用(2) : 少样本提示,少样本提示的推理引导,使用示例数据增强 LangChain 信息提取能力 目录一、少样本提示few‑shotting概念定位二、实现少样本提示三、使用案例案例一推理引导案例二使用示例数据增强 LangChain 信息提取能力完整代码一、少样本提示few‑shotting概念少样本提示是一种通过向 LLM 提供少量具体示例或样本来教会它如何执行某项特定任务的技术。提高模型性能的最有效方法之一是给出一个【模型示例】指导大模型你想做什么、怎么做。下面用一个例子解释少样本提示的作用。参考之前学习的内容我们可以将其想象为 零样本提示直接给模型一道考题不给任何例子。模型会凭借已有的知识直接回答。例如我们输入What is 2 9?答案可能是少样本提示则是在给出考题前先给它看几道类似的、附有正确答案的例题。添加示例输入和预期输出的技术给到模型提示让模型通过例题来理解任务应该怎么做。例如以下样例模型通过样例后可以发现与加号含义相似便可以按照此规则得出What is 2 9?的结果是 11定位少样本提示属于提示词模板这一大块的知识范畴不是完全独立、脱离提示模板的全新组件但是 LangChain 里面有专门配套的模板工具来实现少样本。先说本质少样本本身是提示工程的思路、写 prompt 的技巧。这能解决什么问题LLM 虽然知识渊博但有时我们需要它以非常特定的格式、风格或逻辑来回答问题。提供正确的示例可以减少模型 “胡说八道” 或犯低级错误的概率将其输出约束在你提供的范例范围内。举个例子更能理解强制要求模型以特定的格式如 JSON、XML、特定的列表样式输出结果。样例可以当作格式样板。有些任务很难用文字指令清晰描述 (例如“请用莎士比亚的风格写作”)。提供几个例子比写长篇大论的指令更有效。对于需要多步推理的复杂任务示例可以展示出思考链引导模型遵循类似的推理路径。二、实现少样本提示实现少样本提示的第一步也是最重要的一步是提出一个好的示例数据集。好的示例应该在运行时相关、清晰、信息丰富并提供模型尚不知道的信息。如我们给出的例子就能很好的提示大模型与 含义相似代码讲解examples 是列表列表内部每一项是字典。字典包含 input 字段代表给模型的输入样例output 字段代表该输入对应的正确答案。这两份样例用来教会模型代表加法运算。如何让大模型看懂这份示例呢之前我们说过聊天模型读的是聊天消息。因此接下来我们需要将示例集实例化成聊天模型可以读懂的聊天消息。对于 LangChain 就需要创建一个 FewShotChatMessagePromptTemplate 对象来实例化示例集。FewShotChatMessagePromptTemplate 是一个提示词模板专门用来将示例集实例化为聊天消息用法如下所示代码讲解导入 ChatPromptTemplate 普通聊天模板、FewShotChatMessagePromptTemplate 少样本聊天模板。example_prompt定义单个样例的消息格式。每一组样例会生成一条 human 用户消息一条 ai 模型回复消息{input}、{output} 会被 examples 字典里面的值填充。实例化 FewShotChatMessagePromptTemplateexample_prompt 参数传入单条样例的格式化模板examples 传入准备好的样例列表。few_shot_prompt.invoke({}) 执行模板空字典代表没有额外变量调用 .to_messages() 直接拿到转换完成的消息对象列表打印查看。我们来看一下 langchain_core.prompts.few_shot.FewShotChatMessagePromptTemplate它也实现了标准的 Runnable 接口。类初始化参数说明examples样本示例。example_promptChatPromptTemplate用于格式化单个示例。类方法说明.invoke() 方法此方法与其他 Runnable 实例的 .invoke() 方法类似。输入一个字典给它返回完整的提示内容 PromptValuePromptValue 的 to_string() 方法可以将提示值作为【字符串】返回。PromptValue 的 to_messages() 方法可以将提示作为【消息列表】返回。可以得到示例集转化的聊天消息列表结果如下模板已经把我们写的字典样例转换成模型原生能识别的消息对象序列。每一组示例都变成一轮 human‑ai 对话后续只需要把这个 few_shot_prompt 嵌入主 ChatPromptTemplate就可以把全部样例放进最终发给大模型的 prompt。最后得到示例集消息列表后就可以带上一起发起请求代码讲解构建最终完整聊天模板 final_prompt消息列表分为三部分system 系统提示、前面构造好的少样本模板对象 few_shot_prompt、接收用户真实提问的 human 消息。few_shot_prompt可以直接嵌入 ChatPromptTemplate 内部模板渲染时会自动把全部样例消息展开插入这个位置。导入聊天模型 ChatOpenAI实例化 gpt‑4o‑mini。使用 LCEL 语法 final_prompt | model 拼接链先渲染提示词再送入大模型。chain.invoke() 传入字典input 字段填入我们真正要问的考题.pretty_print() 格式化打印 AI 返回消息。结果如下少样本示例已经被拼入发给模型的 prompt模型从两组样例中学到代表加法运算。输入2 9模型执行 29输出结果 11计算成功。计算成功三、使用案例案例一推理引导我们希望输入《教父》和《星球大战》的导演来自同一个国家吗让聊天模型可以先分析再得出结论而不是直接得出结论。分析过程需要展示出来示例如下代码讲解导入 PromptTemplate 普通字符串提示模板非聊天模板本案例使用文本型少样本 FewShotPromptTemplate不是聊天版本。PromptTemplate.from_template 定义单条样例的格式占位符 {question} 接收问题{answer} 接收完整分步推理回答。examples 列表存放多组少样本样例每一组包含问题 question和完整分步推理 answer用来教会模型回答问题要拆解输出中间推理步骤不要直接给最终答案。example_prompt.invoke(examples[0]) 拿第一条样例做渲染测试.to_string() 输出渲染后的字符串。结果如下模板完成占位符替换把字典内 question、answer 填充进模板字符串输出完整的单条样例文本可以直接给模型看。接下来我们需要格式化完整的样本提示。此时可以创建一个 FewShotPromptTemplate 初始化少样本提示模板。其接收少量示例和少量示例的格式化程序。如下所示代码讲解导入FewShotPromptTemplate文本版本少样本模板区分聊天版本FewShotChatMessagePromptTemplate。examples传入全部样例列表example_prompt传入单条样例的格式化模板。suffix所有样例全部渲染完成之后拼接在末尾的字符串用来放用户真实提问占位符{input}接收用户新问题。input_variables声明模板需要接收的变量名这里就是input。.invoke()传入用户真实问题字典.to_string()拿到完整拼接完成的全部提示词字符串。结果如下运行结果讲解模板把全部 4 组少样本示例完整渲染输出全部样例结束之后拼接 suffix 部分追加用户新的问题。给到模型之后模型就会模仿样例格式分步拆解推理输出后续问题、中间答案、最终答案而不是直接给出简短结论。补充区分面试要点FewShotPromptTemplate用于普通字符串 promptFewShotChatMessagePromptTemplate用于聊天消息 ChatPromptTemplate 体系。二者都是少样本适用场景不一样。通过为模型提供这样的示例我们可以引导模型做出更好的响应。来看下 class langchain_core.prompts.few_shot.FewShotPromptTemplate它也实现了标准的 Runnable 接口。类初始化参数说明examples样本示例。example_promptPromptTemplate用于格式化单个示例。prefix放在示例前面的提示模板字符串。suffix放在示例之后的提示模板字符串。input_variables变量的名称列表这些变量的值需要作为提示词的输入。类方法说明.invoke() 方法此方法与其他 Runnable 实例的 .invoke() 方法类似。输入一个字典给提示符模板返回完整的提示内容 PromptValuePromptValue 的 to_string() 方法可以将提示值作为【字符串】返回。PromptValue 的 to_messages() 方法可以将提示作为【消息列表】返回。接下来让我们调用聊天模型看看结果完整代码如下代码讲解导入三个依赖PromptTemplate、FewShotPromptTemplate 文本版少样本模板、ChatOpenAI 聊天模型。example_prompt 定义单条样例的渲染格式。examples 为 4 组推理示范样例约束模型输出分步推理不能直接输出答案。实例化 FewShotPromptTemplate传入样例、样例模板、后缀字符串、输入变量。prompt.invoke(...).to_messages()将渲染完成的字符串 prompt转换成消息对象列表就可以直接传给聊天模型。实例化 ChatOpenAI 模型把消息列表送入模型调用 .pretty_print() 格式化打印模型返回结果。结果如下运行结果讲解模型完全模仿少样本示例规定的输出格式不会直接输出 “是”而是先拆解多轮后续问题一步步得到中间答案最后输出最终结论。少样本在这里起到强制约束推理输出格式的效果。案例二使用示例数据增强 LangChain 信息提取能力在我们学习【结构化输出】小节时其中有一个使用场景是使用结构化输出进行信息提取。当时说明可以结合少样本提示来实现。于是在这里我们来实现一个基于 LangChain 的结构化信息提取系统专门从文本中提取人物相关信息。例如我们希望对于输入以下文本篮球场上身高两米的中锋王伟默契地将球传给一米七的后卫挚友李明完成一记绝杀。这对老友用十年配合弥补了身高的差距。代码会提取出结构化数据如下所示这是预期输出的对象结构从原文抽取出两个人物王伟、李明提取身高字段原文没有提到肤色、发色对应字段赋值None。实现如下第一步定义结构化返回对象。代码讲解导入 typing 的 List、Optional 用来做类型标注导入 Pydantic 的 BaseModel、Field 用来定义数据模型。Person 继承 BaseModel代表单个人物Optional[str] 代表字段可以为 NoneField 写字段描述会传给大模型告诉模型每个字段该提取什么内容。Data 模型内部包含 people 列表存放多个 Person 对象作为整体返回结构。第二步定义两个关键示例每个示例中包含【文本】和【希望输出】无人物场景文本中没有人名期望返回空列表部分信息场景只有名字其他字段缺失代码讲解examples 列表存放少样本每一项是元组第一项是输入文本第二项是预期 Pydantic 模型输出对象。第一个样例文本不存在人物people 为空列表第二个样例只提取名字其余不知道的字段全部填 None用来教会模型信息找不到就返回 None不能编造内容。第三步定义提示词模板。代码讲解导入 ChatPromptTemplate 聊天提示模板、MessagesPlaceholder 消息占位符以及系统消息、用户消息对象。SystemMessage 系统提示规定角色和规则只提取原文真实信息不知道的属性返回 null禁止虚构。MessagesPlaceholder(example_messages)占位槽后续会把少样本示例消息全部插入到这个位置。(user,{new_message})接收用户新输入待提取文本。第四步构造请求的消息列表。处理逻辑遍历每个示例对文本、期望输出根据是否有人员信息生成自然语言响应检测到人 or 未检测到人使用 tool_example_to_messages 转换格式将每个示例转换为模型可理解的消息格式代码讲解导入工具函数 tool_example_to_messages该函数专门用来把少样本样例转换成工具调用格式的消息。创建空列表 example_messages 用来存放全部转换完成后的少样本消息。for 循环遍历之前定义好的 examples 拆分成输入文本txt和期望输出对象 tool_call。判断 tool_call.people 列表是否有内容有人就设置 ai_response检测到人无人物设置未检测到人。调用 tool_example_to_messages传入原始文本、期望 Pydantic 对象列表、ai 响应文字extend 把生成的多条消息追加进 example_messages。测试一下代码讲解调用 prompt_template.invoke() 传入两个变量example_messages 传入我们构造好的少样本占位内容new_message 传入本次待提取的真实文本。.to_messages() 拿到完整消息对象列表循环遍历每一条消息调用 pretty_print() 打印每条消息的完整内容。结果如下运行结果讲解消息已经被我们构造成功可以看到一个示例经过转换构建出了 4 条消息HumanMessage、AiMessage(tool)、ToolMessage、AiMessage。HumanMessage样例原始输入文本。AIMessage携带 Tool Calls就是我们期望的结构化输出参数。ToolMessage固定回复告知模型工具调用成功。AIMessage简短自然语言总结检测到人 / 未检测到人。 两套少样本全部拼接到 System 提示词之后最后拼接我们待处理的用户新文本。第五步初始化模型并绑定结构化输出模式最后构件链并调用。代码讲解导入 ChatOpenAI 聊天模型。实例化模型对象调用 .with_structured_output(schemaData) 把之前写好的 Pydantic 的 Data 模型传入。该方法会自动约束模型输出并且直接把模型返回结果解析成DataPydantic 对象不用手动解析 json。使用 LCEL 管道符|拼接链prompt_template | structured_model先执行提示词模板渲染再送入绑定结构化输出的模型。调用 chain.invoke() 传入字典参数传入组装完成的少样本消息列表 example_messages以及待提取的目标文本 new_message。打印最终返回的结构化对象 result。结果如下模型成功从输入文本提取两个人物王伟和李明提取到对应的身高原文没有提及头发颜色、肤色对应字段全部赋值 None没有编造虚构信息输出完全匹配我们定义的 Data、PersonPydantic 对象格式。完整代码整合全部步骤定义 Pydantic 数据模型、准备少样本样例、构建聊天提示模板、调用 tool_example_to_messages 转换样例为消息、绑定结构化输出LCEL 组装链执行 invoke 拿到结构化对象结果。总结该案例展示了 LangChain 在结构化信息提取中的核心能力通过 Pydantic 定义输出模式、少样本学习引导模型行为、提示词模板动态组装上下文以及链式调用简化流程。最终实现从非结构化文本中精准提取结构化数据。