TinyAgent: 尝试Agent入门

最近忙了许多事,终于抽出时间学习一下Agent了,就尝试尝试了Datawhale某不要葱姜蒜作者的大作TingAgent来作为非科班的入门项目。

TinyAgent/Agent.py at master · KMnO4-zx/TinyAgent · GitHubicon-default.png?t=N7T8https://github.com/KMnO4-zx/TinyAgent/blob/master/Agent.py粗略看了一下,这个项目比MetaGPT的代码简单不少,非常适合入门以摸清Agent简单框架的使用!

这次使用的云计算厂商是比较便宜的趋动云,真的很慷慨,送了我不少,很适合新手免费训练!

另外,欢迎使用我的链接进行注册哦!

趋动云icon-default.png?t=N7T8https://growthdata.virtaicloud.com/t/aB在此不打广告了。

本文一共三个部分,第一个部分简单地跑一下结果看效果怎么样,第二部分解析一下代码,第三部分尝试用GPT的API来试试Agent(略)。

第一部分

第一步:创建项目,进入开发环境

选择一个镜像,选Python3.10的

 这里我选了两个模型

首先初始化配置,由于先看项目所以先选较便宜的,1.99的那个

 等待开发环境按钮变亮,然后点“进入开发环境”

第二步、下载项目,安装一些必要的包

 点击terminal首先从github上下载这个项目,然后安装必要的库

cd /gemini/code
git clone https://github.com/KMnO4-zx/TinyAgent.git
cd TinyAgent
pip install -r requirements.txt

我这里已经安装过了

 之后我们先跑一下demo文件试试,先将第二个cell里面的路径改为本次模型所在的位置,选择internlm2-7b的模型,Agent.py里面的路径也改一下。添加一下serper的APIKey(首先自己去申请)。访问以下网址自行注册!

Serper - Dashboardicon-default.png?t=N7T8https://serper.dev/dashboard

 

下面这个图里面表示加载完成了(有等一段时间哦),同时你可以查看自己的CPU状态,会有很大变化。

 这里出一道题给它,回答的不错

再来一道

但是也有局限,稍微复杂点的解决不了。这里也不清楚原因是什么,可能是7B的模型还不太行。

 第二部分:解析代码

这个项目代码主要部分分为4个,一个是tool.py用来调用工具的,一个是LLM.py用来调用大模型的,一个是Agent.py用于组合大模型和搜索工具的,最后一个agent_demo.ipynb用于做小案例演示的。

Tool.py

这个文件很简单,Tools类中有三个函数,第一个不说了;第二个和第一个紧密相连,用_tools是不想别人直接访问,但可以通过self.toolConfig获取;第三个函数其实就是搜索所得结果,具体写法见serper官网,类似如下:

LLM.py

 这份代码文件具体解释详见TinyAgent项目readme文件,总的来说就是加载模型,与模型对话获得结果。

Agent.py

这份代码有三个函数值得细讲:

    def parse_latest_plugin_call(self, text):
        plugin_name, plugin_args = '', ''
        # 下面使用rfind找最后一个出现的是因为所要求的格式可能有多个Action,Action Input,Observation
        i = text.rfind('\nAction:')
        j = text.rfind('\nAction Input:')
        k = text.rfind('\nObservation:')
        if 0 <= i < j:  # If the text has `Action` and `Action input`,
            if k < j:  # but does not contain `Observation`,
                text = text.rstrip() + '\nObservation:'  # Add it back.
            k = text.rfind('\nObservation:')
            plugin_name = text[i + len('\nAction:') : j].strip()
            plugin_args = text[j + len('\nAction Input:') : k].strip()
            text = text[:k + len("\nObservation:")]
        return plugin_name, plugin_args, text
    
    def call_plugin(self, plugin_name, plugin_args):
        plugin_args = json5.loads(plugin_args)
        if plugin_name == 'google_search':
            return '\nObservation:' + self.tool.google_search(**plugin_args)

    def text_completion(self, text, history=[]):
        text = "\nQuestion:" + text
        response, his = self.model.chat(text, history, self.system_prompt)
        # 一般和大模型对话到上面这一行就完了
        # 下面这一行是为了将大模型按格式所回答的内容,包括其选择的“工具”、“工具所用参数”、“最后一个Observation前所有文本”
        plugin_name, plugin_args, response = self.parse_latest_plugin_call(response)
        # 如果“工具”不为空字符串,那么进行谷歌询问,并将返回的答案放到“Observation”后
        if plugin_name:
            response += self.call_plugin(plugin_name, plugin_args)
        # 再将包含“Observation及其结果”的文本给大模型,让其进一步判断
        # 1. observation的循环在哪里?
        response, his = self.model.chat(response, history, self.system_prompt)
        return response, his

首先是parse_latest_plugin,这个函数是将第一次问答模型后的回答进行切片,获得Action(Plugin_name)、Action Input(Plugin_args)以及Observation及其之前的文本(text)

刚刚的这个图,虽然回答不对,但可以用来举例好对这个函数所获内容有更好了解:

Action后面是google_search,也即是名字;Action Input后面是传给谷歌搜索的参数。而之所以截取observation及之前的内容,是observation后表示大模型观察的内容,也就是谷歌搜索返回的答案。这个感觉很像RAG。 

其实刚刚上面已经提到了,为了给大模型一个观察内容,我们需要谷歌搜索的发挥结果,而这也是函数call_plugin的作用。

最后是text_completion函数,如果不用tools,一般就在第二行差不多就结束了,因为普通一次问大模型就问一次就可以了。但后面先用函数parse_latest_plugin将第一次回答切分,得到大模型所得到的一些选择,包括工具名及参数之类的,然后谷歌搜索返回结果,再加到处理后的回答中。最后再一次通过处理后的回答询问大模型,大模型就会根据format直接返回observation之后的内容,比如Thought以及Final answer(如果大模型不抽风的话)。

在学习这些代码的时候我产生了一个疑问:

1. 这些代码似乎没有吧format里面的循环思考体现出来?

第三部分

这一部分其实更简单了,直接将LLM.py中复杂的内容,换成调用大模型API即可。另外还可以尝试使用其他工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是好用的人才测评系统?

对于企业HR来说&#xff0c;在人才测评是必不可少的工具&#xff0c;什么是好用的人才测评&#xff1f; 1、测评效果靠谱&#xff1b;2、操作实施简便。 人才测评的目的是为找到最适合企业的人选&#xff0c;测评就是一个方法&#xff0c;一个工具&#xff0c;能达到预期目的才…

uniapp——组件多颜色模块展示、气泡框

一、自定义颜色&#xff1a; 样式 代码 <template><view class"content"><!-- 右上角 --><view class"coverStatus" :class"[itemClass, positionClass,cornerClass,sanJiaoCss,sanJiaoCss2]":style"dynamicStyle&q…

<router-link>出现Error: No match for {“name“:“home“,“params“:{}}

在将<a></a>标签换到<router-link></router-link>的时候出现No match for {"name":"home","params":{}}这样的错误&#xff0c;其中格式并无错误&#xff0c; <router-link class"navbar-brand active" …

内存管理(C/C++)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

BYOL(NeurIPS 2020)原理解读

paper&#xff1a;Bootstrap your own latent: A new approach to self-supervised Learning third-party implementation&#xff1a;https://github.com/open-mmlab/mmpretrain/blob/main/mmpretrain/models/selfsup/byol.py 本文的创新点 本文提出了一种新的自监督学习方…

Linux配置环境变量_推荐的方式

Linux配置环境变量_推荐以下两种方法&#xff1a; (1)用户环境变量&#xff1a;编辑用户目录下 ~/.bashrc、~/.bash_profile 或 ~/.profile文件 (2)系统环境变量&#xff1a;在/etc/profile.d/目录&#xff0c;创建独立的.sh文件 环境变量脚本文件的执行顺序 /etc/profile-&g…

【Java集合进阶】数据结构(平衡二又树旋转机制)数据结构(红黑树、红黑规则、添加节点处理方案详解)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

记一次 Java 应用内存泄漏的定位过程

