From bde850362051e7793ca46a20a393838e280a6a74 Mon Sep 17 00:00:00 2001 From: "tuyang.yhj" Date: Sat, 13 May 2023 21:24:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=9C=8D=E5=8A=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pilot/configs/model_config.py | 4 +- pilot/conversation.py | 9 ++- pilot/model/inference.py | 90 ++++++++++++++++++++- pilot/prompts/first_conversation_prompt.py | 5 ++ pilot/server/llmserver.py | 9 +-- pilot/server/webserver.py | 56 ++++++++++--- plugins/DB-GPT-SQL-Execution-Plugin.zip | Bin 0 -> 50015 bytes plugins/Db-GPT-SimpleChart-Plugin.zip | Bin 69410 -> 69410 bytes 8 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 plugins/DB-GPT-SQL-Execution-Plugin.zip diff --git a/pilot/configs/model_config.py b/pilot/configs/model_config.py index fff4ad60d..81b390734 100644 --- a/pilot/configs/model_config.py +++ b/pilot/configs/model_config.py @@ -28,7 +28,7 @@ VECTOR_SEARCH_TOP_K = 3 LLM_MODEL = "vicuna-13b" LIMIT_MODEL_CONCURRENCY = 5 MAX_POSITION_EMBEDDINGS = 4096 -VICUNA_MODEL_SERVER = "http://121.41.167.183:8000" +VICUNA_MODEL_SERVER = "http://120.27.148.250:8000" # Load model config ISLOAD_8BIT = True @@ -37,7 +37,7 @@ ISDEBUG = False DB_SETTINGS = { "user": "root", - "password": "aa12345678", + "password": "aa123456", "host": "127.0.0.1", "port": 3306 } \ No newline at end of file diff --git a/pilot/conversation.py b/pilot/conversation.py index 5f76c814f..16e33534b 100644 --- a/pilot/conversation.py +++ b/pilot/conversation.py @@ -159,7 +159,9 @@ auto_dbgpt_one_shot = Conversation( 1. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember. 2. No user assistance 3. Exclusively use the commands listed in double quotes e.g. "command name" - + DBScheme: + + Commands: 1. analyze_code: Analyze Code, args: "code": "" 2. execute_python_file: Execute Python File, args: "filename": "" @@ -249,6 +251,11 @@ conv_qa_prompt_template = """ 基于以下已知的信息, 专业、详细的回 default_conversation = conv_one_shot +conversation_sql_mode ={ + "auto_execute_ai_response": "直接执行结果", + "dont_execute_ai_response": "不直接执行结果" +} + conversation_types = { "native": "LLM原生对话", "default_knownledge": "默认知识库对话", diff --git a/pilot/model/inference.py b/pilot/model/inference.py index c62b0e255..109fe7e98 100644 --- a/pilot/model/inference.py +++ b/pilot/model/inference.py @@ -69,11 +69,99 @@ def generate_stream(model, tokenizer, params, device, del past_key_values @torch.inference_mode() -def generate_output(model, tokenizer, params, device, context_len=2048, stream_interval=2): +def generate_output(model, tokenizer, params, device, context_len=4096, stream_interval=2): + """Fork from fastchat: https://github.com/lm-sys/FastChat/blob/main/fastchat/serve/inference.py """ + prompt = params["prompt"] + l_prompt = len(prompt) + temperature = float(params.get("temperature", 1.0)) + max_new_tokens = int(params.get("max_new_tokens", 2048)) + stop_parameter = params.get("stop", None) + + if stop_parameter == tokenizer.eos_token: + stop_parameter = None + stop_strings = [] + if isinstance(stop_parameter, str): + stop_strings.append(stop_parameter) + elif isinstance(stop_parameter, list): + stop_strings = stop_parameter + elif stop_parameter is None: + pass + else: + raise TypeError("Stop parameter must be string or list of strings.") + + + input_ids = tokenizer(prompt).input_ids + output_ids = list(input_ids) + + max_src_len = context_len - max_new_tokens - 8 + input_ids = input_ids[-max_src_len:] + + for i in range(max_new_tokens): + if i == 0: + out = model( + torch.as_tensor([input_ids], device=device), use_cache=True) + logits = out.logits + past_key_values = out.past_key_values + else: + attention_mask = torch.ones( + 1, past_key_values[0][0].shape[-2] + 1, device=device) + out = model(input_ids=torch.as_tensor([[token]], device=device), + use_cache=True, + attention_mask=attention_mask, + past_key_values=past_key_values) + logits = out.logits + past_key_values = out.past_key_values + + last_token_logits = logits[0][-1] + + if device == "mps": + # Switch to CPU by avoiding some bugs in mps backend. + last_token_logits = last_token_logits.float().to("cpu") + + if temperature < 1e-4: + token = int(torch.argmax(last_token_logits)) + else: + probs = torch.softmax(last_token_logits / temperature, dim=-1) + token = int(torch.multinomial(probs, num_samples=1)) + + output_ids.append(token) + + if token == tokenizer.eos_token_id: + stopped = True + else: + stopped = False + + + output = tokenizer.decode(output_ids, skip_special_tokens=True) + print("Partial output:", output) + for stop_str in stop_strings: + # print(f"Looking for '{stop_str}' in '{output[:l_prompt]}'#END") + pos = output.rfind(stop_str) + if pos != -1: + # print("Found stop str: ", output) + output = output[:pos] + # print("Trimmed output: ", output) + stopped = True + stop_word = stop_str + break + else: + pass + # print("Not found") + if stopped: + break + + del past_key_values + if pos != -1: + return output[:pos] + return output + +@torch.inference_mode() +def generate_output_ex(model, tokenizer, params, device, context_len=2048, stream_interval=2): prompt = params["prompt"] temperature = float(params.get("temperature", 1.0)) max_new_tokens = int(params.get("max_new_tokens", 2048)) stop_parameter = params.get("stop", None) + if stop_parameter == tokenizer.eos_token: stop_parameter = None stop_strings = [] diff --git a/pilot/prompts/first_conversation_prompt.py b/pilot/prompts/first_conversation_prompt.py index 9b9afc025..36c7d5c4d 100644 --- a/pilot/prompts/first_conversation_prompt.py +++ b/pilot/prompts/first_conversation_prompt.py @@ -39,6 +39,7 @@ class FirstPrompt: def construct_first_prompt( self, fisrt_message: [str]=[], + db_schemes: str=None, prompt_generator: Optional[PromptGenerator] = None ) -> str: """ @@ -88,6 +89,10 @@ class FirstPrompt: self.ai_goals = fisrt_message for i, goal in enumerate(self.ai_goals): full_prompt += f"{i+1}. {goal}\n" + if db_schemes: + full_prompt += f"DB SCHEME:\n\n" + full_prompt += f"{db_schemes}\n" + # if self.api_budget > 0.0: # full_prompt += f"\nIt takes money to let you run. Your API budget is ${self.api_budget:.3f}" self.prompt_generator = prompt_generator diff --git a/pilot/server/llmserver.py b/pilot/server/llmserver.py index 95781b69b..190571afe 100644 --- a/pilot/server/llmserver.py +++ b/pilot/server/llmserver.py @@ -93,14 +93,9 @@ async def api_generate_stream(request: Request): return StreamingResponse(generator, background=background_tasks) @app.post("/generate") -def generate(prompt_request: PromptRequest): - params = { - "prompt": prompt_request.prompt, - "temperature": prompt_request.temperature, - "max_new_tokens": prompt_request.max_new_tokens, - "stop": prompt_request.stop - } +def generate(prompt_request: Request): + params = request.json() print("Receive prompt: ", params["prompt"]) output = generate_output(model, tokenizer, params, DEVICE) print("Output: ", output) diff --git a/pilot/server/webserver.py b/pilot/server/webserver.py index f394bd9e7..40d96b1ef 100644 --- a/pilot/server/webserver.py +++ b/pilot/server/webserver.py @@ -21,11 +21,15 @@ from pilot.plugins import scan_plugins from pilot.configs.config import Config from pilot.commands.command_mange import CommandRegistry from pilot.prompts.first_conversation_prompt import FirstPrompt +from pilot.prompts.generator import PromptGenerator + +from pilot.commands.exception_not_commands import NotCommands from pilot.conversation import ( default_conversation, conv_templates, conversation_types, + conversation_sql_mode, SeparatorStyle ) @@ -152,11 +156,13 @@ def post_process_code(code): code = sep.join(blocks) return code -def http_bot(state, mode, db_selector, temperature, max_new_tokens, request: gr.Request): - - # MOCk - autogpt = True +def http_bot(state, mode, sql_mode, db_selector, temperature, max_new_tokens, request: gr.Request): + if sql_mode == conversation_sql_mode["auto_execute_ai_response"]: + print("AUTO DB-GPT模式.") + if sql_mode == conversation_sql_mode["dont_execute_ai_response"]: + print("标准DB-GPT模式.") print("是否是AUTO-GPT模式.", autogpt) + start_tstamp = time.time() model_name = LLM_MODEL @@ -167,17 +173,18 @@ def http_bot(state, mode, db_selector, temperature, max_new_tokens, request: gr. yield (state, state.to_gradio_chatbot()) + (no_change_btn,) * 5 return + cfg = Config() + first_prompt = FirstPrompt() + # TODO when tab mode is AUTO_GPT, Prompt need to rebuild. if len(state.messages) == state.offset + 2: query = state.messages[-2][1] # 第一轮对话需要加入提示Prompt - cfg = Config() - first_prompt = FirstPrompt() first_prompt.command_registry = cfg.command_registry - if(autogpt): + if sql_mode == conversation_sql_mode["auto_execute_ai_response"]: # autogpt模式的第一轮对话需要 构建专属prompt - system_prompt = first_prompt.construct_first_prompt(fisrt_message=[query]) + system_prompt = first_prompt.construct_first_prompt(fisrt_message=[query], db_schemes= gen_sqlgen_conversation(dbname)) logger.info("[TEST]:" + system_prompt) template_name = "auto_dbgpt_one_shot" new_state = conv_templates[template_name].copy() @@ -218,7 +225,13 @@ def http_bot(state, mode, db_selector, temperature, max_new_tokens, request: gr. "stop": state.sep if state.sep_style == SeparatorStyle.SINGLE else state.sep2, } logger.info(f"Requert: \n{payload}") + if sql_mode == conversation_sql_mode["auto_execute_ai_response"]: + auto_db_gpt_response(first_prompt.prompt_generator, payload) + else: + stream_ai_response(payload) +def stream_ai_response(payload): + # 流式输出 state.messages[-1][-1] = "▌" yield (state, state.to_gradio_chatbot()) + (disable_btn,) * 5 @@ -264,6 +277,18 @@ def http_bot(state, mode, db_selector, temperature, max_new_tokens, request: gr. } fout.write(json.dumps(data) + "\n") + +def auto_db_gpt_response( prompt: PromptGenerator, payload)->str: + response = requests.post(urljoin(VICUNA_MODEL_SERVER, "generate"), + headers=headers, json=payload, timeout=30) + print(response) + try: + plugin_resp = execute_ai_response_json(prompt, response) + print(plugin_resp) + except NotCommands as e: + print(str(e)) + return "auto_db_gpt_response!" + block_css = ( code_highlight_css + """ @@ -280,6 +305,12 @@ block_css = ( """ ) +def change_sql_mode(sql_mode): + if sql_mode in ["直接执行结果"]: + return gr.update(visible=True) + else: + return gr.update(visible=False) + def change_mode(mode): if mode in ["默认知识库对话", "LLM原生对话"]: return gr.update(visible=False) @@ -325,6 +356,9 @@ def build_single_model_ui(): tabs= gr.Tabs() with tabs: tab_sql = gr.TabItem("SQL生成与诊断", elem_id="SQL") + sql_mode = gr.Radio(["直接执行结果", "不执行结果"], show_label=False, value="不执行结果") + sql_vs_setting = gr.Markdown("自动执行模式下, DB-GPT可以具备执行SQL、从网络读取知识自动化存储学习的能力") + sql_mode.change(fn=change_sql_mode, inputs=sql_mode, outputs=sql_vs_setting) with tab_sql: # TODO A selector to choose database with gr.Row(elem_id="db_selector"): @@ -383,7 +417,7 @@ def build_single_model_ui(): btn_list = [regenerate_btn, clear_btn] regenerate_btn.click(regenerate, state, [state, chatbot, textbox] + btn_list).then( http_bot, - [state, mode, db_selector, temperature, max_output_tokens], + [state, mode, sql_mode, db_selector, temperature, max_output_tokens], [state, chatbot] + btn_list, ) clear_btn.click(clear_history, None, [state, chatbot, textbox] + btn_list) @@ -392,7 +426,7 @@ def build_single_model_ui(): add_text, [state, textbox], [state, chatbot, textbox] + btn_list ).then( http_bot, - [state, mode, db_selector, temperature, max_output_tokens], + [state, mode, sql_mode, db_selector, temperature, max_output_tokens], [state, chatbot] + btn_list, ) @@ -400,7 +434,7 @@ def build_single_model_ui(): add_text, [state, textbox], [state, chatbot, textbox] + btn_list ).then( http_bot, - [state, mode, db_selector, temperature, max_output_tokens], + [state, mode, sql_mode, db_selector, temperature, max_output_tokens], [state, chatbot] + btn_list ) diff --git a/plugins/DB-GPT-SQL-Execution-Plugin.zip b/plugins/DB-GPT-SQL-Execution-Plugin.zip new file mode 100644 index 0000000000000000000000000000000000000000..5327a35140695df9e4972430ce5c94b249b60d73 GIT binary patch literal 50015 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 ZZ+id=_%;d*Oc?mz4gpXLB@6WJe*uI=_2&Qp literal 0 HcmV?d00001 diff --git a/plugins/Db-GPT-SimpleChart-Plugin.zip b/plugins/Db-GPT-SimpleChart-Plugin.zip index 03d995339313799315ce5f5f8a424d83fde76d00..5cdb06a5759c6c0962d1934073a7aaf51711aaf2 100644 GIT binary patch delta 424 zcmZ29k7dz3mJOw>%+HwPH&?Jq8Zq}pubn)_+>HAUb9@R=Fa=0Y{un5=`MtRYEAw3- z=iqyh&3d*hTws-^?#^J94iRx6m7AO0i~QiKc&4c{!Z}{kO%a@FGZG;jMkbNXe6y07 zLCQ9l%q=vBtN(Ll23Qnq-|8DuaLtqN+&m3d74So3^1fR$;5u?|ujT;xV{+qDh0WGa z4zPh;`0teqieDbSli8g4I+O)$f}tKpnq2#(71 zIc$tAV3~z46s9|~Gj@VF)6cUr&W5Y+90{@u delta 440 zcmZ29k7dz3mJOw>%d{TYW*NJ*1-6TFGxD+k05(6mBme*a