Sun Tao 9 месяцев назад
Родитель
Сommit
868f330e1a

+ 1 - 1
docs/chapter1/第一章 初识智能体.md

@@ -73,7 +73,7 @@
 
 (1)<strong>基于内部决策架构的分类</strong>
 
-第一种分类维度是依据智能体内部决策架构的复杂程度,这个视角在《Artificial Intelligence: A Modern Approach》中系统性地提出<sup>[1]</sup>。正如 1.1.1 节所述,传统智能体的演进路径本身就构成了最经典的分类阶梯,它涵盖了从简单的**反应式**智能体,到引入内部模型的**模型式**智能体,再到更具前瞻性的**基于目标**和**基于效用**的智能体。此外,**学习能力**则是一种可赋予上述所有类型的元能力,使其能通过经验自我改进。
+第一种分类维度是依据智能体内部决策架构的复杂程度,这个视角在《Artificial Intelligence: A Modern Approach》中系统性地提出<sup>[1]</sup>。正如 1.1.1 节所述,传统智能体的演进路径本身就构成了最经典的分类阶梯,它涵盖了从简单的<strong>反应式</strong>智能体,到引入内部模型的<strong>模型式</strong>智能体,再到更具前瞻性的<strong>基于目标</strong>和<strong>基于效用</strong>的智能体。此外,<strong>学习能力</strong>则是一种可赋予上述所有类型的元能力,使其能通过经验自我改进。
 
 (2)<strong>基于时间与反应性的分类</strong>
 

+ 9 - 9
docs/chapter2/第二章 智能体发展史.md

@@ -10,7 +10,7 @@
 
 ### 2.1.1 物理符号系统假说
 
-符号主义时代的理论根据,是1976年由**艾伦·纽厄尔(Allen Newell)**和**赫伯特·西蒙(Herbert A. Simon)**共同提出的**物理符号系统假说(PhysicalSymbol SystemHypothesis, PSSH)**<sup>[1]</sup>。这两位图灵奖得主通过这一假说,为在计算机上实现通用人工智能提供了理论指导和判定标准。
+符号主义时代的理论根据,是1976年由<strong>艾伦·纽厄尔(Allen Newell)</strong>和<strong>赫伯特·西蒙(Herbert A. Simon)</strong>共同提出的<strong>物理符号系统假说(PhysicalSymbol SystemHypothesis, PSSH)</strong><sup>[1]</sup>。这两位图灵奖得主通过这一假说,为在计算机上实现通用人工智能提供了理论指导和判定标准。
 
 该假说包含两个核心论断:
 
@@ -67,7 +67,7 @@ MYCIN是历史上最著名、最具影响力的专家系统之一,由斯坦福
 
 ### 2.1.3 SHRDLU
 
-如果说专家系统展示了符号AI在专业领域的“深度”,那么由**特里·威诺格拉德(Terry Winograd)**于1968-1970年开发的SHRDLU项目<sup>[3]</sup>,则在“广度”上实现了革命性的突破。SHRDLU旨在构建一个能在“积木世界”这一微观环境中,通过自然语言与人类流畅交互的综合性智能体。“积木世界”是一个模拟的三维虚拟空间,其中包含不同形状、颜色和大小的积木,以及一个可以抓取和移动它们的虚拟机械臂。用户通过自然语言向SHRDLU下达指令或提问,SHRDLU则在虚拟世界中执行动作或给出文字回答。
+如果说专家系统展示了符号AI在专业领域的“深度”,那么由<strong>特里·威诺格拉德(Terry Winograd)</strong>于1968-1970年开发的SHRDLU项目<sup>[3]</sup>,则在“广度”上实现了革命性的突破。SHRDLU旨在构建一个能在“积木世界”这一微观环境中,通过自然语言与人类流畅交互的综合性智能体。“积木世界”是一个模拟的三维虚拟空间,其中包含不同形状、颜色和大小的积木,以及一个可以抓取和移动它们的虚拟机械臂。用户通过自然语言向SHRDLU下达指令或提问,SHRDLU则在虚拟世界中执行动作或给出文字回答。
 
 <div align="center">
   <img src="https://raw.githubusercontent.com/datawhalechina/Hello-Agents/main/docs/images/2-figures/1757246501849-3.png" alt="图片描述" width="90%"/>
