重构了模型抽象,用来更好的支持gpt-3.5-turbo

This commit is contained in:
LINSTCL
2023-03-02 15:31:12 +08:00
parent 6f5802551f
commit fd25d61b56
6 changed files with 140 additions and 90 deletions
+39 -53
View File
@@ -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)