什么是AI Agent?大白话新手教学

article/2025/7/16 11:06:43

Agent的诞生背景

如果只有LLM的话,那么LLM就相当于一个脑子,你问他一个问题,他会给你答案或者告诉你怎么做,但并不会帮你去解决这个问题,实际还是需要你自己动手去解决。
(比如我问大模型:“我要回福建,需要买河南到福建的机票”。那么大模型只会告诉你买机票的方法,并不会去帮你买机票)
这样非常的麻烦。
那么我们能不能让LLM返回答案的同时去把问题也给解决了呢?
为了能让LLM(脑)解决实际问题,我们先需要给大模型加上一个tools(手)。
再把脑子和手集成到一个东西里,让这个东西能够自由地调度手和脑子。这个东西就是agent。
大模型用于回答问题(脑子),agent是你的助理,他能够根据大模型回答的问题,并借助tools(手),去完成一系列指定的操作。

用LangChainGo集成Agent

Langchain是一个python框架,用于将大语言模型集成到各种应用中。
LangchainGo就是这个Langchain框架的Go语言版本,除此之外还有 langchain4j(用于java)、rust-langchain(用于rust)、langchain.js(用于javascript)
需求:
我们现在用LangChainGo集成一个Agent,让这个Agent可以根据我们的指令去打开电脑上的Wegame。
package mainimport ("context""fmt""log""os/exec""github.com/tmc/langchaingo/agents""github.com/tmc/langchaingo/chains""github.com/tmc/langchaingo/llms/openai""github.com/tmc/langchaingo/tools"
)// OpenWeGameTool 自定义一个 tool,用于打开 WeGame 应用
type OpenWeGameTool struct{}// Tool 的名称
func (t OpenWeGameTool) Name() string {return "OpenWeGame"
}// Tool 的功能描述
func (t OpenWeGameTool) Description() string {return "Opens the WeGame application on the user's computer."
}// Tool 的功能
func (t OpenWeGameTool) Call(ctx context.Context, input string) (string, error) {// Windows 命令:启动 WeGamecmd := exec.Command("cmd", "/c", "start", "", `D:\WeGame\WeGame.exe`)// 执行命令err := cmd.Run()if err != nil {return "", fmt.Errorf("failed to open WeGame: %v", err)}return "WeGame application opened successfully", nil
}func main() {// Step 1: 初始化LLMllm, err := openai.New(openai.WithModel("deepseek-reasoner"),openai.WithToken("你的api key"),openai.WithBaseURL("https://api.deepseek.com"),)if err != nil {log.Fatalf("Failed to initialize LLM: %v", err)}// Step 2: 初始化 toolsagentTools := []tools.Tool{OpenWeGameTool{}, // 打开wegame的tool}// Step 3: 初始化agentagent := agents.NewOneShotAgent(llm,agentTools,agents.WithMaxIterations(3), // 设置最大迭代次数为3)agentExecutor := agents.NewExecutor(agent)// Step 4: 运行agent,并输入promptprompt := "帮我打开vscode"answer, err := chains.Run(context.Background(), agentExecutor, prompt)if err != nil {log.Fatalf("Failed to run agent: %v", err)}// Step 5: 打印结果fmt.Println("Answer:", answer)
}

深入了解Agent

Agent 和 LLM 之间的通信方式:

Prompt
在初始化时,Agent 先将 Tools 的描述以及指定大模型返回的格式写在 System prompt 中。

0

在用户提问时,Agent 再将用户的提问写在 User prompt 中,连带着上面的 System prompt 一块发给LLM。
顺利的话,LLM会返回一个正确格式的信息。
但是,这里边儿 System Prompt 里的信息都是用自然语言写的,不够规范,不够严谨。
所以容易造成LLM返回一个错误格式信息,Agent 发现这个信息格式不对,会再次调用LLM,进行重试。这样会消耗很多无意义的 token。
为了避免LLM返回一个错误格式信息,我们需要对双方的 交互信息交互方式进行规范处理。
为此,各大厂商推出了一个新功能—— Function Calling
Function Calling
主要通过两方面来进行改进的,分别是双方的交互信息和交互方式。
  1. 交互信息:
每个tool的描述都用一个统一格式的json对象来定义
LLM给的回复也需要用一个统一格式的json对象来定义
  1. 交互方式
