import json from .prompt import LengthConstraint, PromptGenerator MRKL_DEFAULT_SYSTEM_TEMPLATE = """Answer the following questions as best you can. You have access to the following tools: ` """ MRKL_DEFAULT_INSTRUCTION_TEMPLATE = """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 [] 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 question Begin! """ MRKL_DEFAULT_USER_TEMPLATE = """Question: \n""" MRKL_DEFAULT_EXEC_TEMPLATE = """Observation: \n""" TOOL_DESC = ( '{name_for_model}: {name_for_human} API. {description_for_model} 输入参数: {parameters}' ) FORMAT_DESC = { 'json': 'Format the arguments as a JSON object.', 'code': 'Enclose the code within triple backticks (`)' + ' at the beginning and end of the code.' } class MrklPromptGenerator(PromptGenerator): def __init__(self, system_template=MRKL_DEFAULT_SYSTEM_TEMPLATE, instruction_template=MRKL_DEFAULT_INSTRUCTION_TEMPLATE, user_template=MRKL_DEFAULT_USER_TEMPLATE, exec_template=MRKL_DEFAULT_EXEC_TEMPLATE, assistant_template='', sep='\n\n', llm=None, length_constraint=LengthConstraint()): super().__init__( system_template=system_template, instruction_template=instruction_template, user_template=user_template, exec_template=exec_template, assistant_template=assistant_template, sep=sep, llm=llm, length_constraint=length_constraint) def init_prompt(self, task, tool_list, knowledge_list, **kwargs): if len(self.history) == 0: super().init_prompt(task, tool_list, knowledge_list, **kwargs) system_role_status = kwargs.get('system_role_status', False) tool_names = [f'\'{str(tool.name)}\'' for tool in tool_list] tool_names = ','.join(tool_names) self.system_prompt = self.system_prompt.replace( '', tool_names) if system_role_status: system_message = { 'role': 'system', 'content': self.system_prompt } self.history.insert(0, system_message) else: self.history[0]['content'] = self.system_prompt + self.history[ 0]['content'] else: self.history.append({ 'role': 'user', 'content': self.user_template.replace('', task) }) self.history.append({ 'role': 'assistant', 'content': self.assistant_template }) return self.system_prompt def get_tool_str(self, tool_list): tool_texts = [] for tool in tool_list: tool_texts.append( TOOL_DESC.format( name_for_model=tool.name, name_for_human=tool.name, description_for_model=tool.description, parameters=json.dumps(tool.parameters, ensure_ascii=False))) # + ' ' + FORMAT_DESC['json']) tool_str = '\n\n'.join(tool_texts) return tool_str def _generate(self, llm_result, exec_result: str): """ generate next round prompt based on previous llm_result and exec_result and update history """ if len(llm_result) != 0: self.history[-1]['content'] += f'{llm_result}' if len(exec_result) != 0: exec_result = self.exec_template.replace('', str(exec_result)) self.history[-1]['content'] += exec_result self.prompt = self.prompt_preprocessor(self.history) return self.prompt