尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
用 Instructor 实现 Demonstration Ensembling(DENSE):最大化利用少样本示例的集成提示技术
用 Instructor 实现 Demonstration EnsemblingDENSE最大化利用少样本示例的集成提示技术【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructorDENSEDemonstration Ensembling演示集成是一种通过将训练集中的示例划分为多个子集、分别构造多份 few-shot 提示并多次调用模型再对多个输出进行聚合的提示工程技术。本文基于 docs/prompting/ensembling/dense.md 展开结合本项目仓库源码讲解其原理、完整实现与调优要点读完你可以直接在 Instructor 项目中用少量代码落地这套示例利用率最大化的分类与推理方案。核心思想把有限的示例用足少样本few-shot提示的性能通常受限于一次提示中能塞入的示例数量。DENSE 的思路非常直接与其把所有示例挤进一次提示不如把示例分成多个互斥子集分别构造多份提示并行调用模型最后对多个回答做聚合如多数投票得出最终答案。这一技术源自论文《Exploring Demonstration Ensembling for In Context Learning》arXiv:2308.08780。其核心动机是单个子集只覆盖示例空间的一部分而多个子集叠加后能更全面地教模型理解任务模式从而提升分类与推理的准确率。用 Instructor 实现时整个过程可以抽象为三个阶段划分把示例列表划分成num_responses个大小相等的子集并行推理用每个子集分别构造系统提示异步并发调用模型得到多个结构化响应聚合对全部响应的答案字段做多数投票majority vote输出票数最高的结果。原文档特别指出为了简单示例采用遍历并等分的方式得到大小相同的簇。但在真实业务中你完全可以根据场景改用embedding 聚类embedding clustering等相似度采样方式来划分示例让每个子集内部语义更内聚。与 Self-Consistency 的区别多样性来自提示而非采样DENSE 与另一篇同目录文档 Self-ConsistencySelf-Consistency Improves Chain Of Thought Reasoning In Language Models容易混淆两者都用到了多次调用 多数投票但多样性来源截然不同维度Self-ConsistencyDemonstration EnsemblingDENSE多样性来源相同的提示 随机采样temperature0.5多份不同的 few-shot 提示每个子集示例不同是否使用示例不使用示例把示例切分成多个子集分别使用聚合方式对多个答案做多数投票对多个答案做多数投票适用场景需要推理多样性的开放问题手头有标注示例、希望最大化利用示例的分类/推理任务从实现上看Self-Consistency 的多次调用彼此独立coros [generate_self_consistent_response(prompt) for _ in range(num_responses)]而 DENSE 的每次调用携带的是不同的示例子集这正是它名字中 Demonstration演示/示例的由来。你可以把 DENSE 理解为 Self-Consistency 在 few-shot 场景下的增强变体。用 Instructor 实现 DENSE完整代码与逐段解析原文给出了一个可运行的完整示例其核心是异步客户端 结构化输出模型 asyncio.gather并发。下面先给出完整代码与原文档一致再分段解析关键点。import instructor from pydantic import BaseModel import asyncio from collections import Counter from typing import Literal from textwrap import dedent class DemonstrationResponse(BaseModel): correct_answer: Literal[Positive, Negative, Neutral] client instructor.from_provider(openai/gpt-5-nano, async_clientTrue) async def generate_self_consistent_response(prompt: str, examples: list[str]): concetenated_examples \n.join(examples) return await client.create( modelgpt-4o, messages[ { role: system, content: dedent( f You are an intelligent AI System that excels at classifying user queries into three possible labels: - Positive - Negative - Neutral You are about to be given a user query and asked to classify it into one of the three categories. Make sure to refer closely to the examples provided to you, examining each individual example before coming up with the final answer. Here are the examples: {concetenated_examples} ), }, {role: user, content: prompt}, ], response_modelDemonstrationResponse, temperature0, ) async def generate_self_consistent_responses( prompt: str, num_responses: int, examples: list[str] ): assert ( len(examples) % num_responses 0 ), The number of examples must be evenly divisible by num_responses # Batch the examples into num_responses batches batch_size len(examples) // num_responses coros [ generate_self_consistent_response(prompt, examples[i : i batch_size]) for i in range(0, len(examples), batch_size) ] responses await asyncio.gather(*coros) return responses if __name__ __main__: user_query What is the weather like today? examples [ I love this product! [Positive], This is the worst service ever. [Negative], The movie was okay, not great but not terrible. [Neutral], Im so happy with my new phone! [Positive], The food was terrible and the service was slow. [Negative], Its an average day, nothing special. [Neutral], Fantastic experience, will come again! [Positive], I wouldnt recommend this to anyone. [Negative], The book was neither good nor bad. [Neutral], Absolutely thrilled with the results! [Positive], ] responses asyncio.run(generate_self_consistent_responses(user_query, 5, examples)) answer_counts Counter([response.correct_answer for response in responses]) most_common_answer, _ answer_counts.most_common(1)[0] print(most_common_answer) # Neutral1. 用结构化输出模型约束答案空间class DemonstrationResponse(BaseModel): correct_answer: Literal[Positive, Negative, Neutral]这里的关键是Literal联合类型 PydanticBaseModel。Instructor 会把该模型转换成工具调用tool call的 JSON Schema强制模型从三个预定义标签中选一个从而杜绝模型自由发挥输出Positive 之类不可聚合的变体。聚合阶段之所以能放心使用Counter做多数投票正是因为有这一层结构化约束兜底。2. 通过from_provider创建异步客户端client instructor.from_provider(openai/gpt-5-nano, async_clientTrue)from_provider是本仓库统一的多提供商入口其定义位于 instructor/v2/auto_client.py。从函数签名可以看出它接受model字符串或已知模型名、async_client布尔值、cache、mode等参数当async_clientTrue时返回AsyncInstructor异步客户端从而可以在async def函数里使用await client.create(...)当async_clientFalse默认时返回同步的Instructor。从源码看instructor/init.pyfrom_provider通过模块级懒加载机制从.auto_client导入因此即使只安装了部分提供商 SDK 也不会影响包导入性能。client.create(...)是 Instructor 的核心调用入口参数包括参数在本示例中的值说明modelgpt-4o实际推理模型注意它与创建客户端时的提供商标识模型可以不同messages系统提示 用户查询系统提示通过 f-string 动态注入当前子集的示例response_modelDemonstrationResponse结构化输出的目标 Pydantic 模型temperature0设为 0 保证每次对同一子集的输出是确定性的便于公平对比不同子集的贡献提示from_provider(openai/gpt-5-nano, ...)中openai/gpt-5-nano用于路由到 OpenAI 提供商并确定默认模型而create()里的modelgpt-4o是本次请求实际使用的模型两者可以独立指定。这是本仓库统一提供商接口的常见用法可参考 docs/integrations/model-selection.md。3. 动态拼接示例子集concetenated_examples \n.join(examples)每个子集内的示例通过换行拼接后经 f-string 注入系统提示中的 Here are the examples: 段落。textwrap.dedent用于去除多行字符串的公共缩进保证送入模型的提示格式干净一致。系统提示明确要求模型逐个仔细检查每个示例后再给出最终答案这正是 DENSE 想让模型充分吸收子集示例的关键措辞。4. 等分示例 并发聚合async def generate_self_consistent_responses(prompt, num_responses, examples): assert len(examples) % num_responses 0, The number of examples must be evenly divisible by num_responses batch_size len(examples) // num_responses coros [ generate_self_consistent_response(prompt, examples[i : i batch_size]) for i in range(0, len(examples), batch_size) ] responses await asyncio.gather(*coros) return responses这是整个方案的装配线断言约束要求len(examples)能被num_responses整除保证每个子集大小一致。本示例 10 个示例、5 个子集每个子集恰好 2 个示例。等分切片examples[i : i batch_size]将示例列表切成num_responses个互不重叠的连续片段。你可以据此推断示例的排列顺序会直接影响各子集的内容构成因此对示例做随机打乱或按类别均匀重排往往能改善子集的代表性。并发调度asyncio.gather(*coros)一次性并发发出num_responses个异步请求。相比串行 for 循环网络等待时间被完全摊平5 个子集调用几乎同时完成。返回结构返回值是一个DemonstrationResponse列表顺序与coros对应。5. 多数投票得到最终答案answer_counts Counter([response.correct_answer for response in responses]) most_common_answer, _ answer_counts.most_common(1)[0] print(most_common_answer) # Neutral对 5 次子集推理的结果做Counter统计取most_common(1)[0]得到票数最高的标签。在原文档的演示中最终输出为Neutral——即对于 What is the weather like today? 这样的中性问句多数子集判定为中性符合直觉。进阶调优与边界条件在把 DENSE 迁移到自己的任务前有几个值得注意的工程细节整除性约束assert len(examples) % num_responses 0保证了等分但也会限制参数选择。如果你的示例数无法整除可以调整num_responses为示例数的因数或丢弃尾部少量示例让子集数量与示例数匹配或改造切片逻辑如examples[i::num_responses]的跨步采样允许子集大小差 1。子集划分策略原文档明确提示除等分外可考虑embedding 聚类——先用嵌入模型如text-embedding-3-small用法可参考 docs/prompting/ensembling/cosp.md 中的句子级 embedding 计算对示例编码再按语义相似度聚类分组使每个子集内部语义更聚焦。对于类别分布不均的数据集按类别分层抽样也能避免某个子集全是单一标签。投票权重多数投票假设每个子集贡献等权。如果你的场景中某些子集明显更可靠如聚类后与目标查询更相似的簇可以改为加权投票或参考 docs/prompting/ensembling/diverse.md 中 DiVeRSe 的做法——用另一个模型对每个响应打分Poor/Average/Good/Excellent 映射为 0.25/0.5/0.75/1.0按分数聚合而不是按票数聚合。与温度的关系示例中temperature0是为了消除同一子集内的采样随机性。若你的任务允许一定随机性可调高temperature并结合 Self-Consistency同目录 docs/prompting/ensembling/self_consistency.md再做一层多轮采样进一步放大候选多样性。异步环境适配示例使用asyncio.run(...)在脚本入口运行协程。若你运行在已有的事件循环内如 FastAPI应使用await而不是再次asyncio.run可参考 docs/concepts/async.md 与 examples/learn-async/run.py 中的异步客户端模式。与其他 Ensembling 技术的关系DENSE 是 docs/prompting/ensembling 目录下十种集成提示技术之一该目录由 docs/prompting/index.md 统一索引。与它同族的方案各有侧重COSP在无标注数据上用归一化熵 重复度自动挑选高质量 few-shot 示例再叠加 Self-ConsistencyDiVeRSe生成多样提示 验证器打分替代多数投票MoRE用多个专用专家提示事实/多跳/数学/常识分头推理再按得分选出最佳USP / Universal Self-Consistency对自由形式答案做聚类/语义一致性的通用聚合。DENSE 的独特定位在于它把示例当作可切分的资源来调度是如何最有效地把手头标注数据喂给模型这个问题的最朴素也最可靠的答案——实现成本低、可解释性强且天然适配结构化输出与并发调用。小结通过本仓库的 InstructorDENSE 的全部落地代码不过百行一个Literal约束的响应模型保证答案可聚合from_provider(..., async_clientTrue)提供异步客户端等分切片 asyncio.gather实现并发多提示推理Counter.most_common完成多数投票。它不依赖任何额外训练或微调只通过多次使用不同示例子集这一个动作就显著提升了对有限标注数据的利用率是 few-shot 场景下一个极易上手、便于扩展的基线方案。参考资料原始文档docs/prompting/ensembling/dense.md论文Exploring Demonstration Ensembling for In Context LearningarXiv:2308.08780统一提供商入口源码instructor/v2/auto_client.py相关技术Self-Consistency、COSP、DiVeRSe、MoRE【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

