【大模型核心技术】Agent 理论与实战

在这里插入图片描述

一、基本概念

  • LLM 特性:擅长理解和生成文本,但采用 “一次性” 响应模式,本质上是无记忆的生成模型。
  • Agent 本质:包含 LLM 的系统应用,具备自主规划、工具调用和环境反馈能力,是将 LLM 从 “聊天机器人” 升级为能处理复杂任务的 “智能助理”。
  • 常见误解:ChatGPT 等应用本身并非 Agent,其 “记忆” 功能来自外部记忆模块而非 LLM 本身。
  • 基本特点:具有自主性(根据预设目标自主决策执行)、感知能力(多渠道获取环境状态)、行动系统(执行具体操作)、目标导向(行为围绕预设目标展开),且感知数据来自前序行动反馈,形成 “感知 - 决策 - 行动” 闭环。

二、大模型与 Agent 的关系及理论

  • LLM 核心:如同 “缸中大脑”,具备理解输入、思考生成结果的能力。
  • Agent 构成:是 LLM + 记忆模块 + 工具使用 + 长任务规划的系统组合。
  • 螺旋共生:Agent 使用产生数据反哺 LLM 训练,LLM 升级使 Agent 更智能,形成数据飞轮与性能迭代的良性循环。
  • 具身智能:如宇树科技机器人、波士顿动力等,展示 LLM 与物理世界的结合可能。
  • 理论模型
    • BDI 模型:即信念(对环境的认知)、愿望(想要达成的状态)、意图(为实现愿望制定的计划和承诺)模型。
    • 理性 Agent 模型:在给定的感知序列下,能做出使性能度量最大化的行动,具有自主性、适应性和协作性。
  • Agent 分类
    • 简单反射 Agent(仅依当前感知反应,无记忆和规划)
    • 基于模型的反射 Agent(通过内部模型追踪世界状态)
    • 基于目标的 Agent(依状态和目标决策,有一定规划)
    • 基于效用的 Agent(考虑行动效用,权衡多目标)
    • 学习 Agent(通过学习改进性能)

三、Agent 的组件、能力与技术栈

  • 核心组件
    • 传感器系统(收集环境数据)
    • 推理引擎(LLM + 提示词构成决策核心)
    • 执行机构(将决策转化为具体行动)
    • 交互闭环(行动结果反馈形成持续循环)
  • 核心能力与优势
    • 任务分解:拆解复杂目标为可执行步骤,动态调整计划。
    • 工具调用:集成多样化工具,由 LLM 决策使用时机和方式。
    • 长期记忆:通过向量数据库存储历史信息,实现连贯交互和持续学习。
    • 环境交互:突破文本生成局限,实际影响外部系统。
  • 核心技术栈
    • 模型服务层:底层基础设施,主流服务包括 Hugging Face、GPT-4、Meta(闭源)及 Llama 3 等开源模型。
    • 开发框架层:LangChain 生态最健全,支持多智能体开发;LlamaIndex 专注 RAG 数据处理;Semantic Kernel 为微软开源基础工具,LangChain 因功能全面为首选。
    • 核心能力层:规划(依赖 LLM 能力)、记忆(含 RAG 设计和向量数据库应用)、工具(涉及接口设计)、执行(实现决策到操作闭环)。
    • 类型与智能化程度:场景维度从操作型到模拟型再到自主型(智能递增);技术维度包括聊天机器人、多智能体等;智能维度从简单反射型到自主学习型(实现难度递增)。

四、Agent 开发模块、流程与迭代

  • 关键模块特性:支持 60 + 大模型接入,提供 60 + 工具和工具包,记忆系统分短期(GPU 显存)和长期(40 + 向量数据库支持);通过预定义 15 种 Agent 类型和提示词模板降低开发门槛。
  • 开发流程
    1. 定义目标与范围:明确具体任务和边界约束,80% 时间用于思考问题定义。
    2. 选择核心 LLM:需具备指令遵循、推理和工具使用能力,直接影响 Agent 表现上限。
    3. 设计智能体架构:核心逻辑或控制器负责流程控制与决策;规划模块由 LLM 实现任务分解;工具集定义可调用工具及接口;记忆模块分短期和长期,行动执行器负责实际调用功能。
    4. 工具开发与集成:约 50% 工具可能需自主开发,确保 LLM 理解工具信息,封装成标准化模块。
    5. 提示工程:占 Agent 性能差异的 50%,需包含角色定位、任务目标等要素,放大 LLM 能力。
    6. 记忆机制实现:可采用简单列表或向量数据库,需保存历史对话和执行结果。
    7. 测试评估与迭代:从任务完成率、执行效率、鲁棒性评估,优化 prompt、工具等,形成持续闭环。

五、基于 LangChain 的 Agent 实战

环境准备

安装相关库并配置环境变量:

pip install langchain openai python-dotenv

创建.env文件设置 API 密钥:

OPENAI_API_KEY=<your_api_key>

简单工具调用 Agent

实现一个调用计算器工具的简单 Agent:

