当前位置: 首页 > article >正文

【LLM】 TinyAgent 构建指南

文章目录

  • 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 = path

    def chat(self, prompt: str, history: List[dict]):
        pass

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

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

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

以下是运行示例:

from Agent import Agent

agent = 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.kler.cn/a/322834.html

相关文章:

  • Typescript中的keyof类型操作符详解
  • 丹摩征文活动|丹摩助力selenium实现大麦网抢票
  • 【第四课】rust声明式宏理解与实战
  • Amazon Web Services (AWS)
  • HMI FUXA测试
  • 网络安全练习之 ctfshow_web
  • 【CSS/HTML】CSS实现两列布局,一列固定宽度,一列宽度自适应方法
  • 软考高级:企业信息化-数据挖掘中的上卷和下钻、旋转分析
  • 一文速学-知识图谱从零开始构建实战:知识图谱的基本概念
  • PyQt5实现QLabel中的字体多种颜色闪烁效果
  • H. Sakurako‘s Test
  • 趋势外推法
  • Linux学习之路 -- 线程 -- 互斥
  • 20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
  • [SwiftUI 开发] @dynamicCallable 与 callAsFunction:将类型实例作为函数调用
  • 虚假唤醒(Spurious Wakeup)详解:从概念到实践
  • laravel延迟队列 取消未支付超时订单订单
  • 堆排序,TopK问题|向上调整建堆|向下调整建堆(C)
  • Kafka系列之:安装使用kafka_exporter详细步骤
  • Agent智能体
  • 常见错误1:访问指针类型
  • 【Java异常】(简简单单拿捏)
  • Python(六)-拆包,交换变量名,lambda
  • vue3中使用echarts折线图初始化只显示一条数据,其余折线根据用户点击进行显示
  • 【java】前端RSA加密后端解密
  • 外贸电商系统卷轴模式开发:技术深度解析与实践