如何破解深层嵌套iframe?ego-lite 的 Snapshot 机制完整解析

如何破解深层嵌套iframe?ego-lite 的 Snapshot 机制完整解析

如何破解深层嵌套iframe?ego-lite 的 Snapshot 机制完整解析 【免费下载链接】ego-lite The fastest browser for AI agents to run browser automation, built for sharing your logged-in browser state with your AI agents, like Codex or Claude Code, without…

📅 2026/9/15 16:00:17
GTSAM中的ISAM2增量SLAM:贝叶斯树原理与调参实战

GTSAM中的ISAM2增量SLAM:贝叶斯树原理与调参实战

说句实话,从这一篇开始,GTSAM学习系列才算真正摸到了“在线 SLAM”的核心。前面我们一直拿因子图和批量优化在玩,数据量小的时候完全够用,但一旦你手上是一个持续运行的机器人,位姿不断新增、回环不断闭合,…

📅 2026/9/15 16:00:17
Unity超级冰火人源码拆解:双角色协作与机关触发实现

Unity超级冰火人源码拆解:双角色协作与机关触发实现

简介:这是基于Unity 2021.1及以上版本的超级冰火人风格双人合作益智迷宫游戏完整项目源码,面向Unity游戏开发者、独立制作人和解谜游戏爱好者。项目内置三十张地图,设有红男孩与水女孩双角色控制,包含火钻石与冰钻石收集、多种关卡…

