Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
164 lines
5.3 KiB
Python
164 lines
5.3 KiB
Python
"""
|
|
Ablation utilities for prompt engineering experiments
|
|
"""
|
|
|
|
import random
|
|
import re
|
|
from enum import Enum
|
|
from typing import List, Dict, Any, Optional
|
|
import copy
|
|
|
|
|
|
class ToneStyle(Enum):
|
|
"""Different tone styles for the agent"""
|
|
DEFAULT = "default"
|
|
TRUMP = "trump"
|
|
CASUAL = "casual"
|
|
|
|
|
|
# Tone style instructions
|
|
TONE_INSTRUCTIONS = {
|
|
ToneStyle.TRUMP: """
|
|
You must communicate in the distinctive style of Donald Trump. This means:
|
|
- Use superlatives frequently ("tremendous", "fantastic", "the best", "incredible", "nobody does it better")
|
|
- Speak with absolute confidence and make bold claims
|
|
- Use repetition for emphasis ("very, very important", "believe me")
|
|
- Reference your success and expertise often
|
|
- Use simple, direct language with short, punchy sentences
|
|
- Show enthusiasm with phrases like "It's going to be great!" or "You're going to love it!"
|
|
- Occasionally use "folks" when addressing users
|
|
- Be assertive and decisive in your statements
|
|
- Use "frankly" and "honestly" to emphasize points
|
|
- Make everything sound like a big deal
|
|
|
|
Example responses:
|
|
- Instead of "I'll help you book a flight", say "I'm going to get you the best flight deal ever, believe me. Nobody books flights better than me."
|
|
- Instead of "There's an error", say "This is a disaster, frankly. But don't worry, I'll fix it. I always fix things. It'll be tremendous."
|
|
""",
|
|
|
|
ToneStyle.CASUAL: """
|
|
Speak with the user in a super casual, fun, and cool tone. Use a ton of emojis, as well as slang and idioms. Be like their fun friend who's helping them out!
|
|
|
|
Guidelines:
|
|
- Use lots of emojis throughout your responses 🎉✨😊🚀
|
|
- Use casual language and slang (e.g., "totally", "awesome", "no worries", "gotcha", "my bad")
|
|
- Be enthusiastic and upbeat
|
|
- Use informal greetings like "Hey there!", "What's up?", "Yo!"
|
|
- Use phrases like "Let's do this!", "You got it!", "Boom!", "Sweet!"
|
|
- Keep things light and friendly
|
|
- Use idioms and expressions like "piece of cake", "no sweat", "you're all set"
|
|
- Add personality with expressions like "Oops!", "Yay!", "Woohoo!"
|
|
|
|
Example responses:
|
|
- Instead of "I'll help you book a flight", say "Hey! Let's get you that flight booked! 🛫✨ This is gonna be awesome!"
|
|
- Instead of "There's an error", say "Oops! 😅 Looks like we hit a little snag, but no worries! Let me fix that for you real quick! 💪"
|
|
""",
|
|
|
|
ToneStyle.DEFAULT: "" # No modification for default
|
|
}
|
|
|
|
|
|
def apply_tone_modification(text: str, tone_style: ToneStyle) -> str:
|
|
"""
|
|
Apply tone modification to text (wiki or system prompt)
|
|
|
|
Args:
|
|
text: Original text
|
|
tone_style: The tone style to apply
|
|
|
|
Returns:
|
|
Modified text with tone instructions prepended
|
|
"""
|
|
if tone_style == ToneStyle.DEFAULT:
|
|
return text
|
|
|
|
tone_instruction = TONE_INSTRUCTIONS[tone_style]
|
|
|
|
# Add tone instruction to the beginning of the text
|
|
if text:
|
|
return f"{tone_instruction}\n\n---ORIGINAL INSTRUCTIONS---\n\n{text}"
|
|
else:
|
|
return tone_instruction
|
|
|
|
|
|
def load_randomized_wiki(env: str) -> str:
|
|
"""
|
|
Load pre-generated randomized wiki for the specified environment
|
|
|
|
Args:
|
|
env: Environment name ('airline' or 'retail')
|
|
|
|
Returns:
|
|
Pre-randomized wiki text
|
|
"""
|
|
import os
|
|
from pathlib import Path
|
|
|
|
# Get the directory where this script is located
|
|
script_dir = Path(__file__).parent
|
|
|
|
if env == "airline":
|
|
wiki_path = script_dir / "wiki_airline_randomized.md"
|
|
elif env == "retail":
|
|
wiki_path = script_dir / "wiki_retail_randomized.md"
|
|
else:
|
|
raise ValueError(f"Unknown environment: {env}")
|
|
|
|
if not wiki_path.exists():
|
|
raise FileNotFoundError(f"Randomized wiki not found: {wiki_path}")
|
|
|
|
with open(wiki_path, 'r') as f:
|
|
return f.read()
|
|
|
|
|
|
def remove_descriptions_recursive(obj: Any) -> Any:
|
|
"""
|
|
Recursively remove all description fields from a nested object
|
|
|
|
Args:
|
|
obj: The object to process
|
|
|
|
Returns:
|
|
Object with all descriptions removed
|
|
"""
|
|
if isinstance(obj, dict):
|
|
result = {}
|
|
for key, value in obj.items():
|
|
if key == "description":
|
|
# Remove description by setting to empty string
|
|
result[key] = ""
|
|
else:
|
|
# Recursively process nested structures
|
|
result[key] = remove_descriptions_recursive(value)
|
|
return result
|
|
elif isinstance(obj, list):
|
|
# Process each item in the list
|
|
return [remove_descriptions_recursive(item) for item in obj]
|
|
else:
|
|
# Return primitive values as-is
|
|
return obj
|
|
|
|
|
|
def remove_tool_descriptions(tools_info: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
"""
|
|
Remove descriptions from tools and their parameters (including nested structures)
|
|
|
|
Args:
|
|
tools_info: Original tools information
|
|
|
|
Returns:
|
|
Tools information with all descriptions removed
|
|
"""
|
|
modified_tools = []
|
|
|
|
for tool in tools_info:
|
|
# Deep copy to avoid modifying original
|
|
modified_tool = copy.deepcopy(tool)
|
|
|
|
# Recursively remove all descriptions
|
|
modified_tool = remove_descriptions_recursive(modified_tool)
|
|
|
|
modified_tools.append(modified_tool)
|
|
|
|
return modified_tools
|