【LLM】 TinyAgent 构建指南

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 系统,结合了大语言模型与外部工具。未来,我们将继续扩展更多工具功能,特别是在地理信息系统分析方面。

参考文献

学习心得

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值