📅 2026/9/15 16:00:17
MORE NEWS

更多资讯

📰

电磁-热耦合仿真:Maxwell与Steady-State Thermal联合求解完整指南

1. 电磁设备发热这档事,为什么必须把两个求解器绑在一起干过电磁仿真的人基本都遇到过这种场景:电磁阀持续通电半小时,外壳烫得不敢摸;电机堵转状态下绕组温度直线飙升;高频变压器满载运行时,磁芯热到失去磁…

📰

3步跑通:用 douyin-downloader 批量下载无水印抖音作品

3步跑通:用 douyin-downloader 批量下载无水印抖音作品 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…

📰

MOLDFLOW模流分析实战:从缺陷预测到工程应用

干了这么多年注塑,我见过太多这样的场景:模具开好了,上机试模,结果产品填充不满,或者变形超差、缩痕明显。然后一群人围着模具开会,讨论是改浇口还是加冷却,最后模具拉回车间又是两周工期&#…

📰

SolidWorks有限元分析实战流程:从建模到可信结果的五步闭环

1. 为什么SolidWorks Simulation不是“点几下就出结果”的玩具——一个干了八年结构仿真工程师的实话SolidWorks有限元分析流程,这七个字背后藏着太多人踩过的坑、改过的设计、报废过的样机,还有被老板追着问“为什么仿真和实测差30%”时咽下去的那口老血…

📰

GIS快速生成SketchUp场地模型:从DEM到可编辑地形的完整工作流

做方案这几年,我最大的感受是:场地模型往往是整个项目里最不讨好的环节。它不像建筑单体那么出效果,但又直接决定了后续总图、景观、日照、视线分析的底子。传统做法是从CAD里导等高线,再在SketchUp里一条条连地形,运气…

📰

Qwen Code Java SDK 深度指南:基于 qwen serve daemon 传输的可靠 Java 11 编程代理客户端

Qwen Code Java SDK 深度指南:基于 qwen serve daemon 传输的可靠 Java 11 编程代理客户端 【免费下载链接】qwen-code An open-source AI coding agent that lives in your terminal. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code Qwen Cod…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