【LLM】 TinyAgent 构建指南

news/2024/9/28 4:57:38/

文章目录

  • TinyAgent 构建指南
    • 项目概述
    • 实现步骤
      • 步骤一:模型构建
      • 步骤二:工具构建
      • 步骤三:Agent 构建
      • 步骤四:运行 Agent
    • 结论
    • 参考文献
    • 学习心得

TinyAgent 构建指南

项目地址:https://github.com/datawhalechina/tiny-universe

项目概述

我们将手动实现一个 Agent 系统,并逐步深入了解其结构和运作原理。以下是基于 React 论文中的一些示例,展示了如何构建和整合模型与工具。

实现步骤

步骤一:模型构建

首先,我们需要加载大语言模型。在本项目中,我们将使用 InternLM2 作为我们的对话模型。通过 transformers 库,我们可以轻松加载模型。

我们从一个 BaseModel 类开始,该类定义了基本的方法,比如 chatload_model,以便后续扩展。

class BaseModel:def __init__(self, path: str = '') -> None:self.path = pathdef chat(self, prompt: str, history: List[dict]):passdef load_model(self):pass

接下来,创建一个 InternLM2Chat 类,继承自 BaseModel,实现模型加载和聊天功能。

class InternLM2Chat(BaseModel):def __init__(self, path: str = '') -> None:super().__init__(path)self.load_model()def load_model(self):print('================ 加载模型 ================')self.tokenizer = AutoTokenizer.from_pretrained(self.path, trust_remote_code=True)self.model = AutoModelForCausalLM.from_pretrained(self.path, torch_dtype=torch.float16, trust_remote_code=True).cuda().eval()print('================ 模型加载完成 ================')def chat(self, prompt: str, history: List[dict], meta_instruction: str = '') -> str:response, history = self.model.chat(self.tokenizer, prompt, history, temperature=0.1, meta_instruction=meta_instruction)return response, history

步骤二:工具构建

tools.py 文件中,我们将构建一些工具,例如 Google 搜索。首先,创建一个 Tools 类,添加工具的描述和实现方式。

我们需要为 Google 搜索工具添加描述信息,以便在构造 system_prompt 时让模型了解工具的功能和参数。

class Tools:def __init__(self) -> None:self.toolConfig = self._tools()def _tools(self):tools = [{'name_for_human': '谷歌搜索','name_for_model': 'google_search','description_for_model': '谷歌搜索是一个通用搜索引擎,可用于访问互联网、查询百科知识、了解时事新闻等。','parameters': [{'name': 'search_query','description': '搜索关键词或短语','required': True,'schema': {'type': 'string'},}],}]return toolsdef google_search(self, search_query: str):pass

步骤三:Agent 构建

Agent.py 文件中,我们将实现一个符合 React 方法论的 Agent 类。在此类中,实现 text_completion 方法,用于对话处理。

首先,我们需要构造系统提示 (system_prompt),使模型清楚可以调用哪些工具以及如何格式化输出。

def build_system_input(self):tool_descs, tool_names = [], []for tool in self.tool.toolConfig:tool_descs.append(TOOL_DESC.format(**tool))tool_names.append(tool['name_for_model'])tool_descs = '\n\n'.join(tool_descs)tool_names = ','.join(tool_names)sys_prompt = REACT_PROMPT.format(tool_descs=tool_descs, tool_names=tool_names)return sys_prompt

system_prompt 向大模型说明其可用工具及其功能,确保输出格式一致。

每次用户提问时,如果需要调用工具,模型将进行两次调用:第一次解析问题并选择工具,第二次整合工具返回的结果与用户问题。

下面是 Agent 类的简要实现:

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

在该案例中,使用 InternLM2-chat-7B 模型。如果您希望 Agent 更加稳定,可以使用其 big cup 版本 InternLM2-20b-chat

以下是运行示例:

from Agent import Agentagent = Agent('/root/share/model_repos/internlm2-chat-20b')response, _ = agent.text_completion(text='你好', history=[])
print(response)response, _ = agent.text_completion(text='周杰伦是哪一年出生的?', history=_)
print(response)response, _ = agent.text_completion(text='周杰伦是谁?', history=_)
print(response)response, _ = agent.text_completion(text='他的第一张专辑是什么?', history=_)
print(response)

该系统将智能响应用户查询并结合 Google 搜索提供的信息。

结论

本文介绍了如何构建一个基本的 Agent 系统,结合了大语言模型与外部工具。未来,我们将继续扩展更多工具功能,特别是在地理信息系统分析方面。

参考文献

  • ReAct: Synergizing Reasoning and Acting in Language Models

学习心得

本次尝试构建一个基本的agent。使用tramsformer库完成load_model的目的,自定义类实现了chat方法。自定义Tools 类,添加工具的描述和实现方式(以google搜索为例)。都会进行两次的大模型调用,第一次通过parse_latest_plugin_call方法解析用户的提问,通过call_plugin方法选择调用的工具和参数,第二次通过text_completion方法将工具返回的结果与用户的提问整合。


http://www.ppmy.cn/news/1531447.html

相关文章

【深度学习】05-Rnn循环神经网络-01- 自然语言处理概述/词嵌入层/循环网络/文本生成案例精讲

循环神经网络(RNN)主要用于自然语言处理的。 循环神经网络(RNN)、卷积神经网络(CNN)和全连接神经网络(FCN)是三种常见的神经网络类型,各自擅长处理不同类型的数据。下面…

【Go语言】深入解读Go语言中的指针,助你拨开迷雾见月明

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

虚拟机文件系统根目录上的磁盘空间不足?VMware虚拟机扩容磁盘步骤讲解

VMware虚拟机扩容磁盘步骤讲解 今天使用vmware,想使用Ubuntu虚拟机,结果出现这种情况: 我的环境: Ubuntu20.04 VMWare workstation pro 17 VMware设置 参考链接: https://blog.csdn.net/hktkfly6/article/details…

Sqlite_Datetime列选择三月的行

In SQLite, use the strftime function to extract components from a date/time value SELECT * FROM table WHERE strftime(%m, datemonth) 03;strftime(‘%m’, datemonth): extracts the month part from the datemonth column as a string (with leading zeros for sing…

50道渗透测试面试题,全懂绝对是高手

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

Unity图形用户界面!*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。(万字解析)

Unity 3D GUI 简介 游戏开发过程中,开发人员往往会通过制作大量的图形用户界面( Graphical User Interface,GUI )来增强游戏与玩家的交互性。 Unity 3D 中的图形系统分为 OnGUI、NGUI、UGUI等,这些类型的图形系统内容…

国产数据库盘点-亚信安慧AntDB独立模式部署

本章节主要介绍 AntDB 集中式独立模式部署,主要分两步: 安装数据库(二进制文件) 数据库初始化 安装数据库 以 AntDB 7.2 版本的安装包 antdb-t-ee-release-7.2.generic.* 举例。 将安装包(antdb-t-ee-release-7.2…

【C++】模板、宏、命名空间、

十五、C中的模板templates 本部分讨论C中的模板templates 在别的语言中,比如java、c、c#等托管语言中,模板类似泛型的概念,但模板比泛型要强大得多。模板有点像宏,而泛型却非常受限于类型系统以及其他很多因素。同时模板也是一个…