RAG(检索增强生成)里的文档管理
RAG(检索增强生成)是结合检索与生成式 AI 的技术框架。核心逻辑是先从外部知识库精准检索相关信息,再将其作为上下文输入大模型生成回答。技术上依赖检索引擎(如向量数据库、BM25)、大语言模型(如 GPT、LLaMA)及数据预处理技术。通过检索增强,解决大模型知识滞后、幻觉问题,提升回答准确性。应用广泛,涵盖智能客服、医疗问答、法律检索、教育辅导等场景,能基于特定领域知识提供精准、可控的生成内容。
wow-RAG 是 Datawhale 推出的 RAG 技术实践项目,网址:datawhalechina/wow-rag: A simple and trans-platform rag framework and tutorial https://github.com/datawhalechina/wow-rag
在 RAG(检索增强生成)的文档管理中,核心流程围绕 “文档预处理 - 存储 - 检索优化” 展开:首先对原始文档进行加载与清洗,去除冗余信息并统一格式;接着通过分块策略将长文档拆解为语义连贯的小片段(如按句子、段落或主题分割),同时提取元数据(如来源、时间);随后为每个文档片段生成向量嵌入,借助向量数据库将嵌入向量与文本片段关联存储,构建可高效检索的索引;最后结合动态更新机制,支持新增文档的增量入库、过时文档的删除或修正,并通过调整分块粒度、嵌入模型参数等方式持续优化检索准确性,确保后续检索时能快速匹配到与用户 query 语义相关的文档片段。
查看index下的所有文档
print(index.docstore.docs)
print(index.docstore.docs) 的输出结果是一个 字典,其中包含了通过 VectorStoreIndex.from_documents() 处理后存储在文档仓库(docstore)中的所有文档或节点(Node)数据。字典的 键是文档 / 节点的唯一 ID(如 doc_id 或 node_id),值是对应的文档 / 节点对象,包含文本内容、元数据、哈希值等核心信息。
输出中每个 Document 或 Node 对象的关键信息包括:
id_ 唯一标识符,用于索引和检索;
text 经过分块、清洗后的文档内容片段;
metadata 文档的附加信息(如来源、页码、时间等),辅助检索过滤;
hash 文档内容的哈希值,用于检测重复或更新。
输出:
{'7601e3d4-10f2-4578-a740-3844ea5347ab': TextNode(id_='7601e3d4-10f2-4578-a740-3844ea5347ab', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='2db319b2-7b0c-4c79-9be4-a3663819828c', node_type='1', metadata={}, hash='b12dc0fd22c420bcfefb4bf02ea246dc75127380caad1c4c69d8547ff3c6a6f5')}, metadata_template='{key}: {value}', metadata_separator='\n', text='总的来说,大模型可以分为常规大模型和推理型大模型,我们大多数人口中的大模型一般都是指常规大模型,本文重点介绍推理型大模型,并尽可能将大模型的推理过程解释清楚,最后再来说说deepseek为什么能成功,用了哪些技术。\r\n\r\n什么是推理型大模型\r\n与常规 LLM 相比,推理型 LLM 在回答问题前,往往会先将问题拆解为更小的步骤(通常称为推理步骤或思考过程),也可以说是思维链COT。\r\n\r\n\r\n普通大模型直接给出答案,没有给出求解过程。推理型大模型会将推理过程和答案一起输出。那么,“思考过程”、“推理步骤”或“思维链”(CoT, Chain-of-Thought)究竟意味着什么?\r\n\r\n\r\n我在之前的复旦大学文章中也提到过过思维链,可以说某种程度上,思维链直接决定了大模型的推理规划能力:\r\n\r\n\r\n爱吃牛油果的璐璐:细说复旦大学,斯坦福大学智能代理AI-Agent(二更)\r\n280 赞同 · 16 评论文章\r\n\r\n爱吃牛油果的璐璐:大模型中的思维链、思维树、思维图\r\n19 赞同 · 2 评论文章\r\n虽然我们可以探讨大模型是否真的能像人类那样思考,但这些步骤将整个过程拆解为更小,且结构化的推理。推理型大模型不仅学习“回答什么”,更学习“如何回答”。\r\n\r\n\r\n为了理解推理型大模型的构建过程,我们首先需要探讨一个范式转变。\r\n\r\nTrain-time compute 到 Test-time compute\r\n大模型从关注训练阶段的扩展(训练时计算)转向关注推理阶段(测试时计算),下面对两者分别进行介绍。\r\n\r\n训练时计算:Train-time compute\r\n在 2024 年上半年之前,为了提升大模型在预训练阶段的性能,开发者通常会增加以下几个方面的规模:\r\n\r\n• 模型参数(parameters)\r\n\r\n• 数据集(tokens )\r\n\r\n• 计算量(FLOPs )\r\n\r\n这三者合称为训练时计算(train-time compute),它体现了预训练数据作为“ AI 之燃料”的理念。基本上,预训练投入越大,最终得到的模型就会越出色。\r\n\r\n\r\n训练时计算不仅包括训练期间所需的计算量,还涵盖了微调时所需的计算量。\r\n\r\n\r\n长期以来,这些因素一直是提升 LLMs 性能的关键。研究人员通过各种 Scaling Law 探讨模型规模(包括计算量、数据集大小和模型参数数量)与模型性能之间的关系。这些定律属于所谓的“幂律”:某一变量(例如计算量)的增加会导致另一变量(例如性能)按比例发生变化。\r\n\r\n\r\n通常,这些关系会在对数-对数坐标系下展示(呈现直线),以突出计算量的大幅增加。', mimetype='text/plain', start_char_idx=0, end_char_idx=1103, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), '2db319b2-7b0c-4c79-9be4-a3663819828c': TextNode(id_='2db319b2-7b0c-4c79-9be4-a3663819828c', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='7601e3d4-10f2-4578-a740-3844ea5347ab', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='32cfc924bc4fef294e6a4d6fdf27b07c2fd8ac2341c4c203b59c3d9e2cb658c2'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='0d515c1f-5c01-45a0-8ecb-fbb2644dfcf8', node_type='1', metadata={}, hash='f4b3bad6187a5829f41b2fbabb5986885799dcfcc242ecbe51050f5e16a93cba')}, metadata_template='{key}: {value}', metadata_separator='\n', text='长期以来,这些因素一直是提升 LLMs 性能的关键。研究人员通过各种 Scaling Law 探讨模型规模(包括计算量、数据集大小和模型参数数量)与模型性能之间的关系。这些定律属于所谓的“幂律”:某一变量(例如计算量)的增加会导致另一变量(例如性能)按比例发生变化。\r\n\r\n\r\n通常,这些关系会在对数-对数坐标系下展示(呈现直线),以突出计算量的大幅增加。最为知名的规模定律包括“Kaplan 定律”和“Chinchilla 定律”。这些定律能大致说明,随着计算量、token 数量和参数数量的增加,模型性能也会相应提升。\r\n\r\n\r\n(图片来自《Scaling laws for neural language models》)展示了模型性能如何随着不同计算指标(如更长的训练时间、数据集规模和参数数量)的增长而提高。这些定律也表明,为了获得最佳性能,必须同步扩展这三个因素。Kaplan 定律指出,在固定计算量的前提下,扩大模型规模通常比增加数据量更为有效;而 Chinchilla 定律则认为,模型规模和数据量同样重要。\r\n\r\n然而,在 2024 年期间,虽然计算量、数据集规模和模型参数数量持续增长,但其带来的性能提升却呈现出边际递减的趋势。\r\n\r\n\r\n正如这些幂律所揭示的那样,随着规模的不断扩大,收益也会逐步递减。这就引发了一个问题:“我们是否已经遇到了瓶颈?”当然没有,办法总比困难多嘛,也自然而然的引出了测试时计算这一技术。\r\n\r\n测试时计算:Test-time Compute\r\n增加训练时计算的高昂成本促使人们转而关注另一种方法——即测试时计算(Test-time Compute)。与不断增加预训练成本不同,测试时计算允许模型在推理过程中“多思考一会儿”。\r\n\r\n\r\n非推理型模型,通常只输出答案,省略“推理”步骤,如下图所示:\r\n\r\n\r\n而推理型模型则会使用更多的 tokens,通过系统性的思考过程推导出答案:\r\n\r\n\r\n这一思路的核心在于:要 LLM 花费更多计算资源来生成更好的答案。若所有增加的计算资源都用在生成最终答案上,实际效率不高;但若将新增的计算资源用在提前生成包含额外信息、关系以及新思路的 token 上,则模型最终答案的质量会高得多。\r\n\r\n换句话说,与其让模型直接把所有“算力”都投入到“一次性生成最终答案”,不如在生成答案之前先产生一些中间思考或辅助信息(tokens),再在此基础上输出答案。这样会带来更高质量、更准确的结果,尽管过程看似生成的文本更多、消耗的算力更大,但实际却更高效,因为减少了错误或浅层回答的概率,从而节省了后续反复验证或修改的成本。', mimetype='text/plain', start_char_idx=925, end_char_idx=2027, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), '0d515c1f-5c01-45a0-8ecb-fbb2644dfcf8': TextNode(id_='0d515c1f-5c01-45a0-8ecb-fbb2644dfcf8', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='2db319b2-7b0c-4c79-9be4-a3663819828c', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='091944a0268f207c7dfb2b74f64cd129e2b96a775f3ccad6a1f43d4c23a6c652'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='48567331-b35c-40f0-b63a-08a8cf96b423', node_type='1', metadata={}, hash='7d7ea952a1a237c6b591e674e262f89fb6f2ed6053142cfe6c26a6aa1e6ff0f0')}, metadata_template='{key}: {value}', metadata_separator='\n', text='换句话说,与其让模型直接把所有“算力”都投入到“一次性生成最终答案”,不如在生成答案之前先产生一些中间思考或辅助信息(tokens),再在此基础上输出答案。这样会带来更高质量、更准确的结果,尽管过程看似生成的文本更多、消耗的算力更大,但实际却更高效,因为减少了错误或浅层回答的概率,从而节省了后续反复验证或修改的成本。\r\n\r\n\r\n规模定律scaling law\r\n与训练时计算相比,测试时计算的规模定律相对较新。其中有两个有趣的研究方向,将测试时计算的规模定律与训练时计算联系起来。\r\n\r\n首先,OpenAI 的一篇帖子展示了测试时计算可能遵循与训练时计算相同的扩展趋势。\r\n\r\n\r\n图示中添加了红色虚线, OpenAI 认为这一新范式可能属于测试时计算。\r\n\r\nOpenAI 认为随着测试时计算领域的不断发展,可能会出现一种向测试时计算扩展的范式转变。\r\n\r\n其次,一篇题为《Scaling Scaling Laws with Board Games》的有趣论文,探索了 AlphaZero,并在不同的计算量下训练它以玩 Hex 游戏。\r\n\r\n\r\n图示展示了他们如何构造不同程度的训练时计算和测试时计算。其研究结果表明,训练时计算与测试时计算之间存在紧密联系。每一条虚线都展示了达到特定 ELO 分数所需的最小计算量。\r\n\r\n\r\n随着测试时计算扩展得像训练时计算一样,一个新的范式正逐步形成,即利用更多测试时计算来构建“推理”模型。通过这种范式转变,这些“推理”模型不再纯粹依赖训练时计算(预训练和微调),而是在训练和推理之间取得平衡。\r\n\r\n\r\n测试时计算甚至可以在思考时间上实现扩展,如下图所示:\r\n\r\n\r\n“长度扩展”也是我们在深入探讨 DeepSeek-R1 时将会探讨的一个内容。\r\n\r\n测试时计算的类别\r\n如 DeepSeek R-1 和 OpenAI-o1 这样推理模型的巨大成功表明,测试时计算不仅仅是“多思考一会儿”这么简单。\r\n\r\n测试时计算可以涵盖多种技术,包括思维链、修正答案、回溯、采样等等。\r\n\r\n大致而言,这些技术可以分为两大类:\r\n\r\n1. Search against Verifiers:利用验证器进行搜索(采样生成多个答案并挑选最佳答案)\r\n\r\n2.', mimetype='text/plain', start_char_idx=1868, end_char_idx=2813, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), '48567331-b35c-40f0-b63a-08a8cf96b423': TextNode(id_='48567331-b35c-40f0-b63a-08a8cf96b423', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='0d515c1f-5c01-45a0-8ecb-fbb2644dfcf8', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='927234300d1f955466fb71fcf65e8c5323b5e7437bcf0a72aee2a5c1451d1d79'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='1003dfc4-ae7f-4909-83c8-5c049689613d', node_type='1', metadata={}, hash='9d26742453510558b469f5b02a13b1cb42a888fa4b63d79b8202d7cde06e6071')}, metadata_template='{key}: {value}', metadata_separator='\n', text='测试时计算的类别\r\n如 DeepSeek R-1 和 OpenAI-o1 这样推理模型的巨大成功表明,测试时计算不仅仅是“多思考一会儿”这么简单。\r\n\r\n测试时计算可以涵盖多种技术,包括思维链、修正答案、回溯、采样等等。\r\n\r\n大致而言,这些技术可以分为两大类:\r\n\r\n1. Search against Verifiers:利用验证器进行搜索(采样生成多个答案并挑选最佳答案)\r\n\r\n2. Modifying Proposal Distribution:修改Proposal(个人不太喜欢提议这个翻译,总感觉较英文差点意思)分布(训练过的“思考”过程)\r\n\r\n\r\n两种方法的侧重点不同,利用验证器进行搜索侧重于输出,而修改提议分布则侧重于输入。\r\n\r\n\r\n接下来,将探讨两种类型的验证器:\r\n\r\n• 结果奖励模型(Outcome Reward Models, ORM)\r\n\r\n• 过程奖励模型(Process Reward Models, PRM)\r\n\r\n结果奖励模型 ORM\r\nORM只对结果进行评判,而不关心背后的过程:\r\n\r\n\r\n相反,过程奖励模型 PRM 不仅评判结果,还会考量生成结果的过程(即“推理”过程)。\r\n\r\n过程奖励模型PRM\r\n\r\n为了使 PRM 的推理步骤更具体,我们将推理展开看:\r\n\r\n\r\n可以看到:PRM 对步骤 2 打了一个最低分,说明步骤 2 是一个坏的推理步骤。\r\n\r\n接下来探讨它们在各种验证技术中的应用。\r\n\r\nSearch against Verifiers\r\n测试时计算的首个主要方法是利用验证器进行搜索。这个过程通常包括两个步骤:\r\n\r\n1. 生成多个推理过程及其对应的答案。\r\n\r\n2. 然后,利用验证器(即奖励模型)对生成的输出进行评分。\r\n\r\n\r\n通常,验证器也是一个经过微调的 LLM,用于评判大模型的结果(ORM)或大模型的思考过程(PRM)。\r\n\r\n使用验证器的一个主要优势在于,无需重新训练或微调用于回答问题的 LLM。\r\n\r\n多数投票(Majority Voting)\r\n最直接的方法其实是不使用任何奖励模型或验证器,而是采用多数投票。\r\n\r\n具体做法是让模型生成多个答案,然后选取出现次数最多的那个作为最终答案。\r\n\r\n\r\n这种方法也被称为 自洽性(self-consistency),以强调需要生成多个答案及其推理步骤。\r\n\r\nBest-of-N 样本\r\n第一种真正使用到验证器的方法被称为 Best-of-N 样本。它的核心思路是:生成 N 个答案样本,然后使用验证器(一般是结果奖励模型,ORM)来对每个答案进行判断。\r\n\r\n1. 生成多个答案\r\n\r\n通常由一个大模型(也经常被称为“Proposer”)在较高或多种温度设定下生成多个答案样本。\r\n\r\n\r\n2.', mimetype='text/plain', start_char_idx=2618, end_char_idx=3784, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), '1003dfc4-ae7f-4909-83c8-5c049689613d': TextNode(id_='1003dfc4-ae7f-4909-83c8-5c049689613d', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='48567331-b35c-40f0-b63a-08a8cf96b423', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='dab9d5a9804ccde77aae7da82fe19b02d117eb4aeb86375d560b931e44df9e57'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='de3af69b-5b14-4e1c-82c2-573807e3c0ff', node_type='1', metadata={}, hash='af4bf4bc0882b658cb247252603c38fceeb90b20596e3a1c04b7fa7a5e969381')}, metadata_template='{key}: {value}', metadata_separator='\n', text='生成多个答案\r\n\r\n通常由一个大模型(也经常被称为“Proposer”)在较高或多种温度设定下生成多个答案样本。\r\n\r\n\r\n2. 评分并选取最佳答案\r\n\r\n将每个答案输入给结果奖励模型(ORM),为其打分,并选出分数最高的那个答案。\r\n\r\n\r\n如果想评估的不只是答案,还包括推理过程,则可以使用 过程奖励模型(PRM)。它会判断每个推理步骤的质量,并选取具有最高总权重的候选答案。\r\n\r\n\r\n基于这两类验证器,我们还可以让奖励模型(RM)分别对每个答案候选进行加权,然后选出综合得分最高的那一个,这种方法被称为 加权 Best-of-N 样本(Weighted Best-of-N samples)。\r\n\r\n\r\n使用过程奖励模型的 Beam Search\r\n在生成答案和中间推理步骤时,我们可以将上述过程进一步扩展到 Beam Search。\r\n\r\n在 Beam Search 中,会对多个推理步骤进行采样,并由过程奖励模型(PRM)进行打分(类似于 Tree of Thought 的思路)。在此过程中,我们会追踪评分最高的若干条“beam”,例如前三名。\r\n\r\n\r\n这种方法能让我们快速终止那些得分低、不太可能带来理想结果的推理路径,从而将计算资源集中在更有用的推理路线。\r\n\r\n最终产生的答案,结合之前的 Best-of-N 方法进行加权或筛选,获得最高分答案。\r\n\r\n蒙特卡洛树搜索(Monte Carlo Tree Search)\r\n蒙特卡洛树搜索(MCTS) 是在搜索树中高效寻找最优路径的一种方法,通常包括以下四个步骤:\r\n\r\n1. Selection:根据特定公式(例如上置信界 UCB)选择当前树中的某个叶子节点。\r\n\r\n2. Expand:在该叶子节点处创建额外的子节点(新的推理步骤)。\r\n\r\n3. Rollouts:对新生成的节点进行若干次随机扩展,直到到达最终答案。\r\n\r\n4.', mimetype='text/plain', start_char_idx=3720, end_char_idx=4522, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), 'de3af69b-5b14-4e1c-82c2-573807e3c0ff': TextNode(id_='de3af69b-5b14-4e1c-82c2-573807e3c0ff', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='1003dfc4-ae7f-4909-83c8-5c049689613d', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='c1b0eed835d53ded34491c3a475ac26996c8c4fb06201b3ab91cd9297b50eee1'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='96c385d2-8703-4636-84de-21c9be129a97', node_type='1', metadata={}, hash='9b0cf263fb45fb1b28abf8f1be2330a2d5d028b39f87b59310995c7d9147772d')}, metadata_template='{key}: {value}', metadata_separator='\n', text='Selection:根据特定公式(例如上置信界 UCB)选择当前树中的某个叶子节点。\r\n\r\n2. Expand:在该叶子节点处创建额外的子节点(新的推理步骤)。\r\n\r\n3. Rollouts:对新生成的节点进行若干次随机扩展,直到到达最终答案。\r\n\r\n4. Backprop:将模拟中获得的分数或奖励向上更新到父节点。\r\n\r\n这四个步骤的目标是不断扩大最优推理路径的同时,兼顾对其他潜在路径的探索,即在“探索”与“利用”之间取得平衡。\r\n\r\n节点的选择和评分通常可参考下图所示的公式或方法来执行:\r\n\r\n\r\n在选择要进一步探索的推理步骤时,不一定总是选择当前看起来最佳的路径,这样有助于避免过早收敛。\r\n\r\n具体实现中,选中一个节点后,可以对其进行扩展(生成新的推理步骤),再使用适当的温度采样来生成多个变体。\r\n\r\n\r\n随后,我们会对某一分支进行多次模拟(rollout),直到生成完整的答案。\r\n\r\n这些 rollouts 可依据推理过程(PRM)、结果质量(ORM),或两者结合来进行评估并得到分数。\r\n\r\n最后,将这些得分回溯更新到父节点,然后继续进行新的选择(selection),周而复始,持续改进搜索过程。\r\n\r\n\r\n修改提议分布 (Modifying Proposal Distribution)\r\n让大模型进行推理的第二大类方法称为“修改提议分布”。与利用验证器(着重输出)来搜索正确推理步骤不同,这种方法会训练模型主动生成更优质的推理步骤(着重输入)。换句话说,我们会对用于采样(Completion/Thought/Tokens)的分布进行修改。试想,我们有一个问题,以及一个用于从中采样的 tokens 的分布。常见的策略是选取得分最高的 token:\r\n\r\n\r\n但注意在上方示意图中,有些 tokens 被标记成红色——这些 tokens 会更倾向于带来推理过程:\r\n\r\n\r\n尽管“贪婪”地选择得分最高的 token 并不一定错误,但如果某些 token 指向了更详细的推理步骤,往往可以得到更高质量的答案。\r\n\r\n当我们修改提议分布(即 token 的概率分布)时,实质上就是对模型的 token 排序进行重新评估,使得“推理” token 被选中的概率更大:\r\n\r\n\r\n从概念上说,修改提议分布的方法可以分成两类:\r\n\r\n1. 通过 Prompt Engineering 来更新提示\r\n\r\n2. 训练模型更多地关注推理 token 或推理过程\r\n\r\nPrompting\r\n在 Prompt Engineering 中,我们通过更新提示来改善输出,同时也会引导模型显式或隐式地展示之前提到的“推理过程”。\r\n\r\n要通过 Prompt 来改变提议分布,我们可以给模型提供示例(即“上下文学习”),从而诱导它生成更具推理倾向的回答:\r\n\r\n\r\n如果不想提供完整示例,也可以通过简单的一句话来指示模型,例如“Let’s think step-by-step”,从而让模型在回答之前先做推理拆解:\r\n\r\n\r\n不过需要注意:模型本身并不一定“真正学会”遵循这个过程。', mimetype='text/plain', start_char_idx=4394, end_char_idx=5686, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), '96c385d2-8703-4636-84de-21c9be129a97': TextNode(id_='96c385d2-8703-4636-84de-21c9be129a97', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='de3af69b-5b14-4e1c-82c2-573807e3c0ff', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='e670fdda69b7638a9f3f998133b042fdf895d6fe3e0889ad25c559ac774c2183'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='de04124e-49be-4503-ab1c-a0a61d78d97e', node_type='1', metadata={}, hash='7eeb3b0eecca43eea8d4540ae40f97de21c036d3060b749cdb7c305c9a55173e')}, metadata_template='{key}: {value}', metadata_separator='\n', text='要通过 Prompt 来改变提议分布,我们可以给模型提供示例(即“上下文学习”),从而诱导它生成更具推理倾向的回答:\r\n\r\n\r\n如果不想提供完整示例,也可以通过简单的一句话来指示模型,例如“Let’s think step-by-step”,从而让模型在回答之前先做推理拆解:\r\n\r\n\r\n不过需要注意:模型本身并不一定“真正学会”遵循这个过程。此外,这种方法是静态、线性的,缺少自我修正机制。一旦模型开始的推理过程出现错误,它往往会沿着这个错误的思路继续下去,而不进行修正。\r\n\r\nSTaR:Self-Taught Reasoner\r\n除了提示工程,另一个思路是让模型通过“学习”来进行推理,即让模型因生成相应的推理步骤而获得奖励。此类方法通常需要大量的推理数据和强化学习,以在训练中鼓励某些行为。\r\n\r\n一个颇具争议的方法是 STaR,即 Self-Taught Reasoner。STaR 会让 LLM 生成自身的推理数据,并将这些推理作为微调的训练输入。\r\n\r\n模型先在步骤 (1)中生成推理步骤和答案。如果答案正确 (2a),则将该推理过程和最终答案一起加入到三元组数据集中 (3a),用于后续的监督微调 (5)。这个过程如下图所示:\r\n\r\n\r\n如果模型给出的答案是错误的 (2b),则为模型提供一个“提示”(正确答案 3b),让它去推理为什么这个答案才是正确的 (4b)。模型最终的推理过程同样会被加入到相同的三元组数据集中,用于监督微调 (5)。这个过程如下图所示:\r\n\r\n\r\n在这一过程中(以及许多其他修改提议分布的方法中),我们都会显式地教模型去“遵循”我们示范的推理步骤。\r\n\r\n换句话说,我们可以通过监督微调来决定模型“应该怎样”进行推理。\r\n\r\nSTaR 的完整流程相当有趣,因为它会自动生成合成训练示例。正如我们会在后续讨论 DeepSeek R1 时看到的,使用合成训练示例是将推理过程蒸馏给其他模型的一种绝佳方式。\r\n\r\nDeepSeek-R1\r\n在推理模型领域,一项重大的发布是 DeepSeek-R1。这是一个开源模型,与 OpenAI 的 o1 推理模型直接竞争,并在业界产生了重大影响。\r\n\r\nDeepSeek 团队通过多种技术手段,成功地将推理能力巧妙融入到其基础模型(DeepSeek-V3-Base)中。我在之前的文章中也介绍了DeepSeek的核心概念,大家也可以根据需要进行查看:\r\n\r\n爱吃牛油果的璐璐:(万字长文)手把手教你认识学会 DeepSeek,掌握核心概念\r\n\r\n值得注意的是,在这一过程中并未使用任何验证器;与使用监督微调来提炼推理能力相比,DeepSeek 更加重视强化学习(RL)。', mimetype='text/plain', start_char_idx=5514, end_char_idx=6637, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), 'de04124e-49be-4503-ab1c-a0a61d78d97e': TextNode(id_='de04124e-49be-4503-ab1c-a0a61d78d97e', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='96c385d2-8703-4636-84de-21c9be129a97', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='c8d20d6e56694e9409ad23670d26acff62068326a36a6810d27ad98b99ff4c19'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='ac42e4d1-bce1-4a45-8cd5-6bb567effd10', node_type='1', metadata={}, hash='1ec237657830554c65eeacccd3237f068397158cf68ecfe91fa2d4171c73eec0')}, metadata_template='{key}: {value}', metadata_separator='\n', text='DeepSeek 团队通过多种技术手段,成功地将推理能力巧妙融入到其基础模型(DeepSeek-V3-Base)中。我在之前的文章中也介绍了DeepSeek的核心概念,大家也可以根据需要进行查看:\r\n\r\n爱吃牛油果的璐璐:(万字长文)手把手教你认识学会 DeepSeek,掌握核心概念\r\n\r\n值得注意的是,在这一过程中并未使用任何验证器;与使用监督微调来提炼推理能力相比,DeepSeek 更加重视强化学习(RL)。\r\n\r\n接下来,让我们深入探究他们是如何为模型训练出推理能力的。\r\n\r\nDeepSeek-R1 Zero 的推理机制\r\n在通往 DeepSeek-R1 的道路上,有一个实验性模型作出了关键贡献,名为 DeepSeek-R1 Zero。\r\n\r\n它基于 DeepSeek-V3-Base 而来,但并没有采用针对大量推理数据的监督微调,而是仅通过强化学习(RL)来激发模型的推理行为。\r\n\r\n为此,他们设计了一个非常简单直观的提示(Prompt),类似于系统提示,贯穿于整个Pipeline:\r\n\r\n\r\n可以看到,虽然提示中明确要求在 <think> 标签内写出推理过程,但并未对推理过程的具体形式做任何规定。\r\n\r\n强化学习阶段\r\n在强化学习阶段,DeepSeek基于规则设计了两类奖励:\r\n\r\n1. 准确度奖励(Accuracy rewards):通过测试答案的正确性来给予奖励。\r\n\r\n2.', mimetype='text/plain', start_char_idx=6429, end_char_idx=7032, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), 'ac42e4d1-bce1-4a45-8cd5-6bb567effd10': TextNode(id_='ac42e4d1-bce1-4a45-8cd5-6bb567effd10', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='de04124e-49be-4503-ab1c-a0a61d78d97e', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='6b5b23b0c939ad5a06c77fae3b7e677d53c87384fa3a41bd275b5f7c618332bc'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='a52e1285-b9f7-40aa-88b9-7849aa151697', node_type='1', metadata={}, hash='c332dac398e02d00ae38f2394e441b3bd87d98a479c9da51c34dcfafc63a067c')}, metadata_template='{key}: {value}', metadata_separator='\n', text='为此,他们设计了一个非常简单直观的提示(Prompt),类似于系统提示,贯穿于整个Pipeline:\r\n\r\n\r\n可以看到,虽然提示中明确要求在 <think> 标签内写出推理过程,但并未对推理过程的具体形式做任何规定。\r\n\r\n强化学习阶段\r\n在强化学习阶段,DeepSeek基于规则设计了两类奖励:\r\n\r\n1. 准确度奖励(Accuracy rewards):通过测试答案的正确性来给予奖励。\r\n\r\n2. 格式奖励(Format rewards):对使用 <thinking> 和 <answer> 标签的行为给予奖励。\r\n\r\n他们所使用的 RL 算法名为 Group Relative Policy Optimization (GRPO) 。接下来介绍GRPO的核心思路。\r\n\r\nGRPO\r\n对于那些导致答案正确的所有决策——无论是特定的 token 序列还是推理步骤——都会在训练中获得使其更有可能被采纳的权重调整。\r\n\r\n而对于那些导致答案错误的所有决策,则会在训练中获得使其更不可能被采纳的权重调整。\r\n\r\n\r\n有意思的是,该提示并没有给出 <think> 过程应当如何呈现的示例,只是要求在 <think> 标签内进行思考,无需更多细节。\r\n\r\n通过向模型提供与思维链(Chain-of-Thought)相关的间接奖励,模型逐渐自主学会:当推理过程更长、更复杂时,答案更可能是正确的。\r\n\r\n\r\n这张图非常重要,因为它进一步印证了从训练时计算到测试时计算的范式转变。当这些模型生成更长的思考序列时,实际上就加大了测试时计算的投入。\r\n\r\n通过这样的训练流程,研究人员发现,模型能够自发地探索出最优的链式推理模式,并展现出如自我反思、自我验证等高级推理能力。\r\n\r\n不过,这种做法仍存在一个显著缺陷:其输出的可读性不佳,而且有时会混用多种语言。为了解决这个问题,团队转而研究另一种思路,也就是 DeepSeek-R1。\r\n\r\nDeepSeek-R1训练\r\nDeepSeek-R1 的训练大体可以概括为以下五个阶段:\r\n\r\n1. 冷启动(Cold Start)\r\n\r\n2. 面向推理的强化学习(Reasoning-oriented Reinforcement Learning)\r\n\r\n3. 拒绝采样(Rejection Sampling)\r\n\r\n4. 监督微调(Supervised Fine-Tuning)\r\n\r\n5. 适用于所有场景的强化学习(Reinforcement Learning for all Scenarios)\r\n\r\n以下是各个阶段的具体流程:\r\n\r\n1. 冷启动(Cold Start)\r\n在第一步中,研究人员使用一个小型的高质量推理数据集(约 5000 个tokens)对 DeepSeek-V3-Base 进行微调。这样做是为了避免“冷启动”问题导致的可读性不佳。\r\n\r\n\r\n2. 面向推理的强化学习\r\n在第二步中,得到的模型采用与 DeepSeek-V3-Zero 类似的强化学习过程进行训练。但在奖励机制中增加了一项新指标,用来确保目标语言的输出保持一致性。\r\n\r\n\r\n3.', mimetype='text/plain', start_char_idx=6830, end_char_idx=8136, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), 'a52e1285-b9f7-40aa-88b9-7849aa151697': TextNode(id_='a52e1285-b9f7-40aa-88b9-7849aa151697', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='ac42e4d1-bce1-4a45-8cd5-6bb567effd10', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='acedf367f7b12872b70bd06f00d7e05b146ba7d45ad11a0a53cba7ccde089c68'), <NodeRelationship.NEXT: '3'>: RelatedNodeInfo(node_id='9dea914a-b261-4ed6-bb75-4f29ae8c891e', node_type='1', metadata={}, hash='0279db96c3126ea4e3acfcb96b6aa084085ec69f420f85270dd2cfdeeeca592f')}, metadata_template='{key}: {value}', metadata_separator='\n', text='冷启动(Cold Start)\r\n在第一步中,研究人员使用一个小型的高质量推理数据集(约 5000 个tokens)对 DeepSeek-V3-Base 进行微调。这样做是为了避免“冷启动”问题导致的可读性不佳。\r\n\r\n\r\n2. 面向推理的强化学习\r\n在第二步中,得到的模型采用与 DeepSeek-V3-Zero 类似的强化学习过程进行训练。但在奖励机制中增加了一项新指标,用来确保目标语言的输出保持一致性。\r\n\r\n\r\n3. 拒绝采样(Rejection Sampling)\r\n在第三步,研究人员利用上一步得到的模型合成推理数据,用于后续的监督微调。通过基于规则的奖励策略(rule-based rewards)、生成式奖励模型(Generative Reward Model),生成了 600,000 份高质量的推理示例。 此外,还生成了 200,000 份“非推理”示例,这些示例来自 DeepSeek-V3 及其部分训练数据。\r\n\r\n\r\n4. 监督微调(Supervised Fine-Tuning)\r\n第四步,将得到的总计 800,000 条示例数据用于对 DeepSeek-V3-Base 的监督微调。\r\n\r\n\r\n5. 适用于所有场景的强化学习\r\n第五步,他们使用与 DeepSeek-R1-Zero 类似的方法,对微调后得到的模型再次进行 RL 训练。但为了更好地对齐人类偏好(Human Preferences),在奖励信号中额外加入了“有益性”与“无害性”的考量。同时,为了避免推理结果的可读性问题,模型会被要求对推理过程进行适当的总结和精简。\r\n\r\n\r\n通过上述五个阶段,DeepSeek-R1 最终得以成型。可以说,DeepSeek-R1 是 DeepSeek-V3-Base 通过监督微调和强化学习得到的成果。其中,大量工作都集中在确保生成出高质量的训练示例上。\r\n\r\n使用 DeepSeek-R1 进行推理“蒸馏”\r\nDeepSeek-R1 规模庞大,拥有 6710 亿(671B)参数。这对于普通硬件来说,运行成本极高。\r\n\r\n因此,DeepSeek的研究人员还探索了如何将 DeepSeek-R1 的推理能力“蒸馏”到其他模型中,例如可以在消费级硬件上运行的 Qwen-32B。\r\n\r\n具体做法是,让 DeepSeek-R1 作为教师模型(Teacher),而体量较小的模型则作为学生模型(Student)。两者在面对相同的提示时,需要分别生成 token 的概率分布;学生模型会尝试在训练中逼近教师模型的分布:\r\n\r\n\r\n1. 使用之前提到的 80 万高质量数据样本(其中 60 万条推理示例 + 20 万条非推理示例)进行训练。\r\n\r\n\r\n2.', mimetype='text/plain', start_char_idx=7923, end_char_idx=9062, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}'), '9dea914a-b261-4ed6-bb75-4f29ae8c891e': TextNode(id_='9dea914a-b261-4ed6-bb75-4f29ae8c891e', embedding=None, metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, excluded_embed_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], excluded_llm_metadata_keys=['file_name', 'file_type', 'file_size', 'creation_date', 'last_modified_date', 'last_accessed_date'], relationships={<NodeRelationship.SOURCE: '1'>: RelatedNodeInfo(node_id='175c70bd-eff9-4743-bd70-9174ee86dbed', node_type='4', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='fc891f08c5725428a6ea72c71b389cb0a718156509c4b2a4c42db880268b6595'), <NodeRelationship.PREVIOUS: '2'>: RelatedNodeInfo(node_id='a52e1285-b9f7-40aa-88b9-7849aa151697', node_type='1', metadata={'file_path': 'docs\\大模型推理.txt', 'file_name': '大模型推理.txt', 'file_type': 'text/plain', 'file_size': 22722, 'creation_date': '2025-07-21', 'last_modified_date': '2025-07-21'}, hash='63a1927e6be275695f51cfcc2e469dfbe8aec9a18bdd496632b388b953b6ef75')}, metadata_template='{key}: {value}', metadata_separator='\n', text='使用之前提到的 80 万高质量数据样本(其中 60 万条推理示例 + 20 万条非推理示例)进行训练。\r\n\r\n\r\n2. 学生模型通过不断对比自己的输出分布和教师模型的输出分布,来学习 DeepSeek-R1 的推理方式。\r\n\r\n这样“蒸馏”出来的小模型性能依旧出色,因为它不仅学到了 80 万条数据中的知识,还学到了 DeepSeek-R1 如何作答的思路。\r\n\r\nDeepSeek不太成功的尝试\r\n还记得我们之前提到的 过程奖励模型(PRMs) 和 蒙特卡洛树搜索(MCTS) 吗?DeepSeek 团队也曾试图用这些方法来培养模型的推理能力,但并未取得理想成果。\r\n\r\n在 MCTS 中,由于搜索空间极其庞大,研究人员不得不大幅限制节点扩展。此外,训练一个能够细化评估推理过程的奖励模型本身就是一项困难的任务。\r\n\r\n在结合 PRMs 的 Best-of-N 技术中,他们遇到的主要问题是计算开销过高,需要频繁地对奖励模型进行再训练,以防止出现所谓的 “reward-hacking”(对奖励函数的漏洞进行投机利用)。\r\n\r\n这并不代表这些技术就完全不适用,但至少说明了它们在实际应用中面临着一些挑战。\r\n\r\n结语\r\n以上就是关于推理型大模型的概念与 DeepSeek-R1 的有关介绍。希望这篇内容能帮助你更好地理解 “测试时计算扩展” 的潜力所在。也再次感谢为大模型探索道路上做出贡献和努力的研究者们,像你们致敬!', mimetype='text/plain', start_char_idx=9003, end_char_idx=9614, metadata_seperator='\n', text_template='{metadata_str}\n\n{content}')}
文档来源与元数据整合:所有节点均关联自文档docs\大模型推理.txt,元数据中清晰记录了文件路径、名称、类型(text/plain)、大小(22722 字节)及创建 / 修改日期(2025-07-21),确保检索时可追溯内容来源。
语义分块策略落地:原始文档被拆分为 14 个TextNode,每个节点文本长度适中(约 500-1000 字符),围绕 “推理型大模型定义”“训练时 vs 测试时计算”“DeepSeek-R1 训练流程” 等子主题拆分,保留了段落级语义连贯性,避免内容割裂。
节点关系网络构建:通过relationships字段建立了完整的上下文关联,每个节点包含SOURCE(指向原始文档根节点)、PREVIOUS和NEXT(指向前后相邻节点)的引用关系,形成链式结构,确保检索时能还原文本逻辑流。
嵌入与过滤配置:节点明确标注了excluded_embed_metadata_keys和excluded_llm_metadata_keys,排除文件类型、大小等非核心元数据对嵌入生成和 LLM 调用的干扰,聚焦文本内容本身的语义表征。
内容完整性验证:所有分块文本覆盖了原文核心内容,从推理型大模型定义、测试时计算范式,到 DeepSeek-R1 的五阶段训练流程、推理蒸馏技术等均有体现,未出现关键信息丢失,为后续检索提供了完整的数据基础。
查看index下所有node的ID
print(index.index_struct.nodes_dict)
输出展示了一个向量索引结构中的 节点 ID 注册表(nodes_dict
),它是构建高效检索系统的核心组件。
输出是一个字典,键和值均为节点 ID(如 7601e3d4-10f2-4578-a740-3844ea5347ab
)。这种设计看似冗余,但实际上实现了 节点 ID 的唯一性校验和快速查找:
- 唯一性:每个 ID 在字典中只能出现一次,防止索引冲突。
- O (1) 复杂度:通过哈希表直接定位 ID,无需遍历整个索引。
docstore.docs:存储实际的文档内容(文本、元数据等)。nodes_dict:作为索引层,仅维护 ID 映射,不存储内容。
nodes_dict 支持以下核心操作:
向量相似度检索:
当用户查询时,系统首先计算查询向量与索引中节点向量的相似度,返回最相似的节点 ID 列表。
通过 nodes_dict 快速验证 ID 有效性,再从 docstore 获取完整内容。
文档链导航:
由于节点间通过 relationships 建立了链式关系(如 PREVIOUS、NEXT),可基于 nodes_dict 快速跳转到上下文节点,实现连贯的知识检索。
增量更新:
新增文档时,生成新 ID 并添加到 nodes_dict,同时将内容存入 docstore,无需重新处理已有索引。
查看index下面所有有ref文档的信息
print(index.ref_doc_info)
输出展示了向量索引系统中的文档引用信息(ref_doc_info
),它建立了原始文档与索引节点之间的映射关系。具体来看,这里有一个名为 175c70bd-eff9-4743-bd70-9174ee86dbed
的文档引用,对应着一个包含 11 个节点的知识条目。这些节点 ID(如 7601e3d4-10f2-4578-a740-3844ea5347ab
)此前在 nodes_dict
中出现过,表明它们已被索引。该文档的元数据显示它源自 docs\大模型推理.txt
文件,创建于 2025 年 7 月 21 日,大小为 22,722 字节。这种设计实现了文档级的管理 —— 系统不仅能追踪单个节点,还能将它们关联回原始文档,支持完整上下文的重建。例如,当检索到某个相关节点时,系统可通过 ref_doc_info
定位到整个文档的元数据,甚至获取同一文档中的其他相关节点,为用户提供更全面的信息。这种结构在处理长文档时尤为重要,因为长文档通常会被分割成多个节点以提高检索精度,但用户可能需要访问完整的上下文。
参考文章
https://github.com/datawhalechina/wow-raghttps://github.com/datawhalechina/wow-rag