一、智能体

1.传统智能体和LLM智能体区别

2.什么是LLM驱动的智能体

模块 功能
大语言模型(LLM) 作为核心推理引擎,负责理解任务、生成计划和决策
记忆模块 包括短期记忆(当前对话上下文)和长期记忆(外部向量数据库存储历史经验)
规划模块 将复杂任务分解为子步骤,能够自我反思和调整计划
工具使用 调用外部工具/API(如搜索、代码执行、数据库查询、计算器等)扩展能力
行动执行 将决策转化为具体行动,并接收环境反馈形成闭环

工作原理

  1. 感知:接收用户指令或环境状态

  2. 推理与规划:LLM 分析任务,拆解为可执行的步骤

  3. 工具调用:根据需要使用搜索、代码、API 等工具获取信息或执行操作

  4. 行动:执行具体动作(如发送请求、更新数据库、输出结果)

  5. 反馈与迭代:根据行动结果调整下一步计划,直至任务完成

3.智能体的运行机制

  1. 感知(Perception):这是循环的起点。智能体通过其传感器(例如,API的监听端口、用户输入接口)接收来自环境的输入信息。这些信息,即观察(Observation),既可以是用户的初始指令,也可以是上一步行动所导致的环境状态变化反馈。
  2. 思考(Thought):接收到观察信息后,智能体进入其核心决策阶段。对于LLM智能体而言,这通常是由大语言模型驱动的内部推理过程。如图所示,“思考”阶段可进一步解读为两个关键环节:
    • 规划(Planning):智能体基于当前的观察及其内部记忆,更新对任务和环境的理解,并制定或调整一个行动计划。这可能涉及将复杂的目标分解为一系列更具体的子任务。
    • 工具选择(Tool Selection):根据当前计划,智能体从其可用的工具库中,选择最适合执行下一步骤的工具,并确定调用该工具所需的具体参数。
  3. 行动(Action):决策完成后,智能体通过其执行器(Actuators)执行具体的行动。这通常会调用一个选定的工具(如代码解释器、搜索引擎API),从而对环境施加影响,意图改变环境的状态。

4.智能体最终形态

4.1联结主义范式

4.2基于强化学习的智能体

强化学习核心框架:与环境互动,根据反馈信号优化自身行为

智能体(Agent):学习者和决策者。在AlphaGo的例子中,就是其决策程序。
环境(Environment):智能体外部的一切,是智能体与之交互的对象。对AlphaGo而言,就是围棋的规则和对手。
状态(State, S):对环境在某一时刻的特定描述,是智能体做出决策的依据。例如,棋盘上所有棋子的当前位置。
行动(Action, A):智能体根据当前状态所能采取的操作。例如,在棋盘的某个合法位置上落下一
子。
奖励(Reward, R):环境在智能体执行一个行动后,反馈给智能体的一个标量信号,用于评价该行动在特定状态下的好坏。例如,在一局棋结束后,胜利获得+1的奖励,失败获得-1的奖励。

4.3基于大规模数据的预训练

从特定任务到通用模型:

 1. 预训练阶段:首先在一个包含互联网级别海量文本数据的通用语料库上,通过自监督学(Self-supervised Learning)的方式训练一个超大规模的神经网络模型。这个阶段的目标不是完成任何特定任务,而是学习语言本身内在的规律、语法结构、事实知识以及上下文逻辑。最常见的目标是“预测下一个词”。
2. 微调阶段:完成预训练后,这个模型就已经学习到了和数据集有关的丰富知识。之后,针对特定的下游任务,只需使用少量该任务的标注数据对模型进行微调,即可让模型适应对应任务。

大语言模型的诞生与涌现能力:

上下文学习(In-context Learning):无需调整模型权重,仅在输入中提供几个示例(Few-shot)
甚至零个示例(Zero-shot),模型就能理解并完成新的任务。
思维链(Chain-of-Thought)推理:通过引导模型在回答复杂问题前,先输出一步步的推理过程,可以显著提升其在逻辑、算术和常识推理任务上的准确性。

二、大语言模型基础

1.语言模型

语言模型就是计算一个词序列出现的概率。

(1)N-gram

N-gram 模型虽然简单有效,但有两个致命缺陷:
1. 数据稀疏性 (Sparsity) :如果一个词序列从未在语料库中出现,其概率估计就为 0,这显然是不合理的。虽然可以通过平滑 (Smoothing) 技术缓解,但无法根除。
2. 泛化能力差:模型无法理解词与词之间的语义相似性。例如,即使模型在语料库中见过很多次 agent learns,它也无法将这个知识泛化到语义相似的词上。当我们计算 robot learns 的概率时,如果 robot这个词从未出现过,或者 robot learns 这个组合从未出现过,模型计算出的概率也会是零。模型无法理解agent 和 robot 在语义上的相似性。

(2)神经语言模型与词嵌入

核心思想可以分为两步:
1. 构建一个语义空间:创建一个高维的连续向量空间,然后将词汇表中的每个词都映射为该空间中的一个点。这个点(即向量)就被称为词嵌入 (Word Embedding) 或词向量。在这个空间里,语义上相近的词,它们对应的向量在空间中的位置也相近。例如, agent 和 robot 的向量会靠得很近,而 agent 和 apple 的向量会离得很远。
2. 学习从上下文到下一个词的映射:利用神经网络的强大拟合能力,来学习一个函数。这个函数的输入是前个词的词向量,输出是词汇表中每个词在当前上下文后出现的概率分布。

(3)循环神经网络(RNN)与长短时记忆网络(LSTM)

RNN:

引入循环连接,让网络在处理序列时保留“记忆”,每个时间步的输出依赖于当前输入和上一个时间步的隐藏状态。

LSTM:

核心思想:通过门控机制精细控制信息的遗忘、写入和输出,解决 RNN 的长距离依赖问题。

核心组件

  1. 遗忘门:决定丢弃哪些旧信息

  2. 输入门:决定存储哪些新信息

  3. 输出门:决定输出哪些信息

2.Transformer架构

注意力机制

(1)自注意力机制

为了实现上述过程,自注意力机制为每个输入的词元向量引入了三个可学习的角色:
查询 (Query, Q):代表当前词元,它正在主动地“查询”其他词元以获取信息。
键 (Key, K):代表句子中可被查询的词元“标签”或“索引”。
值 (Value, V):代表词元本身所携带的“内容”或“信息”。

它将原始的 Q, K, V 向量在维度上切分成 h 份(h 就是“头”数),每一份都独立地进行一次单头注意力的计算。这就好比让 h 个不同的“专家”从不同的角度去审视句子,每个专家都能捕捉到一种不同的特征关系。最后,将这 h 个专家的“意见”(即输出向量)拼接起来,再通过一个线性变换进行整合,就得到了最终的输出。

(2)前馈神经网络

前馈神经网络是最基本、最经典的人工神经网络结构,信息单向流动——从输入层经过隐藏层到输出层,没有任何循环或反馈连接。"前馈"意味着:数据向前传播,不会回头。

前馈神经网络是最基础的神经网络结构,信息单向流动,通过全连接层和非线性激活函数实现函数逼近,虽无记忆能力且参数多,但作为深度学习基石至今仍广泛使用。

(3)残差连接与层归一化

它们解决了深层网络训练中的两大难题:梯度消失/退化内部协变量偏移

残差连接(Residual Connection,也称“跳跃连接”或“短路连接”)是指将层的输入直接跨层加到该层的输出上。

层归一化(Layer Normalization, LN)是在单个样本的所有特征维度上进行归一化,使其均值为0、方差为1。

技术 解决的核心问题
残差连接 让梯度直接传播到浅层,解决梯度消失;让深层至少不差于浅层
层归一化 稳定每层输入的分布,加速收敛;配合残差防止值爆炸

3.Decoder-Only架构

抛弃了编码器,只保留了解码器部分。

解码器通过掩码自注意力机制来保证在预测第t个词时,不去偷看第t+1个词的答案。

Decoder-Only 架构的优势
这种看似简单的架构,却带来了巨大的成功,其优势在于:
训练目标统一:模型的唯一任务就是“预测下一个词”,这个简单的目标非常适合在海量的无标注文本数据上进行预训练。
结构简单,易于扩展:更少的组件意味着更容易进行规模化扩展。今天的 GPT-4、Llama 等拥有数千亿甚至万亿参数的巨型模型,都是基于这种简洁的架构。
天然适合生成任务:其自回归的工作模式与所有生成式任务(对话、写作、代码生成等)完美契合,这也是它能成为构建通用智能体基础的核心原因。