@@ -99,15 +99,15 @@ SHRDLU的历史地位与影响主要体现在三个方面:
 
 符号主义智能体的“智能”完全依赖于其知识库的质量和完备性。然而,如何构建一个能够支撑真实世界交互的知识库,被证明是一项极其艰巨的任务,主要体现在两个方面:
 
-- **知识获取瓶颈(Knowledge Acquisition Bottleneck)**:专家系统的知识需要由人类专家和知识工程师通过繁琐的访谈、提炼和编码过程来构建。这个过程成本高昂、耗时漫长,且难以规模化。更重要的是,人类专家的许多知识是内隐的、直觉性的,很难被清晰地表达为“IF-THEN”规则。试图将整个世界的知识都进行手工符号化,被认为是一项几乎不可能完成的任务。
-- **常识问题(Common-sense Problem)**:人类行为依赖于庞大的常识背景(例如,“水是湿的”、“绳子可以拉不能推”),但符号系统除非被明确编码,否则对此一无所知。为广阔、模糊的常识建立完备的知识库至今仍是重大挑战,Cyc项目<sup>[4]</sup>历经数十年努力,其成果和应用仍然非常有限。
+- <strong>知识获取瓶颈(Knowledge Acquisition Bottleneck)</strong>:专家系统的知识需要由人类专家和知识工程师通过繁琐的访谈、提炼和编码过程来构建。这个过程成本高昂、耗时漫长,且难以规模化。更重要的是,人类专家的许多知识是内隐的、直觉性的,很难被清晰地表达为“IF-THEN”规则。试图将整个世界的知识都进行手工符号化,被认为是一项几乎不可能完成的任务。
+- <strong>常识问题(Common-sense Problem)</strong>:人类行为依赖于庞大的常识背景(例如,“水是湿的”、“绳子可以拉不能推”),但符号系统除非被明确编码,否则对此一无所知。为广阔、模糊的常识建立完备的知识库至今仍是重大挑战,Cyc项目<sup>[4]</sup>历经数十年努力,其成果和应用仍然非常有限。
 
 <strong>(2)框架问题与系统脆弱性</strong>
 
 除了知识层面的挑战,符号主义在处理动态变化的世界时也遇到了逻辑上的困境。
 
-- **框架问题(Frame Problem)**:在一个动态世界中,智能体执行一个动作后,如何高效判断哪些事物未发生改变是一个逻辑难题<sup>[5]</sup>。为每个动作显式地声明所有不变的状态,在计算上是不可行的,而人类却能毫不费力地忽略不相关的变化。
-- **系统脆弱性(Brittleness)**:符号系统完全依赖预设规则,导致其行为非常“脆弱”。一旦遇到规则之外的任何微小变化或新情况,系统便可能完全失灵,无法像人类一样灵活变通。SHRDLU的成功,也正是因为它运行在一个规则完备的封闭世界里,而真实世界充满了例外。
+- <strong>框架问题(Frame Problem)</strong>:在一个动态世界中,智能体执行一个动作后,如何高效判断哪些事物未发生改变是一个逻辑难题<sup>[5]</sup>。为每个动作显式地声明所有不变的状态,在计算上是不可行的,而人类却能毫不费力地忽略不相关的变化。
+- <strong>系统脆弱性(Brittleness)</strong>:符号系统完全依赖预设规则,导致其行为非常“脆弱”。一旦遇到规则之外的任何微小变化或新情况,系统便可能完全失灵,无法像人类一样灵活变通。SHRDLU的成功,也正是因为它运行在一个规则完备的封闭世界里,而真实世界充满了例外。
 
 ## 2.2 构建基于规则的聊天机器人
 
@@ -115,7 +115,7 @@ SHRDLU的历史地位与影响主要体现在三个方面:
 
 ### 2.2.1 ELIZA 的设计思想
 
-ELIZA是由麻省理工学院的计算机科学家**约瑟夫·魏泽鲍姆(Joseph Weizenbaum)**于1966年发布的一个计算机程序<sup>[6]</sup>,是早期自然语言处理领域的著名尝试之一。ELIZA并非一个单一的程序,而是一个可以执行不同“脚本”的框架。其中,最广为人知也最成功的脚本是“DOCTOR”,它模仿了一位罗杰斯学派的非指导性心理治疗师。
+ELIZA是由麻省理工学院的计算机科学家<strong>约瑟夫·魏泽鲍姆(Joseph Weizenbaum)</strong>于1966年发布的一个计算机程序<sup>[6]</sup>,是早期自然语言处理领域的著名尝试之一。ELIZA并非一个单一的程序,而是一个可以执行不同“脚本”的框架。其中,最广为人知也最成功的脚本是“DOCTOR”,它模仿了一位罗杰斯学派的非指导性心理治疗师。
 
 ELIZA的工作方式极其巧妙:它从不正面回答问题或提供信息,而是通过识别用户输入中的关键词,然后应用一套预设的转换规则,将用户的陈述转化为一个开放式的提问。例如,当用户说“我为我的男朋友感到难过”时,ELIZA可能会识别出关键词“我为……感到难过”,并应用规则生成回应:“你为什么会为你的男朋友感到难过?”
 
@@ -280,7 +280,7 @@ ELIZA的实践清晰地揭示了符号主义方法的核心矛盾:系统看似
 
 ## 2.3 马文·明斯基的心智社会
 
-符号主义的探索和ELIZA的实践,共同指向了一个问题:通过预设规则构建的、单一的、集中的推理引擎,似乎难以通向真正的智能。无论规则库多么庞大,系统在面对真实世界的模糊性、复杂性和无穷变化时,总是显得僵化而脆弱。这一困境促使一些顶尖的思考者开始反思人工智能最底层的设计哲学。其中,**马文·明斯基(Marvin Minsky)**没有继续尝试为单一推理核心添加更多规则,而是在他的**《心智社会》(The Society of Mind)**<sup>[7]</sup> 一书中提出了一个革命性的问题:"What magical trick makes us intelligent? The trick is that there is no trick. The power of intelligence stems from our vast diversity, not from any single, perfect principle."
+符号主义的探索和ELIZA的实践,共同指向了一个问题:通过预设规则构建的、单一的、集中的推理引擎,似乎难以通向真正的智能。无论规则库多么庞大,系统在面对真实世界的模糊性、复杂性和无穷变化时,总是显得僵化而脆弱。这一困境促使一些顶尖的思考者开始反思人工智能最底层的设计哲学。其中,<strong>马文·明斯基(Marvin Minsky)</strong>没有继续尝试为单一推理核心添加更多规则,而是在他的<strong>《心智社会》(The Society of Mind)</strong><sup>[7]</sup> 一书中提出了一个革命性的问题:"What magical trick makes us intelligent? The trick is that there is no trick. The power of intelligence stems from our vast diversity, not from any single, perfect principle."
 
 ### 2.3.1 对单一整体智能模型的反思
 
@@ -342,7 +342,7 @@ ELIZA的实践清晰地揭示了符号主义方法的核心矛盾:系统看似
 
 ### 2.4.1 从符号到联结
 
-作为对符号主义局限性的直接回应,**联结主义(Connectionism)**在20世纪80年代重新兴起。与符号主义自上而下、依赖明确逻辑规则的设计哲学不同,联结主义是一种自下而上的方法,其灵感来源于对生物大脑神经网络结构的模仿<sup>[8]</sup>。它的核心思想可以概括为以下几点:
+作为对符号主义局限性的直接回应,<strong>联结主义(Connectionism)</strong>在20世纪80年代重新兴起。与符号主义自上而下、依赖明确逻辑规则的设计哲学不同,联结主义是一种自下而上的方法,其灵感来源于对生物大脑神经网络结构的模仿<sup>[8]</sup>。它的核心思想可以概括为以下几点:
 
 1. <strong>知识的分布式表示</strong>:知识并非以明确的符号或规则形式存储在某个知识库中,而是以连接权重的形式,分布式地存储在大量简单的处理单元(即人工神经元)的连接之间。整个网络的连接模式本身就构成了知识。
 2. <strong>简单的处理单元</strong>:每个神经元只执行非常简单的计算,如接收来自其他神经元的加权输入,通过一个激活函数进行处理,然后将结果输出给下一个神经元。

+ 15 - 15
docs/chapter3/第三章 大模型基础.md

@@ -106,7 +106,7 @@ N-gram 模型虽然简单有效,但有两个致命缺陷:
 
 <strong>(2)神经网络语言模型与词嵌入</strong>
 
