ETJava Beta | Java    注册   登录
  • 搜索:
  • 手搓大模型Task03:手搓一个最小的 Agent 系统

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/xinjieli/p/18436807
    如有侵权 请联系我们删除  (页面底部联系我们)  

    前言

      训练一个大模型是一件高投入低回报的事情,况且训练的事情是由大的巨头公司来做的事情;通常我们是在已有的大模型基础之上做微调或Agent等;大模型的能力是毋庸置疑的,但大模型在一些实时的问题上,或是某些专有领域的问题上,可能会显得有些力不从心。因此,我们需要一些工具来为大模型赋能,给大模型一个抓手,让大模型和现实世界发生的事情对齐颗粒度,这样我们就获得了一个更好的用的大模型。

    1.构造Agent

      这里就简单说一下Agent的结构,Agent的结构是一个React的结构,提供一个system_prompt,使得大模型知道自己可以调用那些工具,并以什么样的格式输出。每次用户的提问,如果需要调用工具的话,都会进行两次的大模型调用,第一次解析用户的提问,选择调用的工具和参数,第二次将工具返回的结果与用户的提问整合。这样就可以实现一个React的结构,具体如下图所示。

    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

    2.调用示例

      使用了InternLM2-chat-7B模型,进行了问答测试:

    3.总结

      使用4060ti 16G显卡测试Agent,消耗显存15G,整体测试下来感觉 书生·浦语7b 的模型完成一些基本的问答任务没什么问题,但是联系上下文回答问题还是理解不到位;不够那么聪明。