使用transformers.agents构建Gradio UI(1)——代理概念、类型和构建方法
前言
本系列文章主要介绍WEB界面工具Gradio。Gradio是Hugging Face发布的简易WebUI开发框架,它基于FastAPI和svelte,可以使用机器学习模型、python函数或API开发多功能界面,并可部署人工智能模型,是当前热门的非常易于展示机器学习大语言模型LLM及扩散模型DM的WebUI框架。
本系列文章分为五部分:Gradio介绍、HuggingFace资源与工具库、Gradio基础功能实战、Gradio与大模型融合实战和Gradio高级功能实战。第一部分Gradio介绍,包括三章内容:第一章先介绍Gradio的概念,包括详细技术架构、历史、应用场景、与其他框架Gradio/NiceGui/StreamLit/Dash/PyWebIO的区别,然后详细介绍了Gradio的安装与运行,安装包括Linux/Win/Mac三类系统安装,运行包括普通方式和热重载方式;第二章介绍Gradio的4种部署方式,包括本地部署launch()、huggingface托管、FastAPI挂载和Gradio-Lite浏览器集成;第三章介绍Gradio的三种Client,包括python客户端、javascript客户端和curl客户端,方便读者对Gradio整体把握。第二部分介绍著名网站Hugging Face的各类资源和工具库,因为Gradio演示中经常用到Hugging Face的models及某些场景需要部署在spaces,包括两章内容:第四章详解三类资源models/datasets/spaces的使用,第五章实战六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum实战。第三部分是Gradio基础功能实战,进入本系列文章的核心,包括四章内容:第六章讲解Gradio库的模块架构和环境变量,第七章讲解Gradio高级抽象界面类Interface,第八章讲解Gradio底层区块类Blocks,第九章讲解补充特性Additional Features。第四部分是Gradio与大模型融合实战,包括二章内容:第十章讲解融合大模型的多模态聊天机器人组件Chatbot,第十一章讲述将LLM封装为工具的Gradio Tools。第五部分讲述LangChain,包括四章内容:第十二章讲述LangChain优势分析、学习资料及架构,第十三章讲述LangChain组件Chat models,第十四章讲述组件Tools/Toolkits,第十五章讲述其它五类主要组件:Text splitters/Document loaders/Embedding models/Vector stores/Retrievers。第六部分是使用Agent构建Gradio,包括两章内容:第十六章讲解使用langchain.agents和LangGraph构建Gradio,第十七章讲述使用transformers.agents构建Gradio。第七部分讲述Gradio其它高级功能,包括三章内容:第十八章讲述Discord Bot/Slack Bot/Website Widget部署,第十九章讲述数据科学与绘图Data Science And Plots,第二十章讲述流式传输Streaming。
本系列文章讲解细致,涵盖Gradio及相关框架的大部分组件和功能,代码均可运行并附有大量运行截图,方便读者理解并应用到开发中,Gradio一定会成为每个技术人员实现各种奇思妙想的最称手工具。
本系列文章目录如下:
- 《Gradio全解1——Gradio简介》
- 《Gradio全解1——Gradio的安装与运行》
- 《Gradio全解2——Gradio的3+1种部署方式实践》
- 《Gradio全解2——浏览器集成Gradio-Lite》
- 《Gradio全解3——Gradio Client:python客户端》
- 《Gradio全解3——Gradio Client:javascript客户端》
- 《Gradio全解3——Gradio Client:curl客户端》
- 《Gradio全解4——剖析Hugging Face:详解三类资源models/datasets/spaces》
- 《Gradio全解5——剖析Hugging Face:实战六类工具库transformers/diffusers/datasets/PEFT/accelerate/optimum》
- 《Gradio全解6——Gradio库的模块架构和环境变量》
- 《Gradio全解7——Interface:高级抽象界面类(上)》
- 《Gradio全解7——Interface:高级抽象界面类(下)》
- 《Gradio全解8——Blocks:底层区块类(上)》
- 《Gradio全解8——Blocks:底层区块类(下)》
- 《Gradio全解9——Additional Features:补充特性(上)》
- 《Gradio全解9——Additional Features:补充特性(下)》
- 《Gradio全解10——Chatbot:融合大模型的多模态聊天机器人》
- 《Gradio全解11——Gradio Tools:将LLM封装为工具》
- 《Gradio全解12——LangChain优势分析、学习资料及架构》
- 《Gradio全解13——LangChain组件Chat models详解》
- 《Gradio全解14——LangChain组件Tools/Toolkits详解》
- 《Gradio全解15——LangChain其它五类组件详解》
- 《Gradio全解16——使用LangChain Agents和LangGraph构建Gradio》
- 《Gradio全解17——使用transformers.agents构建Gradio》
- 《Gradio全解18——Discord Bot/Slack Bot/Website Widget部署》
- 《Gradio全解19——Data Science And Plots:数据科学与绘图》
- 《Gradio全解20——Streaming:流式传输》
本系列文章目录如下:
- 《使用transformers.agents构建Gradio UI(1)——代理概念、类型和构建方法》
- 《使用transformers.agents构建Gradio UI(2)——定义大模型引擎Engines》
- 《使用transformers.agents构建Gradio UI(3)——创建和使用工具Tools》
- 《使用transformers.agents构建Gradio UI(4)——系统提示system prompt》
- 《使用transformers.agents构建Gradio UI(5)——其它设置》
- 《使用transformers.agents构建Gradio UI(6)——通过transformers.agents构建Gradio UI》
本篇摘要
本部分章开始使用代理方式构建用户界面,包括三种代理方式:transformers.agents、langchain agents和langgraph。因为Agents作为连接各大模型和工具的桥梁,是打通人工通用智能(AGI)的最后一公里,对从业者和人工智能行业都是至关重要的一环,所以文章重点放在Agents智能体的原理及应用步骤拆解,然后才是通过Gradio构建UI。作者为此阅读了大量文献,以尽量阐述清楚智能代理,请读者不吝三连和评论,共同进步变强。
12. 使用transformers.agents构建Gradio UI
Gradio的组件Chatbot原生支持显示中间思考过程和工具使用情况(参考其参数metadata用法),这使得它非常适合为LLM Agent、思维链(Chain-of-Thought, CoT)或推理演示创建用户界面,本章将展示如何使用gr.Chatbot和gr.ChatInterface来显示transformers.agents代理的思考过程和工具使用情况。
本章讲述如何使用transformers.agents构建Gradio UI,内容包括代理概念类型和构建、定义大模型引擎Engines、创建和使用Tools、系统提示、其它设置和使用transformers.agents构建Gradio UI。关于库transformers的介绍请参考Hugging Face章节中的六大工具库实战。
12.1 代理概念、类型和构建方法
本小节讲述代理的概念、类型和构建方法,对理解代理至关重要。
12.1.1 代理概念
经过大量因果语言建模(causal language modeling)训练的大型语言模型(LLMs)能够处理多种任务,但在逻辑、计算和搜索等基本任务上往往表现不佳。当在这些不擅长的领域中被prompt时,大模型通常无法生成我们期望的答案,克服这一弱点的一种方法是创建代理LLM Agent。
LLM Agent的定义非常宽泛:通常指的是所有将LLM作为核心引擎,并能够根据观察对其环境施加影响的系统。这些系统能够通过多次迭代“感知 ⇒ 思考 ⇒ 行动”的循环来实现既定任务,并常常融入规划或知识管理系统以提升其表现效能。并且LLM Agent可以访问工具(Tools),这些工具通常是用于执行任务的函数,它们必须包含代理正确使用它们所需的所有描述。我们可以在论文《The Rise and Potential of Large Language Model Based Agents: A Survey》的研究中找到对智能体领域的精彩评述。
12.1.2 代理类型
代理可以设计为一系列动作/工具(actions/tools)并一次性运行它们,也可以逐个计划后执行动作/工具,并在启动下一个动作之前等待前面每个动作的结果。因此根据代理设计理念的不同,一般分为两种类型:
- Code agent:该代理有一个规划步骤,然后生成Python代码以一次性执行所有动作。它原生支持处理工具内不同的输入和输出类型,因此是多模态任务的推荐选择;
- React agent:它采用一种基于“推理 (Reasoning)”与“行动 (Acting)”结合的方式逐步解决给定任务,并以此来构建智能体。Transformers实现了三种版本的React agent:
(1)ReactAgent:原始的推理执行代理,它的行动将从大语言模型(LLM)的输出中解析出来,它并不常用,经常会被下面两种衍生代理代替;
(2)ReactJsonAgent:工具调用将由LLM以JSON代码块生成,然后解析并执行;
(3)ReactCodeAgent:是一种新型的ReactJsonAgent,工具调用将由LLM以Python代码块生成,这对于具有强大编码性能的LLM非常有效。
我们将重点放在ReAct智能体上,因为它是解决推理任务的首选代理。在提示词中,我们阐述了模型能够利用哪些工具,并引导它逐步思考“step by step” (亦称为思维链行为Chain-of-Thought),以规划并实施其后续动作。ReAct框架(ReAct: Synergizing Reasoning and Acting in Language Models)使代理可以在基于先前观察的基础上进行多次非常高效的思考。读者可以阅读Open-source LLMs as LangChain Agents博客文章(https://huggingface.co/blog/open-source-llms-as-agents)以了解更多关于使用ReAct代理的信息。
单步Code agent与多步React agent执行流程区别可参考下图:
12.1.3 如何构建代理
要初始化一个代理,需要以下参数:
- llm_engine:此参数设置为代理提供动力引擎的LLM,代理并不完全是LLM,它更像是一个使用LLM作为引擎的程序;
- 工具箱:代理从中挑选工具来执行任务;
- 系统提示(system prompt):LLM引擎将根据这个提示生成其输出;
- 解析器:用于从LLM的输出中提取需要调用的工具及其参数。
在代理系统初始化时,工具的属性被用来生成工具描述,将其嵌入到代理的system_prompt中,以便代理知道它可以使用哪些工具以及为什么使用这些工具。然后LLM根据系统提示输出解决方案,解析器解析LLM的输出后,决定调用哪些工具继续执行。最后当已经得到答案或者满足停止条件将结束会话,否则继续迭代执行。下面对这四方面内容逐一讲述。当然开始之前,请使用以下命令额外安装transformers的agents以安装所有默认依赖项:pip install transformers[agents]。