4.与大语言模型交互

(1)提示工程

1.模型采用参数

在提示工程中,采样参数用于控制大语言模型(LLM)生成文本时的随机性和多样性。它们决定模型从概率分布中"选择"下一个词的方式。

Top-k

只保留概率最高的 k 个候选词,其余概率置零后重新归一化。

Top-p

动态选择概率和达到 p 的最小候选词集合(核采样)。

2.零样本、单样本与少样本提示
  • 零样本提示 (Zero-shot Prompting) 这指的是我们不给模型任何示例,直接让它根据指令完成任务。这得益于模型在海量数据上预训练后获得的强大泛化能力。
  • 单样本提示 (One-shot Prompting) 我们给模型提供一个完整的示例,向它展示任务的格式和期望的输出风格。
  • 少样本提示 (Few-shot Prompting) 我们提供多个示例,这能让模型更准确地理解任务的细节、边界和细微差别,从而获得更好的性能。
3.指令调优的影响

对文本补全模型的提示(你需要用少样本提示“教会”模型做什么)令调优模型的提示(你可以直接下达命令)

4.基础提示技巧

角色扮演 (Role-playing) 通过赋予模型一个特定的角色,我们可以引导它的回答风格、语气和知识范围,使其输出更符合特定场景的需求。
上下文示例 (In-context Example) 这与少样本提示的思想一致,通过在提示中提供清晰的输入输出示例,来“教会”模型如何处理我们的请求,尤其是在处理复杂格式或特定风格的任务时非常有效。

5.思维链

对于需要逻辑推理、计算或多步骤思考的复杂问题,直接让模型给出答案往往容易出错。思维链 (Chain-of-Thought, CoT) 是一种强大的提示技巧,它通过引导模型“一步一步地思考”,提升了模型在复杂任务上的推理能力。实现 CoT 的关键,是在提示中加入一句简单的引导语,如“请逐步思考”或“Let's think step by step”。

(2)文本分词

字节对编码(BPE)是一种子词分词算法,通过**迭代合并**语料中最频繁共现的字符对来构建词汇表,最终将文本切分为常见子词(如"er"、"ing")或单字符。它平衡了词汇量与泛化能力,解决了传统分词中的未知词问题,是现代LLM(GPT、BERT等)的主流分词方法。字节级BPE以256个字节为基础,进一步实现了多语言无损支持。

(3)调用开源模型

在为智能体选择大语言模型时,可以从以下几个维度进行综合评估:

  • 性能与能力:这是最核心的考量。不同的模型擅长的任务不同,有的长于逻辑推理和代码生成,有的则在创意写作或多语言翻译上更胜一筹。您可以参考一些公开的基准测试排行榜(如 LMSys Chatbot ArenaLeaderboard)来评估模型的综合能力。
  • 成本:对于闭源模型,成本主要体现在 API 调用费用,通常按 Token 数量计费。对于开源模型,成本则体现在本地部署所需的硬件(GPU、内存)和运维上。需要根据应用的预期使用量和预算做出选择。
  • 速度(延迟):对于需要实时交互的智能体(如客服、游戏 NPC),模型的响应速度至关重要。一些轻量级或经过优化的模型(如 GPT-3.5 Turbo, Claude 3.5 Sonnet)在延迟上表现更优。
  • 上下文窗口:模型能一次性处理的 Token 数量上限。对于需要理解长文档、分析代码库或维持长期对话记忆的智能体,选择一个拥有较大上下文窗口(如 128K Token 或更高)的模型是必要的。
  • 部署方式:使用 API 的方式最简单便捷,但数据需要发送给第三方,且受限于服务商的条款。本地部署则能确保数据隐私和最高程度的自主可控,但对技术和硬件要求更高。
  • 生态与工具链:一个模型的流行程度也决定了其周边生态的成熟度。主流模型通常拥有更丰富的社区支持、教程、预训练模型、微调工具和兼容的开发框架(如 LangChain, LlamaIndex, Hugging Face Transformers),这能极大地加速开发进程,降低开发难度。选择一个拥有活跃社区和完善工具链的模型,可以在遇到问题时更容易找到解决方案和资源。
  • 可微调性与定制化:对于需要处理特定领域数据或执行特定任务的智能体,模型的微调能力至关重要。一些模型提供了便捷的微调接口和工具,允许开发者使用自己的数据集对模型进行定制化训练,从而显著提升模型在特定场景下的性能和准确性。开源模型在这方面通常提供更大的灵活性。
  • 安全性与伦理:随着大语言模型的广泛应用,其潜在的安全风险和伦理问题也日益凸显。选择模型时,需要考虑其在偏见、毒性、幻觉等方面的表现,以及服务商或开源社区在模型安全和负责任AI方面的投入。对于面向公众或涉及敏感信息的应用,模型的安全性和伦理合规性是不可忽视的考量。

(4)缩放法则

缩放法则揭示了在大语言模型中,模型性能与参数量、数据量和计算量之间存在可预测的幂律关系,三者需同步扩大才能最有效地提升模型能力。

(5)模型幻觉

  • 事实性幻觉 (Factual Hallucinations) : 模型生成与现实世界事实不符的信息。
  • 忠实性幻觉 (Faithfulness Hallucinations) : 在文本摘要、翻译等任务中,生成的内容未能忠实地反映源文本的含义。
  • 内在幻觉 (Intrinsic Hallucinations) : 模型生成的内容与输入信息直接矛盾。

多种检测和缓解幻觉的方法:

1. 数据层面: 通过高质量数据清洗、引入事实性知识以及强化学习与人类反馈 (RLHF) 等方式,从源头减少幻觉。
2. 模型层面: 探索新的模型架构,或让模型能够表达其对生成内容的不确性。
3. 推理与生成层面:
1. 检索增强生成 (Retrieval-Augmented Generation, RAG) : 这是目前缓解幻觉的有效方法之一。
RAG 系统通过在生成之前从外部知识库(如文档数据库、网页)中检索相关信息,然后将检索到的信息作为上下文,引导模型生成基于事实的回答。
2. 多步推理与验证: 引导模型进行多步推理,并在每一步进行自我检查或外部验证。
3. 引入外部工具: 允许模型调用外部工具(如搜索引擎、计算器、代码解释器)来获取实时信息或进行精确计算。

三、智能体经典范式构建

ReAct (Reasoning and Acting): 一种将“思考”和“行动”紧密结合的范式,让智能体边想边做,动态调整。
Plan-and-Solve: 一种“三思而后行”的范式,智能体首先生成一个完整的行动计划,然后严格行。
Reflection: 一种赋予智能体“反思”能力的范式,通过自我批判和修正来优化结果。

1.ReAct工作流程

ReAct的巧妙之处在于,它认识到思考与行动是相辅相成的。思考指导行动,而行动的结果又反过来修正思考。为此,ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:

  • Thought (思考): 这是智能体的“内心独白”。它会分析当前情况、分解任务、制定下一步计划,或者反思上一步的结果。
  • Action (行动): 这是智能体决定采取的具体动作,通常是调用一个外部工具,例如 Search['华为最新款手机']。
  • Observation (观察): 这是执行 Action后从外部工具返回的结果,例如搜索结果的摘要或API的返回值。

智能体将不断重复这个 Thought -> Action -> Observation 的循环,将新的观察结果追加到历史记录中,形成一个不断增长的上下文,直到它在 Thought中认为已经找到了最终答案,然后输出结果。这个过程形成了一个强大的协同效应:推理使得行动更具目的性,而行动则为推理提供了事实依据。

2.工具的定义和实现

首先实现工具的核心功能,然后构建一个通用的工具管理器。

(1)实现搜索工具的核心逻辑

一个良好定义的工具应包含以下三个核心要素:
1. 名称 (Name): 一个简洁、唯一的标识符,供智能体在 Action 中调用,例如 Search。
2. 描述 (Description): 一段清晰的自然语言描述,说明这个工具的用途。这是整个机制中最关键的部分,因为大语言模型会依赖这段描述来判断何时使用哪个工具。
3. 执行逻辑 (Execution Logic): 真正执行任务的函数或方法。

(2)构建通用的工具执行器