from langchain.agents import initialize_agent, Tool, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import BaseTool
from dotenv import load_dotenv
import os
load_dotenv()
class CalculatorTool(BaseTool):name = "Calculator"description = "用于进行数学计算"def _run(self, query: str) -> str:try:result = eval(query)return f"计算结果:{result}"except Exception as e:return f"计算错误:{str(e)}"async def _arun(self, query: str) -> str:return self._run(query)
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
tools = [CalculatorTool()]
agent = initialize_agent(tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
result = agent.run("计算3的平方加上5的立方等于多少?")
print(result)

复杂任务处理 Agent(含记忆)

实现能处理复杂任务且具备记忆功能的 Agent:

from langchain.agents import initialize_agent, Tool, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import BaseTool
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from dotenv import load_dotenv
import os
load_dotenv()
# 时间工具
class TimeTool(BaseTool):name = "Time"description = "用于获取当前时间"def _run(self, query: str) -> str:from datetime import datetimereturn datetime.now().strftime("%Y-%m-%d %H:%M:%S")async def _arun(self, query: str) -> str:return self._run(query)
# 规划工具
planning_prompt = PromptTemplate(input_variables=["task"],template="你需要完成以下任务:{task}。请列出完成该任务需要的步骤。"
)
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
planning_chain = LLMChain(llm=llm, prompt=planning_prompt)
class PlanningTool(BaseTool):name = "Planning"description = "用于对复杂任务进行规划,列出步骤"def _run(self, query: str) -> str:return planning_chain.run(task=query)async def _arun(self, query: str) -> str:return self._run(query)
# 初始化记忆功能
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 初始化Agent
tools = [TimeTool(), PlanningTool()]
agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,memory=memory,verbose=True
)
# 测试复杂任务处理,记忆功能会保存对话历史,支持上下文连贯交互
result = agent.run("我想明天上午10点去图书馆,帮我规划一下从家到图书馆的行程,包括出发时间、交通方式,并告诉我明天的天气情况。")
print(result)
# 后续对话可基于之前的记忆继续交互
result2 = agent.run("帮我把出发时间提前半小时,重新规划一下")
print(result2)

此 Agent 通过ConversationBufferMemory实现记忆功能,能保存对话历史,在处理复杂任务时可基于上下文进行连贯交互,先使用规划工具分解任务,再调用相应工具完成各步骤。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917440.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven - 依赖的生命周期详解

作者&#xff1a;唐叔在学习 专栏&#xff1a;唐叔的Java实践 标签&#xff1a;Maven依赖管理、Java项目构建、依赖传递性、Spring Boot依赖、Maven最佳实践、项目构建工具、依赖冲突解决、POM文件详解 文章目录一、开篇二、Maven依赖生命周期2.1 依赖声明阶段&#xff1a;POM文…

从零打造大语言模型--处理文本数据

从零打造大语言模型 第 1 章&#xff1a;处理文本数据 章节导读 在把文本投喂进 Transformer 之前&#xff0c;需要两步&#xff1a;① 将字符流切分成离散 Token&#xff1b;② 把 Token 映射成连续向量。 1.1 理解词嵌入&#xff08;Word Embedding&#xff09; 嵌入向量 一…

【Spring】Bean的生命周期,部分源码解释

文章目录Bean 的生命周期执行流程代码演示执行结果源码阅读AbstractAutowireCapableBeanFactorydoCreateBeaninitializeBeanBean 的生命周期 生命周期指的是一个对象从诞生到销毁的整个生命过程&#xff0c;我们把这个过程就叫做一个对象的声明周期 Bean 的声明周期分为以下 …

[spring-cloud: 服务发现]-源码解析

DiscoveryClient DiscoveryClient 接口定义了常见的服务发现操作&#xff0c;如获取服务实例、获取所有服务ID、验证客户端可用性等&#xff0c;通常用于 Eureka 或 Consul 等服务发现框架。 public interface DiscoveryClient extends Ordered {/*** Default order of the dis…

QML 基础语法与对象模型

QML (Qt Meta-Object Language) 是一种声明式语言&#xff0c;专为创建流畅的用户界面和应用程序逻辑而设计。作为 Qt 框架的一部分&#xff0c;QML 提供了简洁、直观的语法来描述 UI 组件及其交互方式。本文将深入解析 QML 的基础语法和对象模型。 一、QML 基础语法 1. 基本对…

HTTPS的概念和工作过程

一.HTTPS是什么HTTPS也是一个应用层协议&#xff0c;是在HTTP协议的基础上引入了一个加密层&#xff08;SSL&#xff09;HTTP协议内容都是按照文本的方式明文传输的&#xff0c;这就导致传输过程中可能出现被篡改的情况最著名的就是十多年前网络刚发展的时期&#xff0c;出现“…

Unity —— Android 应用构建与发布​

文章目录1 ​Gradle模板​​&#xff1a;了解Gradle模板的作用及使用方法&#xff0c;以增强对构建流程的控制。​2 ​Gradle模板变量​​&#xff1a;参考文档——自定义Gradle模板文件中可用的变量列表。2.1 修改Unity应用的Gradle工程文件2.1.1 通过Gradle模板文件2.1.2 导出…

【iOS】strong和copy工作流程探寻、OC属性关键字复习

