123456789101112131415161718192021222324252627282930313233343536373839 |
- import re
- REGEX = re.compile(r"\{\{([a-zA-Z_][a-zA-Z0-9_]{1,29}|#histories#|#query#|#context#)\}\}")
- class PromptTemplateParser:
- """
- Rules:
- 1. Template variables must be enclosed in `{{}}`.
- 2. The template variable Key can only be: letters + numbers + underscore, with a maximum length of 16 characters,
- and can only start with letters and underscores.
- 3. The template variable Key cannot contain new lines or spaces, and must comply with rule 2.
- 4. In addition to the above, 3 types of special template variable Keys are accepted:
- `{{#histories#}}` `{{#query#}}` `{{#context#}}`. No other `{{##}}` template variables are allowed.
- """
- def __init__(self, template: str):
- self.template = template
- self.variable_keys = self.extract()
- def extract(self) -> list:
- # Regular expression to match the template rules
- return re.findall(REGEX, self.template)
- def format(self, inputs: dict, remove_template_variables: bool = True) -> str:
- def replacer(match):
- key = match.group(1)
- value = inputs.get(key, match.group(0)) # return original matched string if key not found
- if remove_template_variables:
- return PromptTemplateParser.remove_template_variables(value)
- return value
- return re.sub(REGEX, replacer, self.template)
- @classmethod
- def remove_template_variables(cls, text: str):
- return re.sub(REGEX, r'{\1}', text)
|