[datawhale202405]从零手搓大模型实战:TinyAgent

结论速递

TinyAgent项目实现了一个简单的Agent智能体,主要是实现了ReAct策略(推理+调用工具的能力),及封装了一个Tool。

项目实现有一定的疏漏。为了正确运行代码,本次对代码Agent部分进行了简单修改(完善ReAct prompt及LLM的多次循环调用)。

前情回顾

  1. TinyRAG

目录

    • 结论速递
    • 前情回顾
  • 1 绪论
    • 1.1 LLM Agent
    • 1.2 ReAct
    • 1.3 如何手搓Agent
  • 2 TinyAgent
    • 2.1 项目结构
    • 2.2 代码阅读
      • 2.2.1 Agent
      • 2.2.2 Tool
      • 2.2.3 LLM
    • 2.3 运行案例
      • 2.3.1 代码修改
      • 2.3.2 运行结果
    • 参考阅读

1 绪论

1.1 LLM Agent

Agent是人工智能中一个广为人知的概念,指代理人类完成部分工作的AI程序。

LLM Agent是利用LLM构建Agent,比较受到广泛认可的方式是使用LLM作为Agent的大脑,让其自主规划、利用工具来完成人类指定的任务。如下图所示,图片出自The Rise and Potential of Large Language Model Based Agents: A Survey。

Conceptual framework of LLM-based agent with three components: brain, perception, and
action

关于Agent有很多有名的项目,除了单Agent之外,Multi-agent也是目前一个比较流行的研究方向(simulated agent society)。
请添加图片描述

  • AI小镇
  • ChatDev
  • MetaGPT

1.2 ReAct

ReAct是一种prompt策略,它将CoT(思维链策略)和action(操作工具)结合,使LLM能够实时规划和调整操作工具的策略,从而完成较复杂的任务。下图出自ReAct project。

1.3 如何手搓Agent

之前简单玩过Langchain和CrewAI的agent,都是ReAct策略的agent,简单理解agent是prompt-based的role+tool use,其中tool use借助ReAct实现

所以,手搓Agent需要完成

  • 定义Agent的prompt构建:
    • 角色
    • 任务
    • ReAct策略
  • tool:
    • input处理:把agent的动作处理为API的输入
    • 调用API

2 TinyAgent

2.1 项目结构

项目由三大部分构成

  • Agent:集成了prompt模板,其中agent的动作的截取也在此实现
  • Tool:实现了tool的封装
  • LLM:实现LLM的调用

2.2 代码阅读

2.2.1 Agent

代码详见tinyAgent/Agent.py,下为笔记

有两大部分组成

  • prompt:分为两块,一块是tool描述的模板,一块是ReAct的模板
    在这里插入图片描述
    • tool描述:由三个部分组成,tool唯一名name_for_model,tool描述(name_for_human工具人类名,description_for_model工具功能),调用tool所需要生成的格式及参数(JSON格式,指定parameters)。
      其中tool唯一名 和 调用tool所需要生成的格式及参数 是decode LLM的回复时需要的,tool描述是方便LLM理解这个工具是干什么的(这个在多工具时很重要)
    {name_for_model}: Call this tool to interact with the {name_for_human} API. What is the {name_for_human} API useful for? {description_for_model} Parameters: {parameters} Format the arguments as a JSON object.
    
    • ReAct策略:规定了由Question,Thought,Action,Action Input, Observation构成,并且从思考动作到观测这个步骤可以重复多次。这个是ReAct的核心。
  • Agent:
    • LLM调用:build_system_input构建调用LLM所需的prompt,text_completion调用LLM生成回复。只执行了两次调用
    • 工具调用:parse_latest_plugin_call解析/解码LLM回复中关于调用工具的部分,确定调用的tool唯一名 和 调用tool的参数;call_plugin调用工具得到结果。
      疑问:parse_latest_plugin_call没有用正则,而使用的字符串遍历,是出于什么考虑呢?
