From b90650a1d4e9d8f3eccea992add36bb3e3e50f91 Mon Sep 17 00:00:00 2001 From: ChangingSelf Date: Sun, 13 Apr 2025 17:09:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor(prompt=5Fbuilder):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=87=AA=E5=AE=9A=E4=B9=89=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?=E8=BD=AC=E4=B9=89=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/utils/prompt_builder.py | 70 ++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/src/plugins/utils/prompt_builder.py b/src/plugins/utils/prompt_builder.py index 6531d0a3e..fb83f41c9 100644 --- a/src/plugins/utils/prompt_builder.py +++ b/src/plugins/utils/prompt_builder.py @@ -142,35 +142,54 @@ class Prompt(str): @staticmethod def _preprocess_template(template: str) -> tuple[str, dict]: - """预处理模板,替换转义的花括号为临时标记""" + """ + 预处理模板,将转义的花括号替换为唯一的临时标记 + + Args: + template: 原始模板字符串 + + Returns: + tuple: (处理后的模板, 占位符映射字典) + """ placeholders = {} counter = 0 + processed = template + + # 定义替换函数 - 用于生成唯一占位符 + def create_placeholder(char_type): + nonlocal counter + placeholder = f"__ESC_{char_type}_{counter}__" + counter += 1 + return placeholder # 处理转义的左花括号 \{ - def replace_escaped_left_brace(match): - nonlocal counter - placeholder = f"__ESC_LEFT_BRACE_{counter}__" + left_brace_pattern = r"\\{" + while re.search(left_brace_pattern, processed): + placeholder = create_placeholder("LEFT_BRACE") placeholders[placeholder] = "{" - counter += 1 - return placeholder - - processed = re.sub(r"\\{", replace_escaped_left_brace, template) + processed = re.sub(left_brace_pattern, placeholder, processed, count=1) # 处理转义的右花括号 \} - def replace_escaped_right_brace(match): - nonlocal counter - placeholder = f"__ESC_RIGHT_BRACE_{counter}__" + right_brace_pattern = r"\\}" + while re.search(right_brace_pattern, processed): + placeholder = create_placeholder("RIGHT_BRACE") placeholders[placeholder] = "}" - counter += 1 - return placeholder - - processed = re.sub(r"\\}", replace_escaped_right_brace, processed) + processed = re.sub(right_brace_pattern, placeholder, processed, count=1) return processed, placeholders @staticmethod def _restore_template(template: str, placeholders: dict) -> str: - """还原预处理后的模板""" + """ + 还原预处理后的模板中的占位符为实际字符 + + Args: + template: 处理后的模板字符串 + placeholders: 占位符映射字典 + + Returns: + str: 还原后的字符串 + """ result = template for placeholder, value in placeholders.items(): result = result.replace(placeholder, value) @@ -188,9 +207,19 @@ class Prompt(str): @classmethod def _format_template(cls, template: str, args: List[Any] = None, kwargs: Dict[str, Any] = None) -> str: - # 预处理模板,替换转义的花括号 + """ + 格式化模板字符串,同时处理转义的花括号 + + 处理流程: + 1. 预处理模板,替换转义的花括号为临时占位符 + 2. 解析模板中的参数 + 3. 应用参数进行格式化 + 4. 还原临时占位符为实际花括号 + """ + # 1. 预处理:替换转义的花括号为临时占位符 processed_template, placeholders = cls._preprocess_template(template) + # 2. 解析参数 template_args = [] result = re.findall(r"\{(.*?)\}", processed_template) for expr in result: @@ -200,7 +229,7 @@ class Prompt(str): formatted_args = {} formatted_kwargs = {} - # 处理位置参数 + # 3. 处理位置参数 if args: # print(len(template_args), len(args), template_args, args) for i in range(len(args)): @@ -226,14 +255,13 @@ class Prompt(str): formatted_kwargs[key] = value try: - # 先用位置参数格式化 + # 应用格式化 if args: processed_template = processed_template.format(**formatted_args) - # 再用关键字参数格式化 if kwargs: processed_template = processed_template.format(**formatted_kwargs) - # 还原转义的花括号 + # 4. 还原占位符为实际的花括号 final_result = cls._restore_template(processed_template, placeholders) return final_result except (IndexError, KeyError) as e: