Hello-Agents 第二章 智能体发展史 学习笔记
智能体发展史笔记
一、符号主义时代(早期)
- 核心思想:智能 = 符号操作 + 逻辑推理。认为只要把知识写成规则,机器就能像人一样思考。
- 代表系统 :
- 专家系统(如 MYCIN):把医生诊断经验变成"如果-那么"规则,能专业看病,但知识必须人工一条条编,费时费力。
- SHRDLU:在虚拟积木世界里能听懂指令、搬积木、回答提问,像个"全能管家",但一出积木世界就啥也不会。
- ELIZA 聊天机器人:靠关键词匹配和句式转换假装心理医生,其实不懂对话,但居然有人觉得它真有感情(ELIZA 效应)。
- 根本局限 :
- 知识靠人工编,永远编不完(知识获取瓶颈)。
- 没有常识,遇到规则外的情况直接死机(系统脆弱)。
- 像积木世界这种封闭环境还行,真实世界完全玩不转。
二、心智社会(思想转折)
- 提出者:马文·明斯基。
- 核心观点:智能不是单个"超级大脑",而是一群"小功能模块"协作涌现的结果。比如搭积木,不是有个"总指挥",而是"找积木""抓取""放置"等简单模块一起干活,自然就搭好了。
- 影响:启发了多智能体系统研究,但当时缺少具体实现方法。
三、学习范式崛起(关键突破)
1. 联结主义(神经网络)
- 让机器从数据中自己学,不再依赖人工编规则。
- 典型成果:深度学习,让 AI 能看懂图像、听懂声音。
2. 强化学习
- 让智能体通过"试错"学决策,比如 AlphaGo 下围棋,自己跟自己下,越下越强。
3. 预训练大模型(LLM)
- 在海量文本上预训练,让模型隐式掌握大量知识(解决了符号主义"知识编不完"的痛点)。
- 出现"涌现能力":比如给几个例子就能做新任务(上下文学习),推理时能分步骤思考(思维链)。
四、现代 LLM 驱动智能体
- 架构核心:LLM 作为"大脑",搭配记忆、规划、工具调用等模块。
- 工作流程 :
- 感知环境(接收指令或数据)
- 思考规划(LLM 分析目标,分解步骤)
- 调用工具(查资料、算数学、控制设备等)
- 观察结果,循环直到任务完成。
- 本质:符号主义的逻辑框架 + 联结主义的学习能力 + 强化学习的决策能力,最终融合成现在这个形态。
五、发展逻辑
- 每一代都是为了解决上一代的痛点,但自己又会带来新问题(比如大模型有"幻觉")。
- 趋势:从"人工设计智能"转向"机器自主学习",从"单一系统"转向"多模块协作"。
一句话总结:智能体是从"按规则办事的木头人",慢慢变成"能自学、能协作、能调用工具的灵活助手"。
习题
习题1
物理符号系统假说[1]是符号主义时代的理论基石。请分析:
- 该假说的"充分性论断"和"必要性论断"分别是什么含义?
- 充分性论断:任何一个物理符号系统,都具备产生通用智能行为的充分手段。这意味着,只要一个系统能操作符号,它就有可能实现智能。
- 必要性论断:任何一个能够展现通用智能行为的系统,其本质必然是一个物理符号系统。这意味着,所有智能系统(包括人脑)本质上都在进行符号操作。
- 结合本章内容,说明符号主义智能体在实践中遇到的哪些问题对该假说的"充分性"提出了挑战?
- 知识获取瓶颈:构建一个能支撑真实世界交互的、完备的符号知识库几乎不可能,因为人类知识(尤其是常识)庞大、内隐且难以形式化为"IF-THEN"规则。这挑战了"仅靠符号操作就足以产生智能"的论断,因为无法为系统提供足够的符号和规则。
- 框架问题与系统脆弱性:在动态世界中,为每个动作显式声明所有不变的状态在计算上不可行(框架问题)。同时,完全依赖预设规则的系统非常脆弱,一旦遇到规则之外的微小变化就会失灵,无法像人类一样灵活变通。这说明符号操作本身不足以应对现实的复杂性和开放性。
- 大语言模型驱动的智能体是否符合物理符号系统假说?
这是一个开放性问题,没有标准答案,以下提供两种分析视角:- 符合的视角 :可以将LLM视为一个"物理符号系统"。它处理的token(词元) 就是"符号",其神经网络权重和注意力机制构成了对符号进行操作的复杂"过程"。它接收文本(符号输入),经过内部计算(符号操作),生成新文本(符号输出),并展现出智能行为,符合PSSH对智能系统的描述。
- 不符合的视角 :LLM的工作方式与经典的、基于显式逻辑规则的符号系统有本质区别。其"知识"不是存储在明确的符号库和规则中,而是分布式地存储在连接权重里。其"推理"也不是基于严格的逻辑演绎,而是基于概率计算和模式匹配。这种"联结主义"的方式挑战了"智能本质必然是符号操作"的必要性论断。
习题2
专家系统MYCIN[2]在医疗诊断领域取得了显著成功,但最终并未大规模应用于临床实践。请思考:
- 除了本章提到的"知识获取瓶颈"和"脆弱性",还有哪些因素可能阻碍了专家系统在医疗等高风险领域的应用?
- 法律与责任问题:如果系统诊断错误导致医疗事故,责任应由谁承担(开发者、医院还是医生)?法律框架不明确。
- 缺乏透明度与解释能力:虽然MYCIN能解释推理路径,但其基于规则的逻辑可能与医生的临床直觉不符。在高风险领域,用户需要的是符合医学逻辑、能被专家认可的"可解释性",而非简单的规则链。
- 数据与知识更新维护:医学知识更新迅速。维护一个包含数百条规则的知识库,确保其始终与最新医学共识同步,是一项成本高昂且复杂的工程任务。
- 用户接受度与临床工作流整合:医生可能抵触将其视为"黑盒"的系统,或认为它干扰了既有的、高效的诊疗流程。系统需要无缝融入电子病历等现有IT基础设施,而非作为一个孤立系统存在。
- 如果让现在的你设计一个医疗诊断智能体,你会如何设计系统来克服MYCIN的局限?
- 采用混合架构:不依赖单一的规则引擎。以一个大语言模型(LLM)作为核心"大脑",利用其从海量医学文献、教材和病历中学习到的隐式知识进行初步分析和建议。
- 引入检索增强生成(RAG):为了解决LLM的"幻觉"和知识时效性问题,连接外部、可更新的权威知识库(如最新的临床指南、药品数据库)。在生成诊断建议时,先检索相关信息作为上下文,让LLM的回答有据可依。
- 工具调用与外部验证:让智能体具备调用外部工具的能力,例如,调用专门的化验单分析API、医学影像分析模型,或查询药物相互作用数据库,将结果整合到诊断推理中。
- 人机协同与交互式设计:将智能体定位为"辅助决策助手",而非替代医生。通过交互式对话,它向医生展示其推理依据、引用的知识来源和置信度,并允许医生进行追问、修正或提供额外信息。
- 在哪些垂直领域中,基于规则的专家系统至今仍然是比深度学习更好的选择?请举例说明。
在规则明确、环境封闭、需要高度可解释性和安全性,且数据稀疏或难以获取 的领域,专家系统仍是好选择。- 示例1:税务申报软件。税法由明确的、可枚举的规则构成(IF 收入>X THEN 税率=Y)。基于规则的系统可以确保100%的准确性和可解释性,而深度学习模型可能会产生不可预测的错误。
- 示例2:工业控制系统中的故障诊断。对于特定型号的机器,其故障模式与报警信号之间的对应关系是固定的(IF 温度过高 AND 压力过低 THEN 可能是泵故障)。规则系统可靠、易于验证和维护。
- 示例3:简单游戏AI(如棋类游戏)。对于井字棋这样状态空间极小的游戏,可以直接穷举所有规则,构建一个完美的、永不失误的专家系统。
习题3
在2.2节中,我们实现了一个简化版的ELIZA聊天机器人。请在此基础上进行扩展实践:
-
为ELIZA添加3-5条新的规则,使其能够处理更多样化的对话场景(如谈论工作、学习、爱好等)
可以在
rules字典中添加如下规则:pythonrules = { # ... 原有规则 ... r'.* work .*|.* job .*': [ # 谈论工作 "What do you find most challenging about your work?", "Does your work bring you fulfillment?", "Tell me more about your typical day at work." ], r'.* study .*|.* learn .*': [ # 谈论学习 "What motivated you to study that?", "How is your learning journey going?", "Is there anything you find difficult to learn?" ], r'.* hobby .*|.* like to .*': [ # 谈论爱好 "That sounds interesting! How long have you been doing that?", "What do you enjoy most about that hobby?", "Does that hobby help you relax?" ], r'.* tired .*|.* exhausted .*': [ # 表达疲惫 "It sounds like you've been through a lot. What's been draining your energy?", "Do you think you're getting enough rest?", "Why do you feel tired?" ] } -
实现一个简单的"上下文记忆"功能:让ELIZA能够记住用户在对话中提到的关键信息(如姓名、年龄、职业),并在后续对话中引用
可以添加一个全局字典
memory来存储信息,并增加处理特定模式的规则来捕获信息。核心代码示例如下:pythonmemory = {} # 在 rules 中添加识别关键信息的规则(优先级要高) rules = { r'my name is (.*)\.?$': [ # 匹配 "my name is ..." "Nice to meet you, {0}. How can I help you today?" ], r'i am (\d+) years old\.?$': [ # 匹配 "I am X years old" "Thank you for telling me your age. How does being {0} feel?" ], # ... 其他规则 ... } def respond(user_input): global memory # 1. 尝试捕获并存储信息 (在通用规则匹配前) name_match = re.search(r'my name is (.*)\.?$', user_input, re.IGNORECASE) if name_match: memory['name'] = name_match.group(1) age_match = re.search(r'i am (\d+) years old\.?$', user_input, re.IGNORECASE) if age_match: memory['age'] = age_match.group(1) # 2. 在生成回应时,如果有记忆,可以动态构建 for pattern, responses in rules.items(): # ... (原有的匹配逻辑) ... if match: # ... 处理捕获和代词转换 ... response = random.choice(responses).format(swapped_group) # 3. 在特定情况下引用记忆 if 'name' in memory and "How can I help" not in response: # 例如,随机地插入名字,但要避免生硬 if random.random() < 0.3: response = f"{response} By the way, {memory['name']}, tell me more." return response # ... 返回默认回应 -
对比你扩展后的ELIZA与ChatGPT,列举至少3个维度上存在的本质差异
- 理解能力:ELIZA基于关键词模式匹配,完全不理解语义,即使加了记忆也是机械存储。ChatGPT基于大语言模型,能进行深度的语义理解和上下文消歧。
- 记忆与上下文:ELIZA的记忆是人为编程的、有限的键值对存储。ChatGPT拥有海量的隐式记忆(模型参数)和强大的上下文窗口,能自然流畅地维持长程对话,理解复杂指代。
- 知识广度与生成能力:ELIZA的知识仅限于程序员编写的几十条规则,回答模板化。ChatGPT的知识来自整个互联网,能生成内容详实、风格多变的原创文本,进行解释、总结、创作等复杂任务。
- 对话的连贯性与策略:ELIZA的"策略"是固定的(如反问),对话常显得生硬和重复。ChatGPT能根据对话历史和用户意图,动态调整对话策略,进行有目的、有逻辑的深入交流。
-
为什么基于规则的方法在处理开放域对话时会遇到"组合爆炸"问题并且难以扩展维护?能否使用数学的方法来说明?
- 组合爆炸问题:自然语言是无穷的。要覆盖所有可能的用户输入,需要编写的规则数量会随着需要考虑的语境和词汇组合呈指数级增长。
- 数学说明 :假设我们需要处理一个长度为n的句子,词汇表大小为V。
- 可能的句子数量上限约为 ( V^n )。这是一个天文数字,即使V=10万,n=10,可能的句子数也是 (10^{50}) 量级。
- 一个基于规则的系统,为了正确处理所有这些句子,理论上需要为每一个可能的句子(或每一种高度抽象的模式)编写一条规则。即便我们只考虑模式,模式的数量也会随着需要考虑的变量和组合呈多项式甚至指数级增长。
- 规则之间还会相互影响,维护一个包含 (R) 条规则的系统,其潜在的交互复杂度是 (O(R^2)) 甚至更高。当R达到数千条时,管理规则冲突、优先级和覆盖度将变得完全不可行。这就是为什么规则系统只能用于高度受限的"玩具"领域。
习题4
马文·明斯基在"心智社会"理论[7]中提出了一个革命性的观点:智能源于大量简单智能体的协作,而非单一的完美系统。
- 在图2.6"搭建积木塔"的例子中,如果
GRASP智能体突然失效了,整个系统会发生什么?这种去中心化架构的优势和劣势是什么?- 系统会发生什么 :整个"搭积木塔"的任务会失败。
GET-BLOCK机构在尝试执行GRASP时会失败,由于没有全局控制器来重新规划或指派其他智能体(如PUSH)来替代,任务会停滞。系统不会崩溃,其他与抓取无关的功能(如SEE-SHAPE)可能仍在运行,但无法完成依赖GRASP的宏观目标。 - 优势 :鲁棒性 。
GRASP的失效不会导致整个系统"死机",只是丧失了与抓取相关的功能。其他功能模块(如视觉)依然可以独立工作。这体现了功能解耦的优势。 - 劣势 :缺乏全局协调与适应性 。没有一个中央智能体意识到
GRASP失效,并协调其他智能体(如用吸盘代替机械爪)来达成目标。系统在面对局部故障时,无法进行创造性的问题解决,只能机械地失败。这体现了纯去中心化系统在应对未预期问题时的局限性。
- 系统会发生什么 :整个"搭积木塔"的任务会失败。
- 将"心智社会"理论与现在的一些多智能体系统(如CAMEL-Workforce、MetaGPT、CrewAI)进行对比,它们之间存在哪些关联和不同之处?
- 关联 :
- 核心思想一脉相承 :都认为复杂智能可以由多个相对简单的单元(智能体)协作涌现出来。
- 模块化与分工:都强调将复杂任务分解,由不同角色或功能的智能体(如产品经理、程序员、测试员)分工完成,这与明斯基的"机构"概念类似。
- 交互产生智能:系统的整体能力来自于智能体之间的交互(通信、协作、竞争),而非单个智能体的能力。
- 不同之处 :
- 智能体的复杂性 :明斯基理论中的智能体是"无心的 ",执行极其简单的、原子化的功能。而现代MAS中的智能体(如由LLM驱动的)本身就可能具备强大的推理、规划和语言能力,是"有心的"复杂实体。
- 交互方式 :明斯基的交互是信号式的(激活/抑制) 。现代MAS的交互是基于自然语言的高层通信协议,模拟的是人类社会协作模式。
- 设计目标 :明斯基旨在解释人类心智的构成 。现代MAS旨在构建能解决现实世界复杂问题的工程系统。
- 关联 :
- 马文·明斯基认为智能体可以是"无心"的简单过程,然而现在的大语言模型和智能体往往都拥有强大的推理能力。这是否意味着"心智社会"理论在大语言模型时代不再适用了?
并非不再适用,而是理论适用的层次发生了变化 。- 适用于微观层面(解释LLM内部) :我们可以将一个大型神经网络(如Transformer)本身看作一个"心智社会"。其中的每个注意力头、每个前馈网络层都可以被视为一个"无心的"、执行特定简单计算(如模式匹配、特征提取)的智能体。它们之间通过复杂的连接(权重)相互协作,最终涌现出整体的语言理解和生成能力。
- 适用于宏观层面(设计多智能体系统) :当我们用多个LLM构建一个多智能体系统(如MetaGPT)时,这个系统整体上就是一个"心智社会"。每个LLM驱动的智能体可以看作是拥有一定"心智"的复杂个体,但它们在系统中扮演着特定角色,通过协作来解决超越单个LLM能力的复杂任务。"整体大于部分之和"的涌现逻辑依然成立 。
因此,明斯基的理论为我们提供了一个跨越不同尺度的、通用的分析框架,从微观的神经网络到宏观的多智能体协作,都具有解释和指导意义。
习题5
强化学习与监督学习是两种不同的学习范式。请分析:
- 用AlphaGo的例子说明强化学习的"试错学习"机制是如何工作的
AlphaGo(智能体)通过自我对弈(与环境交互)来学习。在每一步,它观察当前棋盘(状态S ),选择一个落子点(行动A )。一局棋结束后,它收到一个奖励R(+1为赢,-1为输)。它通过数百万次这样的对弈"试错",不断调整其策略(Policy),目标是最大化长期累积奖励(赢得棋局)。它从胜利的对弈中学习到哪些走法导向成功,从失败的对弈中学习到哪些走法应避免,这个过程就是通过与环境互动、根据延迟的胜负反馈来学习的"试错学习"。 - 为什么强化学习特别适合序贯决策问题?它与监督学习在数据需求上有什么本质区别?
- 适合原因 :强化学习的核心框架(状态-行动-奖励)天然是为序贯决策 设计的。它不仅关注当前行动的即时好坏,更通过最大化累积奖励来学习一个长期策略,这使其能够处理当前决策对未来结果有影响的任务,如游戏对弈、机器人控制、资源调度等。
- 数据需求本质区别 :
- 监督学习 需要的是带有正确答案的静态数据集(如"图片-标签"对),学习输入到输出的映射。
- 强化学习 不需要"正确答案",它需要的是通过与环境的持续交互生成的、带有延迟奖励信号的交互数据(状态、行动、奖励序列)。它是在线或通过模拟环境自主生成数据的。
- 现在我们需要训练一个会玩超级马里奥游戏的智能体。如果分别使用监督学习和强化学习,各需要什么数据?哪种方法对于这个任务来说更合适?
- 监督学习所需数据 :需要一个由人类专家玩家录制的海量数据集,包含游戏每一帧的画面(状态)和人类在这一帧按下的正确按键(行动),即
(游戏画面, 正确按键)的配对数据。 - 强化学习所需数据 :不需要人类数据。只需要一个游戏模拟器(环境),智能体可以自行在其中尝试、犯错、通关或死亡,并从环境获得即时的奖励信号(如获得分数+1,击败敌人+10,通关+1000,死亡-1000),从而学习策略。
- 哪种方法更合适 :强化学习更合适。因为超级马里奥是一个典型的序贯决策问题,最优策略往往不是简单模仿人类(人类操作可能不是最优的),而是需要探索出超越人类的、创造性的过关方式。强化学习能通过自主试错发现这些策略。而监督学习受限于人类数据,其上限不会超过提供数据的人类玩家水平。
- 监督学习所需数据 :需要一个由人类专家玩家录制的海量数据集,包含游戏每一帧的画面(状态)和人类在这一帧按下的正确按键(行动),即
- 在大语言模型的训练过程中,强化学习起到了什么关键性的作用?
强化学习,特别是基于人类反馈的强化学习(RLHF) ,在LLM训练的最后一个阶段起到了关键作用。它解决了"让模型说人话、做人事"的问题。- 作用 :在模型通过预学习和监督微调具备了基础能力后,RLHF让模型进一步学习人类的复杂偏好和价值观。人类会对模型生成的多个回答进行好坏排序(作为奖励信号 ),强化学习算法(如PPO)则利用这些反馈来优化模型,使其生成的文本更符合人类期望(如更 helpful, honest, harmless)。简单说,RLHF教会了模型在开放域中,什么样的回答是"好"的,超越了简单的模仿学习。
习题6
预训练-微调范式是现代人工智能领域的重要突破。请深入思考:
- 为什么说预训练解决了符号主义时代的"知识获取瓶颈"问题?它们在知识表示方式上有什么本质区别?
- 如何解决 :预训练通过自监督学习,自动从海量、原始的互联网文本中学习知识,无需昂贵、耗时的人工知识编码。模型在"预测下一个词"的过程中,被动地吸收了语料中的语法、事实、推理逻辑和世界常识。这彻底绕过了符号主义依赖"知识工程师+领域专家"手动将知识形式化为规则的过程。
- 知识表示方式的本质区别 :
- 符号主义 :知识是显式、局部、离散 的。表现为一个独立的、可读的符号库和规则集(如
IF 发烧 AND 咳嗽 THEN 呼吸道感染)。 - 预训练模型 :知识是隐式、分布式、连续 的。表现为神经网络中数十亿个连接权重的数值。知识不是存储在某个特定位置,而是散布在整个网络中,无法直接读取或修改。
- 符号主义 :知识是显式、局部、离散 的。表现为一个独立的、可读的符号库和规则集(如
- 预训练模型的知识绝大部分来自互联网数据,这可能带来哪些问题?如何缓解以上问题?
- 可能带来的问题 :
- 偏见与刻板印象:互联网数据包含大量人类社会的偏见(性别、种族、地域等),模型会学习并放大这些偏见。
- 有害与有毒内容:模型可能学习到仇恨言论、暴力、歧视性语言,并在交互中生成这些内容。
- 事实错误与"幻觉":互联网信息鱼龙混杂,包含大量不准确、过时甚至虚假的信息。模型会学到这些错误,并自信地编造不存在的事实。
- 隐私问题:模型可能"记住"并泄露训练数据中的个人隐私信息。
- 缓解方法 :
- 数据过滤与清洗:在预训练前,对数据进行严格的筛选,去除已知的有害、偏见和低质量内容。
- 价值观对齐(RLHF等):在预训练后,通过人类反馈微调,让模型学习拒绝对有害问题的回答,并生成符合人类价值观的内容。
- 检索增强生成(RAG):不依赖模型内部存储的、可能过时或错误的知识,而是让模型在回答问题时,先从外部、可信的知识库中检索相关信息,再基于检索到的内容生成答案,有效减少"幻觉"。
- 差分隐私训练:在训练过程中引入噪声,从数学上保证模型不会泄露训练数据中的特定样本信息。
- 可能带来的问题 :
- 你认为"预训练-微调"范式是否可能会被某种新范式取代?或者它会长期存在?
这是一个开放性问题,两种可能性都存在。- 可能被取代的视角 :未来的范式可能是**"测试时训练"或"无限上下文"。例如,模型不再预先学习所有知识,而是拥有一个巨大的、可高速检索的外部记忆库。在面对新问题时,动态地检索相关"知识模块"并在推理时进行快速学习或组装。另一种可能是,模型规模不再增长,而是通过多个专用小模型的动态协作**来解决复杂问题,从而取代"一个超大模型通吃所有任务"的微调模式。
- 可能长期存在的视角:预训练-微调范式提供了一个非常高效且成功的"基础能力获取 + 特定任务适应"的框架。只要有大量的通用数据和计算资源,预训练就是获取广泛、通识知识的最有效方式。而微调允许不同组织和个人在强大的基础之上快速定制自己的模型。这个"基础模型"的概念将长期存在,成为AI领域的"操作系统",而其上的应用开发和定制(微调、提示工程等)也会持续繁荣。
习题7
假设你要设计一个"智能代码审查助手",它能够自动审查代码提交(Pull Request),概括代码的实现逻辑、检查代码质量、发现潜在BUG、提出改进建议。
- 如果在符号主义时代(1980年代)设计这个系统,你会如何实现?会遇到什么困难?
- 实现方式 :需要邀请顶级程序员和领域专家组成"知识工程师"团队,手动将代码审查的"知识"形式化为成千上万条严格的"IF-THEN"规则。
- 例如:
IF 函数长度 > 100行 THEN 建议:函数过长,应考虑重构;IF 变量名长度 < 2个字符 AND 不是循环计数器 THEN 警告:变量名无意义;IF 存在空catch块 THEN 错误:异常被忽略。
- 例如:
- 主要困难 :
- 知识获取瓶颈:代码审查的许多知识是内隐的、依赖上下文的(例如,某种设计模式是否适用于此),极难被穷举为规则。
- 系统脆弱性:规则库再庞大,也无法覆盖所有可能的代码风格、逻辑错误和新的编程模式。对于规则之外的代码,系统将完全失语。
- 缺乏语义理解:系统无法真正"理解"代码的逻辑意图,只能进行语法层面的模式匹配,无法发现深层次的逻辑BUG。
- 实现方式 :需要邀请顶级程序员和领域专家组成"知识工程师"团队,手动将代码审查的"知识"形式化为成千上万条严格的"IF-THEN"规则。
- 如果在没有大语言模型的深度学习时代(2015年左右),你会如何实现?
- 实现方式 :可以训练多个深度学习模型。例如,用循环神经网络(RNN)或卷积神经网络(CNN)在大量开源代码上训练一个代码摘要生成模型 ;用图神经网络(GNN)学习代码的抽象语法树(AST)结构,训练一个缺陷预测模型;再用分类模型判断代码是否符合某种风格规范。这些模型各自独立运行。
- 主要困难 :
- 任务碎片化:系统由多个为单一任务训练的模型拼凑而成,缺乏整体性和灵活性。例如,发现一个BUG后,无法像人类一样连贯地解释其原因并提出跨模块的修改建议。
- 依赖大量标注数据:每个模型都需要大量高质量的标注数据(如标记了BUG位置的代码),获取成本高昂。
- 缺乏推理能力:模型能"感知"模式(如这段代码看起来像有BUG),但缺乏逻辑推理能力去"思考"为什么这是一个BUG,以及在不同上下文中的影响。
- 在当前的大语言模型和智能体的时代,你会如何设计这个智能体的架构?它应该包含哪些模块(参考图2.10)?
- 核心:以一个大语言模型(LLM)作为系统的"大脑"。
- 架构与模块 :
- 感知模块:接收用户提交的代码差异(diff)和PR描述作为输入。
- 规划模块:将"审查这个PR"的宏观任务分解为子任务,如"先概括整体改动"、"然后逐文件检查代码质量"、"再分析是否存在特定模式的BUG"。
- 记忆模块:存储本次审查的中间结果,如已经分析过的文件、已发现的BUG列表,以及长期的审查历史,以保持一致性。
- LLM推理核心:执行具体的思考任务。例如,根据代码diff,推理其实现逻辑;调用外部工具获取信息;生成审查意见。
- 工具调用模块 :这是关键。LLM可以决定调用各种外部工具来增强能力。例如:
- 调用静态代码分析工具(如linters),获取基础的风格和语法问题。
- 调用代码解释器,运行单元测试或分析代码的动态行为。
- 调用代码搜索工具,在项目代码库中查找相似模式或相关定义。
- 执行模块:根据LLM的决策,实际调用这些工具,并将工具执行结果返回给LLM。
- 行动输出:最终,LLM综合所有信息(代码本身、工具结果、历史记忆),生成结构化的、带有解释和修改建议的代码审查评论,提交回PR。
- 对比这三个时代的方案,说明智能体技术的演进如何使这个任务从"几乎不可能"变为"可行"
- 从"几乎不可能"到"高度受限" :符号主义时代,由于知识的获取和表示困难,构建一个能覆盖所有代码场景的系统是不可能的。最多只能做出用于教学或特定语言的简单风格检查器。
- 从"高度受限"到"能力碎片化" :深度学习时代,系统获得了强大的感知和模式识别 能力,能自动发现一些常见问题。但由于缺乏通用推理和任务整合能力 ,它仍然无法像一个真正的审查者那样进行连贯的、深度的、上下文相关的分析,能力是碎片化的。
- 从"碎片化"到"接近可行" :大语言模型智能体时代,通过 LLM的通用推理能力 作为"大脑",将感知、规划、记忆和多种工具(包括传统分析工具和深度学习模型) 整合在一个闭环中,使得模拟人类审查员的复杂工作流程成为可能。系统不仅能发现模式,更能"理解"代码意图、"推理"潜在后果、"规划"如何验证,并"行动"给出综合性的、有洞见的审查建议。智能体的演进,本质上是从"单一能力"到"通用能力",从"孤立的程序"到"能调用工具的协作系统"的飞跃。

项目地址:hello-agents