用 Instructor 实现 Mixture of Reasoning Experts(MoRE):多专家协同推理与置信度择答实战 用 Instructor 实现 Mixture of Reasoning ExpertsMoRE多专家协同推理与置信度择答实战【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor导读单一语言模型难以在所有问题类型上都表现良好——事实性查询、多跳推理、数学计算与常识判断需要截然不同的推理能力。MoREMixture of Reasoning Experts推理专家混合通过让一组专家模型各司其职地生成候选答案再用打分机制择优输出从而显著提升回答质量。本文以 docs/prompting/ensembling/more.md 为核心结合 instructor 仓库源码完整演示如何使用instructor.from_provider与 Pydantic 响应模型在几十行代码内落地一个支持弃权机制的简化版 MoRE 流水线。MoRE 是什么为什么需要多个推理专家语言模型往往在部分问题类型上表现出色、在其他类型上却力不从心。MoRE 的核心思想是与其依赖单个模型覆盖所有推理模式不如组合多个专精不同推理能力的专家让每个专家只处理自己最擅长的问题类型。在原始论文方案中一共设计了四位专家事实型专家Factual Expert由 RAG检索增强生成提示流水线增强。收到查询后先从 Wikipedia 检索最相关的 10 条段落拼接到问题的正前方再喂给模型让模型基于外部证据作答。多跳专家Multihop Expert在每个演示样例demo后人工编写推理理由rationale引导模型针对问题展开多步骤推理过程。数学专家Math Expert针对 GSM8k 数据集人工编写逐步解释把模型引导向不同的推理步骤擅长数值计算类问题。常识专家Commonsense Expert由 Codex 模型生成 10 条不同事实同样拼接到问题之前为模型补充常识性背景。在 instructor 的提示词技术体系中这一方法被归类为Ensembling集成类别下的 Specialized Experts 技术——与 Self-Consistency自一致性、DiVeRSe多样化验证器 等并列解决的是如何从多个候选输出中选出最佳答案这一共性问题。从随机森林打分到结构化打分核心机制每位专家生成响应后原始论文使用一个随机森林分类器对每个回答打出 01 之间的分数。这个分数的用途有两层选择最终答案谁的分数高就采用谁的答案决定是否作答因为每一步都有弃权abstain的选项当所有专家的最高分都低于某个阈值时系统可以主动拒绝回答而不是硬着头皮给出低置信度的答案。用 instructor 落地时我们可以做一个关键替换用 LLM 自身作为打分器LLM-as-a-judge替代随机森林。这也是本仓库其他集成技术如 DiVeRSe 实现的一贯做法——把质量评分也建模成一次带 Pydantic 响应模型的结构化调用让模型返回一个0 ≤ score 1的数值。用 instructor 实现简化版 MoRE完整可运行代码下面的实现完整继承自 docs/prompting/ensembling/more.md并做了适当注释。它包含三个 Pydantic 响应模型、两位专家事实型与多跳型和一位打分器最后通过阈值判断决定采用哪个答案或直接弃权。from pydantic import BaseModel, Field import instructor from textwrap import dedent client instructor.from_provider(openai/gpt-5-nano) class MultihopExpert(BaseModel): chain_of_thought: str answer: str class FactualExpert(BaseModel): answer: str class ModelScore(BaseModel): score: float Field(ge0, lt1) def query_factual_expert(query: str, evidence: list[str]): formatted_evidence \n-.join(evidence) return client.create( modelgpt-4o, response_modelFactualExpert, messages[ { role: system, content: dedent( f query {query} /query evidences {formatted_evidence} /evidences ), } ], ) def query_multihop_expert(query: str): return client.create( modelgpt-4o, response_modelMultihopExpert, messages[ { role: system, content: dedent( f query {query} /query ), } ], ) def score_answer(query: str, answer: str): return client.create( modelgpt-4o, response_modelModelScore, messages[ { role: system, content: You are a helpful assistant that scores answers based on well they are able to answer a specific user query, }, { role: user, content: f user query {query} /user query response {answer} /response , }, ], ) if __name__ __main__: query Whos the original singer of Help Me Make It Through The Night? evidences [ Help Me Make It Through The Night is a country music ballad written and composed by Kris Kristofferson and released on his 1970 album Kristofferson ] threshold 0.8 factual_expert_output query_factual_expert(query, evidences) print(factual_expert_output.model_dump_json(indent2)) { answer: The original singer of Help Me Make It Through the Night is Kris Kristofferson, who released it on his 1970 album Kristofferson. } multihop_expert_output query_multihop_expert(query) print(multihop_expert_output.model_dump_json(indent2)) { chain_of_thought: To identify the original singer of Help Me Make It Through The Night, I need to look for the person who first recorded and released the song., answer: The original singer of Help Me Make It Through The Night is Kris Kristofferson. } factual_expert_score score_answer(query, factual_expert_output.answer) multihop_expert_score score_answer(query, multihop_expert_output.answer) if max(factual_expert_score.score, multihop_expert_score.score) threshold: answer Abstaining from responding elif factual_expert_score.score multihop_expert_score.score: answer factual_expert_output.answer else: answer multihop_expert_output.answer print(answer) The original singer of Help Me Make It Through the Night is Kris Kristofferson, who released it on his 1970 album Kristofferson. 代码结构拆解MultihopExpert/FactualExpert定义两位专家各自的输出结构。多跳专家额外输出chain_of_thought思维链用于显式地引导多步推理事实专家只输出最终answer。instructor 会根据 Pydantic 模型自动构造 JSON Schema要求 LLM 以严格结构返回字段见 响应模型与结构化输出。ModelScore打分器的响应模型score: float Field(ge0, lt1)将分数约束在[0, 1)半开区间内——这保证了打分结果可直接与后续的阈值如0.8进行有意义的比较也呼应了原论文随机森林打分 01 的语义。专家函数两个query_*_expert都以client.create(...)发起一次结构化调用response_model指定返回结构messages里用query、evidences等 XML 风格标签组织提示词使问题与证据的边界在模型中更加清晰。事实专家将检索到的证据以\n-.join(evidence)拼接后注入提示词即原论文检索 top-k 段落拼接到问题前的简化形态。择答逻辑if max(...) threshold判断所有专家的最高分都低于阈值则弃权否则比较两位专家得分选择得分更高者的答案。这就是原论文用分数选择最终答案 允许逐步弃权两个机制的完整复刻。运行效果与输出解读在__main__中运行上述代码你会依次看到事实型专家基于提供的证据Kris Kristofferson 创作并发行于 1970 年专辑直接给出答案多跳专家先输出一段chain_of_thought推理过程需要找到谁首次录制并发行了这首歌再给出答案打分器分别对两个答案评分由于事实型专家的答案包含更完整的出处信息其得分更高最终被选中输出。值得注意的是两个专家的结论一致都是 Kris Kristofferson但事实专家答案的信息量更完整——这正是打分器存在的意义即便答案一致也能区分出哪个回答更优质从而提升最终输出质量。进阶调优阈值、专家数量与异步化调整弃权阈值threshold 0.8是控制系统何时敢作答的关键旋钮调高阈值如0.9系统更保守倾向于弃权适合容错率低、宁可不答也不能答错的场景如医疗、法律咨询调低阈值如0.6系统更激进几乎总是给出答案适合追求高召回、可接受错误答案的场景。由于打分被约束在[0, 1)区间阈值的语义直观且可解释。扩展更多专家原论文包含四位专家本文示例仅实现了事实型与多跳型两位。你可以按照同一模式轻松追加数学专家在提示词中加入 GSM8k 风格的逐步计算演示与常识专家在提示词前注入一组常识事实然后把所有专家的分数都纳入比较scores { factual: factual_expert_score.score, multihop: multihop_expert_score.score, # math: math_expert_score.score, # commonsense: commonsense_expert_score.score, } best_expert max(scores, keyscores.get) if scores[best_expert] threshold: answer Abstaining from responding并发与异步多个专家的天然加速点MoRE 的各个专家彼此独立、互不依赖天然适合并行执行。仓库中其他集成技术如 Self-Consistency 与 DiVeRSe 的实现正是用instructor.from_provider(..., async_clientTrue)配合asyncio.gather并发发起多次调用。把 MoRE 改造为异步版本只需client instructor.from_provider(openai/gpt-5-nano, async_clientTrue) async def run_more_async(query: str, evidence: list[str]): factual_coro query_factual_expert_async(query, evidence) multihop_coro query_multihop_expert_async(query) factual_output, multihop_output await asyncio.gather(factual_coro, multihop_coro) ...async_clientTrue的用法说明详见 from_provider 统一客户端创建指南。这样 N 个专家就能以接近单个专家调用的延迟完成全部推理。源码层面的机制支撑本文实现依赖的instructor.from_provider在 instructor/v2/auto_client.py 中定义签名如下简化def from_provider( model: Union[str, KnownModelName], async_client: bool False, cache: BaseCache | None None, mode: Union[Mode, None] None, **kwargs: Any, ) - Union[Instructor, AsyncInstructor]:model采用provider/model-name格式如openai/gpt-5-nano例如在 docs/concepts/from_provider.md 中将 provider 前缀换成anthropic/、google/即可无缝切换底层模型async_clientTrue返回异步客户端配合await client.create(...)使用mode可覆盖默认调用模式OpenAI 默认Mode.TOOLS通过**kwargs还可透传api_key、base_url、organization、timeout等 provider 专属参数。也就是说MoRE 流水线本身与具体模型解耦——你可以在不修改任何业务逻辑的前提下把事实专家换成检索能力更强的模型、把打分器换成更便宜的小模型如 gpt-5.4-mini实现成本与质量的精细权衡。总结MoRE 的核心价值不在于某个专家更强而在于结构化地组合异构推理能力并用统一的质量评分做仲裁。通过 instructor我们以三个 Pydantic 模型专家输出 ×2 打分器 ×1就完整复现了论文的核心机制——多专家并行生成、LLM 打分替代随机森林、阈值化弃权决策。整条流水线仅依赖client.create(response_model...)这一统一接口从 响应模型定义 到 结构化输出原理 均有仓库文档可循。如果还想进一步探索集成Ensembling家族的其他技术推荐对照阅读仓库中的 Self-Consistency多数投票、DiVeRSe多样化提示 逐步验证 与 Universal Self Prompting自适应示例选择——它们与 MoRE 互为补充共同构成一套完整的多输出择优工具箱。【免费下载链接】instructorstructured outputs for llms项目地址: https://gitcode.com/GitHub_Trending/in/instructor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考