小说网站防盗做的最好的是,好搜seo软件,wordpress 小蘑菇,国际贸易平台哪个好Datawhale干货 作者#xff1a;宋志学#xff0c;Datawhale成员 前 言 大家好#xff0c;我是不要葱姜蒜。在ChatGPT横空出世#xff0c;夺走Bert的桂冠之后#xff0c;大模型愈发地火热#xff0c;国内各种模型层出不穷#xff0c;史称“百模大战”。大模型的能力是毋… Datawhale干货 作者宋志学Datawhale成员 前 言 大家好我是不要葱姜蒜。在ChatGPT横空出世夺走Bert的桂冠之后大模型愈发地火热国内各种模型层出不穷史称“百模大战”。大模型的能力是毋庸置疑的但大模型在一些实时的问题上或是某些专有领域的问题上可能会显得有些力不从心。因此我们需要一些工具来为大模型赋能给大模型一个抓手让大模型和现实世界发生的事情对齐颗粒度这样我们就获得了一个更好用的大模型。 这里基于React的方式制作了一个最小的Agent结构其实更多的是调用工具暑假的时候会尝试将React结构修改为SOP结构。 一步一步手写Agent可能让我对Agent的构成和运作更加地了解。以下是React论文中一些小例子。 参考论文https://arxiv.org/abs/2210.03629 实现细节 Step 1: 构造大模型 我们需要一个大模型这里我们使用InternLM2作为我们的大模型。InternLM2是一个基于Decoder-Only的对话大模型我们可以使用transformers库来加载InternLM2。 首先还是先创建一个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 接着我们创建一个InternLM2类这个类继承自BaseModel类我们在这个类中实现chat方法和load_model方法。就和正常加载InternLM2模型一样来做一个简单的加载和返回即可。 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_codeTrue)self.model AutoModelForCausalLM.from_pretrained(self.path, torch_dtypetorch.float16, trust_remote_codeTrue).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, temperature0.1, meta_instructionmeta_instruction)return response, history Step 2: 构造工具 我们在tools.py文件中构造一些工具比如Google搜索。我们在这个文件中构造一个Tools类这个类中包含了一些工具的描述信息和具体实现。我们可以在这个类中添加一些工具的描述信息和具体实现。 首先要在 tools 中添加工具的描述信息然后在 tools 中添加工具的具体实现 使用Google搜索功能的话需要去serper官网申请一下token: https://serper.dev/dashboard 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 Step 3: 构造Agent 我们在Agent类中构造一个Agent这个Agent是一个React的Agent我们在这个Agent中实现了chat方法这个方法是一个对话方法我们在这个方法中调用InternLM2模型然后根据React的Agent的逻辑来调用Tools中的工具。 首先我们要构造system_prompt, 这个是系统的提示我们可以在这个提示中添加一些系统的提示信息比如ReAct形式的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_descstool_descs, tool_namestool_names)return sys_prompt OK, 如果顺利的话运行出来的示例应该是这样的 Answer the following questions as best you can. You have access to the following tools:google_search: Call this tool to interact with the 谷歌搜索 API. What is the 谷歌搜索 API useful for? 谷歌搜索是一个通用搜索引擎可用于访问互联网、查询百科知识、了解时事新闻等。Parameters: [{name: search_query, description: 搜索关键词或短语, required: True, schema: {type: string}}] Format the arguments as a JSON object.Use the following format:Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [google_search]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can be repeated zero or more times)
Thought: I now know the final answer
Final Answer: the final answer to the original input questionBegin! 这个system_prompt告诉了大模型它可以调用哪些工具以什么样的方式输出以及工具的描述信息和工具应该接受什么样的参数。 目前只是实现了一个简单的Google搜索工具后续会添加更多的关于地理信息系统分析的工具没错我是一个地理信息系统的学生。 关于Agent的具体结构可以在Agent.py中查看。这里就简单说一下Agent的结构是一个React的结构提供一个system_prompt使得大模型知道自己可以调用那些工具并以什么样的格式输出。 每次用户的提问如果需要调用工具的话都会进行两次的大模型调用第一次解析用户的提问选择调用的工具和参数第二次将工具返回的结果与用户的提问整合。这样就可以实现一个React的结构。 下面为Agent代码的简易实现每个函数的具体实现可以在Agent.py中查看。 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 Step 4: 运行Agent 在这个案例中使用了InternLM2-chat-7B模型 如果你想要Agent运行地更加稳定可以使用它的big cup版本InternLM2-20b-chat这样可以提高Agent的稳定性。 from Agent import Agentagent Agent(/root/share/model_repos/internlm2-chat-20b)response, _ agent.text_completion(text你好, history[])
print(response)# Thought: 你好请问有什么我可以帮助你的吗
# Action: google_search
# Action Input: {search_query: 你好}
# Observation:Many translated example sentences containing 你好 – English-Chinese dictionary and search engine for English translations.
# Final Answer: 你好请问有什么我可以帮助你的吗 response, _ agent.text_completion(text周杰伦是哪一年出生的, history_)
print(response)# Final Answer: 周杰伦的出生年份是1979年。 response, _ agent.text_completion(text周杰伦是谁, history_)
print(response)# Thought: 根据我的搜索结果周杰伦是一位台湾的创作男歌手、钢琴家和词曲作家。他的首张专辑《杰倫》于2000年推出他的音乐遍及亚太区和西方国家。
# Final Answer: 周杰伦是一位台湾创作男歌手、钢琴家、词曲作家和唱片制作人。他于2000年推出了首张专辑《杰伦》他的音乐遍布亚太地区和西方国家。他的音乐风格独特融合了流行、摇滚、嘻哈、电子等多种元素深受全球粉丝喜爱。他的代表作品包括《稻香》、《青花瓷》、《听妈妈的话》等。 response, _ agent.text_completion(text他的第一张专辑是什么, history_)
print(response)# Final Answer: 周杰伦的第一张专辑是《Jay》。 https://github.com/KMnO4-zx/TinyAgent 记得给仓库点个小小的 star 哦~ 论文参考 ReAct: Synergizing Reasoning and Acting in Language Models 一起“点赞”三连↓