文章目录
- 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 = pathdef chat(self, prompt: str, history: List[dict]):passdef 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 toolsdef 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:passdef build_system_input(self):# 构造系统提示词passdef parse_latest_plugin_call(self, text):# 解析工具调用和参数passdef call_plugin(self, plugin_name, plugin_args):# 调用选择的工具passdef text_completion(self, text, history=[]):# 整合两次调用pass
步骤四:运行 Agent
在该案例中,使用 InternLM2-chat-7B
模型。如果您希望 Agent
更加稳定,可以使用其 big cup
版本 InternLM2-20b-chat
。
以下是运行示例:
from Agent import Agentagent = 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方法将工具返回的结果与用户的提问整合。