class Agent:def __init__(self, path: str = '') -> None:passdef build_system_input(self):# 构造上文中所说的系统提示词passdef parse_latest_plugin_call(self, text):# 解析第一次大模型返回选择的工具和工具参数passdef call_plugin(self, plugin_name, plugin_args):# 调用选择的工具passdef text_completion(self, text, history=[]):# 整合两次调用pass

Agent的一次回答(解决问题)是LLM多次回复的结果,这是和先前的ChatLLM显著不同的地方。

疑问:是不是应该有action回合数控制?以实现多次调用

2.2.2 Tool

代码详见tinyAgent/tool.py,下为笔记

实现了Tools类,其实应该是写成abstract类及继承子类的形式会比较合理,但是因为这里只有一个tool,所以就混在了一起。

  • 内部方法_tools,包含了构建tool描述prompt的四大基本信息:name_for_modelname_for_humandescription_for_modelparameters
  • 调用API的功能方法:这里是Google search所以是 google_search的调用google搜索的http POST。

2.2.3 LLM

代码详见tinyAgent/LLM.py,下为笔记

abstract类+继承子类的形式,就是LLM的调用封装(因为这里是开源模型调用),两个核心功能

  • 加载模型
  • 推理

如果改调用API的话,可以参考TinyRAG的实现。

2.3 运行案例

2.3.1 代码修改

用Colab跑的,开源模型调用的是internlm/internlm2-chat-1_8b,把所有中文描述都改成了英文。

internlm/internlm2-chat-1_8b会编造工具,所以修改了system_prompt,要求它不能使用其他工具。

完整的prompt:

Answer the following questions as best you can. You have access to the following tools:google_search: Call this tool to interact with the Google Search API. What is the Google Search API useful for? Google Search is a general search engine that can be used to access the internet, consult encyclopedias, learn about current news, and more. Parameters: [{'name': 'search_query', 'description': 'Search for a keyword or phrase', 'required': True, 'schema': {'type': 'string'}}] Format the arguments as a JSON object.Do not use other tools!Use the following format:Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [google_search]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input questionBegin!

修改了Agent类的两个函数,使其:

  • 在调用其他工具时返回Wrong input的提示、
  • 多次调用LLM,直到获得Final Answer或者达到调用上限(设为5)
class Agent:...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)else:return '\nWrong input!'def text_completion(self, text, history=[]):response = "\nQuestion:" + textfor i in range(5):response, history = self.model.chat(response, history, self.system_prompt)if response.rfind('\nFinal Answer:') > 0:breakplugin_name, plugin_args, response = self.parse_latest_plugin_call(response)if plugin_name:response += self.call_plugin(plugin_name, plugin_args)print(response)return response, history

2.3.2 运行结果

运行示例如下,可以正确解决问题

  • 周杰伦哪年生
response, _ = agent.text_completion(text='Which year was Jay Chou born?', history=_)
print(response)
Thought: To answer this question, I need to search for information about Jay Chou's birth year. I will use the Google Search API to find relevant search results.
Action: google_search
Action Input: {"search_query": "Jay Chou birth year"}
Observation:Overview · Born. January 18, 1979 · New Taipei, Taiwan · Birth name. Chieh-Lun Chou · Nicknames. President Chou; Director Chou · Height. 5′ 8″ (1.73 m) ...
Thought: Jay Chou was born on January 18, 1979. He is a Taiwanese singer, songwriter, and actor. He is known for his contributions to the Taiwanese music industry and has released numerous hit songs throughout his career. Chou has also acted in Taiwanese television dramas and films. He is considered one of the most successful and influential Taiwanese artists of all time.
Final Answer: Jay Chou was born on January 18, 1979. He is a Taiwanese singer, songwriter, and actor. He is known for his contributions to the Taiwanese music industry and has released numerous hit songs throughout his career. Chou has also acted in Taiwanese television dramas and films. He is considered one of the most successful and influential Taiwanese artists of all time.
  • 第一张专辑什么时候发的