当智能体需要使用多种工具时(例如,除了搜索,还可能需要计算、查询数据库等),我们需要一个统一的管理器来注册和调度这些工具。为此,我们创建一个 ToolExecutor 类。

3.ReAct智能体的编码实现

(1)系统提示词设计

角色定义: “你是一个有能力调用外部工具的智能助手”,设定了LLM的角色。
工具清单 ( {tools} ): 告知LLM它有哪些可用的“手脚”。
格式规约 ( Thought / Action ): 这是最重要的部分,它强制LLM的输出具有结构性,使我们能通过代码精确解析其意图。
动态上下文 ( {question} / {history} ): 将用户的原始问题和不断累积的交互历史注入,让LLM基于
完整的上下文进行决策。

(2)核心循环的实现

ReActAgent 的核心是一个循环,它不断地“格式化提示词 -> 调用LLM -> 执行动作 -> 整合结果”,直到任务完成或达到最大步数限制。

run 方法是智能体的入口。它的 while 循环构成了 ReAct 范式的主体, max_steps 参数则是一个重要的安全阀,防止智能体陷入无限循环而耗尽资源。

(3)输出解析器的实现

LLM 返回的是纯文本,我们需要从中精确地提取出 Thought和 Action。这是通过几个辅助解析函数完成的,它们通常使用正则表达式来实现。

(4) 工具调用与执行

它首先检查是否为 Finish指令,如果是,则流程结束。否则,它会通过tool_executor获取对应的工具函数并执行,得到 observation。

(5)观测结果的整合

最后一步,也是形成闭环的关键,是将 Action本身和工具执行后Observation添加回历史记录中,为下一轮循环提供新的上下文。通过将 Observation追加到 self.history,智能体在下一轮生成提示词时,就能“看到”上一步行动的结果,并据此进行新一轮的思考和规划。

(6)运行实例与分析

小结

1.ReAct的特点:

高可解释性:通过thought链,我们可以清晰看到智能体每一步的心路历程

动态规划与纠错能力

工具协同能力

2.固有局限性:对LLM自身能力的强依赖,执行效率问题,提示词的脆弱性,可能陷入局部最优

3.调试技巧:

检查完整的提示词、分析原始输出、验证工具的输入输出、调整提示词中的示例、尝试不同模型或参数

4.Plan-ans-Solve

这种范式将任务处理明确地分为两个阶段: 先规划 (Plan) ,后执行 (Solve)
其核心动机是为了解决思维链在处理多步骤、复 杂问题时容易“ 偏离轨道 的问题。
1.工作原理
ReAct 将思考和行动融合在每一步不同, Plan-and-Solve 将整个流程解耦为两个核心阶段:
1. 规划阶段 (Planning Phase) : 首先,智能体会接收用户的完整问题。它的第一个任务不是直接去解决 问题或调用工具,而是将问题分解,并制定出一个清晰、分步骤的行动计划 。这个计划本身就是一次大 语言模型的调用产物。
2. 执行阶段 (Solving Phase) : 在获得完整的计划后,智能体进入执行阶段。它会 严格按照计划中的步 骤,逐一执行 。每一步的执行都可能是一次独立的 LLM 调用,或者是对上一步结果的加工处理,直到计划中的所有步骤都完成,最终得出答案。
2.提示词设计
规划器
提示词通过以下几点确保了输出的质量和稳定性:
角色设定 顶级的 AI 规划专家 ,激发模型的专业能力。
任务描述 : 清晰地定义了 分解问题 的目标。
格式约束 : 强制要求输出为一个 Python 列表格式的字符串,这极大地简化了后续代码的解析工作,使其比解析自然语言更稳定、更可靠。
接下来,我们将这个提示词逻辑封装成一个 Planner 类,这个类也是我们的规划器。
执行器:
执行器的提示词与规划器不同。它的目标不是分解问题,而是 在已有上下文的基础上,专注解决当前这一个 步骤 。因此,提示词需要包含以下关键信息:
原始问题 : 确保模型始终了解最终目标。
完整计划 : 让模型了解当前步骤在整个任务中的位置。
历史步骤与结果 : 提供至今为止已经完成的工作,作为当前步骤的直接输入。
当前步骤 : 明确指示模型现在需要解决哪一个具体任务。
维度 ReAct (边想边做) Plan-and-Solve (先谋后动)
核心流程 推理 (Thought) → 行动 (Action) → 观察 (Observation) 的循环 规划 (Plan) → 执行 (Solve) 的两个独立阶段
工作方式 动态、自适应。每步都根据外部反馈调整下一步计划 结构化、稳定。先制定完整步骤,再严格按照蓝图执行
最佳适用场景 探索性、需实时反馈的任务,如:
- 信息检索
- 客服对话
- 实时问答
复杂、多步骤、目标明确的任务,如:
- 数学推理
- 长文报告生成
- 代码生成
核心优势 灵活、可解释性强。能根据观察结果动态纠错,每一步的思考都可见 稳定、不易跑偏。长程规划能力强,确保最终结果与初始目标一致
主要局限 效率低、易失焦。串行执行,多步任务耗时且成本高,长期目标可能被遗忘 缺乏灵活性。计划一旦制定,难以应对中途变化,如果初始规划有误,可能全盘皆输

5.Reflection

在我们已经实现的 ReAct Plan-and-Solve 范式中,智能体一旦完成了任务,其工作流程便告结束。然 而,它们生成的初始答案,无论是行动轨迹还是最终结果,都可能存在谬误或有待改进之处。Reflection 机制的核心思想,正是为智能体引入一种事后( post-hoc )的自我校正循环。

1.工作原理

其核心工作流程可以概括为一个简洁的三步循环:执行 -> 反思 -> 优化
1. 执行 (Execution) :首先,智能体使用我们熟悉的方法(如 ReAct Plan-and-Solve )尝试完成任务, 生成一个初步的解决方案或行动轨迹。这可以看作是“ 初稿
2. 反思 (Reflection) :接着,智能体进入反思阶段。它会调用一个独立的、或者带有特殊提示词的大语言 模型实例,来扮演一个“ 评审员 的角色。这个 评审员 会审视第一步生成的 初稿 ,并从多个维度进行评估,例如:
事实性错误 :是否存在与常识或已知事实相悖的内容?
逻辑漏洞 :推理过程是否存在不连贯或矛盾之处?
效率问题 :是否有更直接、更简洁的路径来完成任务?
遗漏信息 :是否忽略了问题的某些关键约束或方面? 根据评估,它会生成一段结构化的 反馈 (Feedback) ,指出具体的问题所在和改进建议。
3. 优化 (Refinement) :最后,智能体将 初稿 反馈 作为新的上下文,再次调用大语言模型,要求它根据反馈内容对初稿进行修正,生成一个更完善的“ 修订稿。
与前两种范式相比,Reflection 的价值在于:
1.它为智能体提供了一个内部纠错回路,使其不再完全依赖于外部工具的反馈( ReAct 的Observation),从而能够修正更高层次的逻辑和策略错误。
2.它将一次性的任务执行,转变为一个持续优化的过程,显著提升了复杂任务的最终成功率和答案质量。
3.它为智能体构建了一个临时的 短期记忆 。整个 执行 - 反思 - 优化 的轨迹形成了一个宝贵的经验记录,智能体不仅知道最终答案,还记得自己是如何从有缺陷的初稿迭代到最终版本的。更进一步,这个记忆系统还可以是多模态的,允许智能体反思和修正文本以外的输出(如代码、图像等),为构建更强大的多模态智能体奠定了基础。

2.Memory类设计

这个 Memory 类的设计比较简洁,主体是这样的:
  • 使用一个列表 records 来按顺序存储每一次的行动和反思。
  • add_record 方法负责向记忆中添加新的条目。
  • get_trajectory 方法是核心,它将记忆轨迹序列化成一段文本,可以直接插入到后续的提示词中, 为模型的反思和优化提供完整的上下文。
  • get_last_execution 方便我们获取最新的初稿以供反思

3.提示词设计

与之前的范式不同, Reflection 机制需要多个不同角色的提示词来协同工作。
1. 初始执行提示词 (Execution Prompt) :这是智能体首次尝试解决问题的提示词,内容相对直接,只要求模型完成指定任务。
2. 反思提示词 (Reflection Prompt) :这个提示词是 Reflection 机制的灵魂。它指示模型扮演 代码评审 员” 的角色,对上一轮生成的代码进行批判性分析,并提供具体的、可操作的反馈。
3. 优化提示词 (Refinement Prompt) :当收到反馈后,这个提示词将引导模型根据反馈内容,对原有代码进行修正和优化。

小结

主要成本 :模型调用开销增加任务延迟显著提高提示工程复杂度上升

核心收益:解决方案质量的跃迁 鲁棒性与可靠性增强

综上所述,Reflection 机制是一种典型的 以成本换质量 的策略。它非常适合那些 对最终结果的质量、准确 性和可靠性有极高要求,且对任务完成的实时性要求相对宽松 的场景。

三个范式对比

1. ReAct: 我们构建了一个能与外部世界交互的 ReAct 智能体。通过 思考 - 行动 - 观察 的动态循环,它成功 地利用搜索引擎回答了自身知识库无法覆盖的实时性问题。其核心优势在于环境适应性 动态纠错能 ,使其成为处理探索性、需要外部工具输入的任务的首选。
2. Plan-and-Solve: 我们实现了一个先规划后执行的 Plan-and-Solve 智能体,并利用它解决了需要多步推 理的数学应用题。它将复杂的任务分解为清晰的步骤,然后逐一执行。其核心优势在于结构性 稳定 ,特别适合处理逻辑路径确定、内部推理密集的任务。
3. Reflection ( 自我反思与迭代 ): 我们构建了一个具备自我优化能力的 Reflection 智能体。通过引入 执行 - 反思- 优化 的迭代循环,它成功地将一个效率较低的初始代码方案,优化为了一个算法上更优的高性能 版本。其核心价值在于能显著提升解决方案的质量 ,适用于对结果的准确性和可靠性有极高要求的场景。

四、主流框架

1.AutoGen

1 )框架结构的演进
新架构最显著的变化是引入了清晰的分层和异步优先的设计理念。
分层设计: 框架被拆分为两个核心模块:
autogen-core :作为框架的底层基础,封装了与语言模型交互、消息传递等核心功能。它的存
在保证了框架的稳定性和未来扩展性。 autogen-agentchat :构建于 core 之上,提供了用于开发对话式智能体应用的高级接口,简化了多智能体应用的开发流程。 这种分层策略使得各组件职责明确,降低了系统的耦合度。
异步优先: 新架构全面转向异步编程 ( async/await ) 。在多智能体协作场景中,网络请求(如调用
LLM API )是主要耗时操作。异步模式允许系统在等待一个智能体响应时处理其他任务,从而避免了线程阻塞,显著提升了并发处理能力和系统资源的利用效率。
(2)核心智能体组件
智能体是执行任务的基本单元。在 0.7.4 版本中,智能体的设计更加专注和模块化。 AssistantAgent ( 助理智能体 ) 这是任务的主要解决者,其核心是封装了一个大型语言模型
LLM )。它的职责是根据对话历史生成富有逻辑和知识的回复,例如提出计划、撰写文章或编写代码。通过不同的系统消息(System Message ),我们可以为其赋予不同的 专家 角色。
UserProxyAgent ( 用户代理智能体 ) 这是 AutoGen 中功能独特的组件。它扮演着双重角色:既是人类用户的“ 代言人 ,负责发起任务和传达意图;又是一个可靠的 执行器 ,可以配置为执行代码或调用工具,并将结果反馈给其他智能体。这种设计清晰地区分了“ 思考 (由 AssistantAgent 完成)与 行动”
3 )从 GroupChatManager Team
当任务需要多个智能体协作时,就需要一个机制来协调对话流程。在早期版本中, GroupChatManager 承担 了这一职责。而在新架构中,引入了更灵活的 Team 或群聊概念,例如 RoundRobinGroupChat
轮询群聊 (RoundRobinGroupChat) 这是一种明确的、顺序化的对话协调机制。它会让参与的智能体按照预定义的顺序依次发言。这种模式非常适用于流程固定的任务,例如一个典型的软件开发流程: 产品经理先提出需求,然后工程师编写代码,最后由代码审查员进行检查。
工作流:
1. 首先,创建一个 RoundRobinGroupChat 实例,并将所有参与协作的智能体(如产品经理、工程
师等)加入其中。
2. 当一个任务开始时,群聊会按照预设的顺序,依次激活相应的智能体。
3. 被选中的智能体根据当前的对话上下文进行响应。
4. 群聊将新的回复加入对话历史,并激活下一个智能体。
5. 这个过程会持续进行,直到达到最大对话轮次或满足预设的终止条件。

2.AgentScope

AgentScope 的核心差异在于其 消息驱动的架构设计 工业级的工程实践
(1)分层架构设计
在这个架构中,最底层是 基础组件层 (Foundational Components) ,它为整个框架提供了核心的构建块。Message 组件定义了统一的消息格式,支持从简单的文本交互到复杂的多模态内容; Memory 组件提供了短期和长期记忆管理; Model API 层抽象了对不同大语言模型的调用;而 Tool 组件则封装了智能体与外部 世界交互的能力。
在基础组件之上, 智能体基础设施层 (Agent-level Infrastructure) 提供了更高级的抽象。这一层不仅包含 了各种预构建的智能体(如浏览器使用智能体、深度研究智能体),还实现了经典的 ReAct 范式,支持智能体钩子、并行工具调用、状态管理等高级特性。特别值得注意的是,这一层原生支持异步执行与实时控制 , 这是 AgentScope 相比其他框架的一个重要优势。
多智能体协作层 (Multi-Agent Cooperation) AgentScope 的核心创新所在。 MsgHub 作为消息中心,负责智能体间的消息路由和状态管理;而 Pipeline 系统则提供了灵活的工作流编排能力,支持顺序、并发等多种执行模式。这种设计使得开发者可以轻松构建复杂的多智能体协作场景。 最上层的开发与部署层 (Deployment & Development) 则体现了 AgentScope 对工程化的重视。 AgentScope Runtime 提供了生产级的运行时环境,而 AgentScope Studio 则为开发者提供了完整的可视化开发工具链。
2 )消息驱动
AgentScope 的核心创新在于其 消息驱动架构 。在这个架构中,所有的智能体交互都被抽象为 消息 的发送和接收,而不是传统的函数调用。
(3)智能体生命周期管理
AgentScope 中,每个智能体都有明确的生命周期(初始化、运行、暂停、销毁等),并基于一个统一的 基类 AgentBase 来实现。开发者通常只需要关注其核心的 reply 方法。
4 )消息传递机制
AgentScope 内置了一个 消息中心 (MsgHub) ,它是整个消息驱动架构的中枢。 MsgHub 不仅负责消息的路由和分发,还集成了持久化和分布式通信等高级功能,它有以下这些特点。
灵活的消息路由 : 支持点对点、广播、组播等多种通信模式,可以构建灵活复杂的交互网络。
消息持久化 : 能够将所有消息自动保存到数据库(如 SQLite, MongoDB ),确保了长期运行任务的状态可以被恢复。
原生分布式支持 : 这是 AgentScope 的标志性特性。智能体可以被部署在不同的进程或服务器上,
MsgHub 会通过 RPC (远程过程调用)自动处理跨节点的通信,对开发者完全透明。

3.CAMEL

CAMEL 实现自主协作的基石是两大核心概念: 角色扮演 (Role-Playing) 引导性提示 (Inception Prompting)
1 )角色扮演
CAMEL 最初的设计中,一个任务通常由两个智能体协作完成。这两个智能体被赋予了互补的、明确定义的“ 角色 。一个扮演 “AI 用户 ” (AI User) ,负责提出需求、下达指令和构思任务步骤;另一个则扮演 “AI ” (AI Assistant) ,负责根据指令执行具体操作和提供解决方案。
2 )引导性提示
 CAMEL 最核心的技术,引导性提示发挥作用的地方。 引导性提示 是在对话开始前,分别注入给两个智能体的一段精心设计的、结构化的初始指令(System Prompt )。

4.LangGraph 

