图解 | 大模型智能体LLM Agents
文章目录
- 正文
- 1. 存储 Memory
- 1.1 短期记忆 Short-Term Memory
- 1.1.1 模型的上下文窗口
- 1.1.2 对话历史
- 1.1.3 总结对话历史
- 1.2 长期记忆Long-term Memory
- 2. 工具Tools
- 2.1 工具的类型
- 2.2 function calling
- 2.3 Toolformer
- 2.3.1 大模型调研工具的过程
- 2.3.2 生成工具调用数据集
- 2.4 模型上下文协议 Model Context Protocol (MCP)
- 2.4.1 为什么需要 MCP?
- 2.4.2 MCP 组成
- 2.4.3 MCP 工作流程
资料来源文档:https://newsletter.maartengrootendorst.com/p/a-visual-guide-to-llm-agents
中文翻译:https://mp.weixin.qq.com/s/QFJyS0TUCv-TT39isRLu3w
正文
1. 存储 Memory
LLM 是健忘的系统,或者更准确地说,在与它们交互时根本不执行任何记忆。例如,当你问一个 LLM 问题,然后接着问另一个问题时,它不会记住前者。
以下是一个没有对话依赖的例子:
我们通常将其称为**短期记忆(Short-Term Memory),也称为工作记忆,它的功能是(近乎)即时环境的缓冲。这包括LLM代理最近采取的行动 Atcion。**
但是,LLM代理还需要跟踪可能有几十个步骤,而不仅仅是最近的操作。
让我们探索为这些模型提供内存的几个技巧。
1.1 短期记忆 Short-Term Memory
1.1.1 模型的上下文窗口
启用短期记忆的最直接方法是使用**模型的上下文窗口**,这实际上是LLM可以处理的令牌数量。
上下文窗口往往至少有8192(8k)个令牌,有时可以扩展到数十万个令牌!
1.1.2 对话历史
作为输入提示符的一部分,可以使用一个大的上下文窗口来跟踪完整的对话历史。
只要会话历史符合LLM的上下文窗口,这就可以工作,并且是模仿记忆的好方法。然而,我们实际上并没有记住一段对话,而是“告诉”LLM 这段对话是什么。
1.1.3 总结对话历史
对于具有较小上下文窗口的模型,或者当会话历史记录很大时,我们可以使用另一个LLM来总结到目前为止发生的会话。
通过不断总结对话,我们可以保持对话的规模较小。它将减少令牌的数量,同时只跟踪最重要的信息。
1.2 长期记忆Long-term Memory
LLM代理中的长期记忆包括代理过去的操作空间,需要在一段较长的时间内保留。
实现长期记忆的一种常用技术是将所有以前的**交互、操作和对话存储在外部向量数据库中。
为了建立这样一个数据库,首先将对话嵌入**到捕捉其含义的数字表示中。
在建立数据库后,我们可以嵌入任何给定的提示符,并通过将提示符嵌入与数据库嵌入进行比较,在矢量数据库中找到最相关的信息。
这种方法通常被称为检索增强生成(RAG)。
长期记忆还包括保留不同时段的信息。
例如,您可能希望LLM代理记住它在以前的会话中所做的任何研究。
不同类型的信息也可以与不同类型的记忆相关联。在心理学中,有许多类型的记忆需要区分,但是《Cognitive Architectures for Language Agents》语言代理的认知架构论文将其中的四种结合到LLM代理中。
这种区分有助于构建代理框架。语义记忆(关于世界的事实)可能存储在与工作记忆(当前和最近的情况)不同的数据库中。
2. 工具Tools
2.1 工具的类型
工具允许给定的LLM与外部环境(如数据库)交互或使用外部应用程序(如运行自定义代码)。
工具通常有两种用例:
- fetching data: 实时获取数据;
- taking action:执行命令,例如:执行代码、执行命令、setting a meeting。
2.2 function calling
要实际使用工具,LLM必须生成与给定工具的API 输入相匹配的文本。我们倾向于期望字符串可以格式化为JSON,以便它可以很容易地提供给代码解释器。
您还可以生成LLM可以使用的自定义函数,例如:基本的乘法函数。
这通常被称为函数调用function calling。
如果得到正确和广泛的提示,一些 LLM 可以使用任何工具。
工具的使用是目前大多数 LLM 都能做到的。
访问工具的一种更稳定的方法是对LLM进行微调(稍后会详细介绍!)
如果代理框架是固定的,工具可以按照给定的顺序使用……
或者LLM可以自主选择使用哪种工具以及何时使用。
与上图一样,LLM代理本质上是LLM调用的序列(但具有自主选择动作/工具等)。
2.3 Toolformer
工具的使用是增强 LLM 能力和弥补其缺点的有力技术。
因此,在过去几年中,对工具使用和学习的研究工作出现了快速增长。
这项研究的大部分内容不仅涉及鼓励 LLM 使用工具,还涉及专门训练他们如何使用工具。
2.3.1 大模型调研工具的过程
最早做到这一点的技术之一是Toolformer,这是一种经过训练的模型,可以决定调用哪些api以及如何调用。
它通过使用 [ 和 ] 标记来指示调用工具的开始和结束来实现这一点。
当给出提示时,例如“5乘以3等于多少?”,它开始生成令牌,直到输出 [ 令牌。
之后,它生成令牌,直到到达“→”token,这表明LLM停止生成令牌。
然后,将调用该工具,并将输出添加到目前生成的令牌中。
输出 ] 符号表示LLM现在可以在必要时继续生成。
2.3.2 生成工具调用数据集
Toolformer通过仔细生成一个数据集来创建这种行为,该数据集包含许多模型可以训练的工具。对于每个工具,将手动创建几个提示符,并用于对使用这些工具的输出进行采样。
根据工具使用的正确性、输出和减少损耗对输出进行过滤。
生成的数据集用于训练LLM遵守这种工具使用格式。
自Toolformer发布以来,出现了许多令人兴奋的技术,例如可以使用数千种工具的llm (ToolLLM4)或可以轻松检索最相关工具的llm (Gorilla5)。
无论哪种方式,大多数当前的 LLM(2025年开始)已经被训练成通过JSON生成轻松调用工具(正如我们之前看到的)。
2.4 模型上下文协议 Model Context Protocol (MCP)
2.4.1 为什么需要 MCP?
工具是代理框架的重要组成部分,允许 LLM 与世界互动并扩展其功能。但是,当您有许多不同的API时启用工具使用会变得麻烦,因为任何工具都需要:
- 手动跟踪并反馈给LLM;
- 手动描述(包括预期的JSON模式);
- 每当其API 变化时手动更新;
为了使工具更容易实现任何给定的代理框架,Anthropic开发了模型上下文协议(MCP);
2.4.2 MCP 组成
MCP标准化了天气应用和GitHub等服务的API访问。
它由三个部分组成:
- MCP Host — 管理连接的LLM应用程序(如Cursor)
- MCP Client — 与MCP服务器保持1:1的连接
- MCP Server — 为llm提供上下文、工具等功能;
2.4.3 MCP 工作流程
例如,假设您希望LLM应用程序总结你的 github 仓库中的5个最新提交 commit。
MCP主机(连同客户端)将首先调用MCP服务器询问哪些工具可用。
LLM接收信息,并可以选择使用工具。它通过主机向MCP服务器发送请求,然后接收结果,包括使用的工具。
最后,LLM接收结果并解析答案给用户。
该框架通过连接到任何LLM应用程序都可以使用的MCP服务器,使创建工具变得更加容易。
因此,当您创建MCP服务器与Github交互时,任何支持MCP的LLM应用程序都可以使用它。
如果有用,请点个三连呗 点赞、关注、收藏
。
你的鼓励是我创作最大的动力
相关文章:

图解 | 大模型智能体LLM Agents
文章目录 正文1. 存储 Memory1.1 短期记忆 Short-Term Memory1.1.1 模型的上下文窗口1.1.2 对话历史1.1.3 总结对话历史 1.2 长期记忆Long-term Memory 2. 工具Tools2.1 工具的类型2.2 function calling2.3 Toolformer2.3.1 大模型调研工具的过程2.3.2 生成工具调用数据集 2.4 …...
Lambda表达式的方法引用详解
Lambda表达式的方法引用详解 1. 方法引用的概念与作用 定义:方法引用(Method Reference)是Lambda表达式的一种简化写法,允许直接通过方法名引用已有的方法。核心目的:减少冗余代码,提升可读性,尤其在Lambda仅调用一个现有方法时。语法符号:双冒号 ::。2. 方法引用的四种…...

echarts设置标线和最大值最小值
echarts设置标线和最大值最小值 基本ECharts图表初始化配置 设置动态的y轴范围(min/max值) 通过markPoint标记最大值和最小值点 使用markLine添加水平参考线 配置双y轴图表 自定义标记点和线的样式(颜色、符号等) 响应式调整图表大…...
gcc编译构建流程
0. 项目结构 /home/pi/test/ ├── src/ │ ├── add/ │ │ ├── add.cpp │ │ ├── add.h │ └── log/ │ ├── log.cpp │ ├── log.h │ ├── data.h ├── main.cppmain.cpp代码 // main.cpp #include "log.h&quo…...

Maven 中央仓库操作指南
Maven 中央仓库操作指南 登录注册 在 Maven Central 登录(注册)账号。 添加命名空间 注册 通过右上角用户菜单跳转到命名空间管理页面: 注册命名空间: 填入你拥有的域名并注册: 刚提交的命名空间状态是Unverified…...

BUUCTF——RCE ME
BUUCTF——RCE ME 进入靶场 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight…...
clickhouse-1-特性及docker化安装
clickhouse-1-特性及docker化安装 1.核心特性1.1.列式存储与高效压缩1.2.向量化执行引擎1.3.分布式架构与高可用性1.4.多样化的表引擎1.5.实时处理能力2.安装2.1 拉取镜像2.2 创建容器3.连接4.使用4.1.创建数据库5.其他5.1 primary key5.2 ENG…...
Docker核心笔记
一、概述 1、架构 Docker容器基于镜像运行,容器共享宿主机的内核,不会加载额外内核,通过Namespaces(环境隔离)和Cgroups(资源控制)实现隔离,Cgroups会限容器使用资源并控制优先级和统计数据。隔离后的容器仅包含应用所需的用户态依赖 2、安装 安装先卸载再安装,使用的yum…...
log日志最佳实践
log日志最佳实践 1、占位符的使用2、延迟计算 1、占位符的使用 在进行日志打印的时候,推荐使用占位符进行字符串打印,而不是直接使用字符串拼接。原因: 这样可以避免不必要的字符串拼接。使用占位符时,实际字符串拼接由日志框架…...

FreeRTOS--消息队列
一、简介 消息队列是FreeRTOS中用于任务与任务或任务与中断之间数据交换的一种机制,采用FIFO(先进先出)方式管理数据,也可以采用LIFO(后进先出)方式。有点类似全局变量。 1.1 那为什么不直接使用全局变量&a…...

