Отсутствующая типовая, проверенная система управления быстрого управления для LLMS, которая рано улавливает ошибки, обеспечивает безопасность типа и обеспечивает структурированный способ управления подсказками. Использует модели Pydantic для валидации переменной и шаблонов Jinja2 для быстрого рендеринга.
Примечание : эта библиотека находится в ранней разработке и может быть изменена.
Мне всегда было сложно управлять динамическими подсказками для LLMS. Процесс подвержен ошибкам, с проблемами, часто обнаруживаемыми только во время выполнения. Typed-Prompt стремится решить эту проблему, предоставляя структурированный, безопасный способ управления подсказками, который рано улавливает ошибки и обеспечивает безопасность типа.
Отказ от ответственности : это личный проект для решения проблем, которые я имел в прошлом и не связан с какой -либо организацией. Это работа в процессе и может быть изменена.
Я буду добавлять больше функций и примеров в будущем. Если у вас есть какие -либо предложения или отзывы, не стесняйтесь открывать проблему!
from typed_prompt import BasePrompt
from pydantic import BaseModel
from typing import Optional
# Define your variables
class UserVars ( BaseModel ):
name : str
expertise : str
# This works - all template variables are defined
class ValidPrompt ( BasePrompt [ UserVars ]):
"""Helping {{name}} with {{expertise}} level knowledge."""
prompt_template : str = "Explain {{topic}} to me"
variables : UserVars
def render ( self , * , topic : str , ** extra_vars ) -> RenderOutput :
extra_vars [ "topic" ] = topic
return super (). render ( ** extra_vars )
# This fails immediately - 'unknown_var' not defined
class InvalidPrompt ( BasePrompt [ UserVars ]):
prompt_template : str = "What is {{unknown_var}}?" # ValueError!
variables : UserVars
# This fails - 'expertise' defined but never used
class UnusedVarPrompt ( BasePrompt [ UserVars ]):
prompt_template : str = "Hello {{name}}" # ValueError!
variables : UserVars from typing import Union
class TemplateVars ( BaseModel ):
user_type : Union [ "expert" , "beginner" ]
name : str
preferences : Optional [ dict ] = None
class ConditionalPrompt ( BasePrompt [ TemplateVars ]):
"""{% if user_type == 'expert' %}
Technical advisor for {{name}}
{% else %}
Friendly helper for {{name}}
{% endif %}"""
prompt_template : str = """
{% if preferences %}
Considering your preferences: {% for k, v in preferences.items() %}
- {{k}}: {{v}}{% endfor %}
{% endif %}
How can I help with {{topic}}?
"""
variables : TemplateVars
def render ( self , * , topic : str , ** extra_vars ) -> RenderOutput :
extra_vars [ "topic" ] = topic
return super (). render ( ** extra_vars ) from typed_prompt import RenderOutput
from pydantic import BaseModel , Field
class MyConfig ( BaseModel ):
temperature : float = Field ( default = 0.7 , ge = 0 , le = 2 )
model : str = Field ( default = "gpt-4" )
class MyPrompt ( BasePrompt [ UserVars ]):
"""Assistant for {{name}}"""
prompt_template : str = "Help with {{topic}}"
variables : UserVars
config : MyConfig = Field ( default_factory = MyConfig )
def render ( self , * , topic : str , ** extra_vars ) -> RenderOutput :
extra_vars [ "topic" ] = topic
return super (). render ( ** extra_vars )
# Use custom config
prompt = MyPrompt (
variables = UserVars ( name = "Alice" , expertise = "intermediate" ),
config = MyConfig ( temperature = 0.9 , model = "gpt-3.5-turbo" )
)ПРИМЕЧАНИЕ . Использование None в качестве значения для необязательных переменных будет отображаться, как
Noneв приглашении. Например, «Пример тестирования{{var}}{{var | default('default value')}}отображаться какTest example None,{{if var}}varNoneявляется.
Библиотека проверяет ваши шаблоны подсказки во время определения класса:
Все переменные подтверждены через Pydantic:
Прикрепите пользовательскую конфигурацию к подсказкам:
Рассмотрим этот пример:
# Without typed-prompt
def create_prompt ( user_data ):
template = "Hello {{username}}, your level is {{level}}"
# Error only discovered when rendering with wrong data
return template . format ( ** user_data ) # KeyError at runtime!
# With typed-prompt
class UserPrompt ( BasePrompt [ UserVars ]):
prompt_template : str = "Hello {{unknown_var}}" # Error immediately!
variables : UserVarsБиблиотека улавливает ошибки шаблона во время определения.
uv add tpyed-promptили
pip install typed-promptДля получения дополнительных примеров и подробной документации, проверьте каталог примеров.
Чтобы запустить примеры:
uv run python examples/user.pyTyped-Prompt использует структуру приглашения с двумя частями, которая соответствует общим моделям взаимодействия LLM:
Системная подсказка : предоставляет контекст или инструкции для модели ИИ. Вы можете определить это двумя способами:
system_prompt_template Пользовательская подсказка : содержит фактический шаблон приглашения, который будет отправлен в модель. Это всегда определяется в атрибуте класса prompt_template .
Переменные в типированном профмометировании обрабатываются с помощью трех дополнительных механизмов:
Модель переменных : модель пиданта, которая определяет основные переменные ваши требования быстрого потребности:
class UserVariables ( BaseModel ):
name : str
age : int
occupation : Optional [ str ] = NoneПараметры метода рендеринга : Дополнительные переменные могут быть определены как аргументы только для ключевых слов в пользовательском методе рендеринга:
def render ( self , * , learning_topic : str , ** extra_vars ) -> RenderOutput :
extra_vars [ "learning_topic" ] = learning_topic
return super (). render ( ** extra_vars )Дополнительные переменные : одноразовые переменные могут быть переданы непосредственно в метод рендеринга.
Библиотека выполняет комплексную проверку, чтобы рано поймать общие проблемы:
Для сложных подсказок вы можете загрузить шаблоны из внешних файлов:
class ComplexPrompt ( BasePrompt [ ComplexVariables ]):
system_prompt_template = Path ( "templates/system_prompt.j2" ). read_text ()
prompt_template : str = Path ( "templates/user_prompt.j2" ). read_text ()Примечание . С помощью шаблонных двигателей, таких как Jinja2, вы можете обычно горячие шаблоны перезагрузки, но это не поддерживается в Typed-Prompt, поскольку шаблоны подтверждены во время определения класса.
Основополагающий класс для создания структурированных подсказок.
T : Подкласс пидбайка, определяющий структуру переменных шаблонов system_prompt_template : необязательный [str] - шаблон системы системы системыprompt_template : str - шаблон приглашения пользователяvariables : T - экземпляр модели переменных render(**extra_vars) -> RenderOutput : рендерирует оба подсказки с предоставленными переменнымиNatedTuple, обеспечивающий структурированный доступ к отображенным подсказкам:
system_prompt : необязательныйuser_prompt : str - рендерированная пользовательская приглашение Структура ваших шаблонов для максимальной читаемости и обслуживаемости:
Используйте DocStrings для системных подсказок : когда это возможно, определите системные подсказки в классе DocStrings для лучшей организации кода:
class UserPrompt ( BasePrompt [ UserVariables ]):
"""You are having a conversation with {{name}}, a {{age}}-year-old {{occupation}}."""
prompt_template : str = "What would you like to discuss?"Отдельные сложные шаблоны : для более длинных шаблонов используйте внешние файлы:
system_prompt_template = Path ( "templates/system_prompt.j2" ). read_text ()Используйте условный синтаксис Jinja2 для динамического содержания:
class DynamicPrompt ( BasePrompt [ Variables ]):
prompt_template : str = """
{% if expert_mode %}
Provide a detailed technical explanation of {{topic}}
{% else %}
Explain {{topic}} in simple terms
{% endif %}
""" Взносы приветствуются!
Этот проект лицензирован по лицензии MIT - для получения подробной информации см. Файл лицензии.
Необходимые по -прежнему будут отображаться, как None в приглашении.
Сделайте Jinja2 необязательным, (для очень простой шаблоны просто используйте форматирование строки, например f"Hello {name}" ). Может быть, должна начаться проще, лол.
Вывод Openai -совместимые объекты сообщения.
Способность определить не только системную подсказку и единственную подсказку, но и цепочки. Например, system_prompt -> user_prompt -> assistant_response -> user_prompt -> assistant_response -> ...