Spaces:
Sleeping
Sleeping
| 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: ` | |
| <tool_list>""" | |
| 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 [<tool_names>] | |
| 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: <user_input>\n""" | |
| MRKL_DEFAULT_EXEC_TEMPLATE = """Observation: <exec_result>\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>', 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('<user_input>', 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('<exec_result>', | |
| str(exec_result)) | |
| self.history[-1]['content'] += exec_result | |
| self.prompt = self.prompt_preprocessor(self.history) | |
| return self.prompt | |