| # 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 |
| ``` |
|
|