一種類型安全的,經過驗證的LLMS的提示管理系統,可儘早捕獲錯誤,實施類型安全性,並提供一種結構化的方法來管理提示。使用Pydantic模型進行可變驗證和Jinja2模板進行及時渲染。
注意:該圖書館正處於早期開發狀態,可能會發生變化。
我總是發現管理LLM的動態提示很具有挑戰性。該過程容易出錯,通常僅在運行時發現問題。鍵入宣傳旨在通過提供一種結構化的,類型的安全方法來管理提示,以儘早發現錯誤並強制執行類型的安全性來解決此問題。
免責聲明:這是一個個人項目,旨在解決我過去的抓地力,而不是與任何組織有聯繫。這是一項正在進行的工作,可能會改變。
我將來會添加更多功能和示例。如果您有任何建議或反饋,請隨時打開問題!
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。例如,“測試示例{{var}}{{if var}}{{var | default('default value')}}varNoneTest example None
庫在課堂定義期間驗證您的提示模板:
所有變量均通過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.py鍵入PROMPT使用分為兩部分的提示結構,該結構與常見的LLM交互模式匹配:
系統提示:為AI模型提供上下文或說明。您可以通過兩種方式來定義這一點:
system_prompt_template類屬性用戶提示:包含將發送到模型的實際提示模板。這始終是在prompt_template類屬性中定義的。
打字prompt中的變量通過三種互補機制來處理:
變量模型:定義核心變量您提示需求的pydantic模型:
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之類的模板引擎,您通常可以熱加載模板,但是在類型啟動中不支持該模板在類別定義時間驗證。
創建結構化提示的基礎類。
T :一個定義模板變量結構的pydantic基本模型子類system_prompt_template :可選[str] - 系統提示模板prompt_template :str-用戶提示模板variables :t-變量模型的實例render(**extra_vars) -> RenderOutput :帶有提供變量的兩個提示一個名為Tuple,可提供對渲染提示的結構化訪問:
system_prompt :可選[str] - 渲染系統提示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 -> ...