三步快速部署一个本地Windows/Linux大语言模型ChatGLM(环境配置+权重下载+运行)
前言: 最近刚拿到实验室一个装了3张3090显卡的服务器账号,感觉不用来霍霍有点浪费,于是有了部署一个大语言模型的想法,除去下载权重和传文件到服务器上可能也就用了十分钟不到(这下看懂为啥python受众现在这么广了&…...
深入解析Spring Boot与Redis的缓存集成实践
深入解析Spring Boot与Redis的缓存集成实践 引言 在现代Web应用开发中,缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的内存数据库,广泛应用于缓存场景。本文将详细介绍如何在Spring Boot项目中集成Redis,并探讨其在实际开发…...
leetcode105.从中序与前序遍历序列构造二叉树:前序定根与中序分治的递归重建术
一、题目深度解析与核心挑战 在二叉树的重建问题中,"从中序与前序遍历序列构造二叉树"是一道考察递归分治思想的经典题目。题目要求我们根据一棵二叉树的前序遍历序列和中序遍历序列,重建出该二叉树的原始结构。这道题的核心难点在于如何利用…...
Python二级考试
目录 一、核心知识模块 1. 程序结构 2. 循环结构 3. 组合数据类型 4. 函数与模块 二、重点算法 1. 排序算法 2. 查找算法 三、文件操作 1. 基础文件处理 四、备考建议 五、典型易错点 以下是Python二级考试的复习要点整理,分为知识模块和备考建议&#…...

DeepSeek联网Google搜索引擎
目录: 1、使用背景2、实现代码3、Gradio 的 yield 机制 1、使用背景 比如所有易建联是什么时候退役的?使用大模型对这种实事回答不准确,需要通过联网搜索处理。 正确答案应该是2023年8月29日退役。 2、实现代码 # import gradio as gr# d…...
理论物理:为什么在极低温(接近绝对零度)时,经典理论失效?
经典理论应该是指经典力学和经典统计物理吧,比如牛顿力学、麦克斯韦-玻尔兹曼分布这些。而到了接近绝对零度的时候,物质的状态会发生什么变化呢?比如说超流性、超导性,或者玻色-爱因斯坦凝聚这些现象,这些在经典理论里好像没法解释。 因为在极低温下,粒子的热运动减弱,…...

奈雪小程序任务脚本
功能概述 该脚本用于自动完成奈雪点单小程序的每日任务,包括: 自动检测 Token 有效性自动签到(如果未签到)获取用户基础信息(昵称、手机号)查询当前奈雪币余额记录连续签到天数支持多账号执行,…...

上海医日健集团物联网专利技术领跑智慧药房赛道
在智慧医疗蓬勃发展的浪潮中,上海医日健集团凭借其卓越的创新能力与强大的技术实力,在智慧药房领域崭露头角。集团自主研发的物联网专利技术,正以前所未有的优势,重塑智慧药房运营模式,引领行业迈向新的发展高度。 上…...

基于Java+MySQL实现(Web)图书借阅管理系统
图书借阅管理系统(前后台) 1 需求分析 图书借阅管理系统是模拟学校图书馆实现的一个具有前后台的 Web 系统.对于读者,能够提供全文检索,个性化推荐,借阅等功能.对于管理员,能够提供可视化数据分析,信息管理等功能. 2 技术栈 前端: Layui,jQuery,echarts 后端:Spring Boot,…...

SAR ADC的功耗设计
SAR ADC 由比较器、逻辑和DAC组成,功耗比可能是3:6:1,对于低功耗设计来说,我们需要尽量让DAC的功耗最小,这里来探讨一下CDAC的功耗计算方法。 CDAC从状态1切换到状态2时,需要从Vref buffer上抽拉电荷。C是状态2时连接Vref的总电容,V2就是状态2时接Vref的电容上的电压…...

PP-OCRv5
目录 PP-OCRv5官方效果如下 C封装、C#调用效果 项目 代码 下载 PP-OCRv5官方效果如下 C封装、C#调用效果 项目 代码 using Newtonsoft.Json; using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; usi…...

nginx的一些配置的意思
1.用这个端口可以访问到nginx 2.工作进程,设置成和cpu核心数一样即可 3.每个工作进程的最大网络连接数。 4.主机名称 设置反向代理时,把server_name设置成ip。 5.反向代理进行转发,localhost指的是nginx所在的机器。 关键字proxy_pass。 …...

Agent模型微调
这篇文章讲解: 把 Agent 和 Fine-Tuning 的知识串起来,在更高的技术视角看大模型应用;加深对 Agent 工作原理的理解;加深对 Fine-Tuning 训练数据处理的理解。 1. 认识大模型 Agent 1.1 大模型 Agent 的应用场景 揭秘Agent核心…...
Android-OkHttp与Retrofit学习总结
OkHttp核心机制与工作流程 面试官:能简单介绍一下OkHttp的工作流程吗? 候选人: 好的,OkHttp的工作流程大致可以分为几个步骤。首先,我们需要创建一个OkHttpClient实例,通常会用建造者模式来配置…...
移远三款主流5G模块RM500U,RM520N,RG200U比较
文章目录 概要一、技术架构差异1. 3GPP协议版本2. 芯片平台与性能3. 频段覆盖与区域适配4. 协议增强与特殊功能 二、功能与应用定位1. 网络兼容性2. 封装与接口扩展 三、典型应用场景总结 概要 本文介绍下移远两款主流5G模块RM500U RM520N RG200U。 一…...
C++引用以及和指针的区别
C++ 引用 引用(reference)是 C++ 中的一种变量类型,是另一个变量的别名。一旦引用被初始化,就不能再改变它所指向的对象。 引用的特点 必须初始化:声明引用时必须立即对其进行初始化。不可更改绑定:一旦引用绑定到某个变量,就不能再指向其他变量。语法简洁:使用引用不…...
firfox 国外版和国内版本账号不互通问题处理
https://blog.csdn.net/sinat_37891718/article/details/147445621 现在国际服的火狐浏览器修改使用国内的账号服务器,需要先在搜索框输入about:config 中改变三项配置,然后重启浏览器,才能正常使用国内的火狐账号服务器 identity.fxaccount…...

Linux基本指令篇 —— whoami指令
whoami 是 Linux 和 Unix 系统中一个简单但实用的命令,全称 Who Am I(我是谁)。它的功能是显示当前登录用户的用户名。以下是关于 whoami 的详细解析: 目录 1. 基本用法 2. 命令特点 3. 实际应用场景 场景 1:脚本中…...
用go从零构建写一个RPC(3)--异步调用+多路复用实现
在前两个版本中,我们实现了基础的客户端-服务端通信、连接池、序列化等关键模块。为了进一步提升吞吐量和并发性能,本版本新增了 异步发送机制 和 多路复用支持,旨在减少资源消耗、提升连接利用率。 代码地址:https://github.com/…...

力扣395做题笔记
题目链接 力扣395 第一次尝试 class Solution {public int longestSubstring(String str, int k) {char[] s str.toCharArray();int n s.length;int[] cnts new int[256];int ans 0;for (int r 0, l 0; r < n; r ) { cnts[s[r]];if (cnts[s[r]] > k) { ans Mat…...