
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读PaddleNLP本仓库中位于 slm/pipelines 目录为 LLM Agent 提供了一个轻量级的记忆Memory机制用于在多轮推理与工具调用之间保存和回放对话上下文。本文围绕该模块的 API 文档主题深入剖析抽象基类Memory、对话记忆实现ConversationMemory与空实现NoMemory的源码结构、行为细节以及它们如何被Agent主循环调用帮助读者掌握在 Agent 应用中接入、配置乃至自定义记忆组件的完整方法。一、模块定位Agent 记忆抽象接口记忆模块位于仓库的 slm/pipelines/pipelines/agents/memory 目录下由四个文件构成base.py定义抽象基类Memoryconversation_memory.py定义ConversationMemory负责存储对话历史no_memory.py定义NoMemory一个不保存任何数据的空实现__init__.py统一导出上述类供外部以from pipelines.agents.memory import Memory, ConversationMemory, NoMemory方式导入。在 Agent 中记忆的核心作用是跨推理步骤保存输入—输出—观察observation的上下文使得多跳Multi-hop问答等需要分步推理的场景能够持续引用此前各轮的中间结果。这一点在 Agent 基类的类注释 中有明确体现Agent 会迭代地生成思考 → 选择工具 → 生成输入 → 观察工具输出而记忆正是连接这些迭代的信息载体。抽象基类 Memory 的三个契约方法从 base.py 源码可以看到Memory是一个继承abc.ABC的抽象类定义了三个必须由子类实现的抽象方法方法签名职责loadload(keys: Optional[List[str]] None, **kwargs) - Any从记忆中加载本次模型运行所需的上下文savesave(data: Dict[str, Any]) - None将本次模型运行的上下文写入记忆clearclear() - None清空记忆内容load的可选参数keys用于指定需要加载的数据项save接收一个字典。任何自定义记忆类只需实现这三个方法即可被 Agent 无缝使用——这正是该模块的扩展点所在。二、ConversationMemory基于 OrderedDict 的对话历史存储ConversationMemory 是默认的对话记忆实现其核心数据结构是一个 Python 列表每个元素为一个保留插入顺序的collections.OrderedDict形如{Human: ..., AI: ...}。构造参数input_key 与 output_keydef __init__(self, input_key: str input, output_key: str output):构造时接收两个字符串参数input_key用于从save(data)传入的字典中取出用户输入的键默认值为inputoutput_key用于取出模型输出的键默认值为output。这两个键名需要与 Agent 调用save时传入的数据结构保持一致详见下文 Agent 集成部分。save把一次对话快照写入列表def save(self, data: Dict[str, Any]) - None: chat_snippet collections.OrderedDict() chat_snippet[Human] data[self.input_key] chat_snippet[AI] data[self.output_key] self.list.append(chat_snippet)save从data字典中按下述方式提取内容data[self.input_key]作为Human用户消息data[self.output_key]作为AI模型回复组装成一个OrderedDict追加到self.list尾部。因此记忆按时间顺序累积每次调用save就新增一轮对话。load格式化为 Human/AI 转写文本def load(self, keys: Optional[List[str]] None, **kwargs) - str: chat_transcript window_size kwargs.get(window_size, None) if window_size is not None: chat_list self.list[-window_size:] else: chat_list self.list for chat_snippet in chat_list: chat_transcript fHuman: {chat_snippet[Human]}\n chat_transcript fAI: {chat_snippet[AI]}\n return chat_transcriptload将存储的对话历史渲染为一段可直接拼入 Prompt 的文本其关键特性如下输出格式每轮对话按Human: ...与AI: ...两行输出并以换行符分隔window_size 窗口控制通过kwargs传入可选参数window_size整数指定只加载最近 N 轮对话。实现使用self.list[-window_size:]截取列表尾部从而实现滑动窗口效果有效控制送入 LLM 的上下文长度返回空串语义记忆为空时返回与NoMemory.load()的返回值一致方便上层统一处理。clear清空全部历史def clear(self) - None: self.list []直接重置内部列表达到清空记忆的目的。三、NoMemory无记忆模式的空实现NoMemory 是Memory的一个空操作实现用于关闭记忆功能避免每次迭代都产生额外状态load()直接返回空字符串save(data)为空操作pass不存储任何数据clear()为空操作。从源码注释看其设计意图非常明确——不存储任何数据的记忆类。值得注意的是Agent 的构造函数中self.memory memory or NoMemory()表明当用户未显式传入记忆实例时Agent 默认启用 NoMemory即默认行为是不保留上下文。四、与 Agent 主循环的集成方式记忆并非孤立组件其实际消费方是 slm/pipelines/pipelines/agents/base.py 中的Agent类。理解集成点有助于读者掌握何时写入、写入什么。构造注入与默认值在Agent.__init__中约第 243272 行memory是一个可选参数类型标注为Optional[Memory]memory: Optional[Memory] None, ... self.memory memory or NoMemory()即传入ConversationMemory()实例即可开启记忆不传则自动退化为NoMemory。迭代中的自动保存在Agent._step方法中约第 401415 行每次完成一轮规划 工具调用后都会触发记忆写入observation self.tm.run_tool(next_step.prompt_node_response, params) if not next_step.is_last() else None memory_data self.prepare_data_for_memory(inputquery, outputprompt_node_response, observationobservation) self.memory.save(datamemory_data)这里保存的数据包含三个字段input当前查询、outputLLM 的规划回复与observation工具观察结果与ConversationMemory默认的input_key/output_key一一对应。prepare_data_for_memory 的归一化逻辑Agent.prepare_data_for_memory约第 440446 行负责把原始参数转换为可存入记忆的字典其实现值得注意return { k: v if isinstance(v, str) else next(iter(v)) for k, v in kwargs.items() if isinstance(v, (str, Iterable)) }它会过滤掉既非字符串也非可迭代对象的字段对可迭代但非字符串的值取第一个元素next(iter(v))。同时该方法是可覆写的扩展点——文档注释明确指出可重写它来定制保存到记忆的数据格式例如追加额外的元信息或调整字段命名。自定义记忆的两种接入方式结合上述源码结构读者可按需选择复用现成实现构造ConversationMemory(input_key..., output_key...)后传入 Agent继承Memory实现load/save/clear三个方法例如将对话写入外部存储、数据库或缓存再注入 Agent如需改变写入内容还可同时覆写prepare_data_for_memory。五、行为验证测试用例逐条对照仓库中 slm/pipelines/tests/agents/test_memory.py 用三个单元测试完整锁定了上述行为可作为理解实现语义的权威参照test_no_memory验证NoMemory().load() 且save/clear可安全调用而不报错test_conversation_memory验证依次save两轮对话{input: Hello, output: Hi there}与{input: How are you?, output: Im doing well, thanks.}后load()输出逐行拼接的Human: .../AI: ...转写load(window_size1)只返回最近一轮clear()后load()重新变为空串test_conversation_memory_window_size单独验证窗口截断逻辑包括清空后再以window_size1加载同样返回空串的边界情况。这些断言与前述源码实现完全吻合读者亦可在本地运行python -m unittest tests/agents/test_memory.py在 slm/pipelines 目录下复现验证。六、小结与扩展指引Memory模块以极简的三方法抽象load/save/clear提供了足够的表达力ConversationMemory内置有序列表存储、Human/AI 格式化输出与window_size窗口控制覆盖了 Agent 多轮对话的基本需求NoMemory则提供了零成本的无状态默认路径。二者在Agent的_step循环中自动联动并通过prepare_data_for_memory保留了数据定制入口。进一步深入可查阅抽象基类定义理解方法契约与可扩展性对话记忆实现窗口控制与格式化细节空记忆实现默认无状态语义Agent 集成源码构造注入与迭代保存调用链单元测试全部行为的可执行验证。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP Pipelines Agent 模块详解Agent、ToolsManager、Tool 与 AgentStep 源码级解析PaddleNLP Pipelines Agent 模块详解Agent、ToolsManager、Tool 与 AgentStep 源码级解析 本文以仓库中人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP Pipelines Retriever 模块全解析Dense、Sparse、多模态与 Web 检索器PaddleNLP Pipelines Retriever 模块全解析Dense、Sparse、多模态与 Web 检索器 本文以 PaddleNLP 仓库中人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP paddlenlp.losses 模块深度解析RDropLoss 与 R-Drop 正则化的实现与应用PaddleNLP paddlenlp.losses 模块深度解析RDropLoss 与 R Drop 正则化的实现与应用 导读 本文聚焦 PaddleNLP人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考