refactor(prompt_builder): 优化自定义提示词转义流程
This commit is contained in:
@@ -142,35 +142,54 @@ class Prompt(str):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _preprocess_template(template: str) -> tuple[str, dict]:
|
def _preprocess_template(template: str) -> tuple[str, dict]:
|
||||||
"""预处理模板,替换转义的花括号为临时标记"""
|
"""
|
||||||
|
预处理模板,将转义的花括号替换为唯一的临时标记
|
||||||
|
|
||||||
|
Args:
|
||||||
|
template: 原始模板字符串
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
tuple: (处理后的模板, 占位符映射字典)
|
||||||
|
"""
|
||||||
placeholders = {}
|
placeholders = {}
|
||||||
counter = 0
|
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):
|
left_brace_pattern = r"\\{"
|
||||||
nonlocal counter
|
while re.search(left_brace_pattern, processed):
|
||||||
placeholder = f"__ESC_LEFT_BRACE_{counter}__"
|
placeholder = create_placeholder("LEFT_BRACE")
|
||||||
placeholders[placeholder] = "{"
|
placeholders[placeholder] = "{"
|
||||||
counter += 1
|
processed = re.sub(left_brace_pattern, placeholder, processed, count=1)
|
||||||
return placeholder
|
|
||||||
|
|
||||||
processed = re.sub(r"\\{", replace_escaped_left_brace, template)
|
|
||||||
|
|
||||||
# 处理转义的右花括号 \}
|
# 处理转义的右花括号 \}
|
||||||
def replace_escaped_right_brace(match):
|
right_brace_pattern = r"\\}"
|
||||||
nonlocal counter
|
while re.search(right_brace_pattern, processed):
|
||||||
placeholder = f"__ESC_RIGHT_BRACE_{counter}__"
|
placeholder = create_placeholder("RIGHT_BRACE")
|
||||||
placeholders[placeholder] = "}"
|
placeholders[placeholder] = "}"
|
||||||
counter += 1
|
processed = re.sub(right_brace_pattern, placeholder, processed, count=1)
|
||||||
return placeholder
|
|
||||||
|
|
||||||
processed = re.sub(r"\\}", replace_escaped_right_brace, processed)
|
|
||||||
|
|
||||||
return processed, placeholders
|
return processed, placeholders
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _restore_template(template: str, placeholders: dict) -> str:
|
def _restore_template(template: str, placeholders: dict) -> str:
|
||||||
"""还原预处理后的模板"""
|
"""
|
||||||
|
还原预处理后的模板中的占位符为实际字符
|
||||||
|
|
||||||
|
Args:
|
||||||
|
template: 处理后的模板字符串
|
||||||
|
placeholders: 占位符映射字典
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: 还原后的字符串
|
||||||
|
"""
|
||||||
result = template
|
result = template
|
||||||
for placeholder, value in placeholders.items():
|
for placeholder, value in placeholders.items():
|
||||||
result = result.replace(placeholder, value)
|
result = result.replace(placeholder, value)
|
||||||
@@ -188,9 +207,19 @@ class Prompt(str):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _format_template(cls, template: str, args: List[Any] = None, kwargs: Dict[str, Any] = None) -> str:
|
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)
|
processed_template, placeholders = cls._preprocess_template(template)
|
||||||
|
|
||||||
|
# 2. 解析参数
|
||||||
template_args = []
|
template_args = []
|
||||||
result = re.findall(r"\{(.*?)\}", processed_template)
|
result = re.findall(r"\{(.*?)\}", processed_template)
|
||||||
for expr in result:
|
for expr in result:
|
||||||
@@ -200,7 +229,7 @@ class Prompt(str):
|
|||||||
formatted_args = {}
|
formatted_args = {}
|
||||||
formatted_kwargs = {}
|
formatted_kwargs = {}
|
||||||
|
|
||||||
# 处理位置参数
|
# 3. 处理位置参数
|
||||||
if args:
|
if args:
|
||||||
# print(len(template_args), len(args), template_args, args)
|
# print(len(template_args), len(args), template_args, args)
|
||||||
for i in range(len(args)):
|
for i in range(len(args)):
|
||||||
@@ -226,14 +255,13 @@ class Prompt(str):
|
|||||||
formatted_kwargs[key] = value
|
formatted_kwargs[key] = value
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 先用位置参数格式化
|
# 应用格式化
|
||||||
if args:
|
if args:
|
||||||
processed_template = processed_template.format(**formatted_args)
|
processed_template = processed_template.format(**formatted_args)
|
||||||
# 再用关键字参数格式化
|
|
||||||
if kwargs:
|
if kwargs:
|
||||||
processed_template = processed_template.format(**formatted_kwargs)
|
processed_template = processed_template.format(**formatted_kwargs)
|
||||||
|
|
||||||
# 还原转义的花括号
|
# 4. 还原占位符为实际的花括号
|
||||||
final_result = cls._restore_template(processed_template, placeholders)
|
final_result = cls._restore_template(processed_template, placeholders)
|
||||||
return final_result
|
return final_result
|
||||||
except (IndexError, KeyError) as e:
|
except (IndexError, KeyError) as e:
|
||||||
|
|||||||
Reference in New Issue
Block a user