75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
import json
|
|
import os
|
|
|
|
from prompt.react import ReAct
|
|
|
|
QWEN_TOOLS_LIST = [
|
|
{
|
|
'name_for_human': '代码解释器',
|
|
'name_for_model': 'code_interpreter',
|
|
'description_for_model': '代码解释器,可用于执行Python代码。',
|
|
'parameters': [{
|
|
'name': 'code',
|
|
'type': 'string',
|
|
'description': '待执行的代码'
|
|
}],
|
|
'args_format': 'code'
|
|
},
|
|
]
|
|
|
|
TOOL_DESC = """{name_for_model}: Call this tool to interact with the {name_for_human} API. What is the {name_for_human} API useful for? {description_for_model} Parameters: {parameters}"""
|
|
|
|
|
|
class QwenReAct(ReAct):
|
|
|
|
def __init__(self, query, lang='en', upload_file_paths=[]):
|
|
super().__init__(query, lang, upload_file_paths)
|
|
|
|
self.upload_file_paths = [f'{os.path.basename(fname)}' for fname in upload_file_paths]
|
|
self.list_of_plugin_info = QWEN_TOOLS_LIST
|
|
self.fname_template = {
|
|
'zh': '[上传文件{fname_str}]',
|
|
'en': '[Upload file {fname_str}]',
|
|
'en_multi': '[Upload file {fname_str}]'
|
|
}
|
|
|
|
def build_prompt(self):
|
|
im_start = '<|im_start|>'
|
|
im_end = '<|im_end|>'
|
|
prompt = f'{im_start}system\nYou are a helpful assistant.{im_end}'
|
|
|
|
query = super().build_prompt()
|
|
|
|
query = query.lstrip('\n').rstrip()
|
|
prompt += f'\n{im_start}user\n{query}{im_end}'
|
|
if f'{im_start}assistant' not in query:
|
|
prompt += f'\n{im_start}assistant\n{im_end}'
|
|
assert prompt.endswith(f'\n{im_start}assistant\n{im_end}')
|
|
|
|
prompt = prompt[:-len(f'{im_end}')]
|
|
self.prompt = prompt
|
|
return prompt
|
|
|
|
def _build_tools_text(self):
|
|
# tool info
|
|
tools_text = []
|
|
for plugin_info in self.list_of_plugin_info:
|
|
tool = TOOL_DESC.format(
|
|
name_for_model=plugin_info['name_for_model'],
|
|
name_for_human=plugin_info['name_for_human'],
|
|
description_for_model=plugin_info['description_for_model'],
|
|
parameters=json.dumps(plugin_info['parameters'], ensure_ascii=False),
|
|
)
|
|
if plugin_info.get('args_format', 'json') == 'json':
|
|
tool += ' Format the arguments as a JSON object.'
|
|
elif plugin_info['args_format'] == 'code':
|
|
tool += ' Enclose the code within triple backticks (`) at the beginning and end of the code.'
|
|
else:
|
|
raise NotImplementedError
|
|
tools_text.append(tool)
|
|
tools_text = '\n\n'.join(tools_text)
|
|
return tools_text
|
|
|
|
def _build_tools_name_text(self):
|
|
return ', '.join([plugin_info['name_for_model'] for plugin_info in self.list_of_plugin_info])
|