文章目录前言strong和copy的区别为什么要用copy&#xff1f;什么时候用什么修饰&#xff1f;strong&#xff08;ARC自动管理&#xff09;strong修饰变量的底层流程图底层代码核心实现小结copy底层流程图对比与strong的关键不同之处内部调用关系&#xff08;伪代码&#xff09;小…

程序代码篇---多循环串口程序切换

上位机版&#xff08;Python&#xff09;要实现根据串口接收结果高效切换四个 while 循环函数&#xff0c;我们可以采用状态机模式&#xff0c;配合非阻塞串口读取来设计程序结构。这种方式可以实现快速切换&#xff0c;避免不必要的资源消耗。下面是一个高效的实现方案&#x…

rk3568上,实现ota,计算hash,验证签名,判断激活分区,并通过dd命令,写入对应AB分区

通过自定义升级程序&#xff0c;更直观的理解ota升级原理。 一、模拟计算hash&#xff0c;验证签名&#xff0c;判断激活分区&#xff0c;并通过dd命令&#xff0c;写入对应分区 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <u…

数据分析—numpy库

numpy库NumPy 库全面指南NumPy (Numerical Python) 是 Python 科学计算的基础库&#xff0c;提供了高性能的多维数组对象和工具。以下是 NumPy 的核心功能和使用方法。一、安装与基础1. 安装 NumPypip install numpy2. 导入 NumPyimport numpy as np # 标准导入方式二、数组创建…

Vue3 setup、ref和reactive函数

一、setup函数1.理解&#xff1a;Vue3.0中一个新的配置项&#xff0c;值为一个函数。2.setup是所有Composition API(组合API)的“表演舞台”。3.组件中用到的&#xff1a;数据、方法等等&#xff0c;均要配置在setup中。4.setup函数的两种返回值&#xff1a;(1).若返回一个对象…

python中appium 的NoSuchElementException错误 原因以及解决办法

错误收集D:\Program\Util\python.exe "D:/Program/myUtil/PyCharm 2024.3.5/plugins/python-ce/helpers/pycharm/_jb_pytest_runner.py" --target demo.py::TestAppium Testing started at 15:57 ... Launching pytest with arguments demo.py::TestAppium --no-hea…

mybatis-plus从入门到入土(四):持久层接口之BaseMapper和选装件

大家好&#xff0c;今天继续更新MybatisPlus从入门到入土系列&#xff0c;上一次的持久层接口还没讲完&#xff0c;只讲了IService接口&#xff0c;今天我们继续来讲一下。 BaseMapper BaseMapper中的方法也比较简单&#xff0c;都是增删改查的基础API&#xff0c;不知道大家还…

数组和指针的关系

在 C 语言中&#xff0c;​指针和数组有着非常紧密的联系&#xff0c;但它们本质上是 ​不同的概念。理解它们的关系是掌握 C 语言内存操作的关键。下面我会从多个角度帮你梳理 ​指针和数组的直接联系&#xff0c;并解释它们的异同点。1. 数组和指针的本质区别​概念本质存储方…

AI大模型探索之路-实战篇:智能化IT领域搜索引擎之github网站在线搜索

系列篇章💥 No. 文章 1 AI大模型探索之路-实战篇:智能化IT领域搜索引擎的构建与初步实践 2 AI大模型探索之路-实战篇:智能化IT领域搜索引擎之GLM-4大模型技术的实践探索 3 AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践) 4 AI大模型探索之路…

从0到1学PHP(十二):PHP 框架入门与项目实战

目录一、主流 PHP 框架介绍1.1 Laravel1.2 ThinkPHP1.3 Yii1.4 框架的优势二、框架基本使用&#xff08;以 Laravel 为例&#xff09;2.1 框架的安装与配置2.2 路由定义、控制器创建、视图渲染2.3 数据库操作&#xff08;ORM 的使用&#xff09;三、小型项目实战3.1 项目需求分…

MPLS LSP

一、概述上一章我们已经介绍过,LSP是MPLS报文在MPLS网络中转发时经过的路径,可以看作是由报文传输方向节点为对应FEC分配的MPLS入标签组成的,因为每台设备上为每个FEC分配的入标签是唯一 的&#xff0c;并与由下游节点为本地节点上该FEC分配的出标签建立映射关系&#xff0c; 所…

图像、视频、音频多模态大模型中长上下文token压缩方法综述

多模态大模型MLLMs 能够处理高分辨率图像、长视频序列和冗长音频输入等复杂上下文&#xff0c;但自注意力机制的二次复杂度使得大量输入 token 带来了巨大的计算和内存需求。 如下图&#xff0c;上&#xff1a;图像、视频和音频数据类型可以在其表示维度上进行扩展&#xff0c;…

Spring MVC 九大组件源码深度剖析(一):MultipartResolver - 文件上传的幕后指挥官

文章目录一、为什么从 MultipartResolver 开始&#xff1f;二、核心接口&#xff1a;定义文件上传的契约三、实现解析&#xff1a;两种策略的源码较量1. StandardServletMultipartResolver&#xff08;Servlet 3.0 首选&#xff09;2. CommonsMultipartResolver&#xff08;兼容…