Only escape prompts when used with -e (#1311)

This commit is contained in:
DannyDaemonic 2023-05-04 05:08:25 -07:00 committed by GitHub
parent c65a7fbfa9
commit db1080876a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 23 deletions

View file

@ -66,35 +66,33 @@ int32_t get_num_physical_cores() {
return n_threads > 0 ? (n_threads <= 4 ? n_threads : n_threads / 2) : 4; return n_threads > 0 ? (n_threads <= 4 ? n_threads : n_threads / 2) : 4;
} }
std::string process_escapes(const char* input) { void process_escapes(std::string& input) {
std::string output; std::size_t input_len = input.length();
std::size_t output_idx = 0;
if (input != nullptr) { for (std::size_t input_idx = 0; input_idx < input_len; ++input_idx) {
std::size_t input_len = std::strlen(input); if (input[input_idx] == '\\' && input_idx + 1 < input_len) {
output.reserve(input_len); switch (input[++input_idx]) {
case 'n': input[output_idx++] = '\n'; break;
for (std::size_t i = 0; i < input_len; ++i) { case 'r': input[output_idx++] = '\r'; break;
if (input[i] == '\\' && i + 1 < input_len) { case 't': input[output_idx++] = '\t'; break;
switch (input[++i]) { case '\'': input[output_idx++] = '\''; break;
case 'n': output.push_back('\n'); break; case '\"': input[output_idx++] = '\"'; break;
case 't': output.push_back('\t'); break; case '\\': input[output_idx++] = '\\'; break;
case '\'': output.push_back('\''); break; default: input[output_idx++] = '\\';
case '\"': output.push_back('\"'); break; input[output_idx++] = input[input_idx]; break;
case '\\': output.push_back('\\'); break;
default: output.push_back('\\');
output.push_back(input[i]); break;
}
} else {
output.push_back(input[i]);
} }
} else {
input[output_idx++] = input[input_idx];
} }
} }
return output; input.resize(output_idx);
} }
bool gpt_params_parse(int argc, char ** argv, gpt_params & params) { bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
bool invalid_param = false; bool invalid_param = false;
bool escape_prompt = false;
std::string arg; std::string arg;
gpt_params default_params; gpt_params default_params;
@ -118,7 +116,9 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
invalid_param = true; invalid_param = true;
break; break;
} }
params.prompt = process_escapes(argv[i]); params.prompt = argv[i];
} else if (arg == "-e") {
escape_prompt = true;
} else if (arg == "--session") { } else if (arg == "--session") {
if (++i >= argc) { if (++i >= argc) {
invalid_param = true; invalid_param = true;
@ -335,6 +335,9 @@ bool gpt_params_parse(int argc, char ** argv, gpt_params & params) {
gpt_print_usage(argc, argv, default_params); gpt_print_usage(argc, argv, default_params);
exit(1); exit(1);
} }
if (escape_prompt) {
process_escapes(params.prompt);
}
return true; return true;
} }
@ -355,6 +358,7 @@ void gpt_print_usage(int /*argc*/, char ** argv, const gpt_params & params) {
fprintf(stderr, " -t N, --threads N number of threads to use during computation (default: %d)\n", params.n_threads); fprintf(stderr, " -t N, --threads N number of threads to use during computation (default: %d)\n", params.n_threads);
fprintf(stderr, " -p PROMPT, --prompt PROMPT\n"); fprintf(stderr, " -p PROMPT, --prompt PROMPT\n");
fprintf(stderr, " prompt to start generation with (default: empty)\n"); fprintf(stderr, " prompt to start generation with (default: empty)\n");
fprintf(stderr, " -e process prompt escapes sequences (\\n, \\r, \\t, \\', \\\", \\\\)\n");
fprintf(stderr, " --session FNAME file to cache model state in (may be large!) (default: none)\n"); fprintf(stderr, " --session FNAME file to cache model state in (may be large!) (default: none)\n");
fprintf(stderr, " --random-prompt start with a randomized prompt.\n"); fprintf(stderr, " --random-prompt start with a randomized prompt.\n");
fprintf(stderr, " --in-prefix STRING string to prefix user inputs with (default: empty)\n"); fprintf(stderr, " --in-prefix STRING string to prefix user inputs with (default: empty)\n");

View file

@ -34,13 +34,18 @@ For an interactive experience, try this command:
#### Unix-based systems (Linux, macOS, etc.): #### Unix-based systems (Linux, macOS, etc.):
```bash ```bash
./main -m models/7B/ggml-model.bin -n -1 --color -r "User:" --in-prefix " " --prompt 'User: Hi\nAI: Hello. I am an AI chatbot. Would you like to talk?\nUser: Sure!\nAI: What would you like to talk about?\nUser:' ./main -m models/7B/ggml-model.bin -n -1 --color -r "User:" --in-prefix " " \
'User: Hi
AI: Hello. I am an AI chatbot. Would you like to talk?
User: Sure!
AI: What would you like to talk about?
User:'
``` ```
#### Windows: #### Windows:
```powershell ```powershell
main.exe -m models\7B\ggml-model.bin -n -1 --color -r "User:" --in-prefix " " --prompt "User: Hi\nAI: Hello. I am an AI chatbot. Would you like to talk?\nUser: Sure!\nAI: What would you like to talk about?\nUser:" main.exe -m models\7B\ggml-model.bin -n -1 --color -r "User:" --in-prefix " " -e --prompt "User: Hi\nAI: Hello. I am an AI chatbot. Would you like to talk?\nUser: Sure!\nAI: What would you like to talk about?\nUser:"
``` ```
The following command generates "infinite" text from a starting prompt (you can use `Ctrl-C` to stop it): The following command generates "infinite" text from a starting prompt (you can use `Ctrl-C` to stop it):