-N-gram 模型的根本缺陷在于它将词视为孤立、离散的符号。为了克服这个问题,研究者们转向了神经网络,并提出了一种思想:用连续的向量来表示词。2003年,Bengio 等人提出的**前馈神经网络语言模型 (Feedforward Neural Network Language Model)** 是这一领域的里程碑<sup>[1]</sup>。
+N-gram 模型的根本缺陷在于它将词视为孤立、离散的符号。为了克服这个问题,研究者们转向了神经网络,并提出了一种思想:用连续的向量来表示词。2003年,Bengio 等人提出的<strong>前馈神经网络语言模型 (Feedforward Neural Network Language Model)</strong> 是这一领域的里程碑<sup>[1]</sup>。
 
 其核心思想可以分为两步:
 
@@ -166,7 +166,7 @@ king - man + woman 的结果向量: [0.9 0.2]
 
 <strong>(3)循环神经网络 (RNN) 与长短时记忆网络 (LSTM)</strong>
 
-前一节的神经网络语言模型虽然引入了词嵌入解决了泛化问题,但它和 N-gram 模型一样,上下文窗口是固定大小的。为了预测下一个词,它只能看到前 n−1 个词,再早的历史信息就被丢弃了。这显然不符合我们人类理解语言的方式。为了打破固定窗口的限制,**循环神经网络 (Recurrent Neural Network, RNN)** 应运而生,其核心思想非常直观:为网络增加“记忆”能力<sup>[2]</sup>。
+前一节的神经网络语言模型虽然引入了词嵌入解决了泛化问题,但它和 N-gram 模型一样,上下文窗口是固定大小的。为了预测下一个词,它只能看到前 n−1 个词,再早的历史信息就被丢弃了。这显然不符合我们人类理解语言的方式。为了打破固定窗口的限制,<strong>循环神经网络 (Recurrent Neural Network, RNN)</strong> 应运而生,其核心思想非常直观:为网络增加“记忆”能力<sup>[2]</sup>。
 
 如图3.3所示,RNN 的设计引入了一个<strong>隐藏状态 (hidden state)</strong> 向量,我们可以将其理解为网络的短期记忆。在处理序列的每一步,网络都会读取当前的输入词,并结合它上一刻的记忆(即上一个时间步的隐藏状态),然后生成一个新的记忆(即当前时间步的隐藏状态)传递给下一刻。这个循环往复的过程,使得信息可以在序列中不断向后传递。
 
@@ -177,7 +177,7 @@ king - man + woman 的结果向量: [0.9 0.2]
 
 然而,标准的 RNN 在实践中存在一个严重的问题:<strong>长期依赖问题 (Long-term Dependency Problem)</strong> 。在训练过程中,模型需要通过反向传播算法根据输出端的误差来调整网络深处的权重。对于 RNN 而言,序列的长度就是网络的深度。当序列很长时,梯度在从后向前传播的过程中会经过多次连乘,这会导致梯度值快速趋向于零(<strong>梯度消失</strong>)或变得极大(<strong>梯度爆炸</strong>)。梯度消失使得模型无法有效学习到序列早期信息对后期输出的影响,即难以捕捉长距离的依赖关系。
 
-为了解决长期依赖问题,**长短时记忆网络 (Long Short-Term Memory, LSTM)** 被设计出来<sup>[3]</sup>。LSTM 是一种特殊的 RNN,其核心创新在于引入了**细胞状态 (Cell State)** 和一套精密的**门控机制 (Gating Mechanism)** 。细胞状态可以看作是一条独立于隐藏状态的信息通路,允许信息在时间步之间更顺畅地传递。门控机制则是由几个小型神经网络构成,它们可以学习如何有选择地让信息通过,从而控制细胞状态中信息的增加与移除。这些门包括:
+为了解决长期依赖问题,<strong>长短时记忆网络 (Long Short-Term Memory, LSTM)</strong> 被设计出来<sup>[3]</sup>。LSTM 是一种特殊的 RNN,其核心创新在于引入了<strong>细胞状态 (Cell State)</strong> 和一套精密的<strong>门控机制 (Gating Mechanism)</strong> 。细胞状态可以看作是一条独立于隐藏状态的信息通路,允许信息在时间步之间更顺畅地传递。门控机制则是由几个小型神经网络构成,它们可以学习如何有选择地让信息通过,从而控制细胞状态中信息的增加与移除。这些门包括:
 
 - <strong>遗忘门 (Forget Gate)</strong> : 决定从上一时刻的细胞状态中丢弃哪些信息。
 - <strong>输入门 (Input Gate)</strong> : 决定将当前输入中的哪些新信息存入细胞状态。