首先,是全局状态( State 。整个图的执行过程都围绕一个共享的状态对象进行。
其次,是节点( Nodes 。每个节点都是一个接收当前状态作为输入、并返回一个更新后的状态作为输出的 Python 函数。节点是执行具体工作的单元。
最后,是边( Edges 。边负责连接节点,定义工作流的方向。最简单的边是常规边,它指定了一个节点的 输出总是流向另一个固定的节点。而 LangGraph 最强大的功能在于 条件边( Conditional Edges 。它通 过一个函数来判断当前的状态,然后动态地决定下一步应该跳转到哪个节点。

五、自己构建Agent架构

1.可扩展性

构建HelloAgentsLLM 这一核心组件,解决了与大语言模型通信的关键问题。

  • 多提供商支持
    • 用户可以在实例化 LLM 时手动指定 provider="openai""modelscope"
    • 框架会把请求发送到指定云服务 API
  • 本地模型集成
    • 用户可以设置 provider="vllm""ollama"
    • 框架调用本地运行的 HTTP 接口,兼容 OpenAI API
  • 自动检测机制
    • 设置 provider="auto" 时,框架会扫描 .env 或检测可用服务
    • 自动选择一个可用 provider 并路由请求,无需人工干预

2.框架接口实现

不过它还 需要一系列配套的接口和组件来处理数据流、管理配置、应对异常,并为上层应用的构建提供一个清晰、统一的结构。以下三个核心文件:
message.py : 定义了框架内统一的消息格式,确保了智能体与模型之间信息传递的标准化。
config.py : 提供了一个中心化的配置管理方案,使框架的行为易于调整和扩展。
agent.py : 定义了所有智能体的抽象基类( Agent ),为后续实现不同类型的智能体提供了统一的接口和规范。
message

这个 Message 类的作用就是:

  1. 封装单条对话消息,包含内容、角色、时间戳和可选元数据
  2. 保证数据结构标准化和类型安全(通过 Pydantic)
  3. 提供接口方便与 LLM API 对接to_dict()
  4. 支持调试和打印__str__()

换句话说,它就是 智能体和大语言模型交互中“消息单元”的标准化容器

config
  • 集中管理配置
    • 将原本可能散落在代码中的硬编码参数(如模型名、provider、temperature 等)统一放到一个类里管理。
    • 让框架使用者可以在一个地方看到所有关键配置,结构清晰。
  • 逻辑分区
    • LLM 配置default_model, default_provider, temperature, max_tokens
    • 系统配置debug, log_level
    • 其他配置max_history_length
  • 默认值保证零配置可用
    • 每个配置都有默认值,例如 default_model="gpt-3.5-turbo"
    • 即使用户没有提供任何环境变量,框架也可以正常运行
  • 环境变量覆盖
    • 核心方法 from_env() 可以从环境变量读取值,覆盖默认配置
    • 好处:在不同部署环境(本地、服务器、容器)中无需修改代码,就可以调整参数
  • 提供字典化接口
    • to_dict() 将配置对象转换为普通字典,便于传递给其他模块或序列化
Agent 抽象基类
Agent 类是整个框架的顶层抽象。它定义了一个智能体应该具备的通用行为和属性,但并不关心具体的实现 方式。我们通过 Python abc (Abstract Base Classes) 模块来实现它,这强制所有具体的智能体实现(如后续章节的 SimpleAgent , ReActAgent 等)都必须遵循同一个 接口

1.类的定位

class Agent(ABC):

  • Agent一个抽象基类(Abstract Base Class, ABC)
  • 不能直接实例化,只能被继承
  • 作用是为所有智能体(Agent)定义 统一的接口和基础功能

2.构造函数 __init__

  • 核心依赖
    1. name:Agent 的名称
    2. llm:关联的 LLM 实例(HelloAgentsLLM)
    3. system_prompt:系统提示词(可选)
    4. config:配置参数(可选,如果没有传入就用默认 Config)
  • 历史记录管理
    • _history 用于存储消息列表,每条消息是一个 Message 对象
    • 方便智能体追踪对话上下文

3.抽象方法 run

  • 作用:所有子类必须实现 run 方法
  • 目的:保证每个 Agent 都有一个统一的“执行入口”
  • 设计思想:体现 面向对象的抽象原则(Abstraction)
    • 基类只定义接口
    • 具体逻辑由子类实现

 4.历史记录管理方法

  • add_message(message: Message) → 添加消息到历史记录
  • clear_history() → 清空历史记录
  • get_history() → 获取历史记录的拷贝

特点

  • Message 类协同工作
  • 对对话上下文的管理统一标准化
  • 子类智能体可以直接使用,不必重复实现

 5.字符串表示

  • 打印 Agent 对象时,显示 Agent 名称和当前 LLM provider
  • 方便调试和日志记录
总结:框架核心基础组件的设计与实现
  • 配置管理(Config 类)
    • 集中管理框架参数,包括 LLM 配置(模型名、provider、temperature 等)、系统配置(debug、log_level)和其他参数(历史消息长度等)。
    • 支持 默认值,保证零配置下框架可用。
    • 提供 from_env() 方法,可以从环境变量读取参数,支持跨环境部署,无需修改代码。
    • 提供 to_dict() 接口,方便其他模块调用和序列化。
  • 消息管理(Message 类)
    • 封装智能体与 LLM 交互中的单条消息,包括 contentroletimestampmetadata
    • role 使用 Literal["user","assistant","system","tool"] 限定,保证类型安全并兼容 OpenAI API。
    • 提供 to_dict() 将消息转为 API 可用的字典格式,保证“对内丰富,对外兼容”。
    • 提供 __str__() 方法,便于调试和打印消息。
  • 智能体基类(Agent 基类)
    • 通过继承 ABC 抽象类实现,强制子类实现统一的 run() 方法。
    • 构造函数定义核心依赖:name、LLM 实例、系统提示词和配置参数。
    • 内置 历史记录管理方法add_message()clear_history()get_history(),与 Message 类协作管理对话上下文。
    • 提供 __str__() 方法,便于查看 Agent 名称和所用 LLM provider。
    • 设计体现了 面向对象的抽象原则,保证可扩展性和统一接口调用。
  • LLM 集成(HelloAgentsLLM 类)
    • 作为智能体的核心模型调用接口,统一封装不同 LLM 服务。
    • 支持 多提供商:OpenAI、ModelScope、智谱 AI 等,用户可通过 provider 指定或自动检测(provider="auto")。
    • 支持 本地模型集成:VLLM、Ollama 等,统一通过 OpenAI 兼容 API 调用,无需修改核心智能体逻辑。
    • 提供统一接口,用户调用 agent.run()llm.think() 即可,无需关心后端服务类型。

3.Agent范式的框架化实现

1. 提示词工程的系统性提升 :对第四章中的提示词进行深度优化,从特定任务导向转向通用化设计,同时增强格式约束和角色定义。
2. 接口与格式的标准化统一 :建立统一的 Agent 基类和标准化的运行接口,所有 Agent 都遵循相同的初始化参数、方法签名和历史管理机制。
3. 高度可配置的自定义能力 :支持用户自定义提示词模板、配置参数和执行策略。

1.SimpleAgent

SimpleAgent 是最基础的 Agent 实现,它展示了如何在框架基础上构建一个完整的对话智能体。我们将通过 继承框架基类来重写SimpleAgent
  • 核心特点:基础对话智能体
  • 设计目标:用于最简单的对话场景,提供最直接的 LLM 调用和消息处理
  • 功能
    • 直接把用户输入发送给 LLM
    • 返回模型生成的文本
    • 可选工具调用(如 Calculator)
    • 维护对话历史
  • 适用场景
    • 基础问答、聊天助手、简单任务执行
    • 不包含复杂推理、计划或多步骤动作

2.ReActAgent

  • 核心特点:增强推理 + 行动能力
  • 设计目标:结合 Reasoning(推理)Acting(执行动作) 的智能体
  • 功能
    • 将用户输入分解为思考步骤(Reasoning)和执行动作(Acting)
    • 可以调用外部工具或 API 在对话中“做事情”
    • LLM 不仅生成回答,还会生成行动决策
    • 适合多步骤任务、复杂逻辑问答或工具驱动的交互
  • 适用场景
    • 问答 + 动作决策,例如需要调用数据库、计算器、搜索等工具
    • 复杂任务拆解,需要逐步推理

3.ReflectionAgent

  • 类型:自我反思智能体
  • 核心特点:能够对历史对话或自身输出进行反思和优化
  • 功能
    • 在生成回答前分析对话历史或自身先前回答
    • 通过反思改进回答质量
    • 支持多轮优化或纠错机制
  • 适用场景:对话优化、复杂逻辑推理、连续多轮任务

4.PlanAndSolveAgent

  • 类型:计划 + 执行 Agent
  • 特点:显式生成任务计划,然后逐步执行计划
  • 功能
    • LLM 输出整体计划
    • 将计划拆解为子任务逐步执行
    • 每个子任务可能调用工具或外部接口
  • 适用场景:多步骤任务、需要明确计划的复杂流程
  • 区别:比 ReActAgent 更结构化,先生成完整计划再执行

5.FunctionCallAgent

  • 类型:函数调用 Agent
  • 特点:可以让 LLM 输出函数调用或 API 调用指令
  • 功能
    • LLM 根据用户输入生成调用函数的请求
    • 框架执行函数并把结果返回 LLM
    • 支持可编程工具调用
  • 适用场景:需要动态调用程序、数据库、Web API 的任务
  • 区别:专注于“函数/工具调用”,而不是多步推理或反思
特点 SimpleAgent ReActAgent ReflectionAgent PlanAndSolveAgent FunctionCallAgent
核心思路 直接回答 思考+行动 反思+优化 计划+执行 函数/工具调用
推理能力 分步推理 基于历史/自我输出推理 生成整体计划再拆解执行 LLM 决定调用何种函数
多步骤任务 否/部分 部分
历史利用 消息记录 消息记录 历史 + 自身输出 可利用历史执行计划 可利用历史选择函数
工具调用 可选 主动/可选 可选/辅助 子任务可能调用 核心功能
适用场景 简单问答、聊天 复杂问答、工具驱动 回答优化、多轮任务 多步骤计划任务 动态函数/API 调用任务

4.工具系统

1. 统一的工具抽象与管理 :建立标准化的 Tool 基类和 ToolRegistry 注册机制,为工具的开发、注册、发现
和执行提供统一的基础设施。
2. 实战驱动的工具开发 :以数学计算工具为案例,展示如何设计和实现自定义工具,让读者掌握工具开发
的完整流程。
3. 高级整合与优化策略 :通过多源搜索工具的设计,展示如何整合多个外部服务,实现智能后端选择、结
果合并和容错处理,体现工具系统在复杂场景下的设计思维。

1.Tool 基类

作用:定义所有工具必须遵守的规范,保证每个工具都能以统一方式使用。
• 特点:
• 每个工具都有 name、description,方便发现和理解。
• 提供 run 方法:工具执行时的接口,接受参数并返回结果。
• 提供 get_parameters 方法:工具能描述自己需要哪些参数,这样框架可以自动生成文档或验证输入。
• 设计思想:体现了 面向对象的抽象原则,统一接口,方便扩展。

 

 2.ToolParameter 类

• 作用:定义工具参数,包括参数名、类型、是否必填、默认值等。
• 特点:
• 支持 参数验证(检查类型、必填等)
• 支持 自动文档生成,让用户或 Agent 清楚知道工具需要什么输入


3. ToolRegistry 注册表

• 作用:工具管理中心,用于注册、发现和调用工具。
• 特点:
• 注册 Tool 对象:适合复杂工具,有完整参数定义
• 注册函数工具:适合简单工具,快速集成现有函数
• 避免重复注册并提示覆盖
• 提供 工具描述和 schema 输出,方便 Agent 调用和提示词生成

 

4.工具发现与管理机制

• 作用:让 Agent 能够自动知道自己可以用哪些工具,并知道它们的参数需求
• 输出:
• 格式化的工具描述字符串 → 用于生成 Agent 提示词
• OpenAI SDK 兼容的 schema → 让 LLM 直接调用工具

5.工具系统的高级特性

1.工具链式调用机制(Tool Chaining)

概念:将多个工具按顺序组合执行,实现复杂任务。每个工具的输出可以作为下一个工具的输入。

流程示意

  1. 用户发送请求 → Agent 接收任务
  2. Agent 根据任务拆分工具链:
    • 例:天气查询 + 翻译 → [get_weather, translate]
  3. Agent 调用第一个工具 get_weather
  4. 获取输出后,将结果传给第二个工具 translate
  5. 最终输出给用户

关键点

  • 工具链顺序由 Agent 决策 或预定义
  • 支持 多步骤任务,类似 ReActAgent 或 PlanAndSolveAgent
  • 框架层面通过 ToolRegistry 管理工具注册与发现
2. 异步工具执行支持(Asynchronous Execution)

概念:对于耗时操作(如网络请求、大模型推理),工具执行不会阻塞 Agent 主线程,而是并行处理。

实现方式

  1. Python 异步函数

  2. 线程/进程池

六、记忆系统(Memory System)检索增强生成(Retrieval-Augmented Generation, RAG)

记忆系统:

1.Memory Tool

MemoryTool 作为记忆系统的统一接口,其设计遵循了 " 统一入口,分发处理 "
支持的操作:
- add: 添加记忆(支持 4 种类型 : working/episodic/semantic/perceptual
- search: 搜索记忆
- summary: 获取记忆摘要
- stats: 获取统计信息
- update: 更新记忆
- remove: 删除记忆
- forget: 遗忘记忆(多种策略)
- consolidate: 整合记忆(短期 长期)
- clear_all: 清空所有记忆

(1)add

在实现中,我们不仅要存储记忆内容,还要为每个记忆添加丰富的上下文信息
三个关键任务:
会话 ID 的自动管理(确保每个记忆都有明确的会话归属)、
多模态数据的智能处理(自动推断文件类型并保存相关元数据)、
以及上下文信息的自动补充(为每个记忆添加间戳和会话信息)。
有四种记忆类型:
# 1. 工作记忆 - 临时信息,容量有限
memory_tool.execute("add",
content="用户刚才问了关于Python函数的问题",
memory_type="working",
importance=0.6
)
# 2. 情景记忆 - 具体事件和经历
memory_tool.execute("add",
content="2024年3月15日,用户张三完成了第一个Python项目",
memory_type="episodic",
importance=0.8,
event_type="milestone",
location="在线学习平台"
)
# 3. 语义记忆 - 抽象知识和概念
(2)操作2:search
search 操作是记忆系统的核心功能,它需要在大量记忆中快速找到与查询最相关的内容。它涉及语义理
解、相关性计算和结果排序等多个环节。
memory_tool.execute("add",
content="Python是一种解释型、面向对象的编程语言",
memory_type="semantic",
importance=0.9,
knowledge_type="factual"
)
# 4. 感知记忆 - 多模态信息
memory_tool.execute("add",
content="用户上传了一张Python代码截图,包含函数定义",
memory_type="perceptual",
importance=0.7,
modality="image",
file_path="./uploads/code_screenshot.png"
)

(2)search

search 操作是记忆系统的核心功能,它需要在大量记忆中快速找到与查询最相关的内容。它涉及语义理解、相关性计算和结果排序等多个环节。
搜索操作在设计上支持单数和复数两种参数形式( memory_type memory_types ),让用户以最自然的方式表达需求。

(3)forget

支持三种策略:基于重要性( 删除重要性低于阈值的记忆 )、基于时间(删除过时的记忆)和基于容量(当存储接近上限时删除最不重要的记忆)。

(4)consolidate

默认设置是将重要性超过0.7 的工作记忆转换为情景记忆,这个阈值确保只有真正重要的信息才会被长期保存。整个过程是自动化的,用户无需手动选择具体的记忆,系统会智能地识别符合条件的记忆并执行类型转换。

2.MemoryManager

MemoryTool 专注于用户接口和参数处理,而MemoryManager则负责核心的记忆管理逻辑。MemoryTool在初始化时会创建一个 MemoryManager 实例,并根据配置启用不同类型的记忆模块。
MemoryManager 作为记忆系统的核心协调者,负责管理不同类型的记忆模块,并提供统一的操作接口。

3.四种记忆类型

1)工作记忆(WorkingMemory)当前上下文

工作记忆是记忆系统中最活跃的部分,它负责存储当前对话会话中的临时信息。工作记忆的设计重点在于快速访问和自动清理,这种设计确保了系统的响应速度和资源效率。
工作记忆采用了纯内存存储方案,配合 TTL Time To Live )机制进行自动清理。这种设计的优势在于访问速度极快,但也意味着工作记忆的内容在系统重启后会丢失。这种特性正好符合工作记忆的定位,存储临时的、易变的信息。
工作记忆的检索采用了混合检索策略,首先尝试使用 TF-IDF 向量化进行语义检索,如果失败则回退到关键词匹配。这种设计确保了在各种环境下都能提供可靠的检索服务。评分算法结合了语义相似度、时间衰减和重要性权重,最终得分公式为: ( 相似度 × 时间衰减 ) × (0.8 + 重要性 × 0.4)

2)情景记忆(EpisodicMemory)输入

情景记忆负责存储具体的事件和经历,它的设计重点在于保持事件的完整性和时间序列关系。情景记忆采用了SQLite+Qdrant 的混合存储方案, SQLite 负责结构化数据的存储和复杂查询, Qdrant负责高效的向量检索。
( 向量相似度 × 0.8 + 时间近因性 × 0.2) × (0.8 + 重要性 × 0.4)

3)语义记忆(SemanticMemory)历史对话

语义记忆是记忆系统中最复杂的部分,它负责存储抽象的概念、规则和知识。语义记忆的设计重点在于知识的结构化表示和智能推理能力。语义记忆采用了Neo4j 图数据库和 Qdrant 向量数据库的混合架构,这种设计让系统既能进行快速的语义检索,又能利用知识图谱进行复杂的关系推理。
语义记忆的添加过程体现了知识图谱构建的完整流程。系统不仅存储记忆内容,还会自动提取实体和关系,构建结构化的知识表示: ( 向量相似度 × 0.7 + 图相似度 × 0.3) × (0.8 + 重要性 × 0.4)
向量检索权重( 0.7 :语义相似度是主要因素,确保检索结果与查询语义相关
图检索权重( 0.3 :关系推理作为补充,发现概念间的隐含关联
重要性权重范围 [0.8, 1.2] :避免重要性过度影响相似度排序,保持检索的准确性

4)感知记忆(PerceptualMemory)RAG知识库

感知记忆支持文本、图像、音频等多种模态的数据存储和检索。它采用了模态分离的存储策略,为不同模态的数据创建独立的向量集合,这种设计避免了维度不匹配的问题,同时保证了检索的准确性 感知记忆的检索支持同模态和跨模态两种模式。同模态检索利用专业的编码器进行精确匹配,而跨模态检索 则需要更复杂的语义对齐机制
感知记忆的评分公式为: ( 向量相似度 × 0.8 + 时间近因性 × 0.2) × (0.8 + 重要性 × 0.4) 。感知记忆的评分机制还支持跨模态检索,通过统一的向量空间实现文本、图像、音频等不同模态数据的语义对齐。当进行跨模态检索时,系统会自动调整评分权重,确保检索结果的多样性和准确性。

4.RAG

一个完整的 RAG 应用流程主要分为两大核心环节。在 数据准备阶段 ,系统通过 数据提取 文本分割 向量 ,将外部知识构建成一个可检索的数据库。随后在 应用阶段 ,系统会响应用户的 提问 ,从数据库中 检索 相关信息,将其注入 Prompt ,并最终驱动大语言模型 生成答案

1.RAG系统架构设计

(1)RAGTool接口

该接口定义了一个基于 RAG 架构的工具类,主要完成知识库问答能力的初始化,包括向量数据库(Qdrant)连接配置、RAG pipeline 构建以及多知识库(namespace)管理。通过 pipelines 结构支持多个检索流程,并结合 LLM 实现检索增强生成。

(2)多模态文档载入
RAG 系统的核心优势之一是其强大的多模态文档处理能力。系统使用 MarkItDown 作为统一的文档转换引擎,支持几乎所有常见的文档格式。MarkItDown 是微软开源的通用文档转换工具,它是 HelloAgents RAG 系统的核心组件,负责将任意格式的文档统一转换为结构化的Markdown 文本。无论输入是 PDF Word 、Excel、图片还是音频,最终都会转换为标准的 Markdown 格式,然后进入统一的分块、向量化和存储流程。
(3)分块策略
可以根据Token数量分
(4)统一嵌入与向量存储
嵌入模型是 RAG 系统的核心,它负责将文本转换为高维向量,使得计算机能够理解和比较文本的语义相似性。RAG 系统的检索能力很大程度上取决于嵌入模型的质量和向量存储的效率。

2.高级检索策略

1)多查询扩展(MQE
多查询扩展( Multi-Query Expansion )是一种通过生成语义等价的多样化查询来提高检索召回率的技术。这种方法的核心洞察是:同一个问题可以有多种不同的表述方式,而不同的表述可能匹配到不同的相关文档。例如," 如何学习 Python" 可以扩展为 "Python 入门教程 " "Python 学习方法 " "Python 编程指南 " 等多个查询。通过并行执行这些扩展查询并合并结果,系统能够覆盖更广泛的相关文档,避免因用词差异而遗漏重要信息。
MQE 的优势在于它能够自动理解用户查询的多种可能含义,特别是对于模糊查询或专业术语查询效果显著。
2)假设文档嵌入(HyDE
假设文档嵌入( Hypothetical Document Embeddings HyDE )是一种创新的检索技术,它的核心思想 是" 用答案找答案 " 。传统的检索方法是用问题去匹配文档,但问题和答案在语义空间中的分布往往存在差异 ——问题通常是疑问句,而文档内容是陈述句。 HyDE 通过让 LLM 先生成一个假设性的答案段落,然后用这个答案段落去检索真实文档,从而缩小了查询和文档之间的语义鸿沟。
这种方法的优势在于,假设答案与真实答案在语义空间中更加接近,因此能够更准确地匹配到相关文档。即使假设答案的内容不完全正确,它所包含的关键术语、概念和表述风格也能有效引导检索系统找到正确的文档。特别是对于专业领域的查询,HyDE 能够生成包含领域术语的假设文档,显著提升检索精度
3)扩展检索框架
HelloAgents MQE HyDE 两种策略整合到统一的扩展检索框架中。系统通过 enable_mqe
enable_hyde 参数让用户可以根据具体场景选择启用哪些策略:对于需要高召回率的场景可以同时启用两种策略,对于性能敏感的场景可以只使用基础检索。
扩展检索的核心机制是 " 扩展 - 检索 - 合并 " 三步流程。首先,系统根据原始查询生成多个扩展查询(包括 MQE生成的多样化查询和HyDE 生成的假设文档);然后,对每个扩展查询并行执行向量检索,获取候选文档池; 最后,通过去重和分数排序合并所有结果,返回最相关的top-k 文档。这种设计的巧妙之处在于,它通过candidate_pool_multiplier 参数(默认为 4 )扩大候选池,确保有足够的候选文档进行筛选,同时通过智能去重避免返回重复内容。
MQE 擅长处理用词多样性问题, HyDE 擅长处理语义鸿沟问题,而统一框架则确保了结果的质量和多样性。对于一般查询,建议启用MQE ;对于专业领域查询,建议同时启用MQE HyDE ;对于性能敏感场景,可以只使用基础检索或仅启用 MQE

七、上下文工程

  • ContextBuilder (hello_agents/context/builder.py):上下文构建器,实现 GSSC (Gather-Select-Structure-Compress) 流水线,提供统一的上下文管理接口
  • NoteTool (hello_agents/tools/builtin/note_tool.py):结构化笔记工具,支持智能体进行持久化记忆管理
  • TerminalTool (hello_agents/tools/builtin/terminal_tool.py):终端工具,支持智能体进行文件系统操作和即时上下文检索

1.面向长时程任务的上下文工程

  • 压缩整合(Compaction)

    • 定义:当对话接近上下文上限时,对其进行高保真总结,并用该摘要重启一个新的上下文窗口,以维持长程连贯性。
    • 实践:让模型压缩并保留架构性决策、未解决缺陷、实现细节,丢弃重复的工具输出与噪声;新窗口携带压缩摘要 + 最近少量高相关工件(如“最近访问的若干文件”)。
    • 调参建议:先优化召回(确保不遗漏关键信息),再优化精确度(剔除冗余内容);一种安全的“轻触式”压缩是对“深历史中的工具调用与结果”进行清理。
  • 结构化笔记(Structured note-taking)

    • 定义:也称“智能体记忆”。智能体以固定频率将关键信息写入上下文外的持久化存储,在后续阶段按需拉回。
    • 价值:以极低的上下文开销维持持久状态与依赖关系。例如维护 TODO 列表、项目 NOTES.md、关键结论/依赖/阻塞项的索引,跨数十次工具调用与多轮上下文重置仍能保持进度与一致性。
    • 说明:在非编码场景中同样有效(如长期策略性任务、游戏/仿真中的目标管理与统计计数)。结合第八章的 MemoryTool,可轻松实现文件式/向量式的外部记忆并在运行时检索。
  • 子代理架构(Sub-agent architectures)

    • 思想:由主代理负责高层规划与综合,多个专长子代理在“干净的上下文窗口”中各自深挖、调用工具并探索,最后仅回传凝练摘要(常见 1,000–2,000 tokens)。
    • 好处:实现关注点分离。庞杂的搜索上下文留在子代理内部,主代理专注于整合与推理;适合需要并行探索的复杂研究/分析任务。
    • 经验:公开的多智能体研究系统显示,该模式在复杂研究任务上相较单代理基线具有显著优势。

方法取舍可以遵循以下经验法则:

  • 压缩整合:适合需要长对话连续性的任务,强调上下文的“接力”。
  • 结构化笔记:适合有里程碑/阶段性成果的迭代式开发与研究。
  • 子代理架构:适合复杂研究与分析,能从并行探索中获益。

2.ContextBuilder

1.核心数据结构

ContextBuilder 的实现主要依赖两个核心数据结构:

一是 ContextPacket,用于统一表示来自 RAG、历史对话和 Memory 等多源信息;

二是配置结构(如 token 预算、权重策略等),用于控制上下文的筛选、排序与拼接逻辑。两者分别负责“数据承载”和“策略控制”。

2.GSSC流水线

ContextBuilder 的核心是 GSSC(Gather-Select-Structure-Compress)流水线,它将上下文构建过程分解为四个清晰的阶段。

(1)Gather:多源信息汇集

第一阶段是从多个来源汇集候选信息。这个阶段的关键在于容错性和灵活性。

1. 添加系统指令(最高优先级,不参与评分)

2. 从记忆系统检索相关记忆

3. 从 RAG 系统检索相关知识

4.添加对话历史(仅保留最近的 N 条)

5.自定义信息包

  • 容错机制:每个外部数据源的调用都被 try-except 包裹,确保单个源的失败不会影响整体流程
  • 优先级处理:系统指令被标记为高优先级,确保始终被保留
  • 历史限制:对话历史只保留最近的几条,避免上下文窗口被历史信息占据
(2)Select:智能信息选择

第二阶段是根据相关性和新近性对候选信息进行评分和选择。

1. 分离系统指令和其他信息

2. 计算系统指令占用的 token

3. 为其他信息计算综合分数

4. 按分数降序排序

5. 贪心选择:按分数从高到低填充,直到达到 token 上限

  • 评分机制:采用相关性和新近性的加权组合,权重可配置
  • 贪心算法:按分数从高到低填充,确保在有限预算内选择最有价值的信息
  • 过滤机制:通过 min_relevance 参数过滤低质量信息
(3)Structure:结构化输出

第三阶段是将选中的信息组织成结构化的上下文模板。

1)语义分层

