wordpress主题乱码河南seo外包
引言
随着大模型(LLM)的崛起,特别是ChatGPT等大模型的广泛应用,基于LLM的系统越来越受欢迎。然而,尽管大模型具备强大的生成能力和推理能力,它们在处理某些专有领域或实时问题时仍然存在局限性。因此,结合工具和Agent的概念,增强大模型的实时交互能力,成为解决问题的关键方法。
本文将从零开始,手动构建一个基于React方式的最小化Agent结构,我们称之为TinyAgent。本文会展示如何通过结合LLM与外部工具的方式,赋予大模型实时处理问题的能力。
实现细节
Step 1: 构建大模型
首先,我们需要加载一个大模型作为核心,这里我们选择InternLM2模型。InternLM2是一个Decoder-Only的对话大模型,具备较强的生成能力。我们可以使用transformers
库来加载并运行该模型。
首先,我们定义一个通用的大模型基类BaseModel
,该类用于加载模型和处理输入输出。
class BaseModel:def __init__(self, path: str = '') -> None:self.path = pathdef chat(self, prompt: str, history: List[dict]):passdef load_model(self):pass
然后,我们实现一个继承自BaseModel
的类InternLM2Chat
,这个类实现了具体的模型加载和与模型对话的方法。
class InternLM2Chat(BaseModel):def __init__(self, path: str = '') -> None:super().__init__(path)self.load_model()def load_model(self):print('================ Loading model ================')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('================ Model loaded ================')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
Step 2: 构造工具
接下来,我们定义工具类,支持外部功能的调用,比如Google搜索。通过这些工具,可以扩展大模型的能力,从而处理实时或专有领域的任务。
我们首先定义工具的描述信息,并在类Tools
中实现具体的工具操作。
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):url = "https://google.serper.dev/search"payload = json.dumps({"q": search_query})headers = {'X-API-KEY': '你的API_KEY','Content-Type': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload).json()return response['organic'][0]['snippet']
Step 3: 构建Agent
接下来,我们创建一个Agent类,实现ReAct(Reasoning and Acting)范式的Agent。这个Agent可以通过LLM处理输入,并在需要时调用工具。
我们需要构造system_prompt
,让模型了解可以使用哪些工具,以及如何调用这些工具。
class Agent:def __init__(self, path: str = '') -> None:self.path = pathself.tool = Tools()self.system_prompt = self.build_system_input()self.model = InternLM2Chat(path)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
,我们告知模型可以使用哪些工具,以及如何格式化输入输出。
然后,我们实现一个解析工具调用的逻辑,模型通过解析用户输入决定何时调用工具,并将结果返回。
def parse_latest_plugin_call(self, text):plugin_name, plugin_args = '', ''i = text.rfind('\nAction:')j = text.rfind('\nAction Input:')k = text.rfind('\nObservation:')if 0 <= i < j: # 如果包含Action和Action Inputif k < j: # 且没有Observationtext = text.rstrip() + '\nObservation:' # 添加Observationk = text.rfind('\nObservation:')plugin_name = text[i + len('\nAction:') : j].strip()plugin_args = text[j + len('\nAction Input:') : k].strip()text = text[:k]return plugin_name, plugin_args, text
最后,整合工具调用和LLM的生成过程。
def text_completion(self, text, history=[]):text = "\nQuestion:" + textresponse, his = self.model.chat(text, history, self.system_prompt)print(response)plugin_name, plugin_args, response = self.parse_latest_plugin_call(response)if plugin_name:response += self.call_plugin(plugin_name, plugin_args)response, his = self.model.chat(response, history, self.system_prompt)return response, his
Step 4: 运行Agent
最后,运行我们的Agent,测试其功能。
if __name__ == '__main__':agent = Agent('/root/share/model_repos/internlm2-chat-7b')response, _ = agent.text_completion(text='周杰伦是哪一年出生的?', history=[])print(response)response, _ = agent.text_completion(text='周杰伦是谁?', history=[])print(response)
结语
通过本文的讲解,我们从零开始构建了一个最小化的Agent系统。我们一步一步地实现了如何结合大语言模型(LLM)与外部工具来增强大模型的实际应用能力。尽管大语言模型在很多任务中展现出了惊人的能力,但在面对特定领域的专有任务或实时性要求较高的场景时,单靠语言模型可能会表现不足。Agent系统的核心理念就是让大模型能够借助外部工具(如搜索引擎、数据库等)来完成更加复杂和个性化的任务。
在本项目中,我们基于React范式设计了一个简单的Agent,通过提供工具描述与交互模板,让模型可以理解如何合理调用外部工具。在我们的示例中,模型能够调用Google搜索引擎来获取实时信息,从而补充大模型在某些领域的知识盲点。这种方式大大拓展了大模型的应用边界,不再仅仅依赖于模型参数内的知识,而是能够动态连接外部信息资源。
Agent系统的意义
- 增强信息获取能力:通过工具接口,模型可以即时获取最新信息或查询外部资源,从而突破模型知识更新滞后的局限性。
- 提高任务处理效率:Agent能够通过合理地调用外部工具,更加快速、准确地完成复杂任务。
- 灵活扩展性:我们构建的系统框架具备高度的扩展性,后续可以通过简单的工具插件接口,轻松接入其他任务场景,如金融数据分析、地理信息查询等。
- 实现智能决策:通过多次推理和工具调用,Agent能够像人类一样通过多步推理,获得更符合问题背景的答案,而不是单一的响应。
通过手搓这个TinyAgent,我们不仅熟悉了ReAct范式的原理与实现,还学习了如何通过系统提示与多次推理循环,让大模型具备更强的推理与行动能力。在未来,我们可以进一步优化该框架,将其应用到更广泛的场景中,如智能客服、实时金融预测、医疗信息查询等。
最后,构建Agent系统为大模型的应用开辟了新的可能性,它不仅提升了大模型的智能化水平,也为探索更复杂的任务提供了技术基础。希望本文的讲解能够帮助你深入理解Agent的运作机制,并激发更多关于大模型与工具结合的创新思路。
如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!
欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。
谢谢大家的支持!