@@ -185,7 +185,7 @@ king - man + woman 的结果向量: [0.9 0.2]
 
 ### 3.1.2 Transformer 架构解析
 
-在上一节中,我们看到RNN及LSTM通过引入循环结构来处理序列数据,这在一定程度上解决了捕捉长距离依赖的问题。然而,这种循环的计算方式也带来了新的瓶颈:它必须按顺序处理数据。第 t 个时间步的计算,必须等待第 t−1 个时间步完成后才能开始。这意味着 RNN 无法进行大规模的并行计算,在处理长序列时效率低下,这极大地限制了模型规模和训练速度的提升。Transformer在2017 年由谷歌团队提出<sup>[4]</sup>。它完全抛弃了循环结构,转而完全依赖一种名为**注意力 (Attention)** 的机制来捕捉序列内的依赖关系,从而实现了真正意义上的并行计算。
+在上一节中,我们看到RNN及LSTM通过引入循环结构来处理序列数据,这在一定程度上解决了捕捉长距离依赖的问题。然而,这种循环的计算方式也带来了新的瓶颈:它必须按顺序处理数据。第 t 个时间步的计算,必须等待第 t−1 个时间步完成后才能开始。这意味着 RNN 无法进行大规模的并行计算,在处理长序列时效率低下,这极大地限制了模型规模和训练速度的提升。Transformer在2017 年由谷歌团队提出<sup>[4]</sup>。它完全抛弃了循环结构,转而完全依赖一种名为<strong>注意力 (Attention)</strong> 的机制来捕捉序列内的依赖关系,从而实现了真正意义上的并行计算。
 
 <strong>(1)Encoder-Decoder 整体结构</strong>
 
@@ -477,7 +477,7 @@ class PositionalEncoding(nn.Module):
 
 前面一节中,我们动手构建了一个完整的Transformer 模型,它能在很多端到端的场景表现出色。但是当任务转换为构建一个与人对话、创作、作为智能体大脑的通用模型时,或许我们并不需要那么复杂的结构。
 
-Transformer的设计哲学是“先理解,再生成”。编码器负责深入理解输入的整个句子,形成一个包含全局信息的上下文记忆,然后解码器基于这份记忆来生成翻译。但 OpenAI 在开发 **GPT (Generative Pre-trained Transformer)** 时,提出了一个更简单的思想<sup>[5]</sup>:**语言的核心任务,不就是预测下一个最有可能出现的词吗?**
+Transformer的设计哲学是“先理解,再生成”。编码器负责深入理解输入的整个句子,形成一个包含全局信息的上下文记忆,然后解码器基于这份记忆来生成翻译。但 OpenAI 在开发 <strong>GPT (Generative Pre-trained Transformer)</strong> 时,提出了一个更简单的思想<sup>[5]</sup>:<strong>语言的核心任务,不就是预测下一个最有可能出现的词吗?</strong>
 
 无论是回答问题、写故事还是生成代码,本质上都是在一个已有的文本序列后面,一个词一个词地添加最合理的内容。基于这个思想,GPT 做了一个大胆的简化:<strong>它完全抛弃了编码器,只保留了解码器部分。</strong> 这就是 <strong>Decoder-Only</strong> 架构的由来。
 
@@ -719,8 +719,8 @@ for i in range(num_merges):
 
 后续的许多算法都是在BPE的基础上进行优化的。其中,Google 开发的 WordPiece 和 SentencePiece 是影响力最大的两种。
 
-- **WordPiece**: Google BERT 模型采用的算法<sup>[7]</sup>。它与 BPE 非常相似,但合并词元的标准不是“最高频率”,而是“能最大化提升语料库的语言模型概率”。简单来说,它会优先合并那些能让整个语料库的“通顺度”提升最大的词元对。
-- **SentencePiece**: Google 开源的一款分词工具<sup>[8]</sup>,Llama 系列模型采用了此算法。它最大的特点是,将空格也视作一个普通字符(通常用下划线 `_` 表示)。这使得分词和解码过程完全可逆,且不依赖于特定的语言(例如,它不需要知道中文不使用空格分词)。
+- <strong>WordPiece</strong>: Google BERT 模型采用的算法<sup>[7]</sup>。它与 BPE 非常相似,但合并词元的标准不是“最高频率”,而是“能最大化提升语料库的语言模型概率”。简单来说,它会优先合并那些能让整个语料库的“通顺度”提升最大的词元对。
+- <strong>SentencePiece</strong>: Google 开源的一款分词工具<sup>[8]</sup>,Llama 系列模型采用了此算法。它最大的特点是,将空格也视作一个普通字符(通常用下划线 `_` 表示)。这使得分词和解码过程完全可逆,且不依赖于特定的语言(例如,它不需要知道中文不使用空格分词)。
 
 <strong>3.2.2.3 分词器对开发者的意义</strong>
 