这些 json 的定义不再通过prompt进行交互,而是是通过专门的 API 参数。
这样一来,所有工具描述和返回信息的格式都放在相同的地方,并且按照相同的格式。
所以LLM就更容易理解我们的诉求,生成的答案就更准确。人们也可以更加有针对性的训练LLM。
但是 function calling 也有缺点,例如各大厂商的标准不统一,部分大模型不支持 function calling 等,所以其并没有完全取代prompt。
目前 function calling 和 prompt 这两种方式使用都很流行。

Agent 和 Tools 之间的通信方式:

tools实际上是一个服务,Agent通过MCP通信协议去调用他。(MCP专门用来规范Agent和Tool服务之间是怎么交互的。)
运行Tools的服务叫作MCP Server,调用它的Agent叫作MCP Client。
MCP规定了MCP Server如何和MCP Cient交互,以及MCP Server要提供哪些接口,比如说用来查询MCP Server中有哪些Tool、Tool的功能、描述、需要的参数、格式等等的接口。
MCP server既可以和Agent跑在同一台服务器上,通过标准输入输出进行交互,也可以被部署在网络上通过http进行交互。
package mainimport ("context""fmt""github.com/i2y/langchaingo-mcp-adapter""github.com/tmc/langchaingo/agents""github.com/tmc/langchaingo/llms/openai"
)func main() {ctx := context.Background()// 初始化 OpenAI LLMllm, err := openai.New()if err != nil {panic(err)}// 连接到 MCP 服务器并加载工具mcpURL := "https://mcp.composio.dev/your-app-id"tools, err := mcpadapter.LoadTools(ctx, mcpURL)if err != nil {panic(err)}// 初始化 Agent Executorexecutor, err := agents.Initialize(llm,tools,agents.ZeroShotReactDescription,agents.WithMaxIterations(3),)if err != nil {panic(err)}// 提出问题prompt := "请发送一封邮件给张三,内容是会议安排。"answer, err := executor.Call(ctx, map[string]any{"input": prompt})if err != nil {panic(err)}fmt.Println(answer["output"])
}


http://www.hkcw.cn/article/ahwZbCQeBQ.shtml

相关文章

Unity链接Mysql 数据库实现注册登录

1.搭建注册和登录的UI以及跳转代码撰写 2.安装Mysql 数据库到服务器或者本地电脑 我这里使用的是小皮工具,安装玩数据库后创建一个新的用户以及表格 安装Navicate 链接数据库,方便可视化数据库 点击查询-新建查询-输入命令-运行!完成表格创…

你了解ConcurrentHashMap吗?ConcurrentHashMap九连问

多线程环境下,使用Hashmap进行put操作会造成数据覆盖,应该使用支持多线程的 ConcurrentHashMap。 HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因: 假设两…

Pyenv 使用指南:多版本 Python 环境管理

目录 Pyenv 是什么?安装 Pyenv管理 Python 版本虚拟环境管理项目级 Python 版本控制高级技巧常见问题解决最佳实践 Pyenv 是什么? Pyenv 是一个强大的 Python 版本管理工具,允许你: 在同一台机器上安装多个 Python 版本轻松切换…

Cursor 玩转 腾讯地图 MCP Server

腾讯地图WebService API 服务简介 腾讯地图WebService API 是基于HTTPS/HTTP协议构建的标准化地理数据服务接口。该接口支持跨平台调用,开发者可使用任意客户端、服务器端技术及编程语言,遵循API规范发起HTTPS请求,获取地理信息服务&#xf…

(LeetCode 每日一题)2359. 找到离给定两个节点最近的节点( 图)

