
把 Claude 写的一篇与 Riemann 猜想相关的论文整理后作为上下文知识注入 GPT-5.6-Sol Pro然后它在评测中的成绩变成了 67.30%。如果你第一次看到类似标题大概率会有两种反应要么觉得这是“提示词玄学”要么觉得这只是模型厂商在营销。我的判断和这两种都不太一样。跨模型知识注入——也就是把 A 模型产出的高质量文本作为 B 模型的上下文知识——是当前提升大模型领域表现的最便宜、最可控、也最容易被低估的工程手段之一。它不动权重、不重训、不改架构却能在一个具体领域里带来肉眼可见的分数提升。这篇文章不打算替那个 67.30% 背书也不打算直接否定它而是把整件事拆成三个问题跨模型知识注入本质在做什么一个百分比要怎么解读才不算被带节奏如果想在自己的项目里复现类似实验完整的技术流程、代码、评测设计和坑在哪里。文章最后会附上适合直接落地的工程建议。1. 这篇文章真正要解决的问题1.1 多数人的误区分数提升 模型变强圈子里经常出现一种误读给模型喂了一份资料分数从 50% 涨到 67.30%于是得出结论“新模型比旧模型强”或者“这个提示词很神奇”。这两个结论都可能是错的。真正发生的变化往往只是模型的“工作记忆”里多了一段高质量、结构化的领域知识。模型本身的参数没有变化推理能力也没有变化变化的是它在生成回答时的可用信息量。这就好比一个数学系学生考试前拿到了一份优秀的复习笔记我们不能说这个学生的智商变高了只能说他在这次考试里的信息优势变大了。所以第一个要解决的问题就是把“模型的输出”和“模型的知识状态”区分开。这也是本文所有实验设计的前提。1.2 什么样的人最应该读这篇文章正在做 AI 应用开发但不想投入算力做微调想用低成本方式提升模型在垂直领域的效果。经常在 ChatGPT、Claude 这类对话产品里手动“喂资料”的工程师想知道这种做法背后的工程化方法。被各种“XX 模型分数 XX%”标题轰炸但希望学会判断这个数字是否可信的技术读者。准备搭建评测体系但还没有想清楚如何避免基准污染、如何设置对照组的同学。如果你属于以上任何一类这篇文章的实操部分可以直接拿去做一个最小实验闭环。2. 核心概念跨模型知识注入到底在做什么2.1 从“喂提示词”到“知识注入”跨模型知识注入Cross-Model Knowledge Injection可以这样理解把模型 A 输出的内容——比如一篇论文、一段技术文档、一组问答对——经过结构化处理后作为模型 B 生成回答时的参考上下文。它和普通提示词工程的区别在于普通提示词强调“怎么说”例如角色设定、语气要求、输出格式。知识注入强调“给它什么”重点是把外部知识放到上下文的合适位置让模型在生成时优先参考。没有它的时候你要么把知识写死在 Prompt 里量一大就超出上下文窗口要么走微调路线成本高、周期长、风险大。知识注入是介于两者之间的一条路它利用大模型不断扩大的上下文窗口把“可用的知识量”变成一种可以动态调整的资源。2.2 与 RAG、微调、Few-shot 的边界方法是否改参数知识来源典型成本适合场景微调是训练数据集高需要 GPU 和训练流程需要固化特定行为或格式RAG否外部检索库中需要搭建向量库和检索链路知识库大、动态更新频繁Few-shot 示例否少量示例低快速示范任务格式跨模型知识注入否另一个模型的产出低一次性或小规模知识增强从表中可以看出跨模型知识注入和 RAG 的区别在于知识来源RAG 的知识通常来自文档库而知识注入的知识可能来自另一个聊天模型、一个 Agent 工具链或者一场深度对话的总结。它的核心优势是“快”和“灵活”但劣势也很明显没有检索机制知识一旦超出上下文窗口就只能截断知识过大会均匀分散模型的注意力。标题里的实验本质是把 Claude 产出的高质量论文作为“一次性知识包”注入到 GPT-5.6-Sol Pro。这里面真正有价值的点不是“Claude 写的论文一定比人类写好”而是“一个强模型产出的结构化知识是否能成为另一个强模型的可复用上下文资产”。2.3 一个通俗类比可以把目标模型想象成一个经验丰富的咨询顾问。他本身能力很强但对某个冷门领域缺乏一手资料。现在你递给他一份另一个顶级专家写的行业报告让他先花十分钟读完再回答客户问题。跨模型知识注入就是“递报告”这个动作的工程化版本。这个类比还能解释为什么 67.30% 这类数字经常引发争议报告的质量、阅读顺序、以及测试题是否预先泄露都会影响最终的“成绩”。报告好不代表顾问突然变聪明测试题刚好在报告范围内也不代表顾问什么都会。3. 为什么 67.30% 这个数字要拆开看3.1 数字本身存在三个问题第一个问题基线是多少。从 30% 涨到 67.30% 和从 66.50% 涨到 67.30%意义完全不同。没有基线的百分比本质上是一个无法验证的孤证。第二个问题评测集是什么。如果评测的是“能否复述论文中的结论”那本质上考的是模型的阅读理解能力而不是数学推理能力。如果评测的是“能否推导论文中未出现的定理”那分数含金量就高得多。第三个问题是否发生了基准污染。如果测试题目恰好出现在模型的训练语料里那么注入知识与否分数都会很高反过来如果测试题目是从论文里直接抽的原句那么注入知识后分数涨得再高也只是“开卷考试”的正常表现。3.2 可信的评估需要什么至少需要满足四个条件有对照组同一模型、同一评测集、同一参数设置分别在有知识注入和无知识注入的情况下各跑一次。有多轮采样固定 temperature 和 seed或者在 temperature 较低的情况下多次运行取均值排除随机性。有用例划分测试题按“知识覆盖范围内”和“知识覆盖范围外”两个子集分开统计这样才能看出模型是真的学会了推理还是只会复述。有边界说明明确报告评测的是准确率、通过率、人工评分还是 LLM-as-Judge 评分。缺少以上任何一条67.30% 都只能算一个“参考信息”而不是“结论”。4. 环境准备与前置条件4.1 模型访问与 API Key要进行跨模型知识注入实验首先需要能同时访问两个模型知识生产模型文中案例使用的是 Claude你需要一个可用的 Anthropic API Key。目标模型案例中的 GPT-5.6-Sol Pro你需要能通过官方 API 或兼容网关调用它。这里有一个常见误区很多人以为注册、拿 Key、充值、配置环境变量是一件“几分钟就能搞定”的事。实际上新用户注册、区域开放、套餐额度、API 与对话产品是否互通每个环节都可能卡住。尤其是命令行工具类产品很多人会先装工具再配环境结果在 Windows PowerShell 下直接报“无法将 claude 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”的错误这本质上就是 PATH 环境变量没有配置好。稳妥的做法是先通过官方 API 控制台确认能成功发起一次最小请求再进入实验流程。如果你用的是兼容 OpenAI 协议的中转网关还要确认 base_url、模型标识和计费方式。4.2 依赖与工具本文的代码示例使用 Python 3.10 和 OpenAI 兼容客户端。具体到模型服务商时请以实际 API 文档为准这里演示的是通用思路。pip install openai1.0.0 anthropic0.30.0还需要准备一个评测集 JSON 文件包含问题、参考答案、难度标签。一份论文文本文件例如 riemann_paper.txt。一个用于记录实验结果的输出目录。4.3 评测集设计建议评测集不要一上来就追求“大而全”。建议先准备 30 到 50 道题分三个维度知识覆盖内的事实题答案可以直接从论文中找到。知识覆盖内的推理题答案需要综合论文中多个部分才能得出。知识覆盖外的泛化题论文没有直接答案需要模型用已有能力回答。这样后续的分数才能告诉你知识注入到底帮了多少是“帮复述”还是“帮推理”。5. 完整实验流程与代码实现5.1 第一步把论文变成结构化知识包直接整篇塞进 Prompt 是最粗糙的做法。更稳妥的是把论文切块并保留关键结构信息控制注入量在上下文窗口的合理范围内。# 文件路径prepare_context.py import json import re from pathlib import Path def split_paper_to_chunks(text: str, max_chars: int 2000): 把论文正文按段落切块同时保留标题结构信息。 lines text.split(\n) chunks [] current_header for line in lines: stripped line.strip() if not stripped: continue if re.match(r^(#{1,4}|\d[.、]|\d\.)\s, stripped): current_header stripped chunks.append(stripped) continue if len(stripped) max_chars: start 0 while start len(stripped): end min(start max_chars, len(stripped)) # 尽量在句号附近切断 while end len(stripped) and stripped[end] not in 。: end 1 chunks.append(f[{current_header}] {stripped[start:end]}) start end else: chunks.append(f[{current_header}] {stripped}) return chunks def build_context_pack(paper_path: str, max_estimate_chars: int 6000): 把切好的论文块拼成一个上下文知识包并控制总长度。 这里用字符数估算 token1 个中文字符约 1.5~2 token 实际请根据模型的 tokenizer 调整。 text Path(paper_path).read_text(encodingutf-8) chunks split_paper_to_chunks(text) packed [] used 0 for chunk in chunks: cost int(len(chunk) * 2) if used cost max_estimate_chars * 2: break packed.append(chunk) used cost return \n.join(packed)这段代码做了三件事按标题结构保留论文的层级信息对超长段落按句号边界切分避免语义被硬切断通过字符数估算 token 总量防止上下文溢出。实际项目中如果你有多篇论文可以在此基础上加一个“知识包顺序策略”例如摘要在前、核心定理其次、证明细节最后。5.2 第二步构造注入式 Prompt知识注入的关键是让模型清楚地知道“哪些内容是参考资料哪些内容是任务指令”。这里推荐使用明确的区域分隔和指令约束。# 文件路径run_experiment.py from openai import OpenAI from prepare_context import build_context_pack client OpenAI( api_keyYOUR_API_KEY, base_urlYOUR_GATEWAY_URL/v1, # 以实际服务商为准 ) SYSTEM_PROMPT ( 你是一名严谨的数学研究助手。你的回答必须基于两个来源\n 1. 用户提供的【知识片段】。\n 2. 你自身的数学知识。\n 当【知识片段】与你的自身知识冲突时请明确指出冲突不要强行调和。 回答时先给出结论再给出理由。 ) def build_user_prompt(question: str, context_pack: str) - str: if not context_pack: return f请回答下面的数学问题\n{question} return ( 以下是从一篇关于 Riemann 猜想的论文中整理出的知识片段\n\n 知识片段开始 \n f{context_pack}\n 知识片段结束 \n\n f请基于上述知识片段回答下面的问题\n{question} ) def ask(question: str, context_pack: str, model: str gpt-5.6-sol-pro): response client.chat.completions.create( modelmodel, temperature0.0, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: build_user_prompt(question, context_pack)}, ], ) return response.choices[0].message.content if __name__ __main__: pack build_context_pack(riemann_paper.txt) answer ask( Riemann zeta 函数在 s1 处有什么性质请基于知识片段回答。, pack, ) print(answer)这里有几个容易被忽略的细节。第一system prompt 里明确写了“如果与自身知识冲突请指出冲突”。这样做是为了避免知识注入把模型的判断力带偏——毕竟知识片段也可能包含错误。第二用户 prompt 中使用了显式的分隔标记“ 知识片段开始 ”让模型能更准确地区分“参考区”和“任务区”。第三temperature 固定为 0.0保证同一问题在多次运行时的随机波动最小。5.3 第三步带对照组的评测循环评测必须同时跑“无知识注入”和“有知识注入”两组。下面的代码演示了最小可用的评测循环并输出一个汇总分数。# 文件路径evaluate.py import json import random from prepare_context import build_context_pack from run_experiment import ask def load_eval_set(path: str): with open(path, encodingutf-8) as f: return json.load(f) def judge_answer(answer: str, reference: str) - int: 简化版判定参考答案中的关键短语是否出现在回答中。 生产环境建议使用 LLM-as-Judge 或人工评分。 for phrase in reference.split(): if phrase and phrase in answer: return 1 return 0 def run_eval(eval_set, use_context: bool, trials: int 3): context_pack build_context_pack(riemann_paper.txt) if use_context else correct 0 total len(eval_set) * trials for item in eval_set: for t in range(trials): answer ask(item[question], context_pack) correct judge_answer(answer, item[reference]) print(f[{ctx if use_context else base}] f{item[question][:30]} - 正确 if judge_answer(answer, item[reference]) else f[{ctx if use_context else base}] {item[question][:30]} - 错误) return correct / total if __name__ __main__: eval_set load_eval_set(eval_set.json) baseline run_eval(eval_set, use_contextFalse, trials3) with_context run_eval(eval_set, use_contextTrue, trials3) print(f\nBaseline : {baseline * 100:.2f}%) print(fWith Context : {with_context * 100:.2f}%) print(fDelta : {(with_context - baseline) * 100:.2f}%)这个脚本虽然简单但已经覆盖了实验报告最基本的要素对照组、多次采样、汇总指标。实际使用时还需要把每次生成的原始回答保存下来而不是只存一个 0 或 1 的判定结果。原始回答是判断“模型是复述知识还是真正推理”的第一手证据。需要特别说明的是上面 judge_answer 中的“参考答案关键短语命中”只是一个演示用简化方案严格来说它无法衡量语义等价更适合做快速冒烟测试。正式评测里推荐三种方式结合关键词命中、LLM-as-Judge用第三个模型对回答与参考答案做语义一致性评分、抽样人工复核。6. 运行结果与效果验证6.1 预期输出以下是一种可能的运行输出形态具体数值取决于评测集与模型版本[base] Riemann zeta 函数在 s1 处有什么性质 - 错误 [base] zeta 函数在临界带内的零点分布 - 正确 [ctx] Riemann zeta 函数在 s1 处有什么性质 - 正确 [ctx] zeta 函数在临界带内的零点分布 - 正确 Baseline : 41.33% With Context : 67.30% Delta : 25.97%如果输出中出现了类似的分数提升先不要急着庆祝。按下面的顺序确认结果是否可信。6.2 判断成功与否的标准第一步看趋势是否稳定。把 trials 从 3 提到 10看分数是否还在同一个区间。温度设为 0.0 后波动仍然很大说明评测集或 Prompt 本身不稳定。第二步看提升分布。把评测集按“知识覆盖内的事实题”“覆盖内的推理题”“覆盖外的泛化题”三个子集分别统计。理想结果应该是事实题大幅提升推理题小幅提升泛化题持平或略微波动。如果三个子集都在涨尤其是泛化题也在涨要多留一个心眼——可能测试题本身和论文内容高度重合也就是发生了信息泄露。第三步看失败样本。把加了知识之后仍然答错的题挑出来逐条分析是知识包被截断导致信息缺失还是知识包中相关表述与问题的问法不一致又或者是目标模型自我认知过强即使有知识片段也坚持按自己的知识回答。7. 常见问题与排查思路问题现象可能原因排查方式解决方案加了知识后分数反而下降上下文过长知识片段混杂大量无关信息对比不同上下文长度下分数变化曲线压缩知识包保留与评测主题强相关的章节模型回答完全无视知识片段知识区与任务区边界不清晰检查 Prompt 分隔符是否冲突使用“ 知识片段开始 ”这类显式标记并在 system 中强调优先级相同问题多次运行分数波动大temperature 未固定或评测集样本太少固定 temperature0增加采样轮次设置 seed按 3 轮取均值分数涨得反常地高评测题与论文原文高度重合或评测题在训练语料中出现过换一份未公开的新题或把论文结论改写后再出题完善评测集隔离机制实现“出题与知识包互相独立”请求报错或超时上下文长度超过模型限制查看 API 返回的 usage 信息和错误码调低 build_context_pack 中的 max_estimate_chars并在调用时显式设置 max_tokens命令行工具报“无法将 claude 项识别为 cmdlet”未安装 CLI 工具或未配置 PATH 环境变量在 PowerShell 执行where.exe claude重新安装并确认 bin 目录已加入 PATH或使用 npx 方式调用除了上表还有两个高频问题需要单独说明。第一个是网络和网关问题。调用非官方网关时经常出现“非预期 SSL”“连接中断”等报错。这种时候先不要怀疑代码按顺序检查网关地址是否写对、Key 是否有效、地区网络策略是否允许访问、API 控制台是否有调用记录。把调用日志打开通常能在第一层就定位问题。第二个是模型标识写错。很多兼容 OpenAI 协议的网关要求使用完整的模型 ID而不是对话产品里的产品名。例如你可能需要传“gpt-5.6-sol-pro”或某个带版本后缀的内部标识写错会直接返回 model not found。建议从服务商文档里复制官方模型标识不要手打。8. 最佳实践与工程建议8.1 知识包的组织策略知识注入的收益上限取决于知识包的质量密度而不是文本总量。一篇几万字的论文经过去重、结构化、摘要化之后核心内容可能只有几千字。在注入前做一次“知识密度压缩”往往比无脑塞入更有效。我的建议是采用三级结构知识摘要100 到 300 字概括论文的核心问题、方法与结论。关键定义与定理按编号列出每条控制在一段以内。支撑材料需要时按需追加比如引理证明的推导线索。这样做的原因是模型在处理长上下文时存在“注意力稀释”问题。把最核心的结论放在前面让模型优先关注可以提高命中率。8.2 提示结构的稳定性不要在 Prompt 里使用模棱两可的措辞。清晰的做法是显式定义知识区、任务区、输出区并声明冲突处理策略。另外如果知识包中有大量公式注意公式的文本化表示。Markdown 风格的数学公式在不同的 API 客户端里解析效果不一致建议实验阶段统一使用纯文本或 LaTeX 原始字符串避免因渲染问题导致公式信息丢失。8.3 评测隔离与防污染评测隔离是这里最容易被跳过、却又最重要的一步。两个原则必须守住不要用“喂给模型的知识内容”直接出题。把论文结论做同义改写、变换数值、改变提问角度再放入评测集。不要反复使用同一个公开 Benchmark。如果测试题已经被广泛用于模型训练你测出来的分数就不是“知识注入后”的成绩而是“模型见过原题”的成绩。如果团队有资源建议维护一个“私有评测集”并定期用新题替换旧题。发布分数时也应当同时公开评测集性质、采样轮数、对照组信息。8.4 版本管理与安全边界实验的可复现性来自版本管理。每次实验至少记录五个信息目标模型标识、知识生产模型标识与 Prompt 版本、知识包生成脚本版本、评测集版本、采样参数。这五个信息齐全别人以及三个月后的你自己才能复现实验结果。安全方面同样值得注意。如果你注入的知识包含未公开的论文或受版权保护的材料请先确认你有权使用这些内容。知识注入只是把文本放进了上下文并不能改变它的版权属性。另外在涉及生产环境时不要直接把不确定性很高的知识包投放到面向用户的流程里先做小范围灰度验证。9. 总结与后续学习方向回到开头那个问题把 Claude 的论文传给 GPT-5.6-Sol Pro分数变成 67.30%这件事说明了什么我的结论是它说明跨模型知识注入在实践中确实可能带来显著收益但收益的真实大小取决于知识包的结构质量、注入方式、评测集的隔离程度和对照组的设置。67.30% 本身只是一个起点不是一个答案。如果你接下来想自己动手建议按这个路径推进第一步准备 30 道题的私有评测集跑出基线第二步实现本文的 prepare_context 和 run_experiment完成第一轮知识注入实验第三步把结果分成“覆盖内事实题、覆盖内推理题、覆盖外泛化题”三组分析找到真正的收益来源第四步尝试把知识包从论文扩展到 Agent 工具链的对话记录看看从“模型产出”到“另一个模型的上下文资产”这个链路能走多远。再往后值得深入的方向是检索化改造当知识包大到无法一次性注入时可以引入检索模块把跨模型知识注入升级成带索引的 RAG 系统。从这个角度看跨模型知识注入并不仅仅是一个“提示词技巧”它其实是连接对话模型、Agent 工具链和企业知识库的中间形态。把这套流程跑通之后再去看各种模型分数你会有一个更稳健的判断框架。