【LLM】 TinyAgent 构建指南
文章目录
- TinyAgent 构建指南
- 项目概述
- 实现步骤
- 步骤一:模型构建
- 步骤二:工具构建
- 步骤三:Agent 构建
- 步骤四:运行 Agent
- 结论
- 参考文献
- 学习心得
TinyAgent 构建指南
项目地址:https://github.com/datawhalechina/tiny-universe
项目概述
我们将手动实现一个 Agent 系统,并逐步深入了解其结构和运作原理。以下是基于 React 论文中的一些示例,展示了如何构建和整合模型与工具。
实现步骤
步骤一:模型构建
首先,我们需要加载大语言模型。在本项目中,我们将使用 InternLM2
作为我们的对话模型。通过 transformers
库,我们可以轻松加载模型。
我们从一个 BaseModel
类开始,该类定义了基本的方法,比如 chat
和 load_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方法将工具返回的结果与用户的提问整合。