问题现象 最近&#xff0c;笔者负责测试的某个算法模块机器出现大量报警&#xff0c;报警表现为机器CPU持续高占用。该算法模块是一个优化算法&#xff0c;本身就是CPU密集型应用&#xff0c;一开始怀疑可能是算法在正常运算&#xff0c;但很快这种猜测就被推翻&#xff1a;同…

如何使用云数据库GaussDB管理平台进行实例安装?

前言 随着数字经济的蓬勃发展&#xff0c;数据库也成为企业的关键技术生产力&#xff0c;也是各行各业数字化转型的必要根基。GaussDB作为新一代分布式数据库&#xff0c;核心代码100%自主创新&#xff0c;具备高可用、高安全、高性能、高弹性、高智能、易部署、易迁移的特性&…

Java作业6-Java类的基本概念三

编程1 import java.util.*;abstract class Rodent//抽象类 {public abstract String findFood();//抽象方法public abstract String chewFood(); } class Mouse extends Rodent {public String findFood(){ return "大米"; }public String chewFood(){ return "…

shm 共享内存

shm 共享内存 0,命令1&#xff0c;了解&#xff1a;2&#xff0c;程序: 0,命令 ipcs 查看分配的共享内存ipcrm -m shmid 删掉分配的共享内存1&#xff0c;了解&#xff1a; 1&#xff09;&#xff0c;进程通信的一种 2&#xff09;&#xff0c;地址映射出来后&#xff0c;就不…

C语言数据结构之顺序表

目录 1.线性表2.顺序表2.1顺序表相关概念及结构2.2增删查改等接口的实现 3.数组相关例题 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性&#xff08;数据类型相同&#xff09;的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff…

Github 2024-04-20 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-20统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目2Python项目2Swift项目2HTML项目1CSS项目1Go项目1C项目1C++项目1Rust项目1编程面试大学:成为软件工程师的全面学习计划 创建周期…

半导体材料(三)——P-N结和金属-半导体接触

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第三篇笔记&#xff0c;上一篇传送门。 p-n结和金属-半导体接触 p-n结 无偏压开路状态 如图a所示&#xff0c;左边是n型掺杂&#xff0c;右边是p型掺杂&#xff0c;在n区和p区之间形成了一个不连续的…

WARNING: No swap limit support——查看docker状态时提示警告

环境&#xff1a;Ubuntu 20.04 1、警告详情 执行命令 service docker status如下图 2、解决办法 2.1 修改文件 执行命令 vim /etc/default/grub在GRUB_CMDLINE_LINUX中追加cgroup_enablememory swapaccount1&#xff0c;如下&#xff1a; # If you change this file…

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

攻防世界18.fileclude

18.fileclude include函数&#xff1a;包含并执行变量或者文件。 if&#xff1a;是if语句用来判断。 isset&#xff1a;判断变量是否存在&#xff0c;值是否为NULL。 $_GET&#xff1a;接收表单提交数据&#xff0c;并把数据附加到url链接当中。 逻辑运算符&&&#xff…

【提示学习论文】BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning论文原理

BlackVIP: Black-Box Visual Prompting for Robust Transfer Learning BlackVIP:稳健迁移学习的黑盒视觉提示 问题 黑盒白盒&#xff1f; 黑盒和白盒的概念与对预训练模型内部参数的了解程度相关。黑盒指的是对预训练模型的参数和结构缺乏详细了解&#xff0c;通常只能通过使…

NAT基本配置

配置IP完成及缺省的路由如下&#xff1b; 此时R1pingISP是ping不通的&#xff0c;因为缺省是可以将数据传给R3&#xff0c;但是R3传不回去&#xff0c;知道目标IP地址但因其是私有内部IP&#xff0c;而自己的是公有IP&#xff0c;所以传不过去&#xff0c;此时就需要R2这个边界…

2024 发布Maven项目到中央仓库

注册sonatype账号 Maven中央仓库并不支持直接发布jar包&#xff0c;sonatype是其指定的第三方仓库之一&#xff0c;发布到此的项目会被定时同步到中央仓库 官方教程地址&#xff1a;https://central.sonatype.org/register/central-portal/ 访问网址&#xff1a;https://centra…
最新文章