
使用 instructor 实现 Prompt Mining自动挖掘高质量提示模板的结构化实践【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor导读 本文讲解如何借助 instructor 以结构化输出的方式实现 Prompt Mining提示挖掘不再依赖人工设计提示词而是让 LLM 从给定 prompt 中自动提炼出更简洁、更自然的{subject}/{object}占位模板从而提升下游任务的稳定表现。读完本文你将掌握 Prompt Mining 的核心思想、基于 Pydantic 响应模型的完整可运行实现以及from_provider、response_model、temperature0、max_retries等关键参数背后的底层机制。为什么需要 Prompt Mining提示词是性能瓶颈大语言模型对提示方式高度敏感同样的信息与能力提示措辞不同模型的表现可能天差地别。当提示编写不当prompted incorrectly时即使模型完全具备回答所需的信息或能力也可能表现得更差。Prompt Mining 的目标正是帮助我们发现语料中出现频率更高的、更好的提示格式从而用数据而非直觉来指导提示设计。原始的 Prompt Mining 论文使用大规模 Wikipedia 语料自动提取提示模板通过观察提示语句的中间词middle words、解析句子内部的依赖关系dependencies从海量自然语言句子中归纳出高频出现的表达模式。而本文介绍的轻量级方案则利用 instructor 的结构化输出能力在几行代码内获得类似的效果。人工提示 vs 挖掘出的提示下表展示了论文中给出的一些挖掘结果——挖掘出的模板往往比人工编写的模板更自然、更贴近真实语料分布人工提示Manual Prompts挖掘出的提示Mined Promptsx is affiliated with the y religionx who converted to yThe headquarter of x is in yx is based in yx died in yx died at his home in yx is represented by music label yx recorded for yx is a subclass of yx is a type of y可以看到x died in y 这类人工模板虽然语法正确但在真实语料中更常见的说法是 x died at his home in y而 x is based in y 比 The headquarter of x is in y 更简洁、更贴近母语者的表达。这正是 Prompt Mining 的价值所在用语料统计替代主观猜测。用 instructor 实现轻量级 Prompt Mining实现的核心思路很直接定义一个带有{subject}和{object}占位符的模板结构然后让 LLM 在结构化输出的约束下把给定的 prompt 改写成更简洁、更容易理解的模板形式。from pydantic import BaseModel, Field import instructor class PromptTemplate(BaseModel): prompt_template: str Field( description( A template that has the subject and object that we want to extract from the prompt replaced with a single placeholder of {subject} and {object}. Rephrase the prompt if necessary to make it more concise and easier to understand ), ) client instructor.from_provider(openai/gpt-5-nano) def generate_prompt_templates(prompt: str): return client.create( messages[ { role: system, content: ( You are an expert prompt miner that excels at generating prompt templates which are more concise and easier to understand\n\nYou are about to be passed a prompt to extract 3 new prompt templates for ), }, {role: system, content: prompt}, ], response_modellist[PromptTemplate], temperature0, max_retries3, modelgpt-4o, ) if __name__ __main__: prompt France is the capital of Paris prompt_template generate_prompt_templates(prompt) for prompt in prompt_template: print(prompt) # prompt_template{subject} is the capital of {object} # prompt_templateThe capital of {object} is {subject} # prompt_template{object}s capital is {subject}对输入France is the capital of Paris程序会返回 3 个等价的模板变体例如{subject} is the capital of {object}The capital of {object} is {subject}{object}s capital is {subject}这 3 个变体语义等价但语序不同可以理解为对同一关系首都关系的多种语言表达采样后续可以进一步结合投票或选择机制确定最合适的模板。代码拆解每个关键元素背后的机制1.PromptTemplate与Field(description...)用 Schema 约束输出PromptTemplate是一个标准的 Pydantic 模型而Field(description...)中的描述文本会被 instructor 转换为发送给模型的工具/函数 schema 的一部分见 schema 生成实现。描述写得越具体模型越能理解占位符的语义约束。这里的关键约束是主体与客体必须被替换为单个占位符{subject}和{object}允许在不改变语义的前提下改写措辞使其更简洁、更易理解。也就是说Prompt Mining 输出的不是句子而是可复用的模板。2.instructor.from_provider(...)一行代码完成客户端初始化from_provider是 instructor 的统一客户端入口实现见 instructor/v2/auto_client.py它接收provider/model-name格式的模型字符串例如openai/gpt-5-nano并自动按/拆分出 provider 与 model 名若格式错误会抛出ConfigurationError提示必须使用provider/model-name格式根据 provider 查表找到对应的 builder_PROVIDER_BUILDERS例如 OpenAI 对应_build_openai懒加载并初始化对应厂商的 SDK 客户端返回一个Instructor实例。from_provider还支持async_clientTrue返回异步客户端、cache传入缓存适配器如AutoCache、mode覆盖 provider 默认的调用模式Tool Calls / JSON / Function Call 等。也就是说文中这段 Prompt Mining 代码可以几乎不改动地切换到 Anthropic、Gemini、Mistral 等其它 provider。3.response_modellist[PromptTemplate]一次返回多个模板response_model接受任意 Pydantic 模型list[PromptTemplate]表示希望模型一次返回一个 PromptTemplate 列表即返回多个模板变体。instructor 会基于该类型生成对应的 JSON Schema并通过工具调用tool calling让模型严格按结构输出随后自动完成解析与 Pydantic 校验。这也是本文实现只用一个请求就拿到 3 个模板候选的关键。4.temperature0保证挖掘结果可复现Prompt Mining 属于探索/采集阶段我们希望每次拿到尽量一致、稳定的模板候选因此将temperature设为 0让模型输出接近贪心解码减少随机性带来的噪音。如果你希望挖掘出更多样的模板变体可以适度调高该值。5.max_retries3结构化失败的自动重试兜底max_retries控制当模型输出无法通过 Pydantic 校验或 schema 解析失败时的重试次数。在 instructor/v2/core/client.py 中create的max_retries默认值即为3底层的重试逻辑基于 tenacity会保留之前失败的信息作为上下文反馈给模型见 重试实现让模型在下一轮修正输出。对 Prompt Mining 这类批处理场景这一机制能显著降低手工干预的频率。实战延伸让挖掘出的模板真正派上用场应用到 few-shot / 关系抽取挖掘出的{subject}/{object}模板可以直接用于下游的关系抽取或知识图谱构建把模板中的占位符替换为具体实体如France is the capital of {object}即可构造出训练或 few-shot 示例让模型在更贴近语料分布的表达上进行推理。与同系列提示技术的配合Prompt Mining 属于生成思路thought generation家族中的 few-shot 变体在仓库的 chain_of_thought_few_shot 目录 下与以下技术并列可组合使用Active Prompting通过不确定性估计挑选最值得人工标注的示例再作为 few-shot 示例注入Auto-CoT自动化挑选多样化的 CoT 示例Complexity Based Prompting按推理步骤复杂度挑选更高质量的示例。一个自然的组合是先用 Prompt Mining 提炼出高频模板 → 再用这些模板生成/改写 few-shot 示例 → 通过 Active Prompting 或复杂度选择进一步筛选。这样就把提示设计从手工劳动变成了可复现的流水线。注意事项与限制模板的抽象粒度{subject}/{object}占位符适合二元关系类任务如果任务涉及更复杂的多实体关系需要在Field(description)中显式扩展占位符的语义。输出变体的数量示例中通过 system prompt 要求提取 3 个模板实际数量可根据需要调整更多候选意味着更充分的采样但也消耗更多 token。验证环节挖掘出的模板本质上是模型的输出建议在下游任务中做一次小规模人工抽样或评测例如用模板替换前、替换后的 few-shot 性能对比确认模板确实带来了提升而不是把模型自身的偏差固化进模板。与原论文的差异原论文TACL, How Can We Know What Language Models Know?Shin et al.通过统计大规模语料自动挖掘模板属于无监督的语料分析方法本文的 instructor 实现则是让 LLM 扮演prompt miner角色在结构化约束下改写生成模板更轻量、无需维护语料与解析管线但结果质量与多样性取决于所用模型的改写能力。【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考