题目:2359. 找到离给定两个节点最近的节点 思路:分别记录node1和node2到其他节点的距离d1、d2,然后找最小的值即可。时间复杂度0(n),细节看注释。 C版本: class Solution { public:// 因为最多只会有一条出边&#x…

中国外卖包装废弃物高精度网格图谱(Tif/Excel/Shp)

数据简介 今天我们分享的数据是中国外卖包装废弃物高分辨率网格数据集,该数据集包含中国2018年1平方公里范围内产生的外卖包装废弃物总量的栅格数据以及各城市详细的外卖包装废弃物核算结果表格,我们将中国区域的数据裁剪成各省以及各市的区域&#xff0…

每日Prompt:指尖做画

提示词 微缩景观,微距摄影,俯瞰角度,特写,硕大食指手指甲,一个小小的人正在做画,小人右手拿画笔,小人左手拿调色盘,在指甲上作画,画的是中国古代山水画,背景…

调用Gensim库训练Word2Vec模型

本文为🔗365天深度学习训练营内部文章 原作者:K同学啊 一、Word2Vec是什么? 自然语言处理(NLP)是一种涉及到处理语言文本的计算机技术。在 NLP 中,最小的处理单位是词语,词语是语言文本的基本组成部分。词语组成句子&a…

【Java】你真的了解JVM吗?

类加载机制 JVM(Java虚拟机)中的类加载机制是指将Java类的字节码加载到内存中,并为其创建Class对象的过程。类加载机制的核心在于“类加载器”,它是负责加载类的组件。Java中的类加载机制主要包括以下几个步骤: 加载&…

JVM学习-内存结构(二)

一、堆 1.定义 2.堆内存溢出问题 1.演示 -Xmx设置堆大小 3.堆内存的诊断 3.1介绍 1,2都是命令行工具(可直接在ideal运行时,在底下打开终端,输入命令) 1可以拿到Java进程的进程ID,2 jmap只能查询某一个时…

JVM相关内容

jvm的跨平台,字节码的作用 jvm的跨平台 不同操作系统系统运行的JVM不一样,但度能够处理对应的字节码文件 字节码的作用 利用编译节省了运行的时候的效率 JVM整体结构 类加载子系统:用于加载不同的class(字节码)文…

Sqlite3数据库表内数据批量读取操作---sqlite3_stmt机制

0、引言 在前面两篇文章已经对数据环境搭建、数据批量写入库中进行了较为详细的讲解。因此,基于前两篇文章内容的基础上,本文主要从数据库中批量数据读取操作进行梳理讲解。 嵌入式数据库SQLite 3配置使用详细笔记教程_sqlite3-CSDN博客 SQLite 3 优化批…

官方指定Jmeter配置JVM堆内存方式

软件测试资料领取:[内部资源] 想拿年薪40W的软件测试人员,这份资料必须领取~ 软件测试面试刷题工具领取:软件测试面试刷题【800道面试题答案免费刷】 1.概述 在使用Jmeter做性能测试过程中,可能会应为默认设置的堆内存值较小出…

线上JVM OOM问题,如何排查和解决?

今天咱们来聊聊让无数 Java 开发者头疼的 JVM OOM(Out Of Memory,内存溢出)问题。在面试中,OOM 问题也是面试官的“心头好”,因为它能直接考察你对 JVM 的理解,以及你在实际问题面前的排查和解决能力。 一…

JVM常见线上问题:CPU 100%、内存泄露问题排查

一、CPU 100% 问题排查 1.1、找到 cpu 占有率最高的 java 进程号 使用命令: top -c 显示运行中的进程列表信息, shift + p 使列表按 cpu 使用率排序显示。 PID = 2227 的进程,cpu 使用率最高 1.2、根据进程号找到 cpu 占有率最高的线程号 使用命令: top -Hp {pid} ,同…

JVM 一文详解

目录 JVM 简介 JVM 中的内存区域划分 1. 堆(一个进程只有一份 ------ 线程共享) 2. 栈(一个进程可以有 N 份 ------ 线程私有) Java 虚拟机栈: 本机方法栈: 3. 程序计数器(一个线程可以…

【JVM】关于JVM的内部原理你到底了解多少(八股文面经知识点)

前言 🌟🌟本期讲解关于HTTPS的重要的加密原理~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…

深入理解 JVM 的栈帧结构

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s…

JVM 机制

目录 一、什么是 JVM: 二、JVM 的运行流程: 三、JVM 内存区域划分: 1、( 1 ) 程序计数器: 1、( 2 ) 元数据区: 1、( 3 ) 栈: 1、( 4 ) 堆: 四、类加载: 1、什么时候会触…

【JVM】类加载机制

文章目录 类加载机制类加载过程1. 加载2. 验证3. 准备4. 解析偏移量符号引用和直接引用 5. 初始化 类加载机制 类加载指的是,Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一些列的校验解析的过程(程序要想执行…