手搓大模型Task03:手搓一個最小的 Agent 系統

南风丶丶發表於2024-09-27

前言

  訓練一個大模型是一件高投入低迴報的事情,況且訓練的事情是由大的巨頭公司來做的事情;通常我們是在已有的大模型基礎之上做微調或Agent等;大模型的能力是毋庸置疑的,但大模型在一些實時的問題上,或是某些專有領域的問題上,可能會顯得有些力不從心。因此,我們需要一些工具來為大模型賦能,給大模型一個抓手,讓大模型和現實世界發生的事情對齊顆粒度,這樣我們就獲得了一個更好的用的大模型。

1.構造Agent

  這裡就簡單說一下Agent的結構,Agent的結構是一個React的結構,提供一個system_prompt,使得大模型知道自己可以呼叫那些工具,並以什麼樣的格式輸出。每次使用者的提問,如果需要呼叫工具的話,都會進行兩次的大模型呼叫,第一次解析使用者的提問,選擇呼叫的工具和引數,第二次將工具返回的結果與使用者的提問整合。這樣就可以實現一個React的結構,具體如下圖所示。

手搓大模型Task03:手搓一個最小的 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

2.呼叫示例

  使用了InternLM2-chat-7B模型,進行了問答測試:手搓大模型Task03:手搓一個最小的 Agent 系統

3.總結

  使用4060ti 16G顯示卡測試Agent,消耗視訊記憶體15G,整體測試下來感覺 書生·浦語7b 的模型完成一些基本的問答任務沒什麼問題,但是聯絡上下文回答問題還是理解不到位;不夠那麼聰明。

相關文章