Commit
·
8526803
1
Parent(s):
3db8af6
Upload folder using huggingface_hub
Browse files- README.md +9 -1
- modeling_functionary.py +3 -2
- tokenizer_config.json +1 -1
README.md
CHANGED
|
@@ -101,6 +101,14 @@ will yield:
|
|
| 101 |
```
|
| 102 |
<|start_header_id|>system<|end_header_id|>
|
| 103 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
// Supported function definitions that should be called when necessary.
|
| 105 |
namespace functions {
|
| 106 |
|
|
@@ -115,7 +123,7 @@ location: string,
|
|
| 115 |
What is the weather for Istanbul?
|
| 116 |
```
|
| 117 |
|
| 118 |
-
A more detailed example is provided [here](https://github.com/MeetKai/functionary/blob/main/tests/
|
| 119 |
|
| 120 |
## Run the model
|
| 121 |
|
|
|
|
| 101 |
```
|
| 102 |
<|start_header_id|>system<|end_header_id|>
|
| 103 |
|
| 104 |
+
You are capable of executing available function(s) if required.
|
| 105 |
+
Only execute function(s) when absolutely necessary.
|
| 106 |
+
Ask for the required input to:recipient==all
|
| 107 |
+
Use JSON for function arguments.
|
| 108 |
+
Respond in this format:
|
| 109 |
+
>>>${recipient}
|
| 110 |
+
${content}
|
| 111 |
+
Available functions:
|
| 112 |
// Supported function definitions that should be called when necessary.
|
| 113 |
namespace functions {
|
| 114 |
|
|
|
|
| 123 |
What is the weather for Istanbul?
|
| 124 |
```
|
| 125 |
|
| 126 |
+
A more detailed example is provided [here](https://github.com/MeetKai/functionary/blob/main/tests/prompt_test_v3.llama3.txt).
|
| 127 |
|
| 128 |
## Run the model
|
| 129 |
|
modeling_functionary.py
CHANGED
|
@@ -66,22 +66,23 @@ class FunctionaryForCausalLM(LlamaForCausalLM):
|
|
| 66 |
)
|
| 67 |
|
| 68 |
input_ids = kwargs.pop("input_ids")
|
| 69 |
-
function_call_token = "
|
| 70 |
|
| 71 |
correct_results = []
|
| 72 |
for input_id, result in zip(input_ids, results):
|
| 73 |
final_output_json = {"role": "assistant", "content": None, "tool_calls": None}
|
| 74 |
tool_calls = []
|
| 75 |
raw_output_str = tokenizer.decode(result[len(input_id):].cpu())
|
| 76 |
-
has_text = False if raw_output_str.startswith(function_call_token) else True
|
| 77 |
chunks = raw_output_str.split(function_call_token)
|
| 78 |
for i, chunk in enumerate(chunks):
|
| 79 |
if len(chunk) == 0:
|
| 80 |
continue
|
| 81 |
|
| 82 |
chunk = chunk.replace(tokenizer.pad_token, "")
|
|
|
|
| 83 |
if i == 0 and has_text is not False:
|
| 84 |
final_output_json["content"] = chunk.strip[:-len("<|eot_id|>")] if chunk.endswith("<|eot_id|>") else chunk
|
|
|
|
| 85 |
else:
|
| 86 |
tool_calls.append(
|
| 87 |
{
|
|
|
|
| 66 |
)
|
| 67 |
|
| 68 |
input_ids = kwargs.pop("input_ids")
|
| 69 |
+
function_call_token = ">>>"
|
| 70 |
|
| 71 |
correct_results = []
|
| 72 |
for input_id, result in zip(input_ids, results):
|
| 73 |
final_output_json = {"role": "assistant", "content": None, "tool_calls": None}
|
| 74 |
tool_calls = []
|
| 75 |
raw_output_str = tokenizer.decode(result[len(input_id):].cpu())
|
|
|
|
| 76 |
chunks = raw_output_str.split(function_call_token)
|
| 77 |
for i, chunk in enumerate(chunks):
|
| 78 |
if len(chunk) == 0:
|
| 79 |
continue
|
| 80 |
|
| 81 |
chunk = chunk.replace(tokenizer.pad_token, "")
|
| 82 |
+
has_text = True if chunk.startswith("all") else False
|
| 83 |
if i == 0 and has_text is not False:
|
| 84 |
final_output_json["content"] = chunk.strip[:-len("<|eot_id|>")] if chunk.endswith("<|eot_id|>") else chunk
|
| 85 |
+
final_output_json["content"] = final_output_json["content"][len("all\n"):]
|
| 86 |
else:
|
| 87 |
tool_calls.append(
|
| 88 |
{
|
tokenizer_config.json
CHANGED
|
@@ -2050,7 +2050,7 @@
|
|
| 2050 |
}
|
| 2051 |
},
|
| 2052 |
"bos_token": "<|begin_of_text|>",
|
| 2053 |
-
"chat_template": "{% for message in messages %}\n{% if message['role'] == 'user' or message['role'] == 'system' %}\n{{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' + message['content'] + '<|eot_id|>' }}{% elif message['role'] == 'tool' %}\n{{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' + message['content'] + '<|eot_id|>' }}{% else %}\n{{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'}}{% if message['content'] is not none %}\n{{ '>>>all\n' + message['content'] }}{% endif %}\n{% if 'tool_calls' in message and message['tool_calls'] is not none %}\n{% for tool_call in message['tool_calls'] %}\n{{ '>>>' + tool_call['function']['name'] + '\n' + tool_call['function']['arguments'] }}{% endfor %}\n{% endif %}\n{{ '<|eot_id|>' }}{% endif %}\n{% endfor %}\n{% if add_generation_prompt %}{{ '<|start_header_id|>assistant<|end_header_id|>\n\n' }}{% endif %}",
|
| 2054 |
"clean_up_tokenization_spaces": true,
|
| 2055 |
"eos_token": "<|eot_id|>",
|
| 2056 |
"legacy": true,
|
|
|
|
| 2050 |
}
|
| 2051 |
},
|
| 2052 |
"bos_token": "<|begin_of_text|>",
|
| 2053 |
+
"chat_template": "{% for message in messages %}\n{% if message['role'] == 'user' or message['role'] == 'system' %}\n{{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' + message['content'] + '<|eot_id|>' }}{% elif message['role'] == 'tool' %}\n{{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n' + message['content'] + '<|eot_id|>' }}{% else %}\n{{ '<|start_header_id|>' + message['role'] + '<|end_header_id|>\n\n'}}{% if message['content'] is not none %}\n{{ '>>>all\n' + message['content'] }}{% endif %}\n{% if 'tool_calls' in message and message['tool_calls'] is not none %}\n{% for tool_call in message['tool_calls'] %}\n{{ '>>>' + tool_call['function']['name'] + '\n' + tool_call['function']['arguments'] }}{% endfor %}\n{% endif %}\n{{ '<|eot_id|>' }}{% endif %}\n{% endfor %}\n{% if add_generation_prompt %}{{ '<|start_header_id|>assistant<|end_header_id|>\n\n>>>' }}{% endif %}",
|
| 2054 |
"clean_up_tokenization_spaces": true,
|
| 2055 |
"eos_token": "<|eot_id|>",
|
| 2056 |
"legacy": true,
|