Prácticas Poet Smine y simplifica un diseño rápido para desarrolladores y usuarios no técnicos con su enfoque de código bajo. Utilizando una mezcla de YAML y Jinja2, el poeta rápido permite una creación rápida flexible y dinámica, mejorando la eficiencia y la calidad de las interacciones con los modelos de IA. Ahorra tiempo en manipulaciones de cadenas de ingeniería, lo que permite a todos concentrarse más en elaborar las indicaciones óptimas para sus usuarios.
pip install prompt-poet import os
import getpass
from prompt_poet import Prompt
from langchain import ChatOpenAI
# Uncomment if you need to set OPENAI_API_KEY.
# os.environ["OPENAI_API_KEY"] = getpass.getpass()
raw_template = """
- name: system instructions
role: system
content: |
Your name is {{ character_name }} and you are meant to be helpful and never harmful to humans.
- name: user query
role: user
content: |
{{ username}}: {{ user_query }}
- name: response
role: user
content: |
{{ character_name }}:
"""
template_data = {
"character_name" : "Character Assistant" ,
"username" : "Jeff" ,
"user_query" : "Can you help me with my homework?"
}
prompt = Prompt (
raw_template = raw_template ,
template_data = template_data
)
model = ChatOpenAI ( model = "gpt-4o-mini" )
response = model . invoke ( prompt . messages )Las plantillas de poeta rápidas usan una mezcla de YAML y Jinja2. El procesamiento de la plantilla ocurre en dos etapas principales:
- name : system instructions
role : system
content : |
Your name is {{ character_name }} and you are meant to be helpful and never harmful to humans.
- name : user query
role : user
content : |
{{ username}}: {{ user_query }}
- name : reply_prompt
role : user
content : |
{{ character_name }}: Si tiene elementos (por ejemplo, mensajes) en una lista, puede analizarlos en su plantilla así.
{% for message in current_chat_messages %}
- name : chat_message
role : user
content : |
{{ message.author }}: {{ message.content }}
{% endfor %} La longitud de contexto es limitada y no siempre puede adaptarse a todo el historial de chat, por lo que podemos establecer una prioridad de truncamiento en las partes del mensaje y el poeta rápido truncará estas partes en el orden en que aparecen (más antiguos a más recientes).
{% for message in current_chat_messages %}
- name : chat_message
role : user
truncation_priority : 1
content : |
{{ message.author }}: {{ message.content }}
{% endfor %} Para adaptar las instrucciones basadas en la modalidad actual del usuario (audio o texto).
{% if modality == "audio" %}
- name : special audio instruction
role : system
content : |
{{ username }} is currently using audio. Keep your answers succinct.
{% endif %} Incluir ejemplos específicos del contexto como la ayuda de la tarea cuando sea necesario.
{% if extract_user_query_topic(user_query) == "homework_help" %}
{% for homework_example in fetch_few_shot_homework_examples(username, character_name) %}
- name : homework_example_{{ loop.index }}
role : user
content : |
{{ homework_example }}
{% endfor %}
{% endif %} El poeta rápido despojará el espacio en blanco de forma predeterminada para evitar nuevas líneas no deseadas en su aviso final. Si desea incluir un espacio explícito, use el marcador de espacio incorporado especial "<| Space |>" para garantizar el formateo adecuado.
- name : system instructions
role : system
content : |
Your name is {{ character_name }} and you are meant to be helpful and never harmful to humans.
- name : user query
role : user
content : |
<|space|>{{ username}}: {{ user_query }} La composición es una fuerza central de las plantillas de poeta rápidas, lo que permite la creación de indicaciones dinámicas complejas.
- name : system instructions
role : system
content : |
Your name is {{ character_name }} and you are meant to be helpful and never harmful to humans.
{% if modality == "audio" %}
- name : special audio instruction
role : system
content : |
{{ username }} is currently using audio modality. Keep your answers succinct and to the point.
{% endif %}
{% if extract_user_query_topic(user_query) == "homework_help" %}
{% for homework_example in fetch_few_shot_homework_examples(username, character_name) %}
- name : homework_example_{{ loop.index }}
role : user
content : |
{{ homework_example }}
{% endfor %}
{% endif %}
{% for message in current_chat_messages %}
- name : chat_message
role : user
truncation_priority : 1
content : |
{{ message.author }}: {{ message.content }}
{% endfor %}
- name : user query
role : user
content : |
{{ username}}: {{ user_query }}
- name : reply_prompt
role : user
content : |
{{ character_name }}: Para mantener principios secos en sus plantillas, diviértalos en secciones reutilizables que se puedan aplicar en diferentes plantillas, como cuando A/B prueba un nuevo aviso.
{% include 'sections/system_instruction.yml.j2' %}
{% include 'sections/audio_instruction.yml.j2' %}
{% if extract_user_query_topic(user_query) == "homework_help" %}
{% include 'sections/homework_examples.yml.j2' %}
{% endif %}
{% include 'sections/chat_messages.yml.j2' %}
{% include 'sections/user_query.yml.j2' %}
{% include 'sections/reply_prompt.yml.j2' %}La rápida biblioteca de poetas proporciona varias características y configuraciones, incluidas las propiedades de inmediato. Las características clave como la tokenización y el truncamiento ayudan con el almacenamiento en caché eficiente y las respuestas de baja latencia
prompt . tokenize ()
prompt . truncate ( token_limit = TOKEN_LIMIT , truncation_step = TRUNCATION_STEP )
# Inspect prompt as a raw string.
prompt . string : str
> >> "..."
# Inpsect the prompt as raw tokens.
prompt . tokens : list [ int ]
> >> [...]
# Inspect the prompt as LLM API message dicts.
prompt . messages : list [ dict ]
> >> [...]
# Inspect the prompt as first class parts.
prompt . parts : list [ PromptPart ]
> >> [...]Jinja2 y Yaml se combinan para ofrecer un lenguaje de plantilla increíblemente extensible y expresivo. Jinja2 facilita los enlaces de datos directos, las llamadas de función arbitraria y el flujo de control básico dentro de las plantillas. Yaml proporciona estructura a nuestras plantillas (con profundidad = 1) que nos permite realizar un truncamiento sofisticado cuando se alcanza el límite del token. Este emparejamiento de Jinja2 y Yaml no es único, sobre todo lo usa Ansible.
Una característica destacada de Jinja2 es la capacidad de invocar funciones arbitrarias de Python directamente dentro de las plantillas en tiempo de ejecución. Esta característica es crucial para la recuperación de datos sobre la marcha, la manipulación y la validación, racionalizando cómo se construyen las indicaciones. Aquí extract_user_query_topic puede realizar un procesamiento arbitrario de la consulta del usuario utilizada en el flujo de control de la plantilla, tal vez realizando un viaje de ida y vuelta a un clasificador de temas.
{ % if extract_user_query_topic ( user_query ) == "homework_help" % }
{ % for homework_example in fetch_few_shot_homework_examples ( username , character_name ) % }
- name : homework_example_ {{ loop . index }}
role : user
content : |
{{ homework_example }}
{ % endfor % }
{ % endif % } De manera predeterminada, el poeta utilizará el tokenizer Tiktoken "O200K_Base", aunque se pueden proporcionar nombres de codificación alternativos en el nivel de nivel superior tiktoken_encoding_name . Alternativamente, los usuarios pueden proporcionar su propia función de codificación con el nivel superior encode_func: Callable[[str], list[int]] .
from tiktoken import get_encoding
encode_func = get_encoding ( "o200k_base" )
prompt = Prompt (
raw_template = raw_template ,
template_data = template_data ,
encode_func = encode_func
)
prompt . tokenize ()
prompt . tokens
> >> [...]Si su proveedor de LLM admite la afinidad de GPU y el caché de prefijo, utilice el algoritmo de truncamiento del personaje. La tasa de caché de prefijo se define como el número de tokens rápidos recuperados de la caché sobre el número total de tokens de inmediato. Encuentre los valores óptimos para el paso de truncamiento y el límite de token para su caso de uso. A medida que aumenta el paso de truncamiento, la tasa de caché de prefijo también aumenta, pero más tokens se truncan de la solicitud.
TOKEN_LIMIT = 128000
TRUNCATION_STEP = 4000
# Tokenize and truncate the prompt.
prompt . tokenize ()
prompt . truncate ( token_limit = TOKEN_LIMIT , truncation_step = TRUNCATION_STEP )
response = model . invoke ( prompt . messages )En resumen, el truncamiento consciente de caché trunca hasta un punto de truncamiento fijo cada vez que se invoca, solo moviendo este punto de truncamiento en promedio cada k gira. Esto permite a su proveedor de LLM explotar al máximo de la caché de prefijo GPU descrito en la optimización de la inferencia. Si, en su lugar, simplemente truncamos hasta llegar al límite de token (L), este punto de truncamiento movería cada turno, lo que causaría una reducción significativa en la tasa de caché de prefijo. La compensación en este enfoque es que a menudo truncamos más de lo que necesitamos estrictamente.

Un registro de plantillas es simplemente el concepto de almacenar plantillas como archivos en el disco. Al usar un registro de plantilla, puede aislar archivos de plantilla de su código Python y cargar estos archivos directamente desde el disco. En los sistemas de producción, estos archivos de plantilla se pueden cargar opcionalmente desde un caché en memoria en usos sucesivos, guardando en el disco de E/S. En el futuro, un registro de plantillas puede convertirse en un ciudadano de primera clase del poeta rápido.
Nombre de archivo: chat_template.yml.j2
- name : system instructions
role : system
content : |
Your name is {{ character_name }} and you are meant to be helpful and never harmful to humans.
- name : user query
role : user
content : |
{{ username}}: {{ user_query }}
- name : response
role : user
content : |
{{ character_name }}: Ejecute este código Python desde el mismo directorio que ha guardado el archivo chat_template.yml.j2 .
from prompt_poet import Prompt
prompt = Prompt (
template_path = "chat_template.yml.j2" ,
template_data = template_data
)
print ( prompt . string )
> >> 'Your name is Character Assistant and you are meant to be helpful and never harmful to humans.Jeff: Can you help me with my homework?Character Assistant:'