response, _ = agent.text_completion(text='What was his first album?', history=_)
print(response)
Thought: To answer this question, I need to search for information about Jay Chou's first album. I will use the Google Search API to find relevant search results.
Action: google_search
Action Input: {"search_query": "Jay Chou first album"}
Observation:Jay is the debut studio album by Taiwanese singer Jay Chou. It was released on November 7, 2000, by BMG Taiwan. It was entirely produced and composed by ...
Thought: Jay Chou's first album is titled \"Jay\" and was released on November 7, 2000. It was entirely produced and composed by Jay Chou himself. The album features a mix of pop, rock, and electronic music and includes popular tracks such as \"Jay\" and \"Jay, Jay, Jay\".
Final Answer: Jay Chou's first album is titled \"Jay\" and was released on November 7, 2000. It was entirely produced and composed by Jay Chou himself. The album features a mix of pop, rock, and electronic music and includes popular tracks such as \"Jay\" and \"Jay, Jay, Jay\".

参考阅读

  1. TinyAgent

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

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

相关文章

windows安装rocketmq

1.下载连接 https://rocketmq.apache.org/download/ 2.解压到D盘下(其他位置也可以) 3.配置环境变量 需要有jdk环境 新建ROCKETMQ_HOME,刚刚解压的位置 编辑Path,新增%ROCKETMQ_HOME%\bin 4.启动mqnameserver 进入安装bin目录下…

交叉编译——

什么是交叉编译 交叉编译 是在一个平台上生成临海一个平台可执行代码. eg.在windows上面编写C51代码,并编译生成可执行代码。如xx.hex 我们在Ubuntu上编写树莓派的代码,并编译成可执行代码。a.out. 是在树莓派上运行,不在Ubuntu Linux上面运…

便携式iv测试仪特点

TH-PV30便携式IV测试仪是一种用于测量半导体器件电学特性的设备,它具有体积小、重量轻、便于携带等特点,广泛应用于半导体行业、科研实验室以及教育领域。 该测试仪的工作原理基于四探针法,通过在半导体器件表面放置四个金属探针&#xff0c…

【vs2022】安装copilot和reshaper

直接安装新版vs 17.10 自带集成的copilot支持安装resharper 可以跳过市场里的reshper安装好后依然可以直接使用vs。 resharper 2024.1.2 市场里还是i老版本: copilot 不兼容,这个是之前市场安装的版本 官方建议用vs intall 安装 安裝 GitHub Copilot GitHub.Co…

详解http协议

什么是HTTP协议 定义 Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) 。 它定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向&am…

第四十一天 | 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉搜索树