@@ -874,13 +874,13 @@ print(response)
 
 研究发现,在对数-对数坐标系下,模型的性能(通常用损失 Loss 来衡量)与参数量、数据量和计算量这三个因素都呈现出平滑的幂律关系<sup>[9]</sup>。简单来说,只要我们持续、按比例地增加这三个要素,模型的性能就会可预测地、平滑地提升,而不会出现明显的瓶颈。这一发现为大模型的设计和训练提供了清晰的指导:在资源允许的范围内,尽可能地扩大模型规模和训练数据量。
 
-早期的研究更侧重于增加模型参数量,但 DeepMind 在 2022 年提出的“Chinchilla 定律”对此进行了重要修正<sup>[10]</sup>。该定律指出,在给定的计算预算下,为了达到最优性能,**模型参数量和训练数据量之间存在一个最优配比**。具体来说,最优的模型应该比之前普遍认为的要小,但需要用多得多的数据进行训练。例如,一个 700 亿参数的 Chinchilla 模型,由于使用了比 GPT-3(1750 亿参数)多 4 倍的数据进行训练,其性能反而超越了后者。这一发现纠正了“越大越好”的片面认知,强调了数据效率的重要性,并指导了后续许多高效大模型(如 Llama 系列)的设计。
+早期的研究更侧重于增加模型参数量,但 DeepMind 在 2022 年提出的“Chinchilla 定律”对此进行了重要修正<sup>[10]</sup>。该定律指出,在给定的计算预算下,为了达到最优性能,<strong>模型参数量和训练数据量之间存在一个最优配比</strong>。具体来说,最优的模型应该比之前普遍认为的要小,但需要用多得多的数据进行训练。例如,一个 700 亿参数的 Chinchilla 模型,由于使用了比 GPT-3(1750 亿参数)多 4 倍的数据进行训练,其性能反而超越了后者。这一发现纠正了“越大越好”的片面认知,强调了数据效率的重要性,并指导了后续许多高效大模型(如 Llama 系列)的设计。
 
 缩放法则最令人惊奇的产物是“能力的涌现”。所谓能力涌现,是指当模型规模达到一定阈值后,会突然展现出在小规模模型中完全不存在或表现不佳的全新能力。例如,<strong>链式思考 (Chain-of-Thought)</strong> 、<strong>指令遵循 (Instruction Following)</strong> 、多步推理、代码生成等能力,都是在模型参数量达到数百亿甚至千亿级别后才显著出现的。这种现象表明,大语言模型不仅仅是简单地记忆和复述,它们在学习过程中可能形成了某种更深层次的抽象和推理能力。对于智能体开发者而言,能力的涌现意味着选择一个足够大规模的模型,是实现复杂自主决策和规划能力的前提。
 
 ### 3.3.2 模型幻觉
 
-**模型幻觉(Hallucination)**通常指的是大语言模型生成的内容与客观事实、用户输入或上下文信息相矛盾,或者生成了不存在的事实、实体或事件。幻觉的本质是模型在生成过程中,过度自信地“编造”了信息,而非准确地检索或推理。根据其表现形式,幻觉可以被分为多种类型<sup>[11]</sup>,例如:
+<strong>模型幻觉(Hallucination)</strong>通常指的是大语言模型生成的内容与客观事实、用户输入或上下文信息相矛盾,或者生成了不存在的事实、实体或事件。幻觉的本质是模型在生成过程中,过度自信地“编造”了信息,而非准确地检索或推理。根据其表现形式,幻觉可以被分为多种类型<sup>[11]</sup>,例如:
 
 - <strong>事实性幻觉 (Factual Hallucinations)</strong> : 模型生成与现实世界事实不符的信息。
 - <strong>忠实性幻觉 (Faithfulness Hallucinations)</strong> : 在文本摘要、翻译等任务中,生成的内容未能忠实地反映源文本的含义。
