From b071907304b4c13f3a6d1202d320fbd0c6203074 Mon Sep 17 00:00:00 2001 From: Jiahao Li Date: Wed, 22 Nov 2023 09:51:25 +0800 Subject: [PATCH] Support all features for ChatGLM3 (system prompt / function call / code interpreter) (#197) --- .github/workflows/python-package.yml | 2 +- .gitignore | 1 + CMakeLists.txt | 14 +- README.md | 117 +++++++-- chatglm.cpp | 308 +++++++++++++++++------ chatglm.h | 170 ++++++++++--- chatglm_cpp/_C.pyi | 193 +++++++++++++++ chatglm_cpp/__init__.py | 160 ++++++------ chatglm_cpp/convert.py | 12 +- chatglm_cpp/langchain_api.py | 22 +- chatglm_cpp/openai_api.py | 28 +-- chatglm_pybind.cpp | 75 +++++- chatglm_test.cpp | 281 +++++++++++++++------ docs/code_interpreter.png | Bin 0 -> 173176 bytes docs/function_call.png | Bin 0 -> 147656 bytes examples/chatglm3_demo.py | 344 ++++++++++++++++++++++++++ examples/{cli_chat.py => cli_demo.py} | 89 +++++-- examples/langchain_openai_client.py | 4 + examples/system/code_interpreter.txt | 1 + examples/system/default.txt | 1 + examples/system/function_call.txt | 33 +++ examples/web_demo.py | 42 ++-- main.cpp | 121 +++++++-- pyproject.toml | 5 + tests/test_chatglm_cpp.py | 154 +++--------- 25 files changed, 1663 insertions(+), 514 deletions(-) create mode 100644 chatglm_cpp/_C.pyi create mode 100644 docs/code_interpreter.png create mode 100644 docs/function_call.png create mode 100644 examples/chatglm3_demo.py rename examples/{cli_chat.py => cli_demo.py} (51%) create mode 100644 examples/langchain_openai_client.py create mode 100644 examples/system/code_interpreter.txt create mode 100644 examples/system/default.txt create mode 100644 examples/system/function_call.txt diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 1d383115..972060d0 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -36,7 +36,7 @@ jobs: - name: Lint with black uses: psf/black@stable with: - options: "--check --verbose --line-length 120" + options: "--check --verbose" src: "chatglm_cpp examples tests setup.py" - name: Test with pytest run: | diff --git a/.gitignore b/.gitignore index 47826aca..31d3823e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ __pycache__/ *.egg-info/ dist/ *.so +*.whl .hypothesis/ # cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b7ac72e..373b98c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,7 +92,19 @@ file(GLOB PY_SOURCES add_custom_target(lint COMMAND clang-format -i ${CPP_SOURCES} COMMAND isort ${PY_SOURCES} - COMMAND black ${PY_SOURCES} --line-length 120) + COMMAND black ${PY_SOURCES} --verbose) + +# mypy +add_custom_target(mypy + mypy chatglm_cpp examples --exclude __init__.pyi + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +) + +# stub +add_custom_target(stub + pybind11-stubgen chatglm_cpp -o . + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +) if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") diff --git a/README.md b/README.md index 3c05e02d..fc87692c 100644 --- a/README.md +++ b/README.md @@ -105,11 +105,70 @@ python3 chatglm_cpp/convert.py -i THUDM/chatglm2-6b -t q4_0 -o chatglm2-ggml.bin
ChatGLM3-6B +ChatGLM3-6B further supports function call and code interpreter in addition to chat mode. + +Chat mode: ```sh python3 chatglm_cpp/convert.py -i THUDM/chatglm3-6b -t q4_0 -o chatglm3-ggml.bin ./build/bin/main -m chatglm3-ggml.bin -p 你好 --top_p 0.8 --temp 0.8 # 你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。 ``` + +Setting system prompt: +```sh +./build/bin/main -m chatglm3-ggml.bin -p 你好 -s "You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown." +# 你好👋!我是 ChatGLM3,有什么问题可以帮您解答吗? +``` + +Function call: +~~~ +$ ./build/bin/main -m chatglm3-ggml.bin --top_p 0.8 --temp 0.8 --sp examples/system/function_call.txt -i +System > Answer the following questions as best as you can. You have access to the following tools: ... +Prompt > 生成一个随机数 +ChatGLM3 > random_number_generator +```python +tool_call(seed=42, range=(0, 100)) +``` +Tool Call > Please manually call function `random_number_generator` with args `tool_call(seed=42, range=(0, 100))` and provide the results below. +Observation > 23 +ChatGLM3 > 根据您的要求,我使用随机数生成器API生成了一个随机数。根据API返回结果,生成的随机数为23。 +~~~ + +Code interpreter: +~~~ +$ ./build/bin/main -m chatglm3-ggml.bin --top_p 0.8 --temp 0.8 --sp examples/system/code_interpreter.txt -i +System > 你是一位智能AI助手,你叫ChatGLM,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。 +Prompt > 列出100以内的所有质数 +ChatGLM3 > 好的,我会为您列出100以内的所有质数。 +```python +def is_prime(n): + """Check if a number is prime.""" + if n <= 1: + return False + if n <= 3: + return True + if n % 2 == 0 or n % 3 == 0: + return False + i = 5 + while i * i <= n: + if n % i == 0 or n % (i + 2) == 0: + return False + i += 6 + return True + +primes_upto_100 = [i for i in range(2, 101) if is_prime(i)] +primes_upto_100 +``` + +Code Interpreter > Please manually run the code and provide the results below. +Observation > [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] +ChatGLM3 > 100以内的所有质数为: + +$$ +2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 +$$ +~~~ +
@@ -251,7 +310,7 @@ pip install . Pre-built wheels for CPU backend on Linux / MacOS / Windows are published on [release](https://github.com/li-plus/chatglm.cpp/releases). For CUDA / Metal backends, please compile from source code or source distribution. -**Using pre-converted ggml models** +**Using Pre-converted GGML Models** Here is a simple demo that uses `chatglm_cpp.Pipeline` to load the GGML model and chat with it. First enter the examples folder (`cd examples`) and launch a Python interactive shell: ```python @@ -264,7 +323,7 @@ Here is a simple demo that uses `chatglm_cpp.Pipeline` to load the GGML model an To chat in stream, run the below Python example: ```sh -python3 cli_chat.py -m ../chatglm-ggml.bin -i +python3 cli_demo.py -m ../chatglm-ggml.bin -i ``` Launch a web demo to chat in your browser: @@ -280,7 +339,7 @@ For other models: ChatGLM2-6B ```sh -python3 cli_chat.py -m ../chatglm2-ggml.bin -p 你好 --temp 0.8 --top_p 0.8 # CLI demo +python3 cli_demo.py -m ../chatglm2-ggml.bin -p 你好 --temp 0.8 --top_p 0.8 # CLI demo python3 web_demo.py -m ../chatglm2-ggml.bin --temp 0.8 --top_p 0.8 # web demo ```
@@ -288,10 +347,40 @@ python3 web_demo.py -m ../chatglm2-ggml.bin --temp 0.8 --top_p 0.8 # web demo
ChatGLM3-6B +**CLI Demo** + +Chat mode: +```sh +python3 cli_demo.py -m ../chatglm3-ggml.bin -p 你好 --temp 0.8 --top_p 0.8 +``` + +Function call: ```sh -python3 cli_chat.py -m ../chatglm3-ggml.bin -p 你好 --temp 0.8 --top_p 0.8 # CLI demo -python3 web_demo.py -m ../chatglm3-ggml.bin --temp 0.8 --top_p 0.8 # web demo +python3 cli_demo.py -m ../chatglm3-ggml.bin --temp 0.8 --top_p 0.8 --sp system/function_call.txt -i ``` + +Code interpreter: +```sh +python3 cli_demo.py -m ../chatglm3-ggml.bin --temp 0.8 --top_p 0.8 --sp system/code_interpreter.txt -i +``` + +**Web Demo** + +Install Python dependencies and the IPython kernel for code interpreter. +```sh +pip install streamlit jupyter_client ipython ipykernel +ipython kernel install --name chatglm3-demo --user +``` + +Launch the web demo: +```sh +streamlit run chatglm3_demo.py +``` + +| Function Call | Code Interpreter | +|-----------------------------|--------------------------------| +| ![](docs/function_call.png) | ![](docs/code_interpreter.png) | +
@@ -299,7 +388,7 @@ python3 web_demo.py -m ../chatglm3-ggml.bin --temp 0.8 --top_p 0.8 # web demo ```sh # CLI demo -python3 cli_chat.py -m ../codegeex2-ggml.bin --temp 0 --mode generate -p "\ +python3 cli_demo.py -m ../codegeex2-ggml.bin --temp 0 --mode generate -p "\ # language: Python # write a bubble sort function " @@ -312,7 +401,7 @@ python3 web_demo.py -m ../codegeex2-ggml.bin --temp 0 --max_length 512 --mode ge Baichuan-13B-Chat ```sh -python3 cli_chat.py -m ../baichuan-13b-chat-ggml.bin -p 你好 --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.1 # CLI demo +python3 cli_demo.py -m ../baichuan-13b-chat-ggml.bin -p 你好 --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.1 # CLI demo python3 web_demo.py -m ../baichuan-13b-chat-ggml.bin --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.1 # web demo ```
@@ -321,7 +410,7 @@ python3 web_demo.py -m ../baichuan-13b-chat-ggml.bin --top_k 5 --top_p 0.85 --te Baichuan2-7B-Chat ```sh -python3 cli_chat.py -m ../baichuan2-7b-chat-ggml.bin -p 你好 --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.05 # CLI demo +python3 cli_demo.py -m ../baichuan2-7b-chat-ggml.bin -p 你好 --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.05 # CLI demo python3 web_demo.py -m ../baichuan2-7b-chat-ggml.bin --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.05 # web demo ``` @@ -330,7 +419,7 @@ python3 web_demo.py -m ../baichuan2-7b-chat-ggml.bin --top_k 5 --top_p 0.85 --te Baichuan2-13B-Chat ```sh -python3 cli_chat.py -m ../baichuan2-13b-chat-ggml.bin -p 你好 --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.05 # CLI demo +python3 cli_demo.py -m ../baichuan2-13b-chat-ggml.bin -p 你好 --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.05 # CLI demo python3 web_demo.py -m ../baichuan2-13b-chat-ggml.bin --top_k 5 --top_p 0.85 --temp 0.3 --repeat_penalty 1.05 # web demo ``` @@ -339,7 +428,7 @@ python3 web_demo.py -m ../baichuan2-13b-chat-ggml.bin --top_k 5 --top_p 0.85 --t InternLM-Chat-7B ```sh -python3 cli_chat.py -m ../internlm-chat-7b-ggml.bin -p 你好 --top_p 0.8 --temp 0.8 # CLI demo +python3 cli_demo.py -m ../internlm-chat-7b-ggml.bin -p 你好 --top_p 0.8 --temp 0.8 # CLI demo python3 web_demo.py -m ../internlm-chat-7b-ggml.bin --top_p 0.8 --temp 0.8 # web demo ``` @@ -348,12 +437,12 @@ python3 web_demo.py -m ../internlm-chat-7b-ggml.bin --top_p 0.8 --temp 0.8 # we InternLM-Chat-20B ```sh -python3 cli_chat.py -m ../internlm-chat-20b-ggml.bin -p 你好 --top_p 0.8 --temp 0.8 # CLI demo +python3 cli_demo.py -m ../internlm-chat-20b-ggml.bin -p 你好 --top_p 0.8 --temp 0.8 # CLI demo python3 web_demo.py -m ../internlm-chat-20b-ggml.bin --top_p 0.8 --temp 0.8 # web demo ``` -**Load and optimize Hugging Face LLMs in one line of code** +**Converting Hugging Face LLMs at Runtime** Sometimes it might be inconvenient to convert and save the intermediate GGML models beforehand. Here is an option to directly load from the original Hugging Face model, quantize it into GGML models in a minute, and start serving. All you need is to replace the GGML model path with the Hugging Face model name or path. ```python @@ -369,7 +458,7 @@ Processing model states: 100%|████████████████ Likewise, replace the GGML model path with Hugging Face model in any example script, and it just works. For example: ```sh -python3 cli_chat.py -m THUDM/chatglm-6b -p 你好 -i +python3 cli_demo.py -m THUDM/chatglm-6b -p 你好 -i ``` ## API Server @@ -443,7 +532,7 @@ docker build . --network=host -t chatglm.cpp # cpp demo docker run -it --rm -v $PWD:/opt chatglm.cpp ./build/bin/main -m /opt/chatglm-ggml.bin -p "你好" # python demo -docker run -it --rm -v $PWD:/opt chatglm.cpp python3 examples/cli_chat.py -m /opt/chatglm-ggml.bin -p "你好" +docker run -it --rm -v $PWD:/opt chatglm.cpp python3 examples/cli_demo.py -m /opt/chatglm-ggml.bin -p "你好" # langchain api server docker run -it --rm -v $PWD:/opt -p 8000:8000 -e MODEL=/opt/chatglm-ggml.bin chatglm.cpp \ uvicorn chatglm_cpp.langchain_api:app --host 0.0.0.0 --port 8000 diff --git a/chatglm.cpp b/chatglm.cpp index 0fdcdd2b..3cac2a41 100644 --- a/chatglm.cpp +++ b/chatglm.cpp @@ -136,6 +136,23 @@ ggml_tensor *tensor_to_cpu(ggml_tensor *tensor) { return tensor; } +const std::string ToolCallMessage::TYPE_FUNCTION = "function"; +const std::string ToolCallMessage::TYPE_CODE = "code"; + +const std::string ChatMessage::ROLE_USER = "user"; +const std::string ChatMessage::ROLE_ASSISTANT = "assistant"; +const std::string ChatMessage::ROLE_SYSTEM = "system"; +const std::string ChatMessage::ROLE_OBSERVATION = "observation"; + +void BaseTokenizer::check_chat_messages(const std::vector &messages) { + CHATGLM_CHECK(messages.size() % 2 == 1) << "invalid chat messages size " << messages.size(); + for (size_t i = 0; i < messages.size(); i++) { + const std::string &target_role = (i % 2 == 0) ? ChatMessage::ROLE_USER : ChatMessage::ROLE_ASSISTANT; + CHATGLM_CHECK(messages[i].role == target_role) + << "expect messages[" << i << "].role to be " << target_role << ", but got " << messages[i].role; + } +} + // Adapted from https://github.com/ggerganov/llama.cpp/blob/master/llama.cpp void ggml_graph_compute_helper(std::vector &buf, ggml_cgraph *graph, int n_threads) { struct ggml_cplan plan = ggml_graph_plan(graph, n_threads); @@ -192,6 +209,24 @@ void StreamerGroup::end() { } } +// reference: https://stackoverflow.com/questions/216823/how-to-trim-a-stdstring + +// trim from start (in place) +static inline void ltrim(std::string &s) { + s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); +} + +// trim from end (in place) +static inline void rtrim(std::string &s) { + s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), s.end()); +} + +// trim from both ends (in place) +static inline void trim(std::string &s) { + rtrim(s); + ltrim(s); +} + void TextStreamer::put(const std::vector &output_ids) { if (is_prompt_) { // skip prompt @@ -203,6 +238,9 @@ void TextStreamer::put(const std::vector &output_ids) { token_cache_.insert(token_cache_.end(), output_ids.begin(), output_ids.end()); std::string text = tokenizer_->decode(token_cache_); + if (is_first_line_) { + ltrim(text); + } if (text.empty()) { return; } @@ -211,6 +249,7 @@ void TextStreamer::put(const std::vector &output_ids) { if (text.back() == '\n') { // flush the cache after newline printable_text = text.substr(print_len_); + is_first_line_ = false; token_cache_.clear(); print_len_ = 0; } else if (std::find(puncts.begin(), puncts.end(), text.back()) != puncts.end()) { @@ -227,8 +266,12 @@ void TextStreamer::put(const std::vector &output_ids) { void TextStreamer::end() { std::string text = tokenizer_->decode(token_cache_); + if (is_first_line_) { + ltrim(text); + } os_ << text.substr(print_len_) << std::endl; is_prompt_ = true; + is_first_line_ = true; token_cache_.clear(); print_len_ = 0; } @@ -418,20 +461,20 @@ int get_default_num_threads() { std::string to_string(ModelType model_type) { switch (model_type) { - case MODEL_TYPE_CHATGLM: + case ModelType::CHATGLM: return "ChatGLM"; - case MODEL_TYPE_CHATGLM2: + case ModelType::CHATGLM2: return "ChatGLM2"; - case MODEL_TYPE_CHATGLM3: + case ModelType::CHATGLM3: return "ChatGLM3"; - case MODEL_TYPE_BAICHUAN7B: + case ModelType::BAICHUAN7B: return "Baichuan7B"; - case MODEL_TYPE_BAICHUAN13B: + case ModelType::BAICHUAN13B: return "Baichuan13B"; - case MODEL_TYPE_INTERNLM: + case ModelType::INTERNLM: return "InternLM"; default: - CHATGLM_THROW << "unknown model type " << model_type; + CHATGLM_THROW << "unknown model type " << (int)model_type; } } @@ -632,7 +675,9 @@ std::vector BaseModelForCausalLM::generate(const std::vector &input_id streamer->put({next_token_id}); } - if (next_token_id == config.eos_token_id) { + if (next_token_id == config.eos_token_id || + std::find(config.extra_eos_token_ids.begin(), config.extra_eos_token_ids.end(), next_token_id) != + config.extra_eos_token_ids.end()) { break; } } @@ -669,23 +714,23 @@ std::vector ChatGLMTokenizer::encode(const std::string &text, int max_lengt return ids; } -std::vector ChatGLMTokenizer::encode_history(const std::vector &history, int max_length) const { - std::string prompt = build_prompt(history); +std::vector ChatGLMTokenizer::encode_messages(const std::vector &messages, int max_length) const { + std::string prompt = build_prompt(messages); std::vector input_ids = encode(prompt, max_length); return input_ids; } -std::string ChatGLMTokenizer::build_prompt(const std::vector &history) { - CHATGLM_CHECK(history.size() % 2 == 1) << "invalid history size " << history.size(); +std::string ChatGLMTokenizer::build_prompt(const std::vector &messages) { + check_chat_messages(messages); std::ostringstream oss_prompt; - if (history.size() == 1) { - oss_prompt << history.front(); + if (messages.size() == 1) { + oss_prompt << messages.front().content; } else { - for (size_t i = 0; i < history.size(); i += 2) { - oss_prompt << "[Round " << i / 2 << "]\n问:" << history[i] << "\n答:"; - if (i < history.size() - 1) { - oss_prompt << history[i + 1] << "\n"; + for (size_t i = 0; i < messages.size(); i += 2) { + oss_prompt << "[Round " << i / 2 << "]\n问:" << messages[i].content << "\n答:"; + if (i + 1 < messages.size()) { + oss_prompt << messages[i + 1].content << "\n"; } } } @@ -909,20 +954,20 @@ std::string ChatGLM2Tokenizer::decode(const std::vector &ids) const { return text; } -std::vector ChatGLM2Tokenizer::encode_history(const std::vector &history, int max_length) const { - std::string prompt = build_prompt(history); +std::vector ChatGLM2Tokenizer::encode_messages(const std::vector &messages, int max_length) const { + std::string prompt = build_prompt(messages); std::vector input_ids = encode(prompt, max_length); return input_ids; } -std::string ChatGLM2Tokenizer::build_prompt(const std::vector &history) { - CHATGLM_CHECK(history.size() % 2 == 1) << "invalid history size " << history.size(); +std::string ChatGLM2Tokenizer::build_prompt(const std::vector &messages) { + check_chat_messages(messages); std::ostringstream oss_prompt; - for (size_t i = 0; i < history.size(); i += 2) { - oss_prompt << "[Round " << i / 2 + 1 << "]\n\n问:" << history[i] << "\n\n答:"; - if (i < history.size() - 1) { - oss_prompt << history[i + 1] << "\n\n"; + for (size_t i = 0; i < messages.size(); i += 2) { + oss_prompt << "[Round " << i / 2 + 1 << "]\n\n问:" << messages[i].content << "\n\n答:"; + if (i < messages.size() - 1) { + oss_prompt << messages[i + 1].content << "\n\n"; } } return oss_prompt.str(); @@ -1014,6 +1059,22 @@ ChatGLM3Tokenizer::ChatGLM3Tokenizer(std::string_view serialized_model_proto) { user_token_id = special_id++; assistant_token_id = special_id++; observation_token_id = special_id++; + + special_tokens = { + {"[MASK]", mask_token_id}, + {"[gMASK]", gmask_token_id}, + {"[sMASK]", smask_token_id}, + {"sop", sop_token_id}, + {"eop", eop_token_id}, + {"<|system|>", system_token_id}, + {"<|user|>", user_token_id}, + {"<|assistant|>", assistant_token_id}, + {"<|observation|>", observation_token_id}, + }; + + for (const auto &item : special_tokens) { + index_special_tokens[item.second] = item.first; + } } std::vector ChatGLM3Tokenizer::encode(const std::string &text, int max_length) const { @@ -1025,44 +1086,138 @@ std::vector ChatGLM3Tokenizer::encode(const std::string &text, int max_leng } std::string ChatGLM3Tokenizer::decode(const std::vector &ids) const { - // filter out special tokens - std::vector normal_ids(ids); - normal_ids.erase(std::remove_if(normal_ids.begin(), normal_ids.end(), [this](int id) { return is_special_id(id); }), - normal_ids.end()); + std::string text = decode_with_special_tokens(ids); + text = remove_special_tokens(text); + return text; +} - std::string text; - sp.Decode(normal_ids, &text); - text = replace_punctuations(text); +std::string ChatGLM3Tokenizer::decode_with_special_tokens(const std::vector &ids) const { + std::vector pieces; + for (int id : ids) { + auto pos = index_special_tokens.find(id); + if (pos != index_special_tokens.end()) { + // special tokens + pieces.emplace_back(pos->second); + } else { + // normal tokens + pieces.emplace_back(sp.IdToPiece(id)); + } + } + + std::string text = sp.DecodePieces(pieces); return text; } -std::vector ChatGLM3Tokenizer::encode_history(const std::vector &history, int max_length) const { - // TODO: need a new api for system / tools / metadata prompt +std::string ChatGLM3Tokenizer::remove_special_tokens(const std::string &text) { + std::string output = text; + static const std::vector special_token_regex{ + // std::regex(R"(<\|assistant\|> interpreter)"), + // std::regex(R"(<\|assistant\|> interpre)"), + std::regex(R"(<\|assistant\|>)"), + std::regex(R"(<\|user\|>)"), + std::regex(R"(<\|observation\|>)"), + }; + for (const auto &re : special_token_regex) { + output = std::regex_replace(output, re, ""); + } + return output; +} + +std::vector ChatGLM3Tokenizer::encode_single_message(const std::string &role, const std::string &content) const { + std::vector input_ids; + input_ids.emplace_back(get_command("<|" + role + "|>")); + // TODO: support metadata std::vector newline_ids; sp.Encode("\n", &newline_ids); + input_ids.insert(input_ids.end(), newline_ids.begin(), newline_ids.end()); + std::vector content_ids; + sp.Encode(content, &content_ids); + input_ids.insert(input_ids.end(), content_ids.begin(), content_ids.end()); + return input_ids; +} + +std::vector ChatGLM3Tokenizer::encode_messages(const std::vector &messages, int max_length) const { std::vector input_ids{gmask_token_id, sop_token_id}; - for (size_t i = 0; i < history.size(); i++) { - // TODO: support all roles - input_ids.emplace_back((i % 2 == 0) ? user_token_id : assistant_token_id); - // TODO: support metadata - input_ids.insert(input_ids.end(), newline_ids.begin(), newline_ids.end()); - std::vector content_ids; - sp.Encode(history[i], &content_ids); - input_ids.insert(input_ids.end(), content_ids.begin(), content_ids.end()); + for (const auto &msg : messages) { + auto msg_ids = encode_single_message(msg.role, msg.content); + input_ids.insert(input_ids.end(), msg_ids.begin(), msg_ids.end()); + + // encode code block into a separate message + if (!msg.tool_calls.empty() && msg.tool_calls.front().type == ToolCallMessage::TYPE_CODE) { + auto code_ids = encode_single_message(msg.role, msg.tool_calls.front().code.input); + input_ids.insert(input_ids.end(), code_ids.begin(), code_ids.end()); + } } input_ids.emplace_back(assistant_token_id); - // NOTE: push '\n' into input_ids to avoid model generating it, saving 2 tokens - input_ids.insert(input_ids.end(), newline_ids.begin(), newline_ids.end()); truncate(input_ids, max_length); return input_ids; } -bool ChatGLM3Tokenizer::is_special_id(int id) const { - return id == mask_token_id || id == gmask_token_id || id == smask_token_id || id == sop_token_id || - id == eop_token_id || id == system_token_id || id == user_token_id || id == assistant_token_id || - id == observation_token_id; +ChatMessage ChatGLM3Tokenizer::decode_message(const std::vector &ids) const { + ChatMessage message; + if (!ids.empty() && ids.back() == observation_token_id) { + // insert an <|assistant|> token before content to match possible interpreter delimiter + std::vector full_ids{assistant_token_id}; + full_ids.insert(full_ids.end(), ids.begin(), ids.end()); + + std::string output = decode_with_special_tokens(full_ids); + const std::string ci_delim = "<|assistant|> interpreter"; + size_t ci_pos = output.find(ci_delim); + if (ci_pos != std::string::npos) { + // code interpreter + std::string chat_output = output.substr(0, ci_pos); + chat_output = remove_special_tokens(chat_output); + trim(chat_output); + std::string code_output = output.substr(ci_pos + ci_delim.size()); + code_output = remove_special_tokens(code_output); + trim(code_output); + message = ChatMessage(ChatMessage::ROLE_ASSISTANT, std::move(chat_output), + {ToolCallMessage(CodeMessage(std::move(code_output)))}); + } else { + // tool call + output = remove_special_tokens(output); + + // parse tool name + std::string tool_name = "PARSE_ERROR"; + size_t pos = output.find('\n'); + if (pos != std::string::npos) { + // split tool name and args by 1st linebreak + tool_name = output.substr(0, pos); + trim(tool_name); + output.erase(0, pos + 1); + } + + // post process output + trim(output); + + // extract args + std::string tool_args = "PARSE_ERROR"; + static const std::regex args_regex(R"(```.*?\n(.*?)\n```)"); + std::smatch sm; + if (std::regex_search(output, sm, args_regex)) { + CHATGLM_CHECK(sm.size() == 2) << "unexpected regex match results"; + tool_args = sm[1]; + } + + message = ChatMessage(ChatMessage::ROLE_ASSISTANT, std::move(output), + {ToolCallMessage(FunctionMessage(std::move(tool_name), std::move(tool_args)))}); + } + } else { + // conversation + message = BaseTokenizer::decode_message(ids); + trim(message.content); // strip leading linebreak in conversation mode + } + return message; } +int ChatGLM3Tokenizer::get_command(const std::string &token) const { + auto pos = special_tokens.find(token); + CHATGLM_CHECK(pos != special_tokens.end()) << token << " is not a special token"; + return pos->second; +} + +bool ChatGLM3Tokenizer::is_special_id(int id) const { return index_special_tokens.count(id) > 0; } + void ChatGLM3Tokenizer::truncate(std::vector &ids, int max_length) { if ((int)ids.size() > max_length) { // sliding window: drop the least recent history while keeping the two special prefix tokens @@ -1095,18 +1250,14 @@ std::string BaichuanTokenizer::decode(const std::vector &ids) const { return text; } -std::vector BaichuanTokenizer::encode_history(const std::vector &history, int max_length) const { - CHATGLM_CHECK(history.size() % 2 == 1) << "invalid history size " << history.size(); +std::vector BaichuanTokenizer::encode_messages(const std::vector &messages, int max_length) const { + check_chat_messages(messages); std::vector ids; ids.reserve(max_length); - for (size_t i = 0; i < history.size(); i++) { - if (i % 2 == 0) { - ids.push_back(USER_TOKEN_ID); - } else { - ids.push_back(ASSISTANT_TOKEN_ID); - } - std::vector content_ids = encode(history[i], max_length); + for (const auto &msg : messages) { + ids.push_back((msg.role == ChatMessage::ROLE_USER) ? USER_TOKEN_ID : ASSISTANT_TOKEN_ID); + std::vector content_ids = encode(msg.content, max_length); ids.insert(ids.end(), content_ids.begin(), content_ids.end()); } ids.push_back(ASSISTANT_TOKEN_ID); @@ -1242,20 +1393,21 @@ std::string InternLMTokenizer::decode(const std::vector &ids) const { return text; } -std::vector InternLMTokenizer::encode_history(const std::vector &history, int max_length) const { - std::string prompt = build_prompt(history); +std::vector InternLMTokenizer::encode_messages(const std::vector &messages, int max_length) const { + std::string prompt = build_prompt(messages); std::vector input_ids = encode(prompt, max_length); return input_ids; } -std::string InternLMTokenizer::build_prompt(const std::vector &history) { - CHATGLM_CHECK(history.size() % 2 == 1) << "invalid history size " << history.size(); +std::string InternLMTokenizer::build_prompt(const std::vector &messages) { + check_chat_messages(messages); std::ostringstream oss_prompt; - for (size_t i = 0; i < history.size(); i += 2) { - oss_prompt << "<|User|>:" << history[i] << "\n<|Bot|>:"; - if (i < history.size() - 1) { - oss_prompt << history[i + 1] << "\n"; + for (const auto &msg : messages) { + if (msg.role == ChatMessage::ROLE_USER) { + oss_prompt << "<|User|>:" << msg.content << "\n<|Bot|>:"; + } else { + oss_prompt << msg.content << "\n"; } } return oss_prompt.str(); @@ -1324,7 +1476,7 @@ Pipeline::Pipeline(const std::string &path) { ModelType model_type = (ModelType)loader.read_basic(); // load version int version = loader.read_basic(); - if (model_type == MODEL_TYPE_CHATGLM) { + if (model_type == ModelType::CHATGLM) { CHATGLM_CHECK(version == 1) << "only support version 1 for now but got " << version; // load config @@ -1339,7 +1491,7 @@ Pipeline::Pipeline(const std::string &path) { // load model model = std::make_unique(config); model->load(loader); - } else if (model_type == MODEL_TYPE_CHATGLM2 || model_type == MODEL_TYPE_CHATGLM3) { + } else if (model_type == ModelType::CHATGLM2 || model_type == ModelType::CHATGLM3) { CHATGLM_CHECK(version == 1) << "only support version 1 for now but got " << version; // load config @@ -1350,17 +1502,19 @@ Pipeline::Pipeline(const std::string &path) { std::string_view serialized_model_proto((char *)mapped_file->data + loader.tell(), proto_size); loader.seek(proto_size, SEEK_CUR); - if (model_type == MODEL_TYPE_CHATGLM2) { + if (model_type == ModelType::CHATGLM2) { tokenizer = std::make_unique(serialized_model_proto); model = std::make_unique(config); } else { - tokenizer = std::make_unique(serialized_model_proto); + auto chatglm3_tokenizer = std::make_unique(serialized_model_proto); + config.extra_eos_token_ids = {chatglm3_tokenizer->observation_token_id, chatglm3_tokenizer->user_token_id}; + tokenizer = std::move(chatglm3_tokenizer); model = std::make_unique(config); } // load model model->load(loader); - } else if (model_type == MODEL_TYPE_BAICHUAN7B) { + } else if (model_type == ModelType::BAICHUAN7B) { CHATGLM_CHECK(version == 1) << "only support version 1 for now but got " << version; // load config @@ -1376,7 +1530,7 @@ Pipeline::Pipeline(const std::string &path) { // load model model = std::make_unique(config); model->load(loader); - } else if (model_type == MODEL_TYPE_BAICHUAN13B) { + } else if (model_type == ModelType::BAICHUAN13B) { CHATGLM_CHECK(version == 1) << "only support version 1 for now but got " << version; // load config @@ -1392,7 +1546,7 @@ Pipeline::Pipeline(const std::string &path) { // load model model = std::make_unique(config); model->load(loader); - } else if (model_type == MODEL_TYPE_INTERNLM) { + } else if (model_type == ModelType::INTERNLM) { CHATGLM_CHECK(version == 1) << "only support version 1 for now but got " << version; // load config @@ -1413,7 +1567,7 @@ Pipeline::Pipeline(const std::string &path) { } model->load(loader); } else { - CHATGLM_THROW << "invalid model type " << model_type; + CHATGLM_THROW << "invalid model type " << (int)model_type; } } @@ -1432,11 +1586,11 @@ std::string Pipeline::generate(const std::string &prompt, const GenerationConfig return output; } -std::string Pipeline::chat(const std::vector &history, const GenerationConfig &gen_config, +ChatMessage Pipeline::chat(const std::vector &messages, const GenerationConfig &gen_config, BaseStreamer *streamer) const { - std::vector input_ids = tokenizer->encode_history(history, gen_config.max_context_length); + std::vector input_ids = tokenizer->encode_messages(messages, gen_config.max_context_length); std::vector new_output_ids = generate(input_ids, gen_config, streamer); - std::string output = tokenizer->decode(new_output_ids); + ChatMessage output = tokenizer->decode_message(new_output_ids); return output; } diff --git a/chatglm.h b/chatglm.h index cf3562b2..2394e159 100644 --- a/chatglm.h +++ b/chatglm.h @@ -2,10 +2,10 @@ #include #include +#include #include #include #include -#include #ifdef GGML_USE_METAL #include @@ -46,13 +46,13 @@ ggml_tensor *tensor_to_device(ggml_tensor *tensor); ggml_tensor *tensor_to_cpu(ggml_tensor *tensor); -enum ModelType { - MODEL_TYPE_CHATGLM = 1, - MODEL_TYPE_CHATGLM2 = 2, - MODEL_TYPE_CHATGLM3 = 3, - MODEL_TYPE_BAICHUAN7B = 1024, - MODEL_TYPE_BAICHUAN13B = 1025, - MODEL_TYPE_INTERNLM = 1280, +enum class ModelType { + CHATGLM = 1, + CHATGLM2 = 2, + CHATGLM3 = 3, + BAICHUAN7B = 1024, + BAICHUAN13B = 1025, + INTERNLM = 1280, }; std::string to_string(ModelType model_type); @@ -87,21 +87,23 @@ class ModelConfig { ModelConfig(ModelType model_type, ggml_type dtype, int vocab_size, int hidden_size, int num_attention_heads, int num_kv_heads, int num_hidden_layers, int intermediate_size, float norm_eps, int max_length, - int bos_token_id, int eos_token_id, int pad_token_id, int sep_token_id) + int bos_token_id, int eos_token_id, int pad_token_id, int sep_token_id, + std::vector extra_eos_token_ids) : model_type(model_type), dtype(dtype), vocab_size(vocab_size), hidden_size(hidden_size), num_attention_heads(num_attention_heads), num_kv_heads(num_kv_heads), num_hidden_layers(num_hidden_layers), intermediate_size(intermediate_size), norm_eps(norm_eps), max_length(max_length), bos_token_id(bos_token_id), - eos_token_id(eos_token_id), pad_token_id(pad_token_id), sep_token_id(sep_token_id) {} + eos_token_id(eos_token_id), pad_token_id(pad_token_id), sep_token_id(sep_token_id), + extra_eos_token_ids(std::move(extra_eos_token_ids)) {} ModelConfig(ModelType model_type, const ConfigRecordV1 &rec) : ModelConfig(model_type, rec.dtype, rec.vocab_size, rec.hidden_size, rec.num_attention_heads, rec.num_attention_heads, rec.num_hidden_layers, rec.intermediate_size, 1e-5, rec.max_length, - rec.bos_token_id, rec.eos_token_id, rec.pad_token_id, rec.sep_token_id) {} + rec.bos_token_id, rec.eos_token_id, rec.pad_token_id, rec.sep_token_id, {}) {} ModelConfig(ModelType model_type, const ConfigRecordV2 &rec) : ModelConfig(model_type, rec.dtype, rec.vocab_size, rec.hidden_size, rec.num_attention_heads, rec.num_kv_heads, rec.num_hidden_layers, rec.intermediate_size, 1e-5, rec.max_length, rec.bos_token_id, - rec.eos_token_id, rec.pad_token_id, rec.sep_token_id) {} + rec.eos_token_id, rec.pad_token_id, rec.sep_token_id, {}) {} std::string model_type_name() const { return to_string(model_type); } @@ -120,14 +122,91 @@ class ModelConfig { int eos_token_id; int pad_token_id; int sep_token_id; + std::vector extra_eos_token_ids; +}; + +struct FunctionMessage { + std::string name; + std::string arguments; + + FunctionMessage() = default; + FunctionMessage(std::string name, std::string arguments) : name(std::move(name)), arguments(std::move(arguments)) {} + + friend std::ostream &operator<<(std::ostream &os, const FunctionMessage &self) { + return os << "FunctionMessage(name=" << std::quoted(self.name) << ", arguments=" << std::quoted(self.arguments) + << ")"; + } +}; + +struct CodeMessage { + std::string input; + + CodeMessage() = default; + CodeMessage(std::string input) : input(std::move(input)) {} + + friend std::ostream &operator<<(std::ostream &os, const CodeMessage &self) { + return os << "CodeMessage(input=" << std::quoted(self.input) << ")"; + } +}; + +struct ToolCallMessage { + std::string type; + FunctionMessage function; + CodeMessage code; + + static const std::string TYPE_FUNCTION; + static const std::string TYPE_CODE; + + ToolCallMessage(FunctionMessage function) : type(TYPE_FUNCTION), function(std::move(function)) {} + + ToolCallMessage(CodeMessage code) : type(TYPE_CODE), code(std::move(code)) {} + + friend std::ostream &operator<<(std::ostream &os, const ToolCallMessage &self) { + return os << "ToolCallMessage(type=" << std::quoted(self.type) << ", function=" << self.function + << ", code=" << self.code << ")"; + } +}; + +struct ChatMessage { + std::string role; + std::string content; + std::vector tool_calls; + + static const std::string ROLE_USER; + static const std::string ROLE_ASSISTANT; + static const std::string ROLE_SYSTEM; + static const std::string ROLE_OBSERVATION; + + ChatMessage() = default; + ChatMessage(std::string role, std::string content, std::vector tool_calls = {}) + : role(std::move(role)), content(std::move(content)), tool_calls(std::move(tool_calls)) {} + + friend std::ostream &operator<<(std::ostream &os, const ChatMessage &self) { + os << "ChatMessage(role=" << std::quoted(self.role) << ", content=" << std::quoted(self.content) + << ", tool_calls=["; + for (size_t i = 0; i < self.tool_calls.size(); i++) { + os << (i > 0 ? ", " : "") << self.tool_calls[i]; + } + return os << "])"; + } }; class BaseTokenizer { public: virtual ~BaseTokenizer() = default; + virtual std::vector encode(const std::string &text, int max_length) const = 0; + virtual std::string decode(const std::vector &ids) const = 0; - virtual std::vector encode_history(const std::vector &history, int max_length) const = 0; + + virtual std::vector encode_messages(const std::vector &messages, int max_length) const = 0; + + virtual ChatMessage decode_message(const std::vector &ids) const { + return {ChatMessage::ROLE_ASSISTANT, decode(ids)}; + } + + protected: + static void check_chat_messages(const std::vector &messages); }; struct ggml_context_deleter_t { @@ -237,20 +316,20 @@ class RMSNorm { float eps; }; -enum ActivationType { - ACT_TYPE_GELU, - ACT_TYPE_SILU, +enum class ActivationType { + GELU, + SILU, }; template static inline ggml_tensor *apply_activation_inplace(ggml_context *ctx, ggml_tensor *hidden_states) { - static_assert(ACT_TYPE == ACT_TYPE_GELU || ACT_TYPE == ACT_TYPE_SILU); - if constexpr (ACT_TYPE == ACT_TYPE_GELU) { + static_assert(ACT_TYPE == ActivationType::GELU || ACT_TYPE == ActivationType::SILU); + if constexpr (ACT_TYPE == ActivationType::GELU) { hidden_states = tensor_assign_buffers(ggml_gelu_inplace(ctx, hidden_states)); - } else if constexpr (ACT_TYPE == ACT_TYPE_SILU) { + } else if constexpr (ACT_TYPE == ActivationType::SILU) { hidden_states = tensor_assign_buffers(ggml_silu_inplace(ctx, hidden_states)); } else { - CHATGLM_THROW << "Unknown activation type " << ACT_TYPE; + CHATGLM_THROW << "Unknown activation type " << (int)ACT_TYPE; } return hidden_states; } @@ -650,7 +729,7 @@ class StreamerGroup : public BaseStreamer { class TextStreamer : public BaseStreamer { public: TextStreamer(std::ostream &os, BaseTokenizer *tokenizer) - : os_(os), tokenizer_(tokenizer), is_prompt_(true), print_len_(0) {} + : os_(os), tokenizer_(tokenizer), is_prompt_(true), is_first_line_(true), print_len_(0) {} void put(const std::vector &output_ids) override; void end() override; @@ -658,6 +737,7 @@ class TextStreamer : public BaseStreamer { std::ostream &os_; BaseTokenizer *tokenizer_; bool is_prompt_; + bool is_first_line_; std::vector token_cache_; int print_len_; }; @@ -870,9 +950,9 @@ class ChatGLMTokenizer : public BaseTokenizer { std::string decode(const std::vector &ids) const override; - std::vector encode_history(const std::vector &history, int max_length) const override; + std::vector encode_messages(const std::vector &messages, int max_length) const override; - static std::string build_prompt(const std::vector &history); + static std::string build_prompt(const std::vector &messages); private: static std::string preprocess(const std::string &text); @@ -894,7 +974,7 @@ struct GLMContextMasker { using GLMAttention = BasicAttention; -using GLMMLP = BasicMLP; +using GLMMLP = BasicMLP; // NOTE: disable inplace norm since it causes nonsense on cuda when sequence length >= 144 class GLMBlock : public BasicBlock { @@ -942,10 +1022,11 @@ class ChatGLM2Tokenizer : public BaseTokenizer { std::string decode(const std::vector &ids) const override; - std::vector encode_history(const std::vector &history, int max_length) const override; + std::vector encode_messages(const std::vector &messages, int max_length) const override; - static std::string build_prompt(const std::vector &history); + static std::string build_prompt(const std::vector &messages); + private: bool is_special_id(int id) const; public: @@ -959,7 +1040,7 @@ class ChatGLM2Tokenizer : public BaseTokenizer { using GLM2Attention = BasicAttention, false, CausalContextMasker>; -using GLM2MLP = BasicGLU; +using GLM2MLP = BasicGLU; using GLM2Block = BasicBlock; @@ -991,11 +1072,21 @@ class ChatGLM3Tokenizer : public BaseTokenizer { std::string decode(const std::vector &ids) const override; - std::vector encode_history(const std::vector &history, int max_length) const override; + std::vector encode_messages(const std::vector &messages, int max_length) const override; + + ChatMessage decode_message(const std::vector &ids) const override; + + private: + std::vector encode_single_message(const std::string &role, const std::string &content) const; + + std::string decode_with_special_tokens(const std::vector &ids) const; + + static std::string remove_special_tokens(const std::string &text); + + int get_command(const std::string &token) const; bool is_special_id(int id) const; - protected: static void truncate(std::vector &ids, int max_length); public: @@ -1009,6 +1100,8 @@ class ChatGLM3Tokenizer : public BaseTokenizer { int user_token_id; int assistant_token_id; int observation_token_id; + std::unordered_map special_tokens; + std::unordered_map index_special_tokens; }; using ChatGLM3Model = ChatGLM2Model; @@ -1025,11 +1118,11 @@ class BaichuanTokenizer : public BaseTokenizer { std::string decode(const std::vector &ids) const override; - std::vector encode_history(const std::vector &history, int max_length) const override; + std::vector encode_messages(const std::vector &messages, int max_length) const override; + private: bool is_special_id(int id) const; - protected: static void truncate(std::vector &ids, int max_length); public: @@ -1047,7 +1140,7 @@ class BaichuanTokenizer : public BaseTokenizer { using Baichuan7BAttention = BasicAttention, false, CausalContextMasker>; -using Baichuan7BMLP = BasicGLU; +using Baichuan7BMLP = BasicGLU; using Baichuan7BBlock = BasicBlock; @@ -1073,7 +1166,7 @@ class Baichuan7BForCausalLM : public BasicModelForCausalLM { using Baichuan13BAttention = BasicAttention; -using Baichuan13BMLP = BasicGLU; +using Baichuan13BMLP = BasicGLU; using Baichuan13BBlock = BasicBlock; @@ -1105,10 +1198,11 @@ class InternLMTokenizer : public BaseTokenizer { std::string decode(const std::vector &ids) const override; - std::vector encode_history(const std::vector &history, int max_length) const override; + std::vector encode_messages(const std::vector &messages, int max_length) const override; - static std::string build_prompt(const std::vector &history); + static std::string build_prompt(const std::vector &messages); + private: bool is_special_id(int id) const { return id == unk_token_id || id == bos_token_id || id == eos_token_id; } public: @@ -1121,7 +1215,7 @@ class InternLMTokenizer : public BaseTokenizer { using InternLM7BAttention = BasicAttention, false, CausalContextMasker>; -using InternLM7BMLP = BasicGLU; +using InternLM7BMLP = BasicGLU; using InternLM7BBlock = BasicBlock; @@ -1130,7 +1224,7 @@ using InternLM7BModel = BasicModel, false, CausalContextMasker>; -using InternLM20BMLP = BasicGLU; +using InternLM20BMLP = BasicGLU; using InternLM20BBlock = BasicBlock; @@ -1171,7 +1265,7 @@ class Pipeline { std::string generate(const std::string &prompt, const GenerationConfig &gen_config, BaseStreamer *streamer = nullptr) const; - std::string chat(const std::vector &history, const GenerationConfig &gen_config, + ChatMessage chat(const std::vector &messages, const GenerationConfig &gen_config, BaseStreamer *streamer = nullptr) const; public: diff --git a/chatglm_cpp/_C.pyi b/chatglm_cpp/_C.pyi new file mode 100644 index 00000000..20a5df80 --- /dev/null +++ b/chatglm_cpp/_C.pyi @@ -0,0 +1,193 @@ +""" +ChatGLM.cpp python binding +""" +from __future__ import annotations +import typing +__all__ = ['Baichuan13BForCausalLM', 'Baichuan7BForCausalLM', 'BaichuanTokenizer', 'BaseModelForCausalLM', 'BaseTokenizer', 'ChatGLM2ForCausalLM', 'ChatGLM2Tokenizer', 'ChatGLM3Tokenizer', 'ChatGLMForCausalLM', 'ChatGLMTokenizer', 'ChatMessage', 'CodeMessage', 'FunctionMessage', 'GenerationConfig', 'InternLM20BForCausalLM', 'InternLM7BForCausalLM', 'InternLMTokenizer', 'ModelConfig', 'ModelType', 'Pipeline', 'ToolCallMessage'] +class Baichuan13BForCausalLM(BaseModelForCausalLM): + pass +class Baichuan7BForCausalLM(BaseModelForCausalLM): + pass +class BaichuanTokenizer(BaseTokenizer): + pass +class BaseModelForCausalLM: + def generate_next_token(self, input_ids: list[int], gen_config: GenerationConfig, n_past: int, n_ctx: int) -> int: + ... + @property + def config(self) -> ModelConfig: + ... +class BaseTokenizer: + def decode(self, ids: list[int]) -> str: + ... + def decode_message(self, ids: list[int]) -> ChatMessage: + ... + def encode(self, text: str, max_length: int) -> list[int]: + ... + def encode_messages(self, messages: list[ChatMessage], max_length: int) -> list[int]: + ... +class ChatGLM2ForCausalLM(BaseModelForCausalLM): + pass +class ChatGLM2Tokenizer(BaseTokenizer): + pass +class ChatGLM3Tokenizer(BaseTokenizer): + pass +class ChatGLMForCausalLM(BaseModelForCausalLM): + pass +class ChatGLMTokenizer(BaseTokenizer): + pass +class ChatMessage: + ROLE_ASSISTANT: typing.ClassVar[str] = 'assistant' + ROLE_OBSERVATION: typing.ClassVar[str] = 'observation' + ROLE_SYSTEM: typing.ClassVar[str] = 'system' + ROLE_USER: typing.ClassVar[str] = 'user' + content: str + role: str + tool_calls: list[ToolCallMessage] + def __init__(self, role: str, content: str, tool_calls: list[ToolCallMessage] = []) -> None: + ... + def __repr__(self) -> str: + ... + def __str__(self) -> str: + ... +class CodeMessage: + input: str + def __repr__(self) -> str: + ... + def __str__(self) -> str: + ... +class FunctionMessage: + arguments: str + name: str + def __repr__(self) -> str: + ... + def __str__(self) -> str: + ... +class GenerationConfig: + do_sample: bool + max_context_length: int + max_length: int + num_threads: int + repetition_penalty: float + temperature: float + top_k: int + top_p: float + def __init__(self, max_length: int = 2048, max_context_length: int = 512, do_sample: bool = True, top_k: int = 0, top_p: float = 0.7, temperature: float = 0.95, repetition_penalty: float = 1.0, num_threads: int = 0) -> None: + ... +class InternLM20BForCausalLM(BaseModelForCausalLM): + pass +class InternLM7BForCausalLM(BaseModelForCausalLM): + pass +class InternLMTokenizer(BaseTokenizer): + pass +class ModelConfig: + @property + def bos_token_id(self) -> int: + ... + @property + def eos_token_id(self) -> int: + ... + @property + def extra_eos_token_ids(self) -> list[int]: + ... + @property + def hidden_size(self) -> int: + ... + @property + def intermediate_size(self) -> int: + ... + @property + def max_length(self) -> int: + ... + @property + def model_type(self) -> ModelType: + ... + @property + def model_type_name(self) -> str: + ... + @property + def norm_eps(self) -> float: + ... + @property + def num_attention_heads(self) -> int: + ... + @property + def num_hidden_layers(self) -> int: + ... + @property + def num_kv_heads(self) -> int: + ... + @property + def pad_token_id(self) -> int: + ... + @property + def sep_token_id(self) -> int: + ... + @property + def vocab_size(self) -> int: + ... +class ModelType: + """ + Members: + + CHATGLM + + CHATGLM2 + + CHATGLM3 + + BAICHUAN7B + + BAICHUAN13B + + INTERNLM + """ + BAICHUAN13B: typing.ClassVar[ModelType] # value = + BAICHUAN7B: typing.ClassVar[ModelType] # value = + CHATGLM: typing.ClassVar[ModelType] # value = + CHATGLM2: typing.ClassVar[ModelType] # value = + CHATGLM3: typing.ClassVar[ModelType] # value = + INTERNLM: typing.ClassVar[ModelType] # value = + __members__: typing.ClassVar[dict[str, ModelType]] # value = {'CHATGLM': , 'CHATGLM2': , 'CHATGLM3': , 'BAICHUAN7B': , 'BAICHUAN13B': , 'INTERNLM': } + def __eq__(self, other: typing.Any) -> bool: + ... + def __getstate__(self) -> int: + ... + def __hash__(self) -> int: + ... + def __index__(self) -> int: + ... + def __init__(self, value: int) -> None: + ... + def __int__(self) -> int: + ... + def __ne__(self, other: typing.Any) -> bool: + ... + def __repr__(self) -> str: + ... + def __setstate__(self, state: int) -> None: + ... + def __str__(self) -> str: + ... + @property + def name(self) -> str: + ... + @property + def value(self) -> int: + ... +class Pipeline: + def __init__(self, path: str) -> None: + ... + @property + def model(self) -> BaseModelForCausalLM: + ... + @property + def tokenizer(self) -> BaseTokenizer: + ... +class ToolCallMessage: + code: CodeMessage + function: FunctionMessage + type: str + def __repr__(self) -> str: + ... + def __str__(self) -> str: + ... diff --git a/chatglm_cpp/__init__.py b/chatglm_cpp/__init__.py index a1dc1836..d3938bd0 100644 --- a/chatglm_cpp/__init__.py +++ b/chatglm_cpp/__init__.py @@ -1,11 +1,29 @@ import tempfile -import warnings +from dataclasses import dataclass from pathlib import Path -from typing import Iterator, List, Optional, Union +from typing import Any, Dict, Iterator, List, Optional, Union import chatglm_cpp._C as _C +from chatglm_cpp._C import ChatMessage -__version__ = "0.2.10" +__version__ = "0.3.0" + + +@dataclass +class DeltaMessage: + role: str + content: str + token_ids: List[int] + + +def _ensure_chat_message(message: Union[ChatMessage, Dict[str, Any]]) -> ChatMessage: + if isinstance(message, ChatMessage): + chat_message = message + elif isinstance(message, dict): + chat_message = ChatMessage(**message) + else: + raise TypeError(f"expect message type to be ChatMessage or dict, but got {type(message)}") + return chat_message class Pipeline(_C.Pipeline): @@ -26,7 +44,7 @@ def __init__(self, model_path: str, *, dtype: Optional[str] = None) -> None: def chat( self, - history: List[str], + messages: List[ChatMessage], *, max_length: int = 2048, max_context_length: int = 512, @@ -37,10 +55,10 @@ def chat( repetition_penalty: float = 1.0, num_threads: int = 0, stream: bool = False, - ) -> Union[Iterator[str], str]: - input_ids = self.tokenizer.encode_history(history, max_context_length) - return self._generate( - input_ids=input_ids, + ) -> Union[Iterator[DeltaMessage], ChatMessage]: + messages = [_ensure_chat_message(msg) for msg in messages] + input_ids = self.tokenizer.encode_messages(messages, max_context_length) + gen_config = _C.GenerationConfig( max_length=max_length, max_context_length=max_context_length, do_sample=do_sample, @@ -49,8 +67,10 @@ def chat( temperature=temperature, repetition_penalty=repetition_penalty, num_threads=num_threads, - stream=stream, ) + if stream: + return self._stream_chat(input_ids=input_ids, gen_config=gen_config) + return self._sync_chat(input_ids=input_ids, gen_config=gen_config) def generate( self, @@ -67,33 +87,6 @@ def generate( stream: bool = False, ) -> Union[Iterator[str], str]: input_ids = self.tokenizer.encode(prompt, max_context_length) - return self._generate( - input_ids=input_ids, - max_length=max_length, - max_context_length=max_context_length, - do_sample=do_sample, - top_k=top_k, - top_p=top_p, - temperature=temperature, - repetition_penalty=repetition_penalty, - num_threads=num_threads, - stream=stream, - ) - - def _generate( - self, - input_ids: List[int], - *, - max_length: int = 2048, - max_context_length: int = 512, - do_sample: bool = True, - top_k: int = 0, - top_p: float = 0.7, - temperature: float = 0.95, - repetition_penalty: float = 1.0, - num_threads: int = 0, - stream: bool = False, - ) -> Union[Iterator[str], str]: gen_config = _C.GenerationConfig( max_length=max_length, max_context_length=max_context_length, @@ -104,83 +97,68 @@ def _generate( repetition_penalty=repetition_penalty, num_threads=num_threads, ) + if stream: + return self._stream_generate(input_ids=input_ids, gen_config=gen_config) + return self._sync_generate(input_ids=input_ids, gen_config=gen_config) - generate_fn = self._stream_generate if stream else self._sync_generate - return generate_fn(input_ids=input_ids, gen_config=gen_config) - - def _stream_generate(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> Iterator[str]: - input_ids = [x for x in input_ids] # make a copy + def _stream_generate_ids(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> Iterator[int]: + input_ids = input_ids.copy() n_past = 0 n_ctx = len(input_ids) - token_cache = [] - print_len = 0 while len(input_ids) < gen_config.max_length: next_token_id = self.model.generate_next_token(input_ids, gen_config, n_past, n_ctx) + yield next_token_id n_past = len(input_ids) input_ids.append(next_token_id) + if next_token_id in [self.model.config.eos_token_id, *self.model.config.extra_eos_token_ids]: + break + + def _stream_chat(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> Iterator[DeltaMessage]: + token_cache = [] + print_len = 0 + print_token_len = 0 + for next_token_id in self._stream_generate_ids(input_ids=input_ids, gen_config=gen_config): token_cache.append(next_token_id) output = self.tokenizer.decode(token_cache) if output.endswith("\n"): - yield output[print_len:] + yield DeltaMessage( + role=ChatMessage.ROLE_ASSISTANT, content=output[print_len:], token_ids=token_cache[print_token_len:] + ) token_cache = [] print_len = 0 + print_token_len = 0 elif output.endswith((",", "!", ":", ";", "?", "�")): pass else: - yield output[print_len:] + yield DeltaMessage( + role=ChatMessage.ROLE_ASSISTANT, content=output[print_len:], token_ids=token_cache[print_token_len:] + ) print_len = len(output) - - if next_token_id == self.model.config.eos_token_id: - break + print_token_len = len(token_cache) output = self.tokenizer.decode(token_cache) - yield output[print_len:] + yield DeltaMessage( + role=ChatMessage.ROLE_ASSISTANT, content=output[print_len:], token_ids=token_cache[print_token_len:] + ) - def _sync_generate(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> str: - input_ids = [x for x in input_ids] # make a copy - n_past = 0 - n_ctx = len(input_ids) + def _stream_generate(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> Iterator[str]: + for msg in self._stream_chat(input_ids=input_ids, gen_config=gen_config): + yield msg.content - while len(input_ids) < gen_config.max_length: - next_token_id = self.model.generate_next_token(input_ids, gen_config, n_past, n_ctx) - n_past = len(input_ids) - input_ids.append(next_token_id) - if next_token_id == self.model.config.eos_token_id: - break + def _sync_generate_ids(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> List[int]: + return list(self._stream_generate_ids(input_ids=input_ids, gen_config=gen_config)) - output = self.tokenizer.decode(input_ids[n_ctx:]) - return output + def _sync_generate(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> str: + output_ids = self._sync_generate_ids(input_ids=input_ids, gen_config=gen_config) + return self.tokenizer.decode(output_ids) - def stream_chat( - self, - history: List[str], - *, - max_length: int = 2048, - max_context_length: int = 512, - do_sample: bool = True, - top_k: int = 0, - top_p: float = 0.7, - temperature: float = 0.95, - repetition_penalty: float = 1.0, - num_threads: int = 0, - ) -> Iterator[str]: - warnings.warn( - "stream_chat is deprecated in favor of chat(..., stream=True), and will be removed in the next major version of chatglm-cpp", - DeprecationWarning, - stacklevel=2, - ) - return self.chat( - history=history, - max_length=max_length, - max_context_length=max_context_length, - do_sample=do_sample, - top_k=top_k, - top_p=top_p, - temperature=temperature, - repetition_penalty=repetition_penalty, - num_threads=num_threads, - stream=True, - ) + def _sync_chat(self, input_ids: List[int], gen_config: _C.GenerationConfig) -> ChatMessage: + output_ids = self._sync_generate_ids(input_ids=input_ids, gen_config=gen_config) + return self.tokenizer.decode_message(output_ids) + + def merge_streaming_messages(self, chunks: List[DeltaMessage]) -> ChatMessage: + output_ids = [x for chunk in chunks for x in chunk.token_ids] + return self.tokenizer.decode_message(output_ids) diff --git a/chatglm_cpp/convert.py b/chatglm_cpp/convert.py index 53d5f4c7..32275b98 100644 --- a/chatglm_cpp/convert.py +++ b/chatglm_cpp/convert.py @@ -25,7 +25,7 @@ if platform.system() == "Darwin": # cpm_kernels doesn't support macOS but transformers will check missing packages, so mock it - sys.modules["cpm_kernels"] = object() + sys.modules["cpm_kernels"] = object() # type: ignore class GGMLType(Enum): @@ -47,7 +47,7 @@ class ModelType(Enum): INTERNLM = 1280 -def quantize_q8_0(tensor: torch.Tensor) -> torch.CharTensor: +def quantize_q8_0(tensor: torch.Tensor) -> torch.Tensor: # equivalent to ggml_quantize_q8_0 in ggml.c assert tensor.shape[1] % GGML_QK8_0 == 0 tensor = tensor.view(-1, GGML_QK8_0) @@ -58,7 +58,7 @@ def quantize_q8_0(tensor: torch.Tensor) -> torch.CharTensor: return tensor -def quantize_q4_0(tensor: torch.Tensor) -> torch.CharTensor: +def quantize_q4_0(tensor: torch.Tensor) -> torch.Tensor: # equivalent to ggml_quantize_q4_0 in ggml.c assert tensor.shape[1] % GGML_QK4_0 == 0 tensor = tensor.view(-1, GGML_QK4_0) @@ -73,7 +73,7 @@ def quantize_q4_0(tensor: torch.Tensor) -> torch.CharTensor: return tensor -def quantize_q4_1(tensor: torch.Tensor) -> torch.CharTensor: +def quantize_q4_1(tensor: torch.Tensor) -> torch.Tensor: # equivalent to ggml_quantize_q4_1 in ggml.c assert tensor.shape[1] % GGML_QK4_1 == 0 tensor = tensor.view(-1, GGML_QK4_1) @@ -88,7 +88,7 @@ def quantize_q4_1(tensor: torch.Tensor) -> torch.CharTensor: return tensor -def quantize_q5_0(tensor: torch.Tensor) -> torch.CharTensor: +def quantize_q5_0(tensor: torch.Tensor) -> torch.Tensor: # equivalent to ggml_quantize_q5_0 in ggml.c assert tensor.shape[1] % GGML_QK5_0 == 0 tensor = tensor.view(-1, GGML_QK5_0) @@ -106,7 +106,7 @@ def quantize_q5_0(tensor: torch.Tensor) -> torch.CharTensor: return tensor -def quantize_q5_1(tensor: torch.Tensor) -> torch.CharTensor: +def quantize_q5_1(tensor: torch.Tensor) -> torch.Tensor: # equivalent to ggml_quantize_q5_1 in ggml.c assert tensor.shape[1] % GGML_QK5_1 == 0 tensor = tensor.view(-1, GGML_QK5_1) diff --git a/chatglm_cpp/langchain_api.py b/chatglm_cpp/langchain_api.py index 5cb19115..ceea5988 100644 --- a/chatglm_cpp/langchain_api.py +++ b/chatglm_cpp/langchain_api.py @@ -53,17 +53,27 @@ class ChatResponse(BaseModel): @app.post("/") async def chat(body: ChatRequest) -> ChatResponse: - chat_history = [msg for pair in body.history for msg in pair] + [body.prompt] - response = pipeline.chat( - chat_history, + messages = [] + for prompt, response in body.history: + messages += [ + chatglm_cpp.ChatMessage(role="user", content=prompt), + chatglm_cpp.ChatMessage(role="assistant", content=response), + ] + messages.append(chatglm_cpp.ChatMessage(role="user", content=body.prompt)) + + output = pipeline.chat( + messages, max_length=body.max_length, do_sample=body.temperature > 0, top_p=body.top_p, temperature=body.temperature, ) - history = body.history + [(body.prompt, response)] + history = body.history + [(body.prompt, output.content)] answer = ChatResponse( - response=response, history=history, status=status.HTTP_200_OK, time=datetime.now().strftime("%Y-%m-%d %H:%M:%S") + response=output.content, + history=history, + status=status.HTTP_200_OK, + time=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), ) - logging.info(f'prompt: "{body.prompt}", response: "{response}"') + logging.info(f'prompt: "{body.prompt}", response: "{output.content}"') return answer diff --git a/chatglm_cpp/openai_api.py b/chatglm_cpp/openai_api.py index fbda7e95..20976899 100644 --- a/chatglm_cpp/openai_api.py +++ b/chatglm_cpp/openai_api.py @@ -102,14 +102,14 @@ class ChatCompletionResponse(BaseModel): lock = asyncio.Lock() -def stream_chat(history, body): +def stream_chat(messages, body): yield ChatCompletionResponse( object="chat.completion.chunk", choices=[ChatCompletionResponseStreamChoice(delta=DeltaMessage(role="assistant"))], ) - for piece in pipeline.chat( - history, + for chunk in pipeline.chat( + messages=messages, max_length=body.max_tokens, do_sample=body.temperature > 0, top_p=body.top_p, @@ -119,7 +119,7 @@ def stream_chat(history, body): ): yield ChatCompletionResponse( object="chat.completion.chunk", - choices=[ChatCompletionResponseStreamChoice(delta=DeltaMessage(content=piece))], + choices=[ChatCompletionResponseStreamChoice(delta=DeltaMessage(content=chunk.content))], ) yield ChatCompletionResponse( @@ -144,31 +144,31 @@ async def stream_chat_event_publisher(history, body): @app.post("/v1/chat/completions") async def create_chat_completion(body: ChatCompletionRequest) -> ChatCompletionResponse: - # ignore system messages - history = [msg.content for msg in body.messages if msg.role != "system"] - if len(history) % 2 != 1: - raise HTTPException(status.HTTP_400_BAD_REQUEST, "invalid history size") + if not body.messages: + raise HTTPException(status.HTTP_400_BAD_REQUEST, "empty messages") + + messages = [chatglm_cpp.ChatMessage(role=msg.role, content=msg.content) for msg in body.messages] if body.stream: - generator = stream_chat_event_publisher(history, body) + generator = stream_chat_event_publisher(messages, body) return EventSourceResponse(generator) max_context_length = 512 output = pipeline.chat( - history=history, + messages=messages, max_length=body.max_tokens, max_context_length=max_context_length, do_sample=body.temperature > 0, top_p=body.top_p, temperature=body.temperature, ) - logging.info(f'prompt: "{history[-1]}", sync response: "{output}"') - prompt_tokens = len(pipeline.tokenizer.encode_history(history, max_context_length)) - completion_tokens = len(pipeline.tokenizer.encode(output, body.max_tokens)) + logging.info(f'prompt: "{messages[-1].content}", sync response: "{output.content}"') + prompt_tokens = len(pipeline.tokenizer.encode_messages(messages, max_context_length)) + completion_tokens = len(pipeline.tokenizer.encode(output.content, body.max_tokens)) return ChatCompletionResponse( object="chat.completion", - choices=[ChatCompletionResponseChoice(message=ChatMessage(role="assistant", content=output))], + choices=[ChatCompletionResponseChoice(message=ChatMessage(role="assistant", content=output.content))], usage=ChatCompletionUsage(prompt_tokens=prompt_tokens, completion_tokens=completion_tokens), ) diff --git a/chatglm_pybind.cpp b/chatglm_pybind.cpp index 2fcd7c7d..24749b8d 100644 --- a/chatglm_pybind.cpp +++ b/chatglm_pybind.cpp @@ -17,8 +17,8 @@ class PyBaseTokenizer : public BaseTokenizer { std::string decode(const std::vector &ids) const override { PYBIND11_OVERLOAD_PURE(std::string, BaseTokenizer, decode, ids); } - std::vector encode_history(const std::vector &history, int max_length) const override { - PYBIND11_OVERLOAD_PURE(std::vector, BaseTokenizer, encode_history, history, max_length); + std::vector encode_messages(const std::vector &history, int max_length) const override { + PYBIND11_OVERLOAD_PURE(std::vector, BaseTokenizer, encode_messages, history, max_length); } }; @@ -32,12 +32,27 @@ class PyBaseModelForCausalLM : public BaseModelForCausalLM { } }; +template +static inline std::string to_string(const T &obj) { + std::ostringstream oss; + oss << obj; + return oss.str(); +} + PYBIND11_MODULE(_C, m) { m.doc() = "ChatGLM.cpp python binding"; + py::enum_(m, "ModelType") + .value("CHATGLM", ModelType::CHATGLM) + .value("CHATGLM2", ModelType::CHATGLM2) + .value("CHATGLM3", ModelType::CHATGLM3) + .value("BAICHUAN7B", ModelType::BAICHUAN7B) + .value("BAICHUAN13B", ModelType::BAICHUAN13B) + .value("INTERNLM", ModelType::INTERNLM); + py::class_(m, "ModelConfig") .def_readonly("model_type", &ModelConfig::model_type) - .def_readonly("dtype", &ModelConfig::dtype) + // .def_readonly("dtype", &ModelConfig::dtype) .def_readonly("vocab_size", &ModelConfig::vocab_size) .def_readonly("hidden_size", &ModelConfig::hidden_size) .def_readonly("num_attention_heads", &ModelConfig::num_attention_heads) @@ -50,17 +65,9 @@ PYBIND11_MODULE(_C, m) { .def_readonly("eos_token_id", &ModelConfig::eos_token_id) .def_readonly("pad_token_id", &ModelConfig::pad_token_id) .def_readonly("sep_token_id", &ModelConfig::sep_token_id) + .def_readonly("extra_eos_token_ids", &ModelConfig::extra_eos_token_ids) .def_property_readonly("model_type_name", &ModelConfig::model_type_name); - py::class_(m, "BaseTokenizer") - .def("encode", &BaseTokenizer::encode) - .def("decode", &BaseTokenizer::decode) - .def("encode_history", &BaseTokenizer::encode_history); - - py::class_(m, "BaseModelForCausalLM") - .def("generate_next_token", &BaseModelForCausalLM::generate_next_token) - .def_readonly("config", &BaseModelForCausalLM::config); - py::class_(m, "GenerationConfig") .def(py::init(), "max_length"_a = 2048, "max_context_length"_a = 512, "do_sample"_a = true, "top_k"_a = 0, "top_p"_a = 0.7, "temperature"_a = 0.95, @@ -74,6 +81,48 @@ PYBIND11_MODULE(_C, m) { .def_readwrite("repetition_penalty", &GenerationConfig::repetition_penalty) .def_readwrite("num_threads", &GenerationConfig::num_threads); + py::class_(m, "FunctionMessage") + .def("__repr__", &to_string) + .def("__str__", &to_string) + .def_readwrite("name", &FunctionMessage::name) + .def_readwrite("arguments", &FunctionMessage::arguments); + + py::class_(m, "CodeMessage") + .def("__repr__", &to_string) + .def("__str__", &to_string) + .def_readwrite("input", &CodeMessage::input); + + py::class_(m, "ToolCallMessage") + .def("__repr__", &to_string) + .def("__str__", &to_string) + .def_readwrite("type", &ToolCallMessage::type) + .def_readwrite("function", &ToolCallMessage::function) + .def_readwrite("code", &ToolCallMessage::code); + + py::class_(m, "ChatMessage") + .def(py::init>(), "role"_a, "content"_a, + "tool_calls"_a = std::vector{}) + .def("__repr__", &to_string) + .def("__str__", &to_string) + .def_readonly_static("ROLE_SYSTEM", &ChatMessage::ROLE_SYSTEM) + .def_readonly_static("ROLE_USER", &ChatMessage::ROLE_USER) + .def_readonly_static("ROLE_ASSISTANT", &ChatMessage::ROLE_ASSISTANT) + .def_readonly_static("ROLE_OBSERVATION", &ChatMessage::ROLE_OBSERVATION) + .def_readwrite("role", &ChatMessage::role) + .def_readwrite("content", &ChatMessage::content) + .def_readwrite("tool_calls", &ChatMessage::tool_calls); + + py::class_(m, "BaseTokenizer") + .def("encode", &BaseTokenizer::encode, "text"_a, "max_length"_a) + .def("decode", &BaseTokenizer::decode, "ids"_a) + .def("encode_messages", &BaseTokenizer::encode_messages, "messages"_a, "max_length"_a) + .def("decode_message", &BaseTokenizer::decode_message, "ids"_a); + + py::class_(m, "BaseModelForCausalLM") + .def("generate_next_token", &BaseModelForCausalLM::generate_next_token, "input_ids"_a, "gen_config"_a, + "n_past"_a, "n_ctx"_a) + .def_readonly("config", &BaseModelForCausalLM::config); + // ===== ChatGLM ===== py::class_(m, "ChatGLMTokenizer"); @@ -109,7 +158,7 @@ PYBIND11_MODULE(_C, m) { // ===== Pipeline ==== py::class_(m, "Pipeline") - .def(py::init()) + .def(py::init(), "path"_a) .def_property_readonly("model", [](const Pipeline &self) { return self.model.get(); }) .def_property_readonly("tokenizer", [](const Pipeline &self) { return self.tokenizer.get(); }); } diff --git a/chatglm_test.cpp b/chatglm_test.cpp index 6df30289..03b8cd5d 100644 --- a/chatglm_test.cpp +++ b/chatglm_test.cpp @@ -1022,12 +1022,15 @@ TEST(Pipeline, ChatGLM) { // prompter { - EXPECT_EQ(ChatGLMTokenizer::build_prompt({"你好"}), "你好"); - EXPECT_EQ(ChatGLMTokenizer::build_prompt( - {"你好", "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。", - "晚上睡不着应该怎么办"}), - "[Round 0]\n问:你好\n答:你好👋!我是人工智能助手 " - "ChatGLM-6B,很高兴见到你,欢迎问我任何问题。\n[Round 1]\n问:晚上睡不着应该怎么办\n答:"); + EXPECT_EQ(ChatGLMTokenizer::build_prompt({{ChatMessage::ROLE_USER, "你好"}}), "你好"); + EXPECT_EQ( + ChatGLMTokenizer::build_prompt({ + {ChatMessage::ROLE_USER, "你好"}, + {ChatMessage::ROLE_ASSISTANT, "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"}, + {ChatMessage::ROLE_USER, "晚上睡不着应该怎么办"}, + }), + "[Round 0]\n问:你好\n答:你好👋!我是人工智能助手 " + "ChatGLM-6B,很高兴见到你,欢迎问我任何问题。\n[Round 1]\n问:晚上睡不着应该怎么办\n答:"); } // memory test @@ -1041,17 +1044,17 @@ TEST(Pipeline, ChatGLM) { for (int i = 0; i < gen_config.max_context_length; i++) { oss << "你好"; } - std::vector history{oss.str()}; - pipeline.chat(history, gen_config); + std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; + pipeline.chat(messages, gen_config); } // chat { GenerationConfig gen_config; gen_config.do_sample = false; - std::vector history{"你好"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"); + std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"); } } @@ -1083,12 +1086,15 @@ TEST(Pipeline, ChatGLM2) { // prompter { - EXPECT_EQ(ChatGLM2Tokenizer::build_prompt({"你好"}), "[Round 1]\n\n问:你好\n\n答:"); - EXPECT_EQ(ChatGLM2Tokenizer::build_prompt( - {"你好", "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。", - "晚上睡不着应该怎么办"}), - "[Round 1]\n\n问:你好\n\n答:你好👋!我是人工智能助手 " - "ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。\n\n[Round 2]\n\n问:晚上睡不着应该怎么办\n\n答:"); + EXPECT_EQ(ChatGLM2Tokenizer::build_prompt({{ChatMessage::ROLE_USER, "你好"}}), "[Round 1]\n\n问:你好\n\n答:"); + EXPECT_EQ( + ChatGLM2Tokenizer::build_prompt({ + {ChatMessage::ROLE_USER, "你好"}, + {ChatMessage::ROLE_ASSISTANT, "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。"}, + {ChatMessage::ROLE_USER, "晚上睡不着应该怎么办"}, + }), + "[Round 1]\n\n问:你好\n\n答:你好👋!我是人工智能助手 " + "ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。\n\n[Round 2]\n\n问:晚上睡不着应该怎么办\n\n答:"); } // memory test @@ -1102,20 +1108,25 @@ TEST(Pipeline, ChatGLM2) { for (int i = 0; i < gen_config.max_context_length; i++) { oss << "你好"; } - std::vector history{oss.str()}; - pipeline.chat(history, gen_config); + std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; + pipeline.chat(messages, gen_config); } // chat { GenerationConfig gen_config; gen_config.do_sample = false; - std::vector history{"你好"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。"); + std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。"); } } +static inline std::string read_text(const fs::path &path) { + MappedFile mapped_file(path.string()); + return std::string(mapped_file.data, mapped_file.size); +} + TEST(Pipeline, ChatGLM3) { fs::path model_path = fs::path(__FILE__).parent_path() / "chatglm3-ggml.bin"; if (!fs::exists(model_path)) { @@ -1124,29 +1135,62 @@ TEST(Pipeline, ChatGLM3) { Pipeline pipeline(model_path.string()); EXPECT_TRUE(dynamic_cast(pipeline.model.get())); + const std::string system_tool_call = + read_text(fs::path(__FILE__).parent_path() / "examples/system/function_call.txt"); + const std::string system_ci = read_text(fs::path(__FILE__).parent_path() / "examples/system/code_interpreter.txt"); + // tokenizer { - std::vector cases{{"你好", {64790, 64792, 36474, 54591}}}; - check_tokenizer(pipeline.tokenizer.get(), cases); - - { - std::vector history{"你好"}; - std::vector input_ids = pipeline.tokenizer->encode_history(history, 2048); - std::vector target_ids{64790, 64792, 64795, 30910, 13, 36474, 54591, 64796, 30910, 13}; - EXPECT_EQ(input_ids, target_ids); - } - { - std::vector history{"你好", - "你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。", - "晚上睡不着应该怎么办"}; - std::vector input_ids = pipeline.tokenizer->encode_history(history, 2048); - std::vector target_ids{64790, 64792, 64795, 30910, 13, 36474, 54591, 64796, 30910, 13, - 36474, 54591, 243, 162, 148, 142, 31404, 33030, 34797, 42481, - 22011, 10461, 30944, 30966, 30941, 30978, 30949, 31123, 48895, 35214, - 54622, 31123, 32616, 39905, 31901, 31639, 31155, 64795, 30910, 13, - 30910, 32820, 54266, 31876, 35153, 64796, 30910, 13}; - EXPECT_EQ(input_ids, target_ids); - } + std::vector target_ids{64790, 64792, 36474, 54591}; + std::vector input_ids = pipeline.tokenizer->encode("你好", 2048); + EXPECT_EQ(input_ids, target_ids); + } + { + std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; + std::vector input_ids = pipeline.tokenizer->encode_messages(messages, 2048); + std::vector target_ids{64790, 64792, 64795, 30910, 13, 36474, 54591, 64796}; + EXPECT_EQ(input_ids, target_ids); + } + { + std::vector messages{ + {ChatMessage::ROLE_USER, "你好"}, + {ChatMessage::ROLE_ASSISTANT, "你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。"}, + {ChatMessage::ROLE_USER, "晚上睡不着应该怎么办"}, + }; + std::vector input_ids = pipeline.tokenizer->encode_messages(messages, 2048); + std::vector target_ids{64790, 64792, 64795, 30910, 13, 36474, 54591, 64796, 30910, 13, 36474, 54591, + 243, 162, 148, 142, 31404, 33030, 34797, 42481, 22011, 10461, 30944, 30966, + 30941, 30978, 30949, 31123, 48895, 35214, 54622, 31123, 32616, 39905, 31901, 31639, + 31155, 64795, 30910, 13, 30910, 32820, 54266, 31876, 35153, 64796}; + EXPECT_EQ(input_ids, target_ids); + } + { + std::vector messages{ + {ChatMessage::ROLE_SYSTEM, system_tool_call}, + {ChatMessage::ROLE_USER, "生成一个随机数"}, + }; + std::vector input_ids = pipeline.tokenizer->encode_messages(messages, 2048); + std::vector target_ids{ + 64790, 64792, 64794, 30910, 13, 20115, 267, 1762, 2554, 362, 1077, 362, 344, 457, 30930, + 809, 431, 1675, 289, 267, 1762, 4159, 30954, 13, 30982, 13, 296, 30955, 16599, 30962, + 11228, 30962, 7311, 1306, 2932, 729, 13, 352, 30955, 2323, 2932, 449, 16599, 30962, 11228, + 30962, 7311, 1306, 1252, 13, 352, 30955, 16302, 2932, 449, 9398, 711, 260, 5402, 1276, + 1994, 30932, 268, 30930, 30912, 30930, 2288, 30995, 30940, 30996, 14819, 1994, 906, 2288, 30995, + 30939, 30996, 1252, 13, 352, 30955, 12209, 2932, 790, 13, 753, 30982, 13, 647, 30955, + 2323, 2932, 449, 24794, 1252, 13, 647, 30955, 16302, 2932, 449, 1036, 5402, 9352, 1050, + 422, 267, 17009, 1252, 13, 647, 30955, 3543, 2932, 449, 592, 1252, 13, 647, 30955, + 20379, 2932, 2033, 13, 753, 4143, 13, 753, 30982, 13, 647, 30955, 2323, 2932, 449, + 7855, 1252, 13, 647, 30955, 16302, 2932, 449, 1036, 2288, 290, 267, 7383, 3859, 1252, + 13, 647, 30955, 3543, 2932, 449, 30912, 16471, 30995, 592, 30932, 558, 30996, 1252, 13, + 647, 30955, 20379, 2932, 2033, 13, 753, 30983, 13, 352, 30996, 13, 296, 4143, 13, + 296, 30955, 752, 30962, 27564, 2932, 729, 13, 352, 30955, 2323, 2932, 449, 752, 30962, + 27564, 1252, 13, 352, 30955, 16302, 2932, 449, 4867, 267, 1465, 5100, 332, 4256, 17654, + 30962, 2323, 31040, 1252, 13, 352, 30955, 12209, 2932, 790, 13, 753, 30982, 13, 647, + 30955, 2323, 2932, 449, 17654, 30962, 2323, 1252, 13, 647, 30955, 16302, 2932, 449, 1036, + 1462, 290, 267, 1911, 289, 330, 580, 266, 819, 1252, 13, 647, 30955, 3543, 2932, + 449, 2069, 1252, 13, 647, 30955, 20379, 2932, 2033, 13, 753, 30983, 13, 352, 30996, + 13, 296, 30983, 13, 30983, 64795, 30910, 13, 30910, 36454, 31623, 37853, 54744, 64796}; + EXPECT_EQ(input_ids, target_ids); } // memory test @@ -1160,17 +1204,90 @@ TEST(Pipeline, ChatGLM3) { for (int i = 0; i < gen_config.max_context_length; i++) { oss << "你好"; } - std::vector history{oss.str()}; - pipeline.chat(history, gen_config); + std::vector messages{{ChatMessage::ROLE_USER, oss.str()}}; + pipeline.chat(messages, gen_config); } // chat { GenerationConfig gen_config; gen_config.do_sample = false; - std::vector history{"你好"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。"); + std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。"); + } + + // tool call + { + GenerationConfig gen_config; + gen_config.do_sample = false; + std::vector messages{ + {ChatMessage::ROLE_SYSTEM, system_tool_call}, + {ChatMessage::ROLE_USER, "生成一个随机数"}, + }; + { + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.role, ChatMessage::ROLE_ASSISTANT); + EXPECT_EQ(output.content, "```python\n" + "tool_call(seed=42, range=(0, 100))\n" + "```"); + messages.emplace_back(std::move(output)); + } + messages.emplace_back(ChatMessage::ROLE_OBSERVATION, "22"); + { + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.role, ChatMessage::ROLE_ASSISTANT); + EXPECT_EQ(output.content, "根据您的要求,我使用随机数生成器API生成了一个在0和100之间的随机数,结果为22。"); + } + } + + // code interpreter + { + GenerationConfig gen_config; + gen_config.do_sample = false; + std::vector messages{ + {ChatMessage::ROLE_SYSTEM, system_ci}, + {ChatMessage::ROLE_USER, "列出100以内的所有质数"}, + }; + { + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.role, ChatMessage::ROLE_ASSISTANT); + EXPECT_EQ(output.content, "好的,我会为您列出100以内的所有质数。\n\n质数是指只能被1和它本身整除的大于1" + "的整数。例如,2、3、5、7等都是质数。\n\n让我们开始吧!"); + EXPECT_EQ(output.tool_calls.front().code.input, R"(```python +def is_prime(n): + """Check if a number is prime.""" + if n <= 1: + return False + if n <= 3: + return True + if n % 2 == 0 or n % 3 == 0: + return False + i = 5 + while i * i <= n: + if n % i == 0 or n % (i + 2) == 0: + return False + i += 6 + return True + +# Get all prime numbers up to 100 +primes_upto_100 = [i for i in range(2, 101) if is_prime(i)] +primes_upto_100 +```)"); + messages.emplace_back(std::move(output)); + } + messages.emplace_back( + ChatMessage::ROLE_OBSERVATION, + "[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]"); + { + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.role, ChatMessage::ROLE_ASSISTANT); + EXPECT_EQ(output.content, R"(100以内的所有质数为: + +$$ +2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 +$$)"); + } } } @@ -1234,9 +1351,12 @@ TEST(Pipeline, Baichuan13B) { 1910, 73, 6011, 31169, 4315, 1766, 72, 1231, 11533, 31490, 31182, 21934}}}; check_tokenizer(pipeline.tokenizer.get(), cases); - std::vector history{"你好呀", "你好!很高兴和你交流。请问有什么我可以帮助你的吗?", - "你叫什么名字?"}; - std::vector input_ids = pipeline.tokenizer->encode_history(history, 2048); + std::vector messages{ + {ChatMessage::ROLE_USER, "你好呀"}, + {ChatMessage::ROLE_ASSISTANT, "你好!很高兴和你交流。请问有什么我可以帮助你的吗?"}, + {ChatMessage::ROLE_USER, "你叫什么名字?"}, + }; + std::vector input_ids = pipeline.tokenizer->encode_messages(messages, 2048); std::vector target_input_ids{195, 9875, 31213, 32889, 196, 9875, 31213, 74, 17318, 31906, 14822, 5536, 73, 20389, 7713, 31182, 1231, 4090, 2689, 31763, 75, 195, 9875, 32177, 1534, 10240, 75, 196}; @@ -1259,9 +1379,9 @@ TEST(Pipeline, Baichuan13B) { GenerationConfig gen_config; gen_config.do_sample = false; gen_config.repetition_penalty = 1.1; - std::vector history{"你好呀"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好!很高兴见到你。请问有什么我可以帮助你的吗?"); + std::vector messages{{ChatMessage::ROLE_USER, "你好呀"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好!很高兴见到你。请问有什么我可以帮助你的吗?"); } } @@ -1285,9 +1405,12 @@ TEST(Pipeline, Baichuan2_7B) { 2089, 23672, 1940, 1760, 66, 4173, 23181, 1754, 65, 65351, 39975, 14590}}}; check_tokenizer(pipeline.tokenizer.get(), cases); - std::vector history{"你好呀", "你好!很高兴和你交流。请问有什么问题我可以帮助你解决吗?", - "你叫什么名字?"}; - std::vector input_ids = pipeline.tokenizer->encode_history(history, 2048); + std::vector messages{ + {ChatMessage::ROLE_USER, "你好呀"}, + {ChatMessage::ROLE_ASSISTANT, "你好!很高兴和你交流。请问有什么问题我可以帮助你解决吗?"}, + {ChatMessage::ROLE_USER, "你叫什么名字?"}, + }; + std::vector input_ids = pipeline.tokenizer->encode_messages(messages, 2048); std::vector target_input_ids{195, 16829, 94278, 196, 16829, 67, 52160, 10329, 3341, 66, 23216, 5817, 1754, 92392, 21777, 92430, 2740, 93122, 68, 195, 92430, 93410, 1747, 6642, 68, 196}; @@ -1310,9 +1433,9 @@ TEST(Pipeline, Baichuan2_7B) { GenerationConfig gen_config; gen_config.do_sample = false; gen_config.repetition_penalty = 1.05; - std::vector history{"你好呀"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好!很高兴为你服务。请问有什么问题我可以帮助你解决?"); + std::vector messages{{ChatMessage::ROLE_USER, "你好呀"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好!很高兴为你服务。请问有什么问题我可以帮助你解决?"); } } @@ -1336,9 +1459,12 @@ TEST(Pipeline, Baichuan2_13B) { 2089, 23672, 1940, 1760, 66, 4173, 23181, 1754, 65, 65351, 39975, 14590}}}; check_tokenizer(pipeline.tokenizer.get(), cases); - std::vector history{"你好呀", "你好!很高兴和你交流。请问有什么我可以帮助你的吗?", - "你叫什么名字?"}; - std::vector input_ids = pipeline.tokenizer->encode_history(history, 2048); + std::vector messages{ + {ChatMessage::ROLE_USER, "你好呀"}, + {ChatMessage::ROLE_ASSISTANT, "你好!很高兴和你交流。请问有什么我可以帮助你的吗?"}, + {ChatMessage::ROLE_USER, "你叫什么名字?"}, + }; + std::vector input_ids = pipeline.tokenizer->encode_messages(messages, 2048); std::vector target_input_ids{195, 16829, 94278, 196, 16829, 67, 52160, 10329, 3341, 66, 23216, 5817, 92392, 21777, 2193, 93122, 68, 195, 92430, 93410, 1747, 6642, 68, 196}; EXPECT_TRUE(equal(input_ids, target_input_ids)); @@ -1349,9 +1475,9 @@ TEST(Pipeline, Baichuan2_13B) { GenerationConfig gen_config; gen_config.do_sample = false; gen_config.repetition_penalty = 1.05; - std::vector history{"你好呀"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好!很高兴见到你。请问有什么我可以帮助你的吗?"); + std::vector messages{{ChatMessage::ROLE_USER, "你好呀"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好!很高兴见到你。请问有什么我可以帮助你的吗?"); } } @@ -1378,8 +1504,12 @@ TEST(Pipeline, InternLM) { // prompter { - EXPECT_EQ(InternLMTokenizer::build_prompt({"你好"}), "<|User|>:你好\n<|Bot|>:"); - EXPECT_EQ(InternLMTokenizer::build_prompt({"你好", "你好,有什么我可以帮助你的吗?", "晚上睡不着应该怎么办"}), + EXPECT_EQ(InternLMTokenizer::build_prompt({{ChatMessage::ROLE_USER, "你好"}}), "<|User|>:你好\n<|Bot|>:"); + EXPECT_EQ(InternLMTokenizer::build_prompt({ + {ChatMessage::ROLE_USER, "你好"}, + {ChatMessage::ROLE_ASSISTANT, "你好,有什么我可以帮助你的吗?"}, + {ChatMessage::ROLE_USER, "晚上睡不着应该怎么办"}, + }), "<|User|>:你好\n<|Bot|>:你好,有什么我可以帮助你的吗?\n<|User|>:晚上睡不着应该怎么办" "\n<|Bot|>:"); } @@ -1399,9 +1529,9 @@ TEST(Pipeline, InternLM) { { GenerationConfig gen_config; gen_config.do_sample = false; - std::vector history{"你好"}; - std::string output = pipeline.chat(history, gen_config); - EXPECT_EQ(output, "你好,有什么我可以帮助你的吗?"); + std::vector messages{{ChatMessage::ROLE_USER, "你好"}}; + ChatMessage output = pipeline.chat(messages, gen_config); + EXPECT_EQ(output.content, "你好,有什么我可以帮助你的吗?"); } } @@ -1416,8 +1546,11 @@ static void run_benchmark(const fs::path &model_path) { int64_t load_model_ms = ggml_time_ms() - start_ms; start_ms = ggml_time_ms(); - std::vector history{"你好", "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。", - "晚上睡不着应该怎么办"}; + std::vector messages{ + {ChatMessage::ROLE_USER, "你好"}, + {ChatMessage::ROLE_ASSISTANT, "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"}, + {ChatMessage::ROLE_USER, "晚上睡不着应该怎么办"}, + }; GenerationConfig gen_config; gen_config.do_sample = false; @@ -1425,7 +1558,7 @@ static void run_benchmark(const fs::path &model_path) { PerfStreamer streamer; start_ms = ggml_time_ms(); - pipeline.chat(history, gen_config, &streamer); + pipeline.chat(messages, gen_config, &streamer); int64_t gen_s = (ggml_time_ms() - start_ms) / 1000.f; std::cout << "======== benchmark results for " << model_path.filename() << " ========\n" diff --git a/docs/code_interpreter.png b/docs/code_interpreter.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae1873cd7146178f3ba2dbd89d608eea49bea33 GIT binary patch literal 173176 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%0A^{0=PqpK{z!@kzpvnX#aTsmsZ){ot1Kc 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

OExEp(Nh6_Q&EhrQzrR9L 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�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 OS#na!l2zg+AN~&*KBl+; literal 0 HcmV?d00001 diff --git a/docs/function_call.png b/docs/function_call.png new file mode 100644 index 0000000000000000000000000000000000000000..91b29efdfeaa12d4191df49f0648cd128e222f97 GIT binary patch literal 147656 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 yrWz`8pVuM__IXs^?vdW8D+ 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 chatglm_cpp.Pipeline: + return chatglm_cpp.Pipeline(model_path) + + +class Message(chatglm_cpp.ChatMessage): + def __init__( + self, role: str, content: str, tool_calls: list | None = None, image: Image.Image | None = None + ) -> None: + if tool_calls is None: + tool_calls = [] + super().__init__(role, content, tool_calls) + self.image = image + + @staticmethod + def from_cpp(cpp_message: chatglm_cpp.ChatMessage) -> Message: + return Message( + role=cpp_message.role, content=cpp_message.content, tool_calls=cpp_message.tool_calls, image=None + ) + + +def show_message(message: Message) -> None: + role_avatars = {"user": "user", "observation": "user", "assistant": "assistant"} + avatar = role_avatars.get(message.role) + if avatar is None: + st.error(f"Unexpected message role {message.role}") + return + + display_content = message.content + if message.tool_calls: + (tool_call,) = message.tool_calls + if tool_call.type == "function": + display_content = f"{tool_call.function.name}\n{display_content}" + elif tool_call.type == "code": + display_content += "\n" + tool_call.code.input + + if message.role == "observation": + display_content = f"```\n{display_content.strip()}\n```" + + with st.chat_message(name=message.role, avatar=avatar): + if message.image: + st.image(message.image) + else: + st.markdown(display_content) + + +# ----- begin function call ----- + +_FUNCTION_REGISTRY = {} + + +def register_function(func: Callable) -> Callable: + _FUNCTION_REGISTRY[func.__name__] = func + + @functools.wraps(func) + def wrap(*args, **kwargs): + return func(*args, **kwargs) + + return wrap + + +@register_function +def random_number_generator(seed: int, range: tuple[int, int]) -> int: + import random + + return random.Random(seed).randint(*range) + + +@register_function +def get_weather(city_name: str) -> str: + import requests + + key_selection = { + "current_condition": ["temp_C", "FeelsLikeC", "humidity", "weatherDesc", "observation_time"], + } + resp = requests.get(f"https://wttr.in/{city_name}?format=j1") + resp.raise_for_status() + resp = resp.json() + + ret = {k: {_v: resp[k][0][_v] for _v in v} for k, v in key_selection.items()} + return json.dumps(ret) + + +def run_function(name: str, arguments: str) -> str: + def tool_call(**kwargs): + return kwargs + + func = _FUNCTION_REGISTRY.get(name) + if func is None: + return f"Function `{name}` is not defined" + + try: + kwargs = eval(arguments, dict(tool_call=tool_call)) + except Exception: + return f"Invalid arguments {arguments}" + + try: + return str(func(**kwargs)) + except Exception: + return traceback.format_exc() + + +# ----- end function call ----- + +# ----- begin code interpreter ----- + + +@st.cache_resource +def get_kernel_client(kernel_name) -> jupyter_client.BlockingKernelClient: + km = jupyter_client.KernelManager(kernel_name=kernel_name) + km.start_kernel() + + kc: jupyter_client.BlockingKernelClient = km.blocking_client() + kc.start_channels() + + return kc + + +def clean_ansi_codes(text: str) -> str: + ansi_escape = re.compile(r"(\x9B|\x1B\[|\u001b\[)[0-?]*[ -/]*[@-~]") + return ansi_escape.sub("", text) + + +def extract_code(text: str) -> str: + return re.search(r"```.*?\n(.*?)```", text, re.DOTALL)[1] + + +def run_code(kc: jupyter_client.BlockingKernelClient, code: str) -> str | Image.Image: + kc.execute(code) + + try: + shell_msg = kc.get_shell_msg(timeout=30) + io_msg_content = None + while True: + try: + next_io_msg_content = kc.get_iopub_msg(timeout=30)["content"] + except queue.Empty: + break + if next_io_msg_content.get("execution_state") == "idle": + break + io_msg_content = next_io_msg_content + + if shell_msg["metadata"]["status"] == "timeout": + return "Execution Timeout Expired" + + if shell_msg["metadata"]["status"] == "error": + try: + traceback_content = clean_ansi_codes(io_msg_content["traceback"][-1]) + except Exception: + traceback_content = "Traceback Error" + return traceback_content + + if "text" in io_msg_content: + return io_msg_content["text"] + + data_content = io_msg_content.get("data") + if data_content is not None: + image_content = data_content.get("image/png") + if image_content is not None: + return Image.open(io.BytesIO(base64.b64decode(image_content))) + + text_content = data_content.get("text/plain") + if text_content is not None: + return text_content + + return "" + + except Exception: + return traceback.format_exc() + + +# ----- end code interpreter ----- + + +def main(): + st.set_page_config(page_title="ChatGLM3 Demo", page_icon="🚀", layout="centered", initial_sidebar_state="auto") + + pipeline = get_model(MODEL_PATH) + + st.session_state.setdefault("messages", []) + + st.title("ChatGLM3 Demo") + + prompt = st.chat_input("Chat with ChatGLM3!", key="chat_input") + + mode = st.radio("Mode", [x.value for x in Mode], horizontal=True, label_visibility="hidden") + + DEFAULT_SYSTEM_PROMPT_MAP = { + Mode.CHAT: CHAT_SYSTEM_PROMPT, + Mode.TOOL: TOOL_SYSTEM_PROMPT, + Mode.CI: CI_SYSTEM_PROMPT, + } + default_system_prompt = DEFAULT_SYSTEM_PROMPT_MAP.get(mode) + if default_system_prompt is None: + st.error(f"Unexpected mode {mode}") + + with st.sidebar: + top_p = st.slider(label="Top P", min_value=0.0, max_value=1.0, value=0.8, step=0.01) + temperature = st.slider(label="Temperature", min_value=0.0, max_value=1.5, value=0.8, step=0.01) + max_length = st.slider(label="Max Length", min_value=128, max_value=2048, value=2048, step=16) + max_context_length = st.slider(label="Max Context Length", min_value=128, max_value=2048, value=1536, step=16) + system_prompt = st.text_area(label="System Prompt", value=default_system_prompt, height=300) + if st.button(label="Clear Context", type="primary"): + st.session_state.messages = [] + + messages: list[Message] = st.session_state.messages + + for msg in messages: + show_message(msg) + + if not prompt: + return + + prompt = prompt.strip() + messages.append(Message(role="user", content=prompt)) + show_message(messages[-1]) + + TOOL_CALL_MAX_RETRY = 5 + for _ in range(TOOL_CALL_MAX_RETRY): + messages_with_system = [] + if system_prompt: + messages_with_system.append(Message(role="system", content=system_prompt)) + messages_with_system += messages + + chunks = [] + response = "" + + with st.chat_message(name="assistant", avatar="assistant"): + message_placeholder = st.empty() + + for chunk in pipeline.chat( + messages_with_system, + max_length=max_length, + max_context_length=max_context_length, + do_sample=temperature > 0, + top_k=0, + top_p=top_p, + temperature=temperature, + repetition_penalty=1.0, + num_threads=0, + stream=True, + ): + response += chunk.content + chunks.append(chunk) + message_placeholder.markdown(response + "▌") + + message_placeholder.markdown(response) + + reply_message = Message.from_cpp(pipeline.merge_streaming_messages(chunks)) + messages.append(reply_message) + if not reply_message.tool_calls: + break + + (tool_call,) = reply_message.tool_calls + if tool_call.type == "function": + with st.spinner(f"Calling function `{tool_call.function.name}` ..."): + observation = run_function(tool_call.function.name, tool_call.function.arguments) + elif tool_call.type == "code": + kc = get_kernel_client(IPYKERNEL) + code = extract_code(tool_call.code.input) + with st.spinner(f"Executing code ..."): + observation = run_code(kc, code) + else: + st.error(f"Unexpected tool call type {tool_call.type}") + return + + OBSERVATION_MAX_LENGTH = 1024 + if isinstance(observation, str) and len(observation) > OBSERVATION_MAX_LENGTH: + observation = observation[:OBSERVATION_MAX_LENGTH] + " [TRUNCATED]" + + if isinstance(observation, str): + messages.append(Message(role="observation", content=observation)) + else: + messages.append(Message(role="observation", content="[IMAGE]", image=observation)) + show_message(messages[-1]) + + +if __name__ == "__main__": + main() diff --git a/examples/cli_chat.py b/examples/cli_demo.py similarity index 51% rename from examples/cli_chat.py rename to examples/cli_demo.py index c5cda138..1a07efaa 100644 --- a/examples/cli_chat.py +++ b/examples/cli_demo.py @@ -1,5 +1,6 @@ import argparse from pathlib import Path +from typing import List import chatglm_cpp @@ -18,11 +19,24 @@ WELCOME_MESSAGE = "Welcome to ChatGLM.cpp! Ask whatever you want. Type 'clear' to clear context. Type 'stop' to exit." -def main(): +def main() -> None: parser = argparse.ArgumentParser() - parser.add_argument("-m", "--model", default=DEFAULT_MODEL_PATH, type=Path, help="model path") + parser.add_argument("-m", "--model", default=DEFAULT_MODEL_PATH, type=str, help="model path") parser.add_argument("--mode", default="chat", type=str, choices=["chat", "generate"], help="inference mode") parser.add_argument("-p", "--prompt", default="你好", type=str, help="prompt to start generation with") + parser.add_argument( + "--pp", "--prompt_path", default=None, type=Path, help="path to the plain text file that stores the prompt" + ) + parser.add_argument( + "-s", "--system", default=None, type=str, help="system message to set the behavior of the assistant" + ) + parser.add_argument( + "--sp", + "--system_path", + default=None, + type=Path, + help="path to the plain text file that stores the system message", + ) parser.add_argument("-i", "--interactive", action="store_true", help="run in interactive mode") parser.add_argument( "-l", "--max_length", default=2048, type=int, help="max total length including prompt and output" @@ -35,6 +49,14 @@ def main(): parser.add_argument("-t", "--threads", default=0, type=int, help="number of threads for inference") args = parser.parse_args() + prompt = args.prompt + if args.pp: + prompt = args.pp.read_text() + + system = args.system + if args.sp: + system = args.sp.read_text() + pipeline = chatglm_cpp.Pipeline(args.model) if args.mode != "chat" and args.interactive: @@ -52,14 +74,20 @@ def main(): stream=True, ) + system_messages: List[chatglm_cpp.ChatMessage] = [] + if system is not None: + system_messages.append(chatglm_cpp.ChatMessage(role="system", content=system)) + + messages = system_messages.copy() + if not args.interactive: - generator = ( - pipeline.chat([args.prompt], **generation_kwargs) - if args.mode == "chat" - else pipeline.generate(args.prompt, **generation_kwargs) - ) - for piece in generator: - print(piece, sep="", end="", flush=True) + if args.mode == "chat": + messages.append(chatglm_cpp.ChatMessage(role="user", content=prompt)) + for chunk in pipeline.chat(messages, **generation_kwargs): + print(chunk.content, sep="", end="", flush=True) + else: + for chunk in pipeline.generate(prompt, **generation_kwargs): + print(chunk, sep="", end="", flush=True) print() return @@ -67,27 +95,52 @@ def main(): print() print(WELCOME_MESSAGE) print() - history = [] + + prompt_width = len(pipeline.model.config.model_type_name) + + if system: + print(f"{'System':{prompt_width}} > {system}") + while True: + if messages and messages[-1].tool_calls: + (tool_call,) = messages[-1].tool_calls + if tool_call.type == "function": + print( + f"Function Call > Please manually call function `{tool_call.function.name}` and provide the results below." + ) + input_prompt = "Observation > " + elif tool_call.type == "code": + print(f"Code Interpreter > Please manually run the code and provide the results below.") + input_prompt = "Observation > " + else: + raise ValueError(f"unexpected tool call type {tool_call.type}") + role = "observation" + else: + input_prompt = f"{'Prompt':{prompt_width}} > " + role = "user" + try: - prompt = input(f"{'Prompt':{len(pipeline.model.config.model_type_name)}} > ") + prompt = input(input_prompt) except EOFError: break + if not prompt: continue if prompt == "stop": break if prompt == "clear": - history = [] + messages = system_messages continue - history.append(prompt) + + messages.append(chatglm_cpp.ChatMessage(role=role, content=prompt)) print(f"{pipeline.model.config.model_type_name} > ", sep="", end="") - output = "" - for piece in pipeline.chat(history, **generation_kwargs): - print(piece, sep="", end="", flush=True) - output += piece + chunks = [] + for chunk in pipeline.chat(messages, **generation_kwargs): + print(chunk.content, sep="", end="", flush=True) + chunks.append(chunk) print() - history.append(output) + messages.append(pipeline.merge_streaming_messages(chunks)) + print("Bye") diff --git a/examples/langchain_openai_client.py b/examples/langchain_openai_client.py new file mode 100644 index 00000000..a06781ce --- /dev/null +++ b/examples/langchain_openai_client.py @@ -0,0 +1,4 @@ +from langchain.chat_models import ChatOpenAI + +chat_model = ChatOpenAI() +print(chat_model.predict(text="你好", max_tokens=2048)) diff --git a/examples/system/code_interpreter.txt b/examples/system/code_interpreter.txt new file mode 100644 index 00000000..7561ed20 --- /dev/null +++ b/examples/system/code_interpreter.txt @@ -0,0 +1 @@ +你是一位智能AI助手,你叫ChatGLM,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。 \ No newline at end of file diff --git a/examples/system/default.txt b/examples/system/default.txt new file mode 100644 index 00000000..2345cf50 --- /dev/null +++ b/examples/system/default.txt @@ -0,0 +1 @@ +You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown. \ No newline at end of file diff --git a/examples/system/function_call.txt b/examples/system/function_call.txt new file mode 100644 index 00000000..d25a10c7 --- /dev/null +++ b/examples/system/function_call.txt @@ -0,0 +1,33 @@ +Answer the following questions as best as you can. You have access to the following tools: +{ + "random_number_generator": { + "name": "random_number_generator", + "description": "Generates a random number x, s.t. range[0] <= x < range[1]", + "params": [ + { + "name": "seed", + "description": "The random seed used by the generator", + "type": "int", + "required": true + }, + { + "name": "range", + "description": "The range of the generated numbers", + "type": "tuple[int, int]", + "required": true + } + ] + }, + "get_weather": { + "name": "get_weather", + "description": "Get the current weather for `city_name`", + "params": [ + { + "name": "city_name", + "description": "The name of the city to be queried", + "type": "str", + "required": true + } + ] + } +} \ No newline at end of file diff --git a/examples/web_demo.py b/examples/web_demo.py index 54ab1b87..7fe74cdf 100644 --- a/examples/web_demo.py +++ b/examples/web_demo.py @@ -30,10 +30,9 @@ def postprocess(text): return text -def predict(input, chatbot, max_length, top_p, temperature, history): +def predict(input, chatbot, max_length, top_p, temperature, messages): chatbot.append((postprocess(input), "")) - response = "" - history.append(input) + messages.append(chatglm_cpp.ChatMessage(role="user", content=input)) generation_kwargs = dict( max_length=max_length, @@ -46,19 +45,23 @@ def predict(input, chatbot, max_length, top_p, temperature, history): num_threads=args.threads, stream=True, ) - generator = ( - pipeline.chat(history, **generation_kwargs) - if args.mode == "chat" - else pipeline.generate(input, **generation_kwargs) - ) - for response_piece in generator: - response += response_piece - chatbot[-1] = (chatbot[-1][0], postprocess(response)) - yield chatbot, history - - history.append(response) - yield chatbot, history + response = "" + if args.mode == "chat": + chunks = [] + for chunk in pipeline.chat(messages, **generation_kwargs): + response += chunk.content + chunks.append(chunk) + chatbot[-1] = (chatbot[-1][0], postprocess(response)) + yield chatbot, messages + messages.append(pipeline.merge_streaming_messages(chunks)) + else: + for chunk in pipeline.generate(input, **generation_kwargs): + response += chunk + chatbot[-1] = (chatbot[-1][0], postprocess(response)) + yield chatbot, messages + + yield chatbot, messages def reset_user_input(): @@ -83,13 +86,16 @@ def reset_state(): temperature = gr.Slider(0, 1, value=args.temp, step=0.01, label="Temperature", interactive=True) emptyBtn = gr.Button("Clear History") - history = gr.State([]) + messages = gr.State([]) submitBtn.click( - predict, [user_input, chatbot, max_length, top_p, temperature, history], [chatbot, history], show_progress=True + predict, + [user_input, chatbot, max_length, top_p, temperature, messages], + [chatbot, messages], + show_progress=True, ) submitBtn.click(reset_user_input, [], [user_input]) - emptyBtn.click(reset_state, outputs=[chatbot, history], show_progress=True) + emptyBtn.click(reset_state, outputs=[chatbot, messages], show_progress=True) demo.queue().launch(share=False, inbrowser=True) diff --git a/main.cpp b/main.cpp index cf305a71..e5bed73d 100644 --- a/main.cpp +++ b/main.cpp @@ -1,4 +1,5 @@ #include "chatglm.h" +#include #include #include @@ -23,7 +24,9 @@ static inline InferenceMode to_inference_mode(const std::string &s) { struct Args { std::string model_path = "chatglm-ggml.bin"; InferenceMode mode = INFERENCE_MODE_CHAT; + bool sync = false; std::string prompt = "你好"; + std::string system = ""; int max_length = 2048; int max_context_length = 512; bool interactive = false; @@ -42,7 +45,11 @@ static void usage(const std::string &prog) { << " -h, --help show this help message and exit\n" << " -m, --model PATH model path (default: chatglm-ggml.bin)\n" << " --mode inference mode chose from {chat, generate} (default: chat)\n" + << " --sync synchronized generation without streaming\n" << " -p, --prompt PROMPT prompt to start generation with (default: 你好)\n" + << " --pp, --prompt_path path to the plain text file that stores the prompt\n" + << " -s, --system SYSTEM system message to set the behavior of the assistant\n" + << " --sp, --system_path path to the plain text file that stores the system message\n" << " -i, --interactive run in interactive mode\n" << " -l, --max_length N max total length including prompt and output (default: 2048)\n" << " -c, --max_context_length N\n" @@ -55,42 +62,58 @@ static void usage(const std::string &prog) { << " -v, --verbose display verbose output including config/system/performance info\n"; } +static std::string read_text(std::string path) { + std::ifstream fin(path); + CHATGLM_CHECK(fin) << "cannot open file " << path; + std::ostringstream oss; + oss << fin.rdbuf(); + return oss.str(); +} + static Args parse_args(const std::vector &argv) { Args args; for (size_t i = 1; i < argv.size(); i++) { - const std::string &arg = argv[i]; + const std::string &arg = argv.at(i); if (arg == "-h" || arg == "--help") { - usage(argv[0]); + usage(argv.at(0)); exit(EXIT_SUCCESS); } else if (arg == "-m" || arg == "--model") { - args.model_path = argv[++i]; + args.model_path = argv.at(++i); } else if (arg == "--mode") { - args.mode = to_inference_mode(argv[++i]); + args.mode = to_inference_mode(argv.at(++i)); + } else if (arg == "--sync") { + args.sync = true; } else if (arg == "-p" || arg == "--prompt") { - args.prompt = argv[++i]; + args.prompt = argv.at(++i); + } else if (arg == "--pp" || arg == "--prompt_path") { + args.prompt = read_text(argv.at(++i)); + } else if (arg == "-s" || arg == "--system") { + args.system = argv.at(++i); + } else if (arg == "--sp" || arg == "--system_path") { + args.system = read_text(argv.at(++i)); } else if (arg == "-i" || arg == "--interactive") { args.interactive = true; } else if (arg == "-l" || arg == "--max_length") { - args.max_length = std::stoi(argv[++i]); + args.max_length = std::stoi(argv.at(++i)); } else if (arg == "-c" || arg == "--max_context_length") { - args.max_context_length = std::stoi(argv[++i]); + args.max_context_length = std::stoi(argv.at(++i)); } else if (arg == "--top_k") { - args.top_k = std::stoi(argv[++i]); + args.top_k = std::stoi(argv.at(++i)); } else if (arg == "--top_p") { - args.top_p = std::stof(argv[++i]); + args.top_p = std::stof(argv.at(++i)); } else if (arg == "--temp") { - args.temp = std::stof(argv[++i]); + args.temp = std::stof(argv.at(++i)); } else if (arg == "--repeat_penalty") { - args.repeat_penalty = std::stof(argv[++i]); + args.repeat_penalty = std::stof(argv.at(++i)); } else if (arg == "-t" || arg == "--threads") { - args.num_threads = std::stoi(argv[++i]); + args.num_threads = std::stoi(argv.at(++i)); } else if (arg == "-v" || arg == "--verbose") { args.verbose = true; } else { std::cerr << "Unknown argument: " << arg << std::endl; - usage(argv[0]); + usage(argv.at(0)); exit(EXIT_FAILURE); } } @@ -133,6 +156,13 @@ static bool get_utf8_line(std::string &line) { #endif } +static inline void print_message(const chatglm::ChatMessage &message) { + std::cout << message.content << "\n"; + if (!message.tool_calls.empty() && message.tool_calls.front().type == chatglm::ToolCallMessage::TYPE_CODE) { + std::cout << message.tool_calls.front().code.input << "\n"; + } +} + static void chat(Args &args) { ggml_time_init(); int64_t start_load_us = ggml_time_us(); @@ -143,8 +173,11 @@ static void chat(Args &args) { auto text_streamer = std::make_shared(std::cout, pipeline.tokenizer.get()); auto perf_streamer = std::make_shared(); - auto streamer = std::make_shared( - std::vector>{text_streamer, perf_streamer}); + std::vector> streamers{perf_streamer}; + if (!args.sync) { + streamers.emplace_back(text_streamer); + } + auto streamer = std::make_unique(std::move(streamers)); chatglm::GenerationConfig gen_config(args.max_length, args.max_context_length, args.temp > 0, args.top_k, args.top_p, args.temp, args.repeat_penalty, args.num_threads); @@ -172,6 +205,7 @@ static void chat(Args &args) { << "top_k = " << args.top_k << " | " << "top_p = " << args.top_p << " | " << "temperature = " << args.temp << " | " + << "repetition_penalty = " << args.repeat_penalty << " | " << "num_threads = " << args.num_threads << " |\n"; std::cout << "loaded " << pipeline.model->config.model_type_name() << " model from " << args.model_path @@ -185,6 +219,11 @@ static void chat(Args &args) { args.interactive = false; } + std::vector system_messages; + if (!args.system.empty()) { + system_messages.emplace_back(chatglm::ChatMessage::ROLE_SYSTEM, args.system); + } + if (args.interactive) { std::cout << R"( ________ __ ________ __ ___ )" << '\n' << R"( / ____/ /_ ____ _/ /_/ ____/ / / |/ /_________ ____ )" << '\n' @@ -198,10 +237,33 @@ static void chat(Args &args) { << "Welcome to ChatGLM.cpp! Ask whatever you want. Type 'clear' to clear context. Type 'stop' to exit.\n" << "\n"; - std::vector history; + std::vector messages = system_messages; + if (!args.system.empty()) { + std::cout << std::setw(model_name.size()) << std::left << "System" + << " > " << args.system << std::endl; + } while (1) { - std::cout << std::setw(model_name.size()) << std::left << "Prompt" - << " > " << std::flush; + std::string role; + if (!messages.empty() && !messages.back().tool_calls.empty()) { + const auto &tool_call = messages.back().tool_calls.front(); + if (tool_call.type == chatglm::ToolCallMessage::TYPE_FUNCTION) { + // function call + std::cout << "Function Call > Please manually call function `" << tool_call.function.name + << "` with args `" << tool_call.function.arguments << "` and provide the results below.\n" + << "Observation > " << std::flush; + } else if (tool_call.type == chatglm::ToolCallMessage::TYPE_CODE) { + // code interpreter + std::cout << "Code Interpreter > Please manually run the code and provide the results below.\n" + << "Observation > " << std::flush; + } else { + CHATGLM_THROW << "unexpected tool type " << tool_call.type; + } + role = chatglm::ChatMessage::ROLE_OBSERVATION; + } else { + std::cout << std::setw(model_name.size()) << std::left << "Prompt" + << " > " << std::flush; + role = chatglm::ChatMessage::ROLE_USER; + } std::string prompt; if (!get_utf8_line(prompt) || prompt == "stop") { break; @@ -210,13 +272,16 @@ static void chat(Args &args) { continue; } if (prompt == "clear") { - history.clear(); + messages = system_messages; continue; } - history.emplace_back(std::move(prompt)); + messages.emplace_back(std::move(role), std::move(prompt)); std::cout << model_name << " > "; - std::string output = pipeline.chat(history, gen_config, streamer.get()); - history.emplace_back(std::move(output)); + chatglm::ChatMessage output = pipeline.chat(messages, gen_config, streamer.get()); + if (args.sync) { + print_message(output); + } + messages.emplace_back(std::move(output)); if (args.verbose) { std::cout << "\n" << perf_streamer->to_string() << "\n\n"; } @@ -225,9 +290,17 @@ static void chat(Args &args) { std::cout << "Bye\n"; } else { if (args.mode == INFERENCE_MODE_CHAT) { - pipeline.chat({args.prompt}, gen_config, streamer.get()); + std::vector messages = system_messages; + messages.emplace_back(chatglm::ChatMessage::ROLE_USER, args.prompt); + chatglm::ChatMessage output = pipeline.chat(messages, gen_config, streamer.get()); + if (args.sync) { + print_message(output); + } } else { - pipeline.generate(args.prompt, gen_config, streamer.get()); + std::string output = pipeline.generate(args.prompt, gen_config, streamer.get()); + if (args.sync) { + std::cout << output << "\n"; + } } if (args.verbose) { std::cout << "\n" << perf_streamer->to_string() << "\n\n"; diff --git a/pyproject.toml b/pyproject.toml index 5dda0b29..fc442293 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,3 +39,8 @@ api = [ [project.urls] Homepage = "https://github.com/li-plus/chatglm.cpp" Repository = "https://github.com/li-plus/chatglm.cpp.git" + +# reference: https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#configuration-format +[tool.black] +line-length = 120 +include = '\.py$' diff --git a/tests/test_chatglm_cpp.py b/tests/test_chatglm_cpp.py index 29b2829c..ae1bb37a 100644 --- a/tests/test_chatglm_cpp.py +++ b/tests/test_chatglm_cpp.py @@ -20,58 +20,34 @@ def test_chatglm_version(): print(chatglm_cpp.__version__) -@pytest.mark.skipif(not CHATGLM_MODEL_PATH.exists(), reason="model file not found") -def test_chatglm_pipeline(): - history = ["你好"] - target = "你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。" +def check_pipeline(model_path, prompt, target, gen_kwargs={}): + messages = [chatglm_cpp.ChatMessage(role="user", content=prompt)] - pipeline = chatglm_cpp.Pipeline(CHATGLM_MODEL_PATH) - output = pipeline.chat(history, do_sample=False) + pipeline = chatglm_cpp.Pipeline(model_path) + output = pipeline.chat(messages, do_sample=False, **gen_kwargs).content assert output == target - stream_output = pipeline.stream_chat(history, do_sample=False) - stream_output = "".join(stream_output) + stream_output = pipeline.chat(messages, do_sample=False, stream=True, **gen_kwargs) + stream_output = "".join([msg.content for msg in stream_output]) + if model_path == CHATGLM3_MODEL_PATH: + # hack for ChatGLM3 + stream_output = stream_output.strip() assert stream_output == target - stream_output = pipeline.chat(history, do_sample=False, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + +@pytest.mark.skipif(not CHATGLM_MODEL_PATH.exists(), reason="model file not found") +def test_chatglm_pipeline(): + check_pipeline(model_path=CHATGLM_MODEL_PATH, prompt="你好", target="你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。") @pytest.mark.skipif(not CHATGLM2_MODEL_PATH.exists(), reason="model file not found") def test_chatglm2_pipeline(): - history = ["你好"] - target = "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。" - - pipeline = chatglm_cpp.Pipeline(CHATGLM2_MODEL_PATH) - output = pipeline.chat(history, do_sample=False) - assert output == target - - stream_output = pipeline.stream_chat(history, do_sample=False) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, do_sample=False, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline(model_path=CHATGLM2_MODEL_PATH, prompt="你好", target="你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。") @pytest.mark.skipif(not CHATGLM3_MODEL_PATH.exists(), reason="model file not found") def test_chatglm3_pipeline(): - history = ["你好"] - target = "你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。" - - pipeline = chatglm_cpp.Pipeline(CHATGLM3_MODEL_PATH) - output = pipeline.chat(history, do_sample=False) - assert output == target - - stream_output = pipeline.stream_chat(history, do_sample=False) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, do_sample=False, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline(model_path=CHATGLM3_MODEL_PATH, prompt="你好", target="你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。") @pytest.mark.skipif(not CODEGEEX2_MODEL_PATH.exists(), reason="model file not found") @@ -100,99 +76,39 @@ def bubble_sort(list): @pytest.mark.skipif(not BAICHUAN13B_MODEL_PATH.exists(), reason="model file not found") def test_baichuan13b_pipeline(): - history = ["你好呀"] - target = "你好!很高兴见到你。请问有什么我可以帮助你的吗?" - - gen_kwargs = dict(do_sample=False, repetition_penalty=1.1) - - pipeline = chatglm_cpp.Pipeline(BAICHUAN13B_MODEL_PATH) - output = pipeline.chat(history, **gen_kwargs) - assert output == target - - stream_output = pipeline.stream_chat(history, **gen_kwargs) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, **gen_kwargs, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline( + model_path=BAICHUAN13B_MODEL_PATH, + prompt="你好呀", + target="你好!很高兴见到你。请问有什么我可以帮助你的吗?", + gen_kwargs=dict(repetition_penalty=1.1), + ) @pytest.mark.skipif(not BAICHUAN2_7B_MODEL_PATH.exists(), reason="model file not found") def test_baichuan2_7b_pipeline(): - history = ["你好呀"] - target = "你好!很高兴为你服务。请问有什么问题我可以帮助你解决?" - - gen_kwargs = dict(do_sample=False, repetition_penalty=1.05) - - pipeline = chatglm_cpp.Pipeline(BAICHUAN2_7B_MODEL_PATH) - output = pipeline.chat(history, **gen_kwargs) - assert output == target - - stream_output = pipeline.stream_chat(history, **gen_kwargs) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, **gen_kwargs, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline( + model_path=BAICHUAN2_7B_MODEL_PATH, + prompt="你好呀", + target="你好!很高兴为你服务。请问有什么问题我可以帮助你解决?", + gen_kwargs=dict(repetition_penalty=1.05), + ) @pytest.mark.skipif(not BAICHUAN2_13B_MODEL_PATH.exists(), reason="model file not found") def test_baichuan2_13b_pipeline(): - history = ["你好呀"] - target = "你好!很高兴见到你。请问有什么我可以帮助你的吗?" - - gen_kwargs = dict(do_sample=False, repetition_penalty=1.05) - - pipeline = chatglm_cpp.Pipeline(BAICHUAN2_13B_MODEL_PATH) - output = pipeline.chat(history, **gen_kwargs) - assert output == target - - stream_output = pipeline.stream_chat(history, **gen_kwargs) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, **gen_kwargs, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline( + model_path=BAICHUAN2_13B_MODEL_PATH, + prompt="你好呀", + target="你好!很高兴见到你。请问有什么我可以帮助你的吗?", + gen_kwargs=dict(repetition_penalty=1.05), + ) @pytest.mark.skipif(not INTERNLM7B_MODEL_PATH.exists(), reason="model file not found") def test_internlm7b_pipeline(): - history = ["你好"] - target = "你好,有什么我可以帮助你的吗?" - - gen_kwargs = dict(do_sample=False) - - pipeline = chatglm_cpp.Pipeline(INTERNLM7B_MODEL_PATH) - output = pipeline.chat(history, **gen_kwargs) - assert output == target - - stream_output = pipeline.stream_chat(history, **gen_kwargs) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, **gen_kwargs, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline(model_path=INTERNLM7B_MODEL_PATH, prompt="你好", target="你好,有什么我可以帮助你的吗?") @pytest.mark.skipif(not INTERNLM20B_MODEL_PATH.exists(), reason="model file not found") def test_internlm20b_pipeline(): - history = ["你好"] - target = "你好!有什么我可以帮助你的吗?" - - gen_kwargs = dict(do_sample=False) - - pipeline = chatglm_cpp.Pipeline(INTERNLM20B_MODEL_PATH) - output = pipeline.chat(history, **gen_kwargs) - assert output == target - - stream_output = pipeline.stream_chat(history, **gen_kwargs) - stream_output = "".join(stream_output) - assert stream_output == target - - stream_output = pipeline.chat(history, **gen_kwargs, stream=True) - stream_output = "".join(stream_output) - assert stream_output == target + check_pipeline(model_path=INTERNLM20B_MODEL_PATH, prompt="你好", target="你好!有什么我可以帮助你的吗?")