From fd25d61b56e2c1c99363037ec03c39123108b9f4 Mon Sep 17 00:00:00 2001 From: LINSTCL Date: Thu, 2 Mar 2023 15:31:12 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BA=86=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=8A=BD=E8=B1=A1=EF=BC=8C=E7=94=A8=E6=9D=A5=E6=9B=B4?= =?UTF-8?q?=E5=A5=BD=E7=9A=84=E6=94=AF=E6=8C=81gpt-3.5-turbo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/database/manager.py | 4 +- pkg/openai/manager.py | 16 +++---- pkg/openai/modelmgr.py | 90 +++++++++++++++++++++++++++++++++------- pkg/openai/session.py | 92 +++++++++++++++++------------------------ pkg/qqbot/command.py | 26 ++++++------ requirements.txt | 2 +- 6 files changed, 140 insertions(+), 90 deletions(-) diff --git a/pkg/database/manager.py b/pkg/database/manager.py index a51ab509..90a6dbb2 100644 --- a/pkg/database/manager.py +++ b/pkg/database/manager.py @@ -206,7 +206,7 @@ class DatabaseManager: } # 列出与某个对象的所有对话session - def list_history(self, session_name: str, capacity: int, page: int, replace: str = ""): + def list_history(self, session_name: str, capacity: int, page: int): self.execute(""" select `name`, `type`, `number`, `create_timestamp`, `last_interact_timestamp`, `prompt`, `status` from `sessions` where `name` = '{}' order by `last_interact_timestamp` desc limit {} offset {} @@ -227,7 +227,7 @@ class DatabaseManager: 'subject_number': subject_number, 'create_timestamp': create_timestamp, 'last_interact_timestamp': last_interact_timestamp, - 'prompt': prompt if replace == "" else prompt.replace(replace, "") + 'prompt': json.loads(prompt) }) return sessions diff --git a/pkg/openai/manager.py b/pkg/openai/manager.py index c64d21da..7320d221 100644 --- a/pkg/openai/manager.py +++ b/pkg/openai/manager.py @@ -5,7 +5,7 @@ import openai import pkg.openai.keymgr import pkg.utils.context import pkg.audit.gatherer - +from pkg.openai.modelmgr import Model, ChatCompletionModel, OpenaiModel # 为其他模块提供与OpenAI交互的接口 class OpenAIInteract: @@ -32,24 +32,26 @@ class OpenAIInteract: pkg.utils.context.set_openai_manager(self) # 请求OpenAI Completion - def request_completion(self, prompt, stop): + def request_completion(self, messages): config = pkg.utils.context.get_config() - response = openai.Completion.create( - prompt=prompt, - stop=stop, + + ai:Model = OpenaiModel(config.completion_api_params['model'], 'user') + ai.request( + messages, **config.completion_api_params ) + response = ai.get_response() logging.debug("OpenAI response: %s", response) if 'model' in config.completion_api_params: self.audit_mgr.report_text_model_usage(config.completion_api_params['model'], - response['usage']['total_tokens']) + ai.get_total_tokens()) elif 'engine' in config.completion_api_params: self.audit_mgr.report_text_model_usage(config.completion_api_params['engine'], response['usage']['total_tokens']) - return response + return ai.get_message() def request_image(self, prompt): diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index c106824e..62540e6b 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -1,4 +1,9 @@ # 提供与模型交互的抽象接口 +import openai, logging + +CHAT_COMPLETION_MODELS = { + 'gpt-3.5-turbo' +} COMPLETION_MODELS = { 'text-davinci-003' @@ -12,23 +17,80 @@ IMAGE_MODELS = { } +class Model(): -# ModelManager -# 由session包含 -class ModelMgr(object): + can_chat = False - using_completion_model = "" - using_edit_model = "" - using_image_model = "" + def __init__(self, model_name, user_name, request_fun): + self.model_name = model_name + self.user_name = user_name + self.request_fun = request_fun - def __init__(self): - pass + def request(self, **kwargs): + ret = self.request_fun(**kwargs) + self.ret = self.ret_handle(ret) + self.message = self.ret["choices"][0]["message"] - def get_using_completion_model(self): - return self.using_completion_model + def msg_handle(self, msg): + return msg + + def ret_handle(self, ret): + return ret + + def get_total_tokens(self): + return self.ret['usage']['total_tokens'] + + def get_message(self): + return self.message + + def get_response(self): + return self.ret - def get_using_edit_model(self): - return self.using_edit_model +class ChatCompletionModel(Model): + def __init__(self, model_name, user_name): + request_fun = openai.ChatCompletion.create + self.can_chat = True + super().__init__(model_name, user_name, request_fun) - def get_using_image_model(self): - return self.using_image_model + def request(self, messages, **kwargs): + ret = self.request_fun(messages = self.msg_handle(messages), **kwargs, user=self.user_name) + self.ret = self.ret_handle(ret) + self.message = self.ret["choices"][0]["message"]['content'] + + def get_content(self): + return self.message + +class CompletionModel(Model): + def __init__(self, model_name, user_name): + request_fun = openai.Completion.create + super().__init__(model_name, user_name, request_fun) + + def request(self, prompt, **kwargs): + ret = self.request_fun(prompt = self.msg_handle(prompt), **kwargs) + self.ret = self.ret_handle(ret) + self.message = self.ret["choices"][0]["text"] + + def msg_handle(self, msgs): + prompt = '' + for msg in msgs: + if msg['role'] == '': + prompt = prompt + "{}\n".format(msg['content']) + else: + prompt = prompt + "{}:{}\n".format(msg['role'] if msg['role']!='system' else '你的回答要遵守此规则', msg['content']) + print(prompt) + return prompt + + def get_text(self): + return self.message + +def OpenaiModel(model_name:str, user_name='user'): + if model_name in CHAT_COMPLETION_MODELS: + model = ChatCompletionModel(model_name, user_name) + elif model_name in COMPLETION_MODELS: + model = CompletionModel(model_name, user_name) + else : + log = "找不到模型[{}],请检查配置文件".format(model_name) + logging.error(log) + raise IndexError(log) + + return model diff --git a/pkg/openai/session.py b/pkg/openai/session.py index c04abc4e..a534f01c 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -1,8 +1,10 @@ import logging import threading import time +import json import pkg.openai.manager +import pkg.openai.modelmgr import pkg.database.manager import pkg.utils.context @@ -33,7 +35,7 @@ def load_sessions(): temp_session.name = session_name temp_session.create_timestamp = session_data[session_name]['create_timestamp'] temp_session.last_interact_timestamp = session_data[session_name]['last_interact_timestamp'] - temp_session.prompt = session_data[session_name]['prompt'] + temp_session.prompt = json.loads(session_data[session_name]['prompt']) sessions[session_name] = temp_session @@ -60,13 +62,10 @@ def dump_session(session_name: str): class Session: name = '' - prompt = "" + prompt = {} import config - user_name = config.user_name if hasattr(config, 'user_name') and config.user_name != '' else 'You' - bot_name = config.bot_name if hasattr(config, 'bot_name') and config.bot_name != '' else 'Bot' - create_timestamp = 0 last_interact_timestamp = 0 @@ -99,11 +98,10 @@ class Session: else: current_default_prompt = dprompt.get_prompt(use_default) - user_name = config.user_name if hasattr(config, 'user_name') and config.user_name != '' else 'You' - bot_name = config.bot_name if hasattr(config, 'bot_name') and config.bot_name != '' else 'Bot' - - return (user_name + ":{}\n".format(current_default_prompt) + bot_name + ":好的\n") \ - if current_default_prompt != '' else '' + return [{ + 'role': 'system', + 'content': current_default_prompt + }] def __init__(self, name: str): self.name = name @@ -165,22 +163,17 @@ class Session: if event.is_prevented_default(): return None - # max_rounds = config.prompt_submit_round_amount if hasattr(config, 'prompt_submit_round_amount') else 7 config = pkg.utils.context.get_config() - max_rounds = 1000 # 不再限制回合数 max_length = config.prompt_submit_length if hasattr(config, "prompt_submit_length") else 1024 # 向API请求补全 - response = pkg.utils.context.get_openai_manager().request_completion( - self.cut_out(self.prompt + self.user_name + ':' + - text + '\n' + self.bot_name + ':', - max_rounds, max_length), - self.user_name + ':') + self.cut_out(text, max_length) + message = pkg.utils.context.get_openai_manager().request_completion( + self.prompt + ) - self.prompt += self.user_name + ':' + text + '\n' + self.bot_name + ':' - # print(response) # 处理回复 - res_test = response["choices"][0]["text"] + res_test = message res_ans = res_test # 去除开头可能的提示 @@ -189,50 +182,44 @@ class Session: del (res_ans_spt[0]) res_ans = '\n\n'.join(res_ans_spt) - self.prompt += "{}".format(res_ans) + '\n' + if config.completion_api_params['model'] in pkg.openai.modelmgr.CHAT_COMPLETION_MODELS: + self.prompt.append({'role':'assistant', 'content':res_ans}) + elif config.completion_api_params['model'] in pkg.openai.modelmgr.COMPLETION_MODELS: + self.prompt.append({'role':'', 'content':res_ans}) if self.just_switched_to_exist_session: self.just_switched_to_exist_session = False self.set_ongoing() - return res_ans + return res_ans if res_ans[0]!='\n' else res_ans[1:] # 删除上一回合并返回上一回合的问题 def undo(self) -> str: self.last_interact_timestamp = int(time.time()) # 删除上一回合 - to_delete = self.cut_out(self.prompt, 1, 1024) - - self.prompt = self.prompt.replace(to_delete, '') + if self.prompt[-1]['role'] != 'user': + res = self.prompt[-1]['content'] + self.prompt.remove(self.prompt[-2]) + else: + res = self.prompt[-2]['content'] + self.prompt.remove(self.prompt[-1]) # 返回上一回合的问题 - return to_delete.split(self.bot_name + ':')[0].split(self.user_name + ':')[1].strip() + return res - # 从尾部截取prompt里不多于max_rounds个回合,长度不大于max_tokens的字符串 - # 保证都是完整的对话 - def cut_out(self, prompt: str, max_rounds: int, max_tokens: int) -> str: - # 分隔出每个回合 - rounds_spt_by_user_name = prompt.split(self.user_name + ':') + # 构建对话体 + def cut_out(self, msg: str, max_tokens: int) -> str: - result = '' + if len(msg) > max_tokens: + msg = msg[:max_tokens] - checked_rounds = 0 - # 从后往前遍历,加到result前面,检查result是否符合要求 - for i in range(len(rounds_spt_by_user_name) - 1, 0, -1): - result_temp = self.user_name + ':' + rounds_spt_by_user_name[i] + result - checked_rounds += 1 + self.prompt.append({ + 'role': 'user', + 'content': msg + }) - if checked_rounds > max_rounds: - break - - if int((len(result_temp.encode('utf-8')) - len(result_temp)) / 2 + len(result_temp)) > max_tokens: - break - - result = result_temp - - logging.debug('cut_out: {}'.format(result)) - return result + logging.debug('cut_out: {}'.format(msg)) # 持久化session def persistence(self): @@ -247,11 +234,11 @@ class Session: subject_number = int(name_spt[1]) db_inst.persistence_session(subject_type, subject_number, self.create_timestamp, self.last_interact_timestamp, - self.prompt) + json.dumps(self.prompt)) # 重置session def reset(self, explicit: bool = False, expired: bool = False, schedule_new: bool = True, use_prompt: str = None): - if not self.prompt.endswith(':好的\n'): + if self.prompt[-1]['role'] != "system": self.persistence() if explicit: # 触发插件事件 @@ -291,7 +278,7 @@ class Session: self.create_timestamp = last_one['create_timestamp'] self.last_interact_timestamp = last_one['last_interact_timestamp'] - self.prompt = last_one['prompt'] + self.prompt = json.loads(last_one['prompt']) self.just_switched_to_exist_session = True return self @@ -306,14 +293,13 @@ class Session: self.create_timestamp = next_one['create_timestamp'] self.last_interact_timestamp = next_one['last_interact_timestamp'] - self.prompt = next_one['prompt'] + self.prompt = json.loads(next_one['prompt']) self.just_switched_to_exist_session = True return self def list_history(self, capacity: int = 10, page: int = 0): - return pkg.utils.context.get_database_manager().list_history(self.name, capacity, page, - self.get_default_prompt()) + return pkg.utils.context.get_database_manager().list_history(self.name, capacity, page) def draw_image(self, prompt: str): return pkg.utils.context.get_openai_manager().request_image(prompt) diff --git a/pkg/qqbot/command.py b/pkg/qqbot/command.py index 7de7e5a7..e2b34a61 100644 --- a/pkg/qqbot/command.py +++ b/pkg/qqbot/command.py @@ -185,11 +185,7 @@ def process_command(session_name: str, text_message: str, mgr, config, else: datetime_str = datetime.datetime.fromtimestamp(result.create_timestamp).strftime( '%Y-%m-%d %H:%M:%S') - reply = ["[bot]已切换到前一次的对话:\n创建时间:{}\n".format( - datetime_str) + result.prompt[ - :min(100, - len(result.prompt))] + \ - ("..." if len(result.prompt) > 100 else "#END#")] + reply = ["[bot]已切换到前一次的对话:\n创建时间:{}\n".format(datetime_str)] elif cmd == 'next': result = pkg.openai.session.get_session(session_name).next_session() if result is None: @@ -197,13 +193,18 @@ def process_command(session_name: str, text_message: str, mgr, config, else: datetime_str = datetime.datetime.fromtimestamp(result.create_timestamp).strftime( '%Y-%m-%d %H:%M:%S') - reply = ["[bot]已切换到后一次的对话:\n创建时间:{}\n".format( - datetime_str) + result.prompt[ - :min(100, - len(result.prompt))] + \ - ("..." if len(result.prompt) > 100 else "#END#")] + reply = ["[bot]已切换到后一次的对话:\n创建时间:{}\n".format(datetime_str)] elif cmd == 'prompt': - reply = ["[bot]当前对话所有内容:\n" + pkg.openai.session.get_session(session_name).prompt] + msgs = "" + session:list = pkg.openai.session.get_session(session_name).prompt + for msg in session: + if len(params) != 0 and params[0] in ['-all', '-a']: + msgs = msgs + "{}: {}\n\n".format(msg['role'], msg['content']) + elif len(msg['content']) > 30: + msgs = msgs + "[{}]: {}...\n\n".format(msg['role'], msg['content'][:30]) + else: + msgs = msgs + "[{}]: {}\n\n".format(msg['role'], msg['content']) + reply = ["[bot]当前对话所有内容:\n{}".format(msgs)] elif cmd == 'list': pkg.openai.session.get_session(session_name).persistence() page = 0 @@ -225,8 +226,7 @@ def process_command(session_name: str, text_message: str, mgr, config, datetime_obj = datetime.datetime.fromtimestamp(results[i]['create_timestamp']) reply_str += "#{} 创建:{} {}\n".format(i + page * 10, datetime_obj.strftime("%Y-%m-%d %H:%M:%S"), - results[i]['prompt'][ - :min(20, len(results[i]['prompt']))]) + results[i]['prompt'][1]['content']) if results[i]['create_timestamp'] == pkg.openai.session.get_session( session_name).create_timestamp: current = i + page * 10 diff --git a/requirements.txt b/requirements.txt index 7d445758..838279ea 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ requests~=2.28.1 -openai~=0.26.5 +openai~=0.27.0 pip~=22.3.1 dulwich~=0.21.3 colorlog~=6.6.0 From 623f094e5b7596ef859c58b56448696c4da36e11 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Thu, 2 Mar 2023 16:41:03 +0800 Subject: [PATCH 02/16] =?UTF-8?q?doc:=20=E6=B7=BB=E5=8A=A0=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=EF=BC=9B=E5=AE=8C=E5=96=84=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 62540e6b..185feea5 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -17,6 +17,7 @@ IMAGE_MODELS = { } + class Model(): can_chat = False @@ -45,8 +46,10 @@ class Model(): def get_response(self): return self.ret + class ChatCompletionModel(Model): + """ChatCompletion接口实现""" def __init__(self, model_name, user_name): request_fun = openai.ChatCompletion.create self.can_chat = True @@ -59,8 +62,10 @@ class ChatCompletionModel(Model): def get_content(self): return self.message + class CompletionModel(Model): + """Completion接口实现""" def __init__(self, model_name, user_name): request_fun = openai.Completion.create super().__init__(model_name, user_name, request_fun) @@ -82,6 +87,7 @@ class CompletionModel(Model): def get_text(self): return self.message + def OpenaiModel(model_name:str, user_name='user'): if model_name in CHAT_COMPLETION_MODELS: From 7b8ad2e3159a8873f86ab875b0f32c57217a8274 Mon Sep 17 00:00:00 2001 From: LINSTCL Date: Thu, 2 Mar 2023 16:47:50 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E8=A7=92=E8=89=B2=E6=94=B9=E5=8F=98=E5=BC=95?= =?UTF-8?q?=E8=B5=B7=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 62540e6b..15e50cce 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -47,6 +47,7 @@ class Model(): return self.ret class ChatCompletionModel(Model): + Chat_role = ['system', 'user', 'assistant'] def __init__(self, model_name, user_name): request_fun = openai.ChatCompletion.create self.can_chat = True @@ -57,6 +58,14 @@ class ChatCompletionModel(Model): self.ret = self.ret_handle(ret) self.message = self.ret["choices"][0]["message"]['content'] + def msg_handle(self, msgs): + temp_msgs = [] + for msg in msgs: + if msg['role'] not in self.Chat_role: + msg['role'] = 'user' + temp_msgs.append(msg) + return temp_msgs + def get_content(self): return self.message @@ -77,7 +86,6 @@ class CompletionModel(Model): prompt = prompt + "{}\n".format(msg['content']) else: prompt = prompt + "{}:{}\n".format(msg['role'] if msg['role']!='system' else '你的回答要遵守此规则', msg['content']) - print(prompt) return prompt def get_text(self): From f7830b5e9d539c50ded95f823fe350c5a4edaa64 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Thu, 2 Mar 2023 17:57:39 +0800 Subject: [PATCH 04/16] =?UTF-8?q?feat(modelmgr.py):=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E5=8F=AF=E9=80=89=E6=A8=A1=E5=9E=8B=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 6360f40b..dbd44054 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -1,12 +1,26 @@ # 提供与模型交互的抽象接口 import openai, logging -CHAT_COMPLETION_MODELS = { - 'gpt-3.5-turbo' +COMPLETION_MODELS = { + 'text-davinci-003', + 'text-davinci-002', + 'code-davinci-002', + 'code-cushman-001', + 'text-curie-001', + 'text-babbage-001', + 'text-ada-001', } -COMPLETION_MODELS = { - 'text-davinci-003' +CHAT_COMPLETION_MODELS = { + 'gpt-3.5-turbo', + 'gpt-3.5-turbo-0301', + 'text-davinci-003', + 'text-davinci-002', + 'code-davinci-002', + 'code-cushman-001', + 'text-curie-001', + 'text-babbage-001', + 'text-ada-001', } EDIT_MODELS = { From 19289527ae7c2c06c2909838c2cb17e60fbf55bd Mon Sep 17 00:00:00 2001 From: LINSTCL Date: Thu, 2 Mar 2023 19:40:36 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E6=97=A7=E7=89=88=E6=9C=AC=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/database/manager.py | 2 +- pkg/openai/session.py | 44 ++++++++++++++++++++++++++++++++++++++--- pkg/qqbot/command.py | 18 ++++++++++++++--- 3 files changed, 57 insertions(+), 7 deletions(-) diff --git a/pkg/database/manager.py b/pkg/database/manager.py index 90a6dbb2..519893bb 100644 --- a/pkg/database/manager.py +++ b/pkg/database/manager.py @@ -227,7 +227,7 @@ class DatabaseManager: 'subject_number': subject_number, 'create_timestamp': create_timestamp, 'last_interact_timestamp': last_interact_timestamp, - 'prompt': json.loads(prompt) + 'prompt': prompt }) return sessions diff --git a/pkg/openai/session.py b/pkg/openai/session.py index a534f01c..37e8a241 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -19,6 +19,32 @@ class SessionOfflineStatus: ON_GOING = 'on_going' EXPLICITLY_CLOSED = 'explicitly_closed' +# 重置session.prompt +def reset_session_prompt(session_name, prompt): + # 备份原始数据 + bak_path = 'logs/{}-{}.bak'.format( + session_name, + time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) + ) + f = open(bak_path, 'w+') + f.write(prompt) + f.close() + # 生成新数据 + config = pkg.utils.context.get_config() + prompt = [ + { + 'role': 'system', + 'content': config.default_prompt['default'] + } + ] + # 警告 + logging.warning( + """ +用户[{}]的数据已被重置,有可能是因为数据版本过旧或存储错误 +原始数据将备份在: +{}""".format(session_name, bak_path) + ) + return prompt # 从数据加载session def load_sessions(): @@ -35,7 +61,11 @@ def load_sessions(): temp_session.name = session_name temp_session.create_timestamp = session_data[session_name]['create_timestamp'] temp_session.last_interact_timestamp = session_data[session_name]['last_interact_timestamp'] - temp_session.prompt = json.loads(session_data[session_name]['prompt']) + try: + temp_session.prompt = json.loads(session_data[session_name]['prompt']) + except Exception: + temp_session.prompt = reset_session_prompt(session_name, session_data[session_name]['prompt']) + temp_session.persistence() sessions[session_name] = temp_session @@ -278,7 +308,11 @@ class Session: self.create_timestamp = last_one['create_timestamp'] self.last_interact_timestamp = last_one['last_interact_timestamp'] - self.prompt = json.loads(last_one['prompt']) + try: + self.prompt = json.loads(last_one['prompt']) + except json.decoder.JSONDecodeError: + self.prompt = reset_session_prompt(self.name, last_one['prompt']) + self.persistence() self.just_switched_to_exist_session = True return self @@ -293,7 +327,11 @@ class Session: self.create_timestamp = next_one['create_timestamp'] self.last_interact_timestamp = next_one['last_interact_timestamp'] - self.prompt = json.loads(next_one['prompt']) + try: + self.prompt = json.loads(next_one['prompt']) + except json.decoder.JSONDecodeError: + self.prompt = reset_session_prompt(self.name, next_one['prompt']) + self.persistence() self.just_switched_to_exist_session = True return self diff --git a/pkg/qqbot/command.py b/pkg/qqbot/command.py index e2b34a61..b174d453 100644 --- a/pkg/qqbot/command.py +++ b/pkg/qqbot/command.py @@ -224,9 +224,21 @@ def process_command(session_name: str, text_message: str, mgr, config, for i in range(len(results)): # 时间(使用create_timestamp转换) 序号 部分内容 datetime_obj = datetime.datetime.fromtimestamp(results[i]['create_timestamp']) - reply_str += "#{} 创建:{} {}\n".format(i + page * 10, - datetime_obj.strftime("%Y-%m-%d %H:%M:%S"), - results[i]['prompt'][1]['content']) + msg = "" + try: + msg = json.loads(results[i]['prompt']) + except json.decoder.JSONDecodeError: + msg = pkg.openai.session.reset_session_prompt(session_name, results[i]['prompt']) + # 持久化 + pkg.openai.session.get_session(session_name).persistence() + if len(msg) >= 2: + reply_str += "#{} 创建:{} {}\n".format(i + page * 10, + datetime_obj.strftime("%Y-%m-%d %H:%M:%S"), + msg[1]['content']) + else: + reply_str += "#{} 创建:{} {}\n".format(i + page * 10, + datetime_obj.strftime("%Y-%m-%d %H:%M:%S"), + "无内容") if results[i]['create_timestamp'] == pkg.openai.session.get_session( session_name).create_timestamp: current = i + page * 10 From 61ec8e96f2c443034e9bd5c3dfcc99d4b9f705c0 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Thu, 2 Mar 2023 19:49:36 +0800 Subject: [PATCH 06/16] =?UTF-8?q?test:=20=E6=A8=A1=E5=9E=8B-=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=85=BC=E5=AE=B9=E6=80=A7=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models_and_interfaces.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 tests/compatibility_tests/models_and_interfaces.py diff --git a/tests/compatibility_tests/models_and_interfaces.py b/tests/compatibility_tests/models_and_interfaces.py new file mode 100644 index 00000000..1ace18d4 --- /dev/null +++ b/tests/compatibility_tests/models_and_interfaces.py @@ -0,0 +1,46 @@ +import openai +import time + +# 测试completion api +models = [ + 'gpt-3.5-turbo', + 'gpt-3.5-turbo-0301', + 'text-davinci-003', + 'text-davinci-002', + 'code-davinci-002', + 'code-cushman-001', + 'text-curie-001', + 'text-babbage-001', + 'text-ada-001', +] + +openai.api_key = "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" + +for model in models: + print('Testing model: ', model) + + # completion api + try: + response = openai.Completion.create( + model=model, + prompt="Say this is a test", + max_tokens=7, + temperature=0 + ) + print(' completion api: ', response['choices'][0]['text'].strip()) + except Exception as e: + print(' completion api err: ', e) + + # chat completion api + try: + completion = openai.ChatCompletion.create( + model="gpt-3.5-turbo", + messages=[ + {"role": "user", "content": "Hello!"} + ] + ) + print(" chat api: ",completion.choices[0].message['content'].strip()) + except Exception as e: + print(' chat api err: ', e) + + time.sleep(60) From 118fbe3f7d66acf64b28193c3a6b4535f2c5c8dd Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Thu, 2 Mar 2023 19:50:31 +0800 Subject: [PATCH 07/16] =?UTF-8?q?perf(modelmgr.py):=20=E7=B1=BB=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=BC=BA=E8=B0=83=E5=85=B6=E4=B8=BA=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/manager.py | 4 ++-- pkg/openai/modelmgr.py | 9 +++++---- pkg/openai/session.py | 2 -- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/pkg/openai/manager.py b/pkg/openai/manager.py index 7320d221..563e14ad 100644 --- a/pkg/openai/manager.py +++ b/pkg/openai/manager.py @@ -5,7 +5,7 @@ import openai import pkg.openai.keymgr import pkg.utils.context import pkg.audit.gatherer -from pkg.openai.modelmgr import Model, ChatCompletionModel, OpenaiModel +from pkg.openai.modelmgr import ModelRequest, create_openai_model_request # 为其他模块提供与OpenAI交互的接口 class OpenAIInteract: @@ -35,7 +35,7 @@ class OpenAIInteract: def request_completion(self, messages): config = pkg.utils.context.get_config() - ai:Model = OpenaiModel(config.completion_api_params['model'], 'user') + ai:ModelRequest = create_openai_model_request(config.completion_api_params['model'], 'user') ai.request( messages, **config.completion_api_params diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index dbd44054..8942b4c6 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -32,7 +32,7 @@ IMAGE_MODELS = { } -class Model(): +class ModelRequest(): can_chat = False @@ -62,7 +62,7 @@ class Model(): return self.ret -class ChatCompletionModel(Model): +class ChatCompletionModel(ModelRequest): """ChatCompletion接口实现""" Chat_role = ['system', 'user', 'assistant'] def __init__(self, model_name, user_name): @@ -87,7 +87,7 @@ class ChatCompletionModel(Model): return self.message -class CompletionModel(Model): +class CompletionModel(ModelRequest): """Completion接口实现""" def __init__(self, model_name, user_name): request_fun = openai.Completion.create @@ -111,7 +111,8 @@ class CompletionModel(Model): return self.message -def OpenaiModel(model_name:str, user_name='user'): +def create_openai_model_request(model_name: str, user_name: str = 'user') -> ModelRequest: + """使用给定的模型名称创建模型请求对象""" if model_name in CHAT_COMPLETION_MODELS: model = ChatCompletionModel(model_name, user_name) elif model_name in COMPLETION_MODELS: diff --git a/pkg/openai/session.py b/pkg/openai/session.py index 37e8a241..dcaac9ff 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -94,8 +94,6 @@ class Session: prompt = {} - import config - create_timestamp = 0 last_interact_timestamp = 0 From 5364c36a79f4d4932479ce92f9eae490e0d06fa4 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Thu, 2 Mar 2023 22:42:07 +0800 Subject: [PATCH 08/16] =?UTF-8?q?feat(session.py):=20prompt=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=80=BC=E6=94=B9=E4=B8=BA[]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/openai/session.py b/pkg/openai/session.py index dcaac9ff..28e7611a 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -92,7 +92,7 @@ def dump_session(session_name: str): class Session: name = '' - prompt = {} + prompt = [] create_timestamp = 0 From dd3d403de81a100bdb6595bd287983fb6645e6c3 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Thu, 2 Mar 2023 23:20:28 +0800 Subject: [PATCH 09/16] =?UTF-8?q?feat(modelmgr.py):=20=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 8942b4c6..f8263ad7 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -14,13 +14,6 @@ COMPLETION_MODELS = { CHAT_COMPLETION_MODELS = { 'gpt-3.5-turbo', 'gpt-3.5-turbo-0301', - 'text-davinci-003', - 'text-davinci-002', - 'code-davinci-002', - 'code-cushman-001', - 'text-curie-001', - 'text-babbage-001', - 'text-ada-001', } EDIT_MODELS = { @@ -121,5 +114,5 @@ def create_openai_model_request(model_name: str, user_name: str = 'user') -> Mod log = "找不到模型[{}],请检查配置文件".format(model_name) logging.error(log) raise IndexError(log) - + logging.debug("使用接口[{}]创建模型请求[{}]".format(model.__class__.__name__, model_name)) return model From 2234e9db0ebf3e3a28ee62d55ee03e6429c80680 Mon Sep 17 00:00:00 2001 From: LINSTCL Date: Thu, 2 Mar 2023 23:25:42 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=8B=BC=E6=8E=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 4 ++-- pkg/openai/session.py | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index f8263ad7..66b3c080 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -94,10 +94,10 @@ class CompletionModel(ModelRequest): def msg_handle(self, msgs): prompt = '' for msg in msgs: - if msg['role'] == '': + if msg['role'] == 'assistant': prompt = prompt + "{}\n".format(msg['content']) else: - prompt = prompt + "{}:{}\n".format(msg['role'] if msg['role']!='system' else '你的回答要遵守此规则', msg['content']) + prompt = prompt + "{}:{}\n".format(msg['role'] , msg['content']) return prompt def get_text(self): diff --git a/pkg/openai/session.py b/pkg/openai/session.py index 28e7611a..81c8cbe4 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -210,10 +210,7 @@ class Session: del (res_ans_spt[0]) res_ans = '\n\n'.join(res_ans_spt) - if config.completion_api_params['model'] in pkg.openai.modelmgr.CHAT_COMPLETION_MODELS: - self.prompt.append({'role':'assistant', 'content':res_ans}) - elif config.completion_api_params['model'] in pkg.openai.modelmgr.COMPLETION_MODELS: - self.prompt.append({'role':'', 'content':res_ans}) + self.prompt.append({'role':'assistant', 'content':res_ans}) if self.just_switched_to_exist_session: self.just_switched_to_exist_session = False From 77df3d1ae5a31d755d325bb15754b70164c46e79 Mon Sep 17 00:00:00 2001 From: LINSTCL Date: Thu, 2 Mar 2023 23:50:51 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E5=AE=8C=E6=88=90=E6=A8=A1=E5=9E=8B=E7=94=9F?= =?UTF-8?q?=E6=88=90=E5=AF=B9=E8=AF=9D=E5=9E=8B=E6=96=87=E6=9C=AC=E6=97=B6?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E9=9A=8F=E6=9C=BAAI=E5=90=8D=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 66b3c080..8c94dc35 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -42,8 +42,8 @@ class ModelRequest(): def msg_handle(self, msg): return msg - def ret_handle(self, ret): - return ret + def ret_handle(self): + return def get_total_tokens(self): return self.ret['usage']['total_tokens'] @@ -64,8 +64,8 @@ class ChatCompletionModel(ModelRequest): super().__init__(model_name, user_name, request_fun) def request(self, messages, **kwargs): - ret = self.request_fun(messages = self.msg_handle(messages), **kwargs, user=self.user_name) - self.ret = self.ret_handle(ret) + self.ret = self.request_fun(messages = self.msg_handle(messages), **kwargs, user=self.user_name) + self.ret_handle() self.message = self.ret["choices"][0]["message"]['content'] def msg_handle(self, msgs): @@ -87,8 +87,8 @@ class CompletionModel(ModelRequest): super().__init__(model_name, user_name, request_fun) def request(self, prompt, **kwargs): - ret = self.request_fun(prompt = self.msg_handle(prompt), **kwargs) - self.ret = self.ret_handle(ret) + self.ret = self.request_fun(prompt = self.msg_handle(prompt), **kwargs) + self.ret_handle() self.message = self.ret["choices"][0]["text"] def msg_handle(self, msgs): @@ -100,6 +100,15 @@ class CompletionModel(ModelRequest): prompt = prompt + "{}:{}\n".format(msg['role'] , msg['content']) return prompt + def ret_handle(self): + temp_text:str = self.ret["choices"][0]["text"] + texts = temp_text.split(':') + if len(texts) >= 1: + temp_text = "" + for text in texts[1:]: + temp_text = temp_text + text + self.ret["choices"][0]["text"] = temp_text + def get_text(self): return self.message From 8713fd813089c2447495ac51c1fef693ffc25fe8 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Fri, 3 Mar 2023 00:07:53 +0800 Subject: [PATCH 12/16] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=A4=84=E7=90=86=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/manager.py | 7 +++--- pkg/openai/modelmgr.py | 33 +++++++++++++++------------- pkg/openai/session.py | 49 +++++++++++++++++++++++++++++------------- 3 files changed, 56 insertions(+), 33 deletions(-) diff --git a/pkg/openai/manager.py b/pkg/openai/manager.py index 563e14ad..3bd0c275 100644 --- a/pkg/openai/manager.py +++ b/pkg/openai/manager.py @@ -32,12 +32,13 @@ class OpenAIInteract: pkg.utils.context.set_openai_manager(self) # 请求OpenAI Completion - def request_completion(self, messages): + def request_completion(self, prompts): config = pkg.utils.context.get_config() - ai:ModelRequest = create_openai_model_request(config.completion_api_params['model'], 'user') + # 根据模型选择使用的接口 + ai: ModelRequest = create_openai_model_request(config.completion_api_params['model'], 'user') ai.request( - messages, + prompts, **config.completion_api_params ) response = ai.get_response() diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 66b3c080..cdaa45cd 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -26,7 +26,7 @@ IMAGE_MODELS = { class ModelRequest(): - + """模型请求抽象类""" can_chat = False def __init__(self, model_name, user_name, request_fun): @@ -39,7 +39,8 @@ class ModelRequest(): self.ret = self.ret_handle(ret) self.message = self.ret["choices"][0]["message"] - def msg_handle(self, msg): + def __msg_handle__(self, msg): + """将prompt dict转换成接口需要的格式""" return msg def ret_handle(self, ret): @@ -63,17 +64,16 @@ class ChatCompletionModel(ModelRequest): self.can_chat = True super().__init__(model_name, user_name, request_fun) - def request(self, messages, **kwargs): - ret = self.request_fun(messages = self.msg_handle(messages), **kwargs, user=self.user_name) + def request(self, prompts, **kwargs): + ret = self.request_fun(messages = self.__msg_handle__(prompts), **kwargs, user=self.user_name) self.ret = self.ret_handle(ret) self.message = self.ret["choices"][0]["message"]['content'] - def msg_handle(self, msgs): + def __msg_handle__(self, msgs): temp_msgs = [] + # 把msgs拷贝进temp_msgs for msg in msgs: - if msg['role'] not in self.Chat_role: - msg['role'] = 'user' - temp_msgs.append(msg) + temp_msgs.append(msg.copy()) return temp_msgs def get_content(self): @@ -86,18 +86,21 @@ class CompletionModel(ModelRequest): request_fun = openai.Completion.create super().__init__(model_name, user_name, request_fun) - def request(self, prompt, **kwargs): - ret = self.request_fun(prompt = self.msg_handle(prompt), **kwargs) + def request(self, prompts, **kwargs): + ret = self.request_fun(prompt = self.__msg_handle__(prompts), **kwargs) self.ret = self.ret_handle(ret) self.message = self.ret["choices"][0]["text"] - def msg_handle(self, msgs): + def __msg_handle__(self, msgs): prompt = '' for msg in msgs: - if msg['role'] == 'assistant': - prompt = prompt + "{}\n".format(msg['content']) - else: - prompt = prompt + "{}:{}\n".format(msg['role'] , msg['content']) + prompt = prompt + "{}: {}\n".format(msg['role'], msg['content']) + # for msg in msgs: + # if msg['role'] == 'assistant': + # prompt = prompt + "{}\n".format(msg['content']) + # else: + # prompt = prompt + "{}:{}\n".format(msg['role'] , msg['content']) + prompt = prompt + "assistant: " return prompt def get_text(self): diff --git a/pkg/openai/session.py b/pkg/openai/session.py index 81c8cbe4..9bd9e72d 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -126,10 +126,15 @@ class Session: else: current_default_prompt = dprompt.get_prompt(use_default) - return [{ - 'role': 'system', - 'content': current_default_prompt - }] + return [ + { + 'role': 'user', + 'content': current_default_prompt + },{ + 'role': 'assistant', + 'content': 'ok' + } + ] def __init__(self, name: str): self.name = name @@ -195,12 +200,11 @@ class Session: max_length = config.prompt_submit_length if hasattr(config, "prompt_submit_length") else 1024 # 向API请求补全 - self.cut_out(text, max_length) message = pkg.utils.context.get_openai_manager().request_completion( - self.prompt + self.cut_out(text, max_length), ) - # 处理回复 + # 成功获取,处理回复 res_test = message res_ans = res_test @@ -210,6 +214,8 @@ class Session: del (res_ans_spt[0]) res_ans = '\n\n'.join(res_ans_spt) + # 将此次对话的双方内容加入到prompt中 + self.prompt.append({'role':'user', 'content':text}) self.prompt.append({'role':'assistant', 'content':res_ans}) if self.just_switched_to_exist_session: @@ -234,17 +240,30 @@ class Session: return res # 构建对话体 - def cut_out(self, msg: str, max_tokens: int) -> str: + def cut_out(self, msg: str, max_tokens: int) -> list: + """将现有prompt进行切割处理,使得新的prompt长度不超过max_tokens""" + # 如果用户消息长度超过max_tokens,直接返回 + + temp_prompt = [ + { + 'role': 'user', + 'content': msg + } + ] - if len(msg) > max_tokens: - msg = msg[:max_tokens] + token_count = len(msg) + # 倒序遍历prompt + for i in range(len(self.prompt) - 1, -1, -1): + if token_count >= max_tokens: + break - self.prompt.append({ - 'role': 'user', - 'content': msg - }) + # 将prompt加到temp_prompt头部 + temp_prompt.insert(0, self.prompt[i]) + token_count += len(self.prompt[i]['content']) - logging.debug('cut_out: {}'.format(msg)) + logging.debug('cut_out: {}'.format(str(temp_prompt))) + + return temp_prompt # 持久化session def persistence(self): From a1c167fb7f0996b12c0ef15d0b0f1e5822a00366 Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Fri, 3 Mar 2023 00:21:16 +0800 Subject: [PATCH 13/16] =?UTF-8?q?feat:=20=E5=8A=9F=E8=83=BD=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/openai/modelmgr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/openai/modelmgr.py b/pkg/openai/modelmgr.py index 5f36f7c3..0a68fac4 100644 --- a/pkg/openai/modelmgr.py +++ b/pkg/openai/modelmgr.py @@ -65,7 +65,7 @@ class ChatCompletionModel(ModelRequest): super().__init__(model_name, user_name, request_fun) def request(self, prompts, **kwargs): - ret = self.request_fun(messages = self.__msg_handle__(prompts), **kwargs, user=self.user_name) + self.ret = self.request_fun(messages = self.__msg_handle__(prompts), **kwargs, user=self.user_name) self.ret_handle() self.message = self.ret["choices"][0]["message"]['content'] @@ -87,7 +87,7 @@ class CompletionModel(ModelRequest): super().__init__(model_name, user_name, request_fun) def request(self, prompts, **kwargs): - ret = self.request_fun(prompt = self.__msg_handle__(prompts), **kwargs) + self.ret = self.request_fun(prompt = self.__msg_handle__(prompts), **kwargs) self.ret_handle() self.message = self.ret["choices"][0]["text"] From 862724da74ddb87a7ac9277bf5b6bd18f8928cce Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Fri, 3 Mar 2023 00:23:44 +0800 Subject: [PATCH 14/16] =?UTF-8?q?doc:=20config-template.py=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=A8=A1=E5=9E=8B=E5=8F=82=E6=95=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config-template.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/config-template.py b/config-template.py index f0c8e275..9655e77f 100644 --- a/config-template.py +++ b/config-template.py @@ -112,7 +112,20 @@ encourage_sponsor_at_start = True # 注意:较大的prompt_submit_length会导致OpenAI账户额度消耗更快 prompt_submit_length = 1024 -# OpenAI的completion API的参数 +# OpenAI补全API的参数 +# 请在下方填写模型,程序自动选择接口 +# 现已支持的模型有: +# +# 'gpt-3.5-turbo' +# 'gpt-3.5-turbo-0301' +# 'text-davinci-003' +# 'text-davinci-002' +# 'code-davinci-002' +# 'code-cushman-001' +# 'text-curie-001' +# 'text-babbage-001' +# 'text-ada-001' +# # 具体请查看OpenAI的文档: https://beta.openai.com/docs/api-reference/completions/create completion_api_params = { "model": "text-davinci-003", From 2664ea8622e500cc8d5a225e00d7199f1cfefc5e Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Fri, 3 Mar 2023 00:25:26 +0800 Subject: [PATCH 15/16] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4config-template?= =?UTF-8?q?=E4=B8=AD=E5=AF=B9=E8=AF=9D=E8=A7=92=E8=89=B2=E7=9A=84=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config-template.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/config-template.py b/config-template.py index 9655e77f..fbebb710 100644 --- a/config-template.py +++ b/config-template.py @@ -128,7 +128,7 @@ prompt_submit_length = 1024 # # 具体请查看OpenAI的文档: https://beta.openai.com/docs/api-reference/completions/create completion_api_params = { - "model": "text-davinci-003", + "model": "gpt-3.5-turbo", "temperature": 0.9, # 数值越低得到的回答越理性,取值范围[0, 1] "max_tokens": 512, # 每次获取OpenAI接口响应的文字量上限, 不高于4096 "top_p": 1, # 生成的文本的文本与要求的符合度, 取值范围[0, 1] @@ -151,14 +151,6 @@ include_image_description = True # 消息处理的超时时间,单位为秒 process_message_timeout = 30 -# 会话对象名称,此配置与会话对象管理相关, -# 若不了解相关功能,无需修改此配置 -# 详细说明请查看:https://github.com/RockChinQ/QChatGPT/wiki/%E6%8A%80%E6%9C%AF%E4%BF%A1%E6%81%AF#%E4%BC%9A%E8%AF%9Dsession -# user_name: 管理员(主人)的名字 -# bot_name: 机器人的名字 -user_name = 'You' -bot_name = 'Bot' - # [暂未实现] 群内会话是否启用多对象名称 # 若不启用,群内会话的prompt只使用user_name和bot_name multi_subject = False From fdcec0fbf78150cae119e59a7bd55455248e16ab Mon Sep 17 00:00:00 2001 From: Rock Chin <1010553892@qq.com> Date: Fri, 3 Mar 2023 00:28:14 +0800 Subject: [PATCH 16/16] =?UTF-8?q?doc:=20=E8=87=B4=E8=B0=A2=E8=B4=A1?= =?UTF-8?q?=E7=8C=AE=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b52bb4b4..7be7e690 100644 --- a/README.md +++ b/README.md @@ -233,6 +233,7 @@ python3 main.py - [@mikumifa](https://github.com/mikumifa) 本项目Docker部署仓库开发者 - [@dominoar](https://github.com/dominoar) 为本项目开发多种插件 - [@hissincn](https://github.com/hissincn) 本项目贡献者 +- [@LINSTCL](https://github.com/LINSTCL) GPT-3.5官方模型适配贡献者 以及其他所有为本项目提供支持的朋友们。