题目:62.不同路径 1.二维dp数组dp[i][j]含义:到达(i,j)位置有dp[i][j]种方法。 2.动态转移方程:dp[i][j] dp[i - 1][j] dp[i][j - 1] 3.初始化:dp[0][j] 1, dp[i][0] 1 (第一…

uniapp 安卓 Pc端真机浏览器调试

下载插件:真机模拟浏览器 1. 安装, 每次启用时使用usb 线连接电脑, 并且打开手机或者POS (调试设备)开发者模式, 比如我的是pos 机 则在系统设置中找到版本号,点击多次就会触发开发者模式 2.打开真机模拟软件,打开后会打开一个浏览器,如果想要模拟google的浏览器则 在浏览器地…

精准键位提示,键盘盲打轻松入门

在说明精准键位提示之前,我们先来看一张图: 这是一张标准的基准键位图,也就是打字时我们双手的8个手指放在基准键位上,在打不同的字母时,我们的手指以基准键位为中心,或上、或下、或左、或右,在…

《拯救大学生课设不挂科第二期之Windows11下安装VC6.0(VC++6.0)与跑通Hello,World!程序教程》【官方笔记】

背景与目标人群: 大学第一次学C语言的时候,大部分老师会选择VC6这个编辑器。 但由于很多人是新手,第一次上大学学C语言。 老师要求VC6.0(VC6.0)写C语言跑程序可能很多人还是第一次接触电脑。 需要安装VC6这个编辑器…

Docker常用软件安装

文章目录 1.安装Tomcat1.docker hub查找镜像并复制拉取镜像命令2.拉取镜像到本地1.执行官网命令2.查看是否拉取成功 3.启动tomcat4.退出和重启1.由于是以交互方式启动的,所以不方便,直接ctrl c退出2.查看当前的容器3.使用docker start 命令启动容器&…

【cocos creator 】生成六边形地图

想要生成一个六边形组成的地图 完整代码示例 以下是完整的代码示例,包含了注释来解释每一步: cc.Class({extends: cc.Component,properties: {hexPrefab: {default: null,type: cc.Prefab},mapWidth: 10, // 网格的宽度(六边形的数量&am…

【Flutter】线性布局弹性布局层叠布局

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月25日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

4、PHP的xml注入漏洞(xxe)

青少年ctf&#xff1a;PHP的XXE 1、打开网页是一个PHP版本页面 2、CTRLf搜索xml&#xff0c;发现2.8.0版本&#xff0c;含有xml漏洞 3、bp抓包 4、使用代码出发bug GET /simplexml_load_string.php HTTP/1.1 补充&#xff1a; <?xml version"1.0" encoding&quo…

内网穿透--Nps-自定义-上线

免责声明:本文仅做技术交流与学习... 目录 Nps项目: 一图通解: 1-下载nps/npc 2-服务端启动 访问web网页: 添加客户端&#xff0c;生成密匙. 3-kali客户端连接服务端 4-添加协议隧道. 5-kali生成后门&#xff1a; 6-kali创建监听: Nps项目: https://github.com/ehang…

蓝桥杯Web开发【模拟题一】15届

1.动态的Tab栏 日常在使用移动端 APP 或访问 PC 端网站的时候&#xff0c;常常发现在一些有工具栏或者 Tab 栏的页面会有顶栏固定的效果。简单来说&#xff0c;在页面未开始滚动时顶栏处在其原有的位置上&#xff0c;当页面向下滚动一定区域后&#xff0c;顶栏会跟随滚动固定在…

HTTPS证书——网站如何实现HTTPS访问?

实现网站HTTPS访问可以简化为以下四个基本步骤&#xff0c;确保过程既通俗易懂又条理清晰&#xff1a; 1. 申请SSL证书 - 目的&#xff1a;SSL证书是实现HTTPS加密的关键&#xff0c;它验证了网站的身份&#xff0c;并提供了加密数据所需的密钥。 - 操作&#xff1a;首先&…

TypeScript(持续更新中...)

1.TypeScript是什么&#xff1f; TypeScript是javaScript的超集。 2.使用TypeScript 1&#xff09;全局安装nodejs 2&#xff09;安装TypeScript编译器 npm i -g typescript 3.编译ts文件 //注意&#xff1a;需要在ts文件同级目录执行此命令&#xff0c;否则会报找不到…

遥感、GIS和GPS技术在水文、气象、灾害、生态、环境及卫生等领域中的应用

【科研必备】遥感、GIS和GPS技术在水文、气象、灾害、生态、环境及卫生等领域中的应用 (qq.com)https://mp.weixin.qq.com/s?__bizMzg2NDYxNjMyNA&mid2247565057&idx4&snecec1f5396132122acf02b188f7b74ac&chksmce6515eaf9129cfc9a6c4a16413c0d746003cc192132…

C++ Primer Plus第十七章复习题

1、iostream文件在CI/O中扮演这种角色&#xff1f; 答&#xff1a; iostream文件定义了用于管理输入和输出的类、常量和操纵符,这些对象管理用于处理I/O的流和缓冲区。该文件还创建了一些标准对象(cin、cout、cerr和 clog以及对应的宽字符对象)&#xff0c;用于处理与每个程序…

【论文笔记】| 微调LLM晶体生成

【论文笔记】| 微调LLM晶体生成 Fine-Tuned Language Models Generate Stable Inorganic Materials as Text NYU, ICLR 2024 Theme&#xff1a;Material Generation Main work&#xff1a; 微调大型语言模型以生成稳定的材料 可靠性&#xff1a;在样本结构中&#xff0c;90% …