@@ -892,12 +892,12 @@ print(response)
 
 为了提高大语言模型的可靠性,研究人员和开发者正在积极探索多种检测和缓解幻觉的方法:
 
-1. **数据层面**: 通过高质量数据清洗、引入事实性知识以及强化学习与人类反馈 (RLHF) 等方式<sup>[13]</sup>,从源头减少幻觉。
-2. **模型层面**: 探索新的模型架构,或让模型能够表达其对生成内容的不确定性。
-3. **推理与生成层面**
-   1. **检索增强生成 (Retrieval-Augmented Generation, RAG)** <sup>[14]</sup>: 这是目前缓解幻觉的有效方法之一。RAG 系统通过在生成之前从外部知识库(如文档数据库、网页)中检索相关信息,然后将检索到的信息作为上下文,引导模型生成基于事实的回答。
-   2. **多步推理与验证**: 引导模型进行多步推理,并在每一步进行自我检查或外部验证。
-   3. **引入外部工具**: 允许模型调用外部工具(如搜索引擎、计算器、代码解释器)来获取实时信息或进行精确计算。
+1. <strong>数据层面</strong>: 通过高质量数据清洗、引入事实性知识以及强化学习与人类反馈 (RLHF) 等方式<sup>[13]</sup>,从源头减少幻觉。
+2. <strong>模型层面</strong>: 探索新的模型架构,或让模型能够表达其对生成内容的不确定性。
+3. <strong>推理与生成层面</strong>
+   1. <strong>检索增强生成 (Retrieval-Augmented Generation, RAG)</strong> <sup>[14]</sup>: 这是目前缓解幻觉的有效方法之一。RAG 系统通过在生成之前从外部知识库(如文档数据库、网页)中检索相关信息,然后将检索到的信息作为上下文,引导模型生成基于事实的回答。
+   2. <strong>多步推理与验证</strong>: 引导模型进行多步推理,并在每一步进行自我检查或外部验证。
+   3. <strong>引入外部工具</strong>: 允许模型调用外部工具(如搜索引擎、计算器、代码解释器)来获取实时信息或进行精确计算。
 
 尽管幻觉问题短期内难以完全消除,但通过上述的策略,可以显著降低其发生频率和影响,提高大语言模型在实际应用中的可靠性和实用性。
 

+ 64 - 0
fix_bold_format.py

@@ -0,0 +1,64 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+批量修复Markdown文件中的加粗格式
+将 **文本** 替换为 <strong>文本</strong>
+"""
+
+import re
+import os
+import glob
+
+def fix_bold_format_in_file(file_path):
+    """修复单个文件中的加粗格式"""
+    try:
+        with open(file_path, 'r', encoding='utf-8') as f:
+            content = f.read()
+        
+        # 使用正则表达式匹配 **文本** 并替换为 <strong>文本</strong>
+        # 确保不匹配已经是HTML标签的情况
+        pattern = r'\*\*([^*]+?)\*\*'
+        replacement = r'<strong>\1</strong>'
+        
+        # 执行替换
+        new_content = re.sub(pattern, replacement, content)
+        
+        # 如果内容有变化,写回文件
+        if new_content != content:
+            with open(file_path, 'w', encoding='utf-8') as f:
+                f.write(new_content)
+            print(f"✅ 已修复: {file_path}")
+            return True
+        else:
+            print(f"ℹ️  无需修改: {file_path}")
+            return False
+            
+    except Exception as e:
+        print(f"❌ 处理文件出错 {file_path}: {e}")
+        return False
+
+def main():
+    """主函数"""
+    # 查找所有Markdown文件
+    docs_dir = "/Users/suntao/Documents/GitHub/hello-agents/docs"
+    
+    # 递归查找所有.md文件
+    md_files = []
+    for root, dirs, files in os.walk(docs_dir):
+        for file in files:
+            if file.endswith('.md'):
+                md_files.append(os.path.join(root, file))
+    
+    print(f"找到 {len(md_files)} 个Markdown文件")
+    print("=" * 50)
+    
+    modified_count = 0
+    for file_path in md_files:
+        if fix_bold_format_in_file(file_path):
+            modified_count += 1
+    
+    print("=" * 50)
+    print(f"处理完成!共修改了 {modified_count} 个文件")
+
+if __name__ == "__main__":
+    main()