From 627d739720c449e2ff75db5575250864b61c86d5 Mon Sep 17 00:00:00 2001 From: binary-husky Date: Sat, 13 Jan 2024 22:33:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=85=A5=E7=81=AB=E5=B1=B1=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E5=A4=A7=E6=A8=A1=E5=9E=8B=E7=9A=84=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.py | 6 +++ request_llms/bridge_all.py | 17 ++++++ request_llms/bridge_skylark2.py | 67 +++++++++++++++++++++++ request_llms/com_skylark2api.py | 95 +++++++++++++++++++++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 request_llms/bridge_skylark2.py create mode 100644 request_llms/com_skylark2api.py diff --git a/config.py b/config.py index c202ca0d..d96420ab 100644 --- a/config.py +++ b/config.py @@ -198,6 +198,12 @@ ZHIPUAI_API_KEY = "" ZHIPUAI_MODEL = "chatglm_turbo" +# # 火山引擎YUNQUE大模型 +# YUNQUE_SECRET_KEY = "" +# YUNQUE_ACCESS_KEY = "" +# YUNQUE_MODEL = "" + + # Claude API KEY ANTHROPIC_API_KEY = "" diff --git a/request_llms/bridge_all.py b/request_llms/bridge_all.py index b96d60fa..c19691e8 100644 --- a/request_llms/bridge_all.py +++ b/request_llms/bridge_all.py @@ -594,6 +594,23 @@ if "deepseekcoder" in AVAIL_LLM_MODELS: # deepseekcoder }) except: print(trimmed_format_exc()) +# if "skylark" in AVAIL_LLM_MODELS: +# try: +# from .bridge_skylark2 import predict_no_ui_long_connection as skylark_noui +# from .bridge_skylark2 import predict as skylark_ui +# model_info.update({ +# "skylark": { +# "fn_with_ui": skylark_ui, +# "fn_without_ui": skylark_noui, +# "endpoint": None, +# "max_token": 4096, +# "tokenizer": tokenizer_gpt35, +# "token_cnt": get_token_num_gpt35, +# } +# }) +# except: +# print(trimmed_format_exc()) + # <-- 用于定义和切换多个azure模型 --> AZURE_CFG_ARRAY = get_conf("AZURE_CFG_ARRAY") diff --git a/request_llms/bridge_skylark2.py b/request_llms/bridge_skylark2.py new file mode 100644 index 00000000..8f10b839 --- /dev/null +++ b/request_llms/bridge_skylark2.py @@ -0,0 +1,67 @@ +import time +from toolbox import update_ui, get_conf, update_ui_lastest_msg +from toolbox import check_packages, report_exception + +model_name = '云雀大模型' + +def validate_key(): + YUNQUE_SECRET_KEY = get_conf("YUNQUE_SECRET_KEY") + if YUNQUE_SECRET_KEY == '': return False + return True + +def predict_no_ui_long_connection(inputs, llm_kwargs, history=[], sys_prompt="", observe_window=[], console_slience=False): + """ + ⭐ 多线程方法 + 函数的说明请见 request_llms/bridge_all.py + """ + watch_dog_patience = 5 + response = "" + + if validate_key() is False: + raise RuntimeError('请配置YUNQUE_SECRET_KEY') + + from .com_skylark2api import YUNQUERequestInstance + sri = YUNQUERequestInstance() + for response in sri.generate(inputs, llm_kwargs, history, sys_prompt): + if len(observe_window) >= 1: + observe_window[0] = response + if len(observe_window) >= 2: + if (time.time()-observe_window[1]) > watch_dog_patience: raise RuntimeError("程序终止。") + return response + +def predict(inputs, llm_kwargs, plugin_kwargs, chatbot, history=[], system_prompt='', stream = True, additional_fn=None): + """ + ⭐ 单线程方法 + 函数的说明请见 request_llms/bridge_all.py + """ + chatbot.append((inputs, "")) + yield from update_ui(chatbot=chatbot, history=history) + + # 尝试导入依赖,如果缺少依赖,则给出安装建议 + try: + check_packages(["zhipuai"]) + except: + yield from update_ui_lastest_msg(f"导入软件依赖失败。使用该模型需要额外依赖,安装方法```pip install --upgrade zhipuai```。", + chatbot=chatbot, history=history, delay=0) + return + + if validate_key() is False: + yield from update_ui_lastest_msg(lastmsg="[Local Message] 请配置HUOSHAN_API_KEY", chatbot=chatbot, history=history, delay=0) + return + + if additional_fn is not None: + from core_functional import handle_core_functionality + inputs, history = handle_core_functionality(additional_fn, inputs, history, chatbot) + + # 开始接收回复 + from .com_skylark2api import YUNQUERequestInstance + sri = YUNQUERequestInstance() + for response in sri.generate(inputs, llm_kwargs, history, system_prompt): + chatbot[-1] = (inputs, response) + yield from update_ui(chatbot=chatbot, history=history) + + # 总结输出 + if response == f"[Local Message] 等待{model_name}响应中 ...": + response = f"[Local Message] {model_name}响应异常 ..." + history.extend([inputs, response]) + yield from update_ui(chatbot=chatbot, history=history) \ No newline at end of file diff --git a/request_llms/com_skylark2api.py b/request_llms/com_skylark2api.py new file mode 100644 index 00000000..2530ecca --- /dev/null +++ b/request_llms/com_skylark2api.py @@ -0,0 +1,95 @@ +from toolbox import get_conf +import threading +import logging +import os + +timeout_bot_msg = '[Local Message] Request timeout. Network error.' +#os.environ['VOLC_ACCESSKEY'] = '' +#os.environ['VOLC_SECRETKEY'] = '' + +class YUNQUERequestInstance(): + def __init__(self): + + self.time_to_yield_event = threading.Event() + self.time_to_exit_event = threading.Event() + + self.result_buf = "" + + def generate(self, inputs, llm_kwargs, history, system_prompt): + # import _thread as thread + from volcengine.maas import MaasService, MaasException + + maas = MaasService('maas-api.ml-platform-cn-beijing.volces.com', 'cn-beijing') + + YUNQUE_SECRET_KEY, YUNQUE_ACCESS_KEY,YUNQUE_MODEL = get_conf("YUNQUE_SECRET_KEY", "YUNQUE_ACCESS_KEY","YUNQUE_MODEL") + maas.set_ak(YUNQUE_ACCESS_KEY) #填写 VOLC_ACCESSKEY + maas.set_sk(YUNQUE_SECRET_KEY) #填写 'VOLC_SECRETKEY' + + self.result_buf = "" + + req = { + "model": { + "name": YUNQUE_MODEL, + "version": "1.0", # use default version if not specified. + }, + "parameters": { + "max_new_tokens": 4000, # 输出文本的最大tokens限制 + "min_new_tokens": 1, # 输出文本的最小tokens限制 + "temperature": llm_kwargs['temperature'], # 用于控制生成文本的随机性和创造性,Temperature值越大随机性越大,取值范围0~1 + "top_p": llm_kwargs['top_p'], # 用于控制输出tokens的多样性,TopP值越大输出的tokens类型越丰富,取值范围0~1 + "top_k": 0, # 选择预测值最大的k个token进行采样,取值范围0-1000,0表示不生效 + "max_prompt_tokens": 4000, # 最大输入 token 数,如果给出的 prompt 的 token 长度超过此限制,取最后 max_prompt_tokens 个 token 输入模型。 + }, + "messages": self.generate_message_payload(inputs, llm_kwargs, history, system_prompt) + } + + response = maas.stream_chat(req) + + for resp in response: + self.result_buf += resp.choice.message.content + yield self.result_buf + ''' + for event in response.events(): + if event.event == "add": + self.result_buf += event.data + yield self.result_buf + elif event.event == "error" or event.event == "interrupted": + raise RuntimeError("Unknown error:" + event.data) + elif event.event == "finish": + yield self.result_buf + break + else: + raise RuntimeError("Unknown error:" + str(event)) + + logging.info(f'[raw_input] {inputs}') + logging.info(f'[response] {self.result_buf}') + ''' + return self.result_buf + + def generate_message_payload(inputs, llm_kwargs, history, system_prompt): + from volcengine.maas import ChatRole + conversation_cnt = len(history) // 2 + messages = [{"role": ChatRole.USER, "content": system_prompt}, + {"role": ChatRole.ASSISTANT, "content": "Certainly!"}] + if conversation_cnt: + for index in range(0, 2 * conversation_cnt, 2): + what_i_have_asked = {} + what_i_have_asked["role"] = ChatRole.USER + what_i_have_asked["content"] = history[index] + what_gpt_answer = {} + what_gpt_answer["role"] = ChatRole.ASSISTANT + what_gpt_answer["content"] = history[index + 1] + if what_i_have_asked["content"] != "": + if what_gpt_answer["content"] == "": + continue + if what_gpt_answer["content"] == timeout_bot_msg: + continue + messages.append(what_i_have_asked) + messages.append(what_gpt_answer) + else: + messages[-1]['content'] = what_gpt_answer['content'] + what_i_ask_now = {} + what_i_ask_now["role"] = ChatRole.USER + what_i_ask_now["content"] = inputs + messages.append(what_i_ask_now) + return messages \ No newline at end of file