11# Copyright (c) Alibaba, Inc. and its affiliates.
2+ import datetime as dt
3+ from dataclasses import dataclass
24from typing import Dict , List , Optional , Union
35
6+ import json
7+
8+
9+ @dataclass
10+ class AgentKeyword :
11+ action : str = 'Action:'
12+ action_input : str = 'Action Input:'
13+ observation : str = 'Observation:'
14+
415
516def format_react_en (tool_names , tool_descs ):
617 REACT_PROMPT = """Answer the following questions as best as you can. You have access to the following tools:
@@ -18,6 +29,7 @@ def format_react_en(tool_names, tool_descs):
1829
1930Begin!
2031"""
32+ tool_descs = [json .dumps (t ) if not isinstance (t , str ) else t for t in tool_descs ]
2133 return REACT_PROMPT .format (tool_list = '\n \n ' .join (tool_descs ), tool_names = ',' .join (tool_names ))
2234
2335
@@ -37,6 +49,7 @@ def format_react_zh(tool_names, tool_descs):
3749
3850开始!
3951"""
52+ tool_descs = [json .dumps (t ) if not isinstance (t , str ) else t for t in tool_descs ]
4053 return REACT_ZH_PROMPT .format (tool_list = '\n \n ' .join (tool_descs ), tool_names = ',' .join (tool_names ))
4154
4255
@@ -46,6 +59,7 @@ def format_glm4(tool_names, tool_descs):
4659# 可用工具
4760
4861{tool_list}"""
62+ tool_descs = [json .dumps (t ) if not isinstance (t , str ) else t for t in tool_descs ]
4963 tool_list = ''
5064 for name , tool in zip (tool_names , tool_descs ):
5165 tool_list += f'## { name } \n \n { tool } \n \n '
@@ -78,28 +92,72 @@ def format_toolbench(tool_names, tool_descs):
7892 use function Finish->give_up_and_restart.
79932.Do not use origin tool names, use only subfunctions' names.
8094Specifically, you have access to the following APIs: {tool_list}"""
95+ tool_descs = [json .dumps (t ) if not isinstance (t , str ) else t for t in tool_descs ]
8196 return TOOLBENCH_PROMPT .format (tool_list = '\n \n ' .join (tool_descs ))
8297
8398
99+ def format_qwen (tool_names , tool_descs ):
100+ PROMPT = '''You are a helpful assistant.
101+
102+ 当前时间:{date}
103+
104+ # 工具
105+
106+ ## 你拥有如下工具:
107+
108+ {tool_list}
109+
110+ ## 你可以在回复中插入以下命令以调用这些工具:
111+
112+ {format_list}
113+ '''
114+ # 定义星期映射
115+ weekdays = {0 : '星期一' , 1 : '星期二' , 2 : '星期三' , 3 : '星期四' , 4 : '星期五' , 5 : '星期六' , 6 : '星期日' }
116+ now = dt .datetime .now ()
117+ year = now .year
118+ month = now .month
119+ day = now .day
120+ weekday = weekdays [now .weekday ()]
121+ formatted_date = f'{ year } 年{ month :02d} 月{ day :02d} 日,{ weekday } '
122+ PROMPT = PROMPT .replace ('{date}' , formatted_date )
123+ tool_list = ''
124+ for name , tool in zip (tool_names , tool_descs ):
125+ tool_list += f'### { name } \n { name } : { tool ["description" ]} 输入参数: { json .dumps (tool ["parameters" ])} \n '
126+
127+ PROMPT = PROMPT .replace ('{tool_list}' , tool_list )
128+
129+ format_list = ''
130+ for i , _ in enumerate (tool_names ):
131+ format_list += f'✿FUNCTION✿:工具{ i + 1 } 的名称\n ✿ARGS✿:工具{ i + 1 } 的输入\n ✿RESULT✿:工具{ i + 1 } 的结果\n '
132+ PROMPT = PROMPT .replace ('{format_list}' , format_list )
133+ return PROMPT
134+
135+
84136def format_custom (tool_names , tool_descs ):
85137 PROMPT = '''你是一个人工智能助手。你的任务是针对用户的问题和要求提供适当的答复和支持。
86138
87139 # 可用工具
88140
89141 {tool_list}'''
90142 tool_list = ''
143+ tool_descs = [json .dumps (t ) if not isinstance (t , str ) else t for t in tool_descs ]
91144 for name , tool in zip (tool_names , tool_descs ):
92145 tool_list += f'## { name } \n \n { tool } \n \n '
93146 return PROMPT .format (tool_list = tool_list )
94147
95148
96149# Add your prompt here, use --tools_prompt to train
97150tools_prompt = {
98- 'react_en' : format_react_en ,
99- 'react_zh' : format_react_zh ,
100- 'glm4' : format_glm4 ,
101- 'toolbench' : format_toolbench ,
102- 'custom' : format_custom ,
151+ 'react_en' : (format_react_en , AgentKeyword ().__dict__ ),
152+ 'react_zh' : (format_react_zh , AgentKeyword ().__dict__ ),
153+ 'glm4' : (format_glm4 , AgentKeyword ().__dict__ ),
154+ 'toolbench' : (format_toolbench , AgentKeyword ().__dict__ ),
155+ 'qwen' : (format_qwen , AgentKeyword (
156+ action = '✿FUNCTION✿:' ,
157+ action_input = '✿ARGS✿:' ,
158+ observation = '✿RESULT✿:' ,
159+ ).__dict__ ),
160+ 'custom' : (format_custom , AgentKeyword ().__dict__ ),
103161}
104162
105163
@@ -111,10 +169,15 @@ def get_tools_prompt(tools: List[Dict[str, Union[str, Dict]]], prompt_format: st
111169 if isinstance (info , dict ) and 'function' in info :
112170 info = info ['function' ]
113171 tool_names .append (info ['name' ])
114- tool_descs .append (str ( info ) ) # info: dict
172+ tool_descs .append (info ) # info: dict
115173 except KeyError :
116174 print ('invalid tools format, please check'
117175 'https://github.com/modelscope/swift/blob/main/docs/source_en/LLM/Agent-deployment-best-practice.md' )
118176 return None
119- prompt_format = tools_prompt .get (prompt_format ) or format_toolbench
177+ prompt_format = tools_prompt .get (prompt_format , ( None , None ))[ 0 ] or format_toolbench
120178 return prompt_format (tool_names , tool_descs )
179+
180+
181+ def get_tools_keyword (prompt_format : str = 'react_en' ) -> Dict [str , str ]:
182+ keyword = tools_prompt .get (prompt_format , (None , None ))[1 ] or AgentKeyword ().__dict__
183+ return keyword
0 commit comments