[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:
        pass

    def build_system_input(self):
        # 构造上文中所说的系统提示词
        pass
    
    def parse_latest_plugin_call(self, text):
        # 解析第一次大模型返回选择的工具和工具参数
        pass
    
    def call_plugin(self, plugin_name, plugin_args):
        # 调用选择的工具
        pass

    def 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 question

Begin!

修改了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:" + text
        for i in range(5):
            response, history = self.model.chat(response, history, self.system_prompt)
            if response.rfind('\nFinal Answer:') > 0:
                break
            plugin_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

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

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

相关文章

数据清洗(ETL)案例实操

文章目录 数据清洗(ETL)概述案例需求和分析代码实现和结果分析 数据清洗(ETL)概述 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换&…

事务管理控制

文章目录 1. 事务的基本概念2. 数据库的并发控制2.1 事务调度2.2 并发操作带来的问题2.3 并发调度的可串行性2.4 并发控制技术2.5 两段锁协议2.6 多粒度封锁协议 3. 数据库的备份与恢复3.1 数据库系统故障3.2 数据库的备份3.3 数据库的恢复 4. 数据库的安全性与完整性4.1 数据库…

mongoengine,一个非常实用的 Python 库!

更多Python学习内容:ipengtao.com 大家好,今天为大家分享一个超酷的 Python 库 - mongoengine。 Github地址:https://github.com/MongoEngine/mongoengine 在现代应用程序开发中,NoSQL数据库因其灵活性和高性能而广受欢迎。MongoD…

Oracle 证书的重要性

随着信息技术的飞速发展,数据库管理已成为企业运营中不可或缺的一部分。Oracle作为全球领先的数据库管理系统提供商,其Oracle Certified Professional(OCP)认证已成为数据库管理员和开发人员追求的专业认证之一。本文将深入探讨Or…

前端工程化07-常见的包管理工具npm、yarn、cnpm、npx、pnpm

8、包管理工具 8.1、包管理工具概述 npm包管理工具、在安装node的时候这个东西就已经安装过了,通过npm去管理包的时候这个时候回有一个配置文件叫做package.json,他是以json的方式来书写对应的一个配置文件,这个配置文件是可以添加特别多的一些字段的&…

前端-移动端布局

如何在PC端模拟移动端设备 可以在浏览器里打开检查 点击一下移动端按钮 然后选择一下对应的手机型号可以切换到对应的手机端 响应式布局实现方法 Viewport Flex 弹性盒子 Flex容器属性 flex-direction flex-wrap justify-content align-items align-content 进阶学习建议 Vu…

【网络版本计算器的实现】

本章重点 理解应用层的作用, 初识HTTP协议理解传输层的作用, 深入理解TCP的各项特性和机制对整个TCP/IP协议有系统的理解对TCP/IP协议体系下的其他重要协议和技术有一定的了解学会使用一些分析网络问题的工具和方法 ⭐注意!! 注意!! 注意!! 本课是网络编程的理论基础.是一个服务…

那些网络安全上的事实,很多人不见得知道!

明月发现不少小白对网络安全的认知几乎为零,甚至明月还碰到一个说 VPN 能彻底隐匿自己的,至于现在这帮动不动就利用 DDos/CC 攻击被人网站来推销境外高防服务器、高防 CDN 的老鼠屎们更是网络安全知识白痴的水平,破坏和攻击的水平完全取决于能…

零一万物Yi-1.5开源,34B/9B/6B多尺寸,34B超Qwen1.5-72B

前言 近年来,大型语言模型(LLM)在各个领域展现出惊人的能力,为人们的生活和工作带来了巨大的改变。然而,大多数开源 LLM 的性能仍然无法与闭源模型相媲美,这限制了 LLM 在科研和商业领域的进一步应用。为了…

详细分析crontab定时执行任务(附Demo | 定时清空Tomcat的实战)

目录 前言1. 基本知识2. Demo3. 实战3.1 错误版本3.2 正确版本 前言 由于用户量大,且导出的日志以及缓存特别多,急需定期删除文件 1. 基本知识 crontab 是一个用于定时执行任务的命令行工具,通常在 Unix 和类 Unix 系统中可用,表…

MCF-Microbial Cell Factories

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 Microbial Cell Factories 是一份开放的同行评审期刊,涵盖了与微生物细胞作为重组蛋白和天然产物的生产者或作为工业兴趣的生物转化的催化剂的开发、使用和研究相关的任何主题…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-17讲 定时器按键消抖

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

抖音跳转微信卡片制作教程 小白也能搞

实测可以正常跳转,很牛逼,给大家分享一下~ 这是我做出来抖音发出去的效果,大家会制作了可以去卖钱,市场上一个这个卡片都要卖50-200,很不错的!! https://pan.baidu.com/s/1xPmGAWPcbAp7eXg7Dc…

VMware 和 VirtualBox开机自启指定虚拟机详细教程

VMware上虚拟机随宿主机开机自启 1. 设置自动启动虚拟机 网上教程旧版的,界面和新版有所差异。17版本设置如下:VMware Workstation工作台 -> 文件 -> 配置自动启动虚拟机 -> 按顺序选择需要启动的虚拟机 VMWare17配置自动启动虚拟机提示&…

当前API面临的安全风险,有什么安全措施

在当今信息化高速发展的时代,API(应用程序编程接口)技术已成为企业数字化转型的基石,它连接着各种服务、传输数据并控制系统,成为现代数字业务环境不可或缺的一部分。然而,随着API的广泛应用,其…

【B站 heima】小兔鲜Vue3 项目学习笔记

系列文章目录 Day 01 目录 系列文章目录前言Day011.项目使用相关技术栈2. 项目规模和亮点3. Vue2和Vue3实现一个小案例4. vue3的优势5. create-vue脚手架工具6. 熟悉我们的项目目录和文件7. 组合式API-setup选项8. 组合式API-reactive和ref函数9. 组合式API-computed计算属性…

C++ | Leetcode C++题解之第110题平衡二叉树

题目: 题解: class Solution { public:int height(TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || abs(leftHeight - rightH…

【蓝桥杯选拔赛真题76】python找出元素 第十四届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python找出元素 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python找出元素 第十四届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

一文了解 FileBeat:诞生背景、发展历程与定义

🐇明明跟你说过:个人主页 🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是ELK 2、FileBeat在ELK中的角色 3、File…