From ac65d81ba1fd4dde928bb77b38a5a16a27d96266 Mon Sep 17 00:00:00 2001 From: chordfish <592229466@qq.com> Date: Fri, 10 Mar 2023 10:13:40 +0800 Subject: [PATCH] =?UTF-8?q?adjust=EF=BC=9A=E6=95=B4=E7=90=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E4=BB=85=E6=B7=BB=E5=8A=A0json=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E7=9A=84prompt=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config-template.py | 8 +----- pkg/openai/dprompt.py | 38 +++++++++++++++++++++++++---- pkg/openai/session.py | 57 +++---------------------------------------- pkg/qqbot/manager.py | 10 +------- 4 files changed, 39 insertions(+), 74 deletions(-) diff --git a/config-template.py b/config-template.py index 3cea74fa..deed38ed 100644 --- a/config-template.py +++ b/config-template.py @@ -79,17 +79,11 @@ default_prompt = { "default": "如果我之后想获取帮助,请你说“输入!help获取帮助”", } -# 实验性设置项 -# JSON完整情景导入,存放JSON的文件夹 -full_prompt_dir = "scenario/" - +# 实验性设置项: JSON完整情景导入 # 预设prompt模式 # 参考值:旧版本方式:default | 完整情景:full_scenario preset_mode = "default" -# 过滤AI脱离人设的消息 -# 这类消息在对应情景json中设置,将其替换为自定义消息,以保持人格 -filter_ai_warning = False # 群内响应规则 # 符合此消息的群内消息即使不包含at机器人也会响应 diff --git a/pkg/openai/dprompt.py b/pkg/openai/dprompt.py index 3aba31cb..4812d9f5 100644 --- a/pkg/openai/dprompt.py +++ b/pkg/openai/dprompt.py @@ -10,6 +10,10 @@ __prompts_from_files__ = {} """从文件中读取的情景预设值""" +import json +import logging + + def read_prompt_from_file() -> str: """从文件读取预设值""" # 读取prompts/目录下的所有文件,以文件名为键,文件内容为值 @@ -66,14 +70,38 @@ def set_to_default(): def get_prompt(name: str = None) -> str: + import config + preset_mode = config.preset_mode + """获取预设值""" if name is None: name = get_current() - default_dict = get_prompt_dict() + # JSON预设方式 + if preset_mode == 'full_scenario': + import os + # 整合路径,获取json文件名 + json_file = os.path.join(os.getcwd(), "scenario", name + '.json') - for key in default_dict: - if key.lower().startswith(name.lower()): - return default_dict[key] + logging.debug('try to load json: {}'.format(json_file)) - raise KeyError("未找到情景预设: " + name) + try: + with open(json_file, 'r', encoding ='utf-8') as f: + json_content = json.load(f) + logging.debug('succeed to load json: {}'.format(json_file)) + return json_content['prompt'] + + except FileNotFoundError: + + raise KeyError("未找到Json情景预设: " + name) + + # 默认预设方式 + elif preset_mode == 'default': + + default_dict = get_prompt_dict() + + for key in default_dict: + if key.lower().startswith(name.lower()): + return default_dict[key], None, None + + raise KeyError("未找到默认情景预设: " + name) diff --git a/pkg/openai/session.py b/pkg/openai/session.py index 5564833b..3873a060 100644 --- a/pkg/openai/session.py +++ b/pkg/openai/session.py @@ -128,52 +128,15 @@ class Session: logging.debug('{},lock release successfully,{}'.format(self.name, self.response_lock)) # 从配置文件获取会话预设信息 - def get_default_prompt(self, use_default: str = None, get_only = False): + def get_default_prompt(self, use_default: str = None): config = pkg.utils.context.get_config() import pkg.openai.dprompt as dprompt if use_default is None: use_default = dprompt.get_current() - current_default_prompt = \ - [ - { - 'role': 'user', - 'content': '如果我之后想获取帮助,请你说“输入!help获取帮助”' - }, { - 'role': 'assistant', - 'content': 'ok' - } - ] - - # 根据设置进行prompt预设模式 - if config.preset_mode == "full_scenario": - import os - - dir = os.path.join(os.getcwd(), config.full_prompt_dir) - json_file = os.path.join(dir, use_default) + '.json' - - logging.debug("try to load json: {}".format(json_file)) - - try: - with open(json_file, 'r', encoding ='utf-8') as f: - json_content = json.load(f) - current_default_prompt = json_content['prompt'] - - if not get_only: - # 读取机器人名字,用于响应信息 - self.bot_name = json_content['name'] - # 过滤掉不符合人格的回复 - self.bot_filter = json_content['filter'] - logging.debug("first bot filter: {}".format(self.bot_filter)) - - except FileNotFoundError: - logging.info("couldn't find file {}".format(json_file)) - - - else: - current_default_prompt = dprompt.get_prompt(use_default) + current_default_prompt = dprompt.get_prompt(use_default) return current_default_prompt @@ -228,7 +191,7 @@ class Session: self.last_interact_timestamp = int(time.time()) # 触发插件事件 - if self.prompt == self.get_default_prompt(get_only = True): + if self.prompt == self.get_default_prompt(): args = { 'session_name': self.name, 'session': self, @@ -258,18 +221,6 @@ class Session: del (res_ans_spt[0]) res_ans = '\n\n'.join(res_ans_spt) - - # 检测是否包含ai人格否定 - if config.filter_ai_warning and self.bot_filter: - import re - match = re.search(self.bot_filter['reg'], res_ans) - logging.debug(self.bot_filter) - logging.debug(res_ans) - if match: - logging.debug('回复:{}, 检测到人格否定,替换中。。'.format(res_ans)) - res_ans = self.bot_filter['replace'] - logging.debug('替换为: {}'.format(res_ans)) - # 将此次对话的双方内容加入到prompt中 self.prompt.append({'role': 'user', 'content': text}) @@ -323,7 +274,7 @@ class Session: # 持久化session def persistence(self): - if self.prompt == self.get_default_prompt(get_only = True): + if self.prompt == self.get_default_prompt(): return db_inst = pkg.utils.context.get_database_manager() diff --git a/pkg/qqbot/manager.py b/pkg/qqbot/manager.py index b80b8a66..5f33a95f 100644 --- a/pkg/qqbot/manager.py +++ b/pkg/qqbot/manager.py @@ -27,15 +27,7 @@ def check_response_rule(text: str, event): config = pkg.utils.context.get_config() if not hasattr(config, 'response_rules'): return False, '' - - - bot_name = pkg.openai.session.get_session('group_{}'.format(event.group.id)).bot_name - logging.debug(bot_name) - # 检查情景json自带的名字 - if bot_name: - import re - if re.search(bot_name, text): - return True, text + rules = config.response_rules # 检查前缀匹配 if 'prefix' in rules: