Agent如何帮助大模型“增强记忆”?

图片

记忆+反馈 >规划?

©作者|格林

来源|神州问学

引言

去年6月份,Lilian发布了关于LLM驱动的Agent的结构和组件,其中包括规划、行动、工具还有记忆,这四个模块。这几个模块其实也很好地概括了ReAct式Agent的工作流程:Question – Thought_1 – Action – Action_Input – Observation – Thought_2 - …… - Thought_X – Final_Answer;

图片

{ReAct式的Agent任务解决流程}

在其中,记忆也是Agent的组件之一,在Agent类应用中,记忆可以记住事实和偏好,例如:问题答案、工具调用结果、格式偏好、语言偏好、表达偏好、图表绘制偏好、任务下工具选择偏好;对于事实和偏好的记忆能够让Agent应用提升回答准确率、稳定性以及速度,那么,记忆有哪些种类的分类,Agent的记忆是呼和实现的,记忆又有什么用途,接下来让我们来研究一下:

1.  Agent什么东西可以存入记忆中?

Agent不同于Chat类或者RAG类的单纯知识型应用,其中还涉及到规划与决策、工具调用等内容,因此对于能够把什么东西存入记忆中则是我们需要思考的

1.1.  对话交互历史

对话交互历史是记忆的一部分,也是Agent多轮对话的基础。用户所输入的Query和模型最终返回的自然语言输出形成了对话的交互历史。

1.2.  工作流(规划)与工具调用结果

自然语言规划和工具调用在工作流上的区别,也会让其在工作流记忆的储存上有所区别

在ReAct为基础架构的Agent结构中,规划或Thought是以自然语言的形式呈现的,有长期规划的Agent会在行动开始之前将任务拆解成一系列的子任务,这一系列的子任务就可以作为本次任务生成的工作流储存至记忆中。

以Function Calling(FC)模型为核心驱动的Agent结构中,模型会接收用户Query以及结构化的Function List,输出的是Function调用的JSON文件,接着在外部执行这个函数并返回函数执行结果。函数调用的JSON文件以及执行结果都是可以被记忆所存储的内容,在未来遇到相似条件的时候可以直接召回相关的执行结果,节省函数执行所消耗的资源与时间。

1.3.  Reflection的反馈

Reflection是对Agent每步子任务的反馈,把反馈放入记忆中,就像Agent的错题集一样,能够在未来遇到类似的任务时,能够提供的对应的Reflection改进建议,从而提高准确率。将Reflection的结果加入到记忆中从长远来看,能够对Agent的思维能力有极大的提升,在专业场景下相比纯粹去提升模型原生的推理性能要更加高效。但目前主要受限于自动化的Reflection流程还难以提供给模型高质量的改进建议,通常会导致模型“钻牛角尖”,陷入到错误步骤的循环中。因此短期内可能Reflection步骤仍然需要人工的介入,以类似强化学习的方法提升agent在专业场景的表现性能

2.  记忆的提炼方式

### 大模型 Agent 的定义与实现 大模型 Agent 是一种基于大型预训练语言模型的技术框架,其设计目标在于增强传统人工智能系统的能力,使其能够更好地应对复杂任务和动态环境的需求[^2]。具体来说,这种类型的 Agent 不仅可以完成单一的任务,还具备跨领域知识融合、持续学习以及长期记忆等功能。 #### 核心概念 大模型 Agent 可以被视作一个智能化的服务实体,它通过集成外部数据源(如私有知识库)扩展自身的知识边界,从而克服通用大模型可能存在的局限性——例如缺乏特定领域的专业知识或者容易产生错误推断的现象(即所谓的“幻觉问题”)。这一机制允许企业在不牺牲安全性的前提下充分利用先进的人工智能技术来提升业务效率和服务质量[^3]。 #### 技术架构概述 构建这样一个高效的 Agent 需要综合运用多种现代信息技术手段: 1. **向量化存储**:采用专门设计用于高效检索相似文档片段的向量数据库作为底层支持结构; 2. **RAG (Retrieval-Augmented Generation)** 方法论指导下的信息获取流程优化方案; 3. **针对特定需求场景定制化的参数调整策略** —— 即所谓微调过程; 以上各组成部分共同协作构成了完整的解决方案链条,在此之上开发者可以根据实际项目情况灵活组合各项功能模块达成预期效果[^4]。 下面给出一段简单的 Python 示例代码展示如何借助 LangChain 库快速搭建起基础版本的大规模预训练语言模型驱动型智能助理原型: ```python from langchain import OpenAI, VectorDBQA from langchain.document_loaders import DirectoryLoader from langchain.text_splitter import CharacterTextSplitter from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores.faiss import FAISS def create_agent(): loader = DirectoryLoader('./data', glob="*.txt") documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() db = FAISS.from_texts([t.page_content for t in texts], embeddings) llm = OpenAI(temperature=0) qa = VectorDBQA(llm=llm, vectorstore=db) return qa if __name__ == "__main__": agent = create_agent() query = input("Ask me anything about the data:") result = agent.run(query) print(result) ``` 上述脚本展示了从加载本地文件夹内的文本资源开始直到最终形成问答交互界面为止整个工作流的主要环节操作步骤说明如下: - 使用 `DirectoryLoader` 将指定目录里的所有 .txt 文件读取进来并转换成适合后续处理的形式; - 利用 `CharacterTextSplitter` 对原始内容按照固定长度切分成若干个小段落以便单独索引管理; - 借助 OpenAI 提供的 embedding 接口计算每条记录对应的数值表示形式存入 Faiss 向量空间当中建立关联关系网络; - 最终实例化 LLM 并配置好查询接口等待接收用户的提问请求. ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值