类型 含义 作用
system_instruction 系统规则 控制模型行为
evidence RAG/知识 提供事实依据
context 其他信息 补充背景

2)构建prompt模板

[Role & Policies]
系统指令

[Task]
用户问题

[Evidence]
检索到的知识

[Context]
补充上下文

[Output]
输出要求

  • 可读性:清晰的分区让人类和模型都更容易理解上下文结构
  • 可调试性:问题定位更容易,可以快速识别哪个区域的信息有问题
  • 可扩展性:添加新的信息源只需要创建新的分区
(4)Compress:兜底压缩

第四阶段是对超限上下文进行压缩处理。

3.NoteTool 结构化笔记

然而,MemoryTool 主要关注对话式记忆——短期工作记忆、情景记忆和语义记忆。对于需要长期追踪、结构化管理的项目式任务,我们需要一种更轻量、更人类友好的记录方式。

NoteTool 填补了这个gap,它提供了:

  • 结构化记录:使用 Markdown + YAML 格式,既适合机器解析,也方便人类阅读和编辑
  • 版本友好:纯文本格式,天然支持 Git 等版本控制系统
  • 低开销:无需复杂的数据库操作,适合轻量级的状态追踪
  • 灵活分类:通过 type 和 tags 灵活组织笔记,支持多维度检索

4.TerminalTool 即时文件管理系统

TerminalTool 为智能体提供了安全的命令行执行能力,支持常用的文件系统和文本处理命令,同时通过多层安全机制确保系统安全。

TerminalTool 通过多层安全机制确保系统安全:

第一层:命令白名单

只允许安全的只读命令,完全禁止任何可能修改系统的操作

第二层:工作目录限制(沙箱)

TerminalTool 只能访问指定的工作目录及其子目录,无法访问系统其他部分

第三层:超时控制

每个命令都有执行时间限制,防止无限循环或资源耗尽

第四层:输出大小限制

限制命令输出的大小,防止内存溢出

TerminalTool 的实现聚焦于两个核心功能:命令执行和目录导航。

(1)命令执行

核心的 _execute_command 方法负责实际执行命令

这个实现的关键点:

  • 当前目录感知:使用 cwd 参数在正确的目录下执行命令
  • 错误处理:捕获并合并标准错误,提供完整的诊断信息
  • 返回码检查:非零返回码会被标记为警告
  • 容错设计:超时和异常都会被妥善处理,不会导致智能体崩溃

(2)目录导航

cd 命令的特殊处理支持智能体在文件系统中导航

1)探索式导航

2)数据文件分析

快速了解数据文件的结构和内容

3)日志文件分析

实时分析应用日志,快速定位问题

4)代码库分析

辅助代码审查和理解

与其他工具协同

与 MemoryTool 协同:TerminalTool 发现的信息可以存储到记忆系统中

与 NoteTool 协同:重要的发现可以记录为结构化笔记

与 ContextBuilder 协同:TerminalTool 的输出可以作为上下文的一部分

八、智能体通信协议

通信协议架构层

(1)协议实现层:这一层包含了三种协议的具体实现。MCP 基于 FastMCP 库实现,提供客户端和服务器功能;A2A 基于 Google 官方的 a2a-sdk 实现;ANP 是我们自研的轻量级实现,提供服务发现和网络管理功能,当然目前也有官方的实现,考虑到后期的迭代,因此这里只做概念的模拟。

(2)工具封装层:这一层将协议实现封装成统一的 Tool 接口。MCPTool、A2ATool 和 ANPTool 都继承自 BaseTool,提供一致的run()方法。这种设计让智能体能够以相同的方式使用不同的协议。

(3)智能体集成层:这一层是智能体与协议的集成点。所有的智能体(ReActAgent、SimpleAgent 等)都通过 Tool System 来使用协议工具,无需关心底层的协议细节。

hello_agents/
├── protocols/                          # 通信协议模块
│   ├── mcp/                            # MCP协议实现(Model Context Protocol)
│   │   ├── client.py                   # MCP客户端(支持5种传输方式)
│   │   ├── server.py                   # MCP服务器(FastMCP封装)
│   │   └── utils.py                    # 工具函数(create_context/parse_context)
│   ├── a2a/                            # A2A协议实现(Agent-to-Agent Protocol)
│   │   └── implementation.py           # A2A服务器/客户端(基于a2a-sdk,可选依赖)
│   └── anp/                            # ANP协议实现(Agent Network Protocol)
│       └── implementation.py           # ANP服务发现/注册(概念性实现)
└── tools/builtin/                      # 内置工具模块
    └── protocol_tools.py               # 协议工具包装器(MCPTool/A2ATool/ANPTool)

1.MCP

  1. 工具发现阶段:MCP Client 连接到 Server 后,首先调用list_tools()获取所有可用工具的描述信息(包括工具名称、功能说明、参数定义)

  2. 上下文构建:Client 将工具列表转换为 LLM 能理解的格式,添加到系统提示词中。

  3. 模型推理:LLM 分析用户问题和可用工具,决定是否需要调用工具以及调用哪个工具。这个决策基于工具的描述和当前对话上下文

  4. 工具执行:如果 LLM 决定使用工具,Client 通过 MCP Server 执行所选工具,获取结果

  5. 结果整合:工具执行结果被送回给 LLM,LLM 结合结果生成最终回答

MCP 与 Function Calling 的差异

MCP = 工具接入标准(生态层)
Function Calling = 模型调用工具的能力(执行层)

传输方式

2.A2A

3.ANP

九、Agentic RL 

Agentic RL 的核心思想:将 LLM 作为可学习策略,嵌入智能体的感知-决策-执行循环,通过强化学习优化多步任务表现。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