Sistem manajemen cepat yang aman dan divalidasi untuk LLMS yang menangkap kesalahan lebih awal, menegakkan keamanan tipe, dan menyediakan cara terstruktur untuk mengelola petunjuk. Menggunakan model Pydantic untuk validasi variabel dan templat jinja2 untuk rendering cepat.
Catatan : Perpustakaan ini sedang dalam pengembangan awal dan dapat berubah.
Saya selalu merasa sulit untuk mengelola petunjuk dinamis untuk LLMS. Prosesnya rawan kesalahan, dengan masalah yang sering ditemukan hanya saat runtime. Typed-Prompt bertujuan untuk menyelesaikan masalah ini dengan memberikan cara terstruktur dan aman untuk mengelola petunjuk yang menangkap kesalahan lebih awal dan menegakkan keamanan tipe.
Penafian : Ini adalah proyek pribadi untuk memecahkan keluhan di masa lalu dan tidak berafiliasi dengan organisasi mana pun. Ini adalah pekerjaan yang sedang berlangsung dan dapat berubah.
Saya akan menambahkan lebih banyak fitur dan contoh di masa depan. Jika Anda memiliki saran atau umpan balik, jangan ragu untuk membuka masalah!
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" )
)CATATAN : Menggunakan None sebagai nilai untuk variabel opsional akan membuat karena
Nonedalam prompt. misalnya "Contoh tes{{var}}akan merender sebagaiTest example NonejikavarNone. Ini adalah perilaku default jinja. Oleh karena itu Anda perlu menangani ini di template jinja2 Anda. misalnya{{if var}}atau{{var | default('default value')}}atau apa pun yang Anda inginkan.
Perpustakaan memvalidasi templat prompt Anda selama definisi kelas:
Semua variabel divalidasi melalui Pydantic:
Lampirkan Konfigurasi Kustom ke Prompt:
Pertimbangkan contoh ini:
# 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 : UserVarsPerpustakaan menangkap kesalahan template pada waktu definisi.
uv add tpyed-promptatau
pip install typed-promptUntuk lebih banyak contoh dan dokumentasi terperinci, periksa direktori contoh.
Untuk menjalankan contoh:
uv run python examples/user.pyTyped-Prompt menggunakan struktur prompt dua bagian yang cocok dengan pola interaksi LLM umum:
Prompt Sistem : Memberikan konteks atau instruksi untuk model AI. Anda dapat mendefinisikan ini dalam dua cara:
system_prompt_template Prompt Pengguna : Berisi templat prompt aktual yang akan dikirim ke model. Ini selalu didefinisikan dalam atribut kelas prompt_template .
Variabel dalam prompt diketik ditangani melalui tiga mekanisme pelengkap:
Variabel Model : Model Pydantic yang mendefinisikan variabel inti kebutuhan cepat Anda:
class UserVariables ( BaseModel ):
name : str
age : int
occupation : Optional [ str ] = NoneParameter metode render : Variabel tambahan dapat didefinisikan sebagai argumen kata kunci saja dalam metode render khusus:
def render ( self , * , learning_topic : str , ** extra_vars ) -> RenderOutput :
extra_vars [ "learning_topic" ] = learning_topic
return super (). render ( ** extra_vars )Variabel tambahan : Variabel satu kali dapat diteruskan langsung ke metode render.
Perpustakaan melakukan validasi komprehensif untuk menangkap masalah umum lebih awal:
Untuk prompt yang kompleks, Anda dapat memuat templat dari file eksternal:
class ComplexPrompt ( BasePrompt [ ComplexVariables ]):
system_prompt_template = Path ( "templates/system_prompt.j2" ). read_text ()
prompt_template : str = Path ( "templates/user_prompt.j2" ). read_text ()CATATAN : Dengan mesin templating seperti Jinja2, Anda biasanya dapat memuat templat memuat ulang, tetapi ini tidak didukung dalam prompt yang diketik karena templat divalidasi pada waktu definisi kelas.
Kelas dasar untuk membuat petunjuk terstruktur.
T : Subkelas basemodel pydantic yang mendefinisikan struktur variabel template system_prompt_template : Opsional [str] - Template Prompt Sistemprompt_template : str - Template prompt penggunavariables : T - contoh model variabel render(**extra_vars) -> RenderOutput : render kedua petunjuk dengan variabel yang disediakanA NamedTuple yang menyediakan akses terstruktur ke petunjuk yang diberikan:
system_prompt : Opsional [STR] - Prompt sistem yang diberikanuser_prompt : str - prompt pengguna yang diberikan Struktur templat Anda untuk keterbacaan dan pemeliharaan maksimal:
Gunakan Docstring untuk Sistem Prompt : Jika memungkinkan, tentukan petunjuk sistem di kelas Docstrings untuk Organisasi Kode yang Lebih Baik:
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?"Templat kompleks terpisah : Untuk templat yang lebih panjang, gunakan file eksternal:
system_prompt_template = Path ( "templates/system_prompt.j2" ). read_text ()Gunakan Sintaks Bersyarat Jinja2 untuk Konten Dinamis:
class DynamicPrompt ( BasePrompt [ Variables ]):
prompt_template : str = """
{% if expert_mode %}
Provide a detailed technical explanation of {{topic}}
{% else %}
Explain {{topic}} in simple terms
{% endif %}
""" Kontribusi dipersilakan!
Proyek ini dilisensikan di bawah lisensi MIT - lihat file lisensi untuk detailnya.
Opsial masih akan merender karena None di prompt.
Buat jinja2 opsional, (untuk templating yang sangat sederhana cukup gunakan format string misalnya f"Hello {name}" ). Mungkin seharusnya memulai lol yang lebih sederhana.
Output OpenAi Objek Pesan Kompatibel.
Kemampuan untuk mendefinisikan, bukan hanya prompt sistem dan prompt tunggal, tetapi rantai cepat. misalnya system_prompt -> user_prompt -> assistant_response -> user_prompt -> assistant_response -> ...