# Advanced Features LLMPromptKit provides several advanced features for sophisticated prompt engineering. ## Advanced Templating LLMPromptKit's templating system goes beyond simple variable substitution, offering conditionals and loops. ### Basic Variable Substitution ```python from llmpromptkit import PromptTemplate # Simple variable substitution template = PromptTemplate("Hello, {name}!") rendered = template.render(name="John") # Result: "Hello, John!" ``` ### Conditional Logic ```python # Conditionals template = PromptTemplate(""" {if is_formal} Dear {name}, I hope this message finds you well. {else} Hey {name}! {endif} {message} """) formal = template.render(is_formal=True, name="Dr. Smith", message="Please review the attached document.") casual = template.render(is_formal=False, name="Bob", message="Want to grab lunch?") ``` ### Loops ```python # Loops template = PromptTemplate(""" Here are your tasks: {for task in tasks} - {task.priority}: {task.description} {endfor} """) rendered = template.render(tasks=[ {"priority": "High", "description": "Complete the report"}, {"priority": "Medium", "description": "Schedule meeting"}, {"priority": "Low", "description": "Organize files"} ]) ``` ### Nested Structures ```python # Combining loops and conditionals template = PromptTemplate(""" {system_message} {for example in examples} User: {example.input} {if example.has_reasoning} Reasoning: {example.reasoning} {endif} Assistant: {example.output} {endfor} User: {query} Assistant: """) rendered = template.render( system_message="You are a helpful assistant.", examples=[ { "input": "What's 2+2?", "has_reasoning": True, "reasoning": "Adding 2 and 2 gives 4", "output": "4" }, { "input": "Hello", "has_reasoning": False, "output": "Hi there! How can I help you today?" } ], query="What's the capital of France?" ) ``` ## Custom Evaluation Metrics You can create custom metrics to evaluate prompt outputs based on your specific requirements. ### Creating a Custom Metric ```python from llmpromptkit import EvaluationMetric class RelevanceMetric(EvaluationMetric): """Evaluates relevance of output to a given topic.""" def __init__(self, topics): super().__init__("relevance", "Evaluates relevance to specified topics") self.topics = topics def compute(self, generated_output, expected_output=None, **kwargs): """ Compute relevance score based on topic presence. Returns a float between 0 and 1. """ score = 0 output_lower = generated_output.lower() for topic in self.topics: if topic.lower() in output_lower: score += 1 # Normalize to 0-1 range return min(1.0, score / len(self.topics)) if self.topics else 0.0 ``` ### Using Custom Metrics ```python from llmpromptkit import Evaluator, PromptManager # Initialize components prompt_manager = PromptManager() evaluator = Evaluator(prompt_manager) # Register custom metric climate_relevance = RelevanceMetric(["climate", "temperature", "warming", "environment"]) evaluator.register_metric(climate_relevance) # Use in evaluation async def my_llm(prompt, vars): # Call your LLM API here return "Climate change is causing global temperature increases..." results = await evaluator.evaluate_prompt( prompt_id="abc123", inputs=[{"topic": "climate change"}], llm_callback=my_llm, metric_names=["relevance"] # Use our custom metric ) print(f"Relevance score: {results['aggregated_metrics']['relevance']}") ``` ## Customizing Storage LLMPromptKit allows you to customize where and how prompts and related data are stored. ### Custom Storage Locations ```python # Specify a custom storage location prompt_manager = PromptManager("/path/to/my/prompts") # Export/import prompts import json # Export a prompt to a file prompt = prompt_manager.get("abc123") with open("exported_prompt.json", "w") as f: json.dump(prompt.to_dict(), f, indent=2) # Import a prompt from a file with open("exported_prompt.json", "r") as f: data = json.load(f) imported_prompt = prompt_manager.import_prompt(data) ``` ## LLM Integration LLMPromptKit is designed to work with any LLM through callback functions. Here are examples of integrating with popular LLM APIs. ### OpenAI Integration ```python import openai from llmpromptkit import PromptManager, PromptTesting prompt_manager = PromptManager() testing = PromptTesting(prompt_manager) # Configure OpenAI openai.api_key = "your-api-key" # OpenAI callback function async def openai_callback(prompt, vars): response = openai.ChatCompletion.create( model="gpt-4", messages=[{"role": "user", "content": prompt}], temperature=0.7, max_tokens=150 ) return response.choices[0].message.content # Run tests with OpenAI test_results = await testing.run_all_tests("abc123", openai_callback) ``` ### Anthropic Integration ```python import anthropic from llmpromptkit import PromptManager, Evaluator prompt_manager = PromptManager() evaluator = Evaluator(prompt_manager) # Configure Anthropic client = anthropic.Anthropic(api_key="your-api-key") # Anthropic callback function async def anthropic_callback(prompt, vars): response = client.messages.create( model="claude-2", messages=[{"role": "user", "content": prompt}], max_tokens=150 ) return response.content[0].text # Evaluate with Anthropic eval_results = await evaluator.evaluate_prompt( prompt_id="abc123", inputs=[{"query": "What is machine learning?"}], llm_callback=anthropic_callback ) ``` ### Hugging Face Integration ```python from transformers import pipeline import asyncio from llmpromptkit import PromptManager, VersionControl prompt_manager = PromptManager() version_control = VersionControl(prompt_manager) # Set up Hugging Face pipeline generator = pipeline('text-generation', model='gpt2') # Hugging Face callback function async def hf_callback(prompt, vars): # Run synchronously but in a way that doesn't block the asyncio event loop loop = asyncio.get_event_loop() result = await loop.run_in_executor(None, lambda: generator(prompt, max_length=100)[0]['generated_text']) return result # Use with version control prompt = prompt_manager.create( content="Complete this: {text}", name="Text Completion" ) version_control.commit(prompt.id, "Initial version") # Test with different models by swapping the callback ```