This repo contains the source code from my Youtube course on Context Engineering with DSPy.
📺 Watch the Course for free
Context Engineering - Complete 1h 20m Course
Learn advanced prompt engineering techniques with hands-on examples
If you find this content helpful, please consider supporting my work on Patreon. Your support helps me create more in-depth tutorials and content. My Patreon hosts all the code, projects, slides, write-ups I have ever made on my YouTube channel.
- Python 3.10+ (required)
uv(recommended) orpipfor package management
-
Clone the repository:
git clone https://github.com/avbiswas/context-engineering-dspy cd context-engineering-dspy/tutorial -
Install dependencies:
# Using uv uv sync -
Set up your API keys:
Required API Keys:
OPENAI_API_KEY- For OpenAI modelsGEMINI_API_KEY- For Google Gemini modelsTAVILY_API_KEY- For web search functionality
Environment Management Options:
Option 1: Using
direnv(Recommended)# Install direnv first, then create .envrc file echo "export OPENAI_API_KEY=your_key_here" >> .envrc echo "export GEMINI_API_KEY=your_key_here" >> .envrc echo "export TAVILY_API_KEY=your_key_here" >> .envrc direnv allow
Option 2: Using
.envfile with python-dotenv# Create .env file touch .envAdd your keys to
.env:OPENAI_API_KEY=your_key_here GEMINI_API_KEY=your_key_here TAVILY_API_KEY=your_key_here
Note: This requires adding
dotenv.load_dotenv()to your Python scripts.Option 3: Global environment variables (Not recommended for security)
export OPENAI_API_KEY=your_key_here # Repeat for other keys...
-
Run the examples: Navigate to any level directory and run the Python scripts:
cd level2_multi_interaction uv run t1_sequential_flow.py
level1_atomic_prompts/level1.ipynb: Introduces the basics of prompting and interacting with language models.
level2_multi_interaction/t1_sequential_flow.py: Demonstrates a sequential flow of interactions with the language model.level2_multi_interaction/t2_iterative_refinement.py: Shows how to iteratively refine the output from the model.level2_multi_interaction/t3_conditional_branch.py: Illustrates how to use conditional logic to guide the conversation with the model.level2_multi_interaction/t3-multi_out.py: Multiple output handling example.level2_multi_interaction/t3-multi_out_refine.py: Refined multiple output handling.level2_multi_interaction/t4_reflection.py: An example of how to make the model reflect on its own output.
To run mlflow server, use the command:
uv run mlflow server --backend-store-uri sqlite:///mydb.sqlite --port 5000
Uncomment the below lines to track experiments in mlflow
# import mlflow
# mlflow.autolog()
# mlflow.set_tracking_uri("http://127.0.0.1:5000")
# mlflow.set_experiment("Tool calling")
You can visit localhost:5000 to track experiments from the mlflow dashboard.
level3_evaluation/reflection.py: Shows how to use reflection for evaluation to generate dataset of results with different hyperparams.level3_evaluation/pairwise_elo.py: Use pairwise comparison of model outputs (not actual elo, but similar motives)level3_evaluation/analysis.ipynb: Analysis notebook for evaluation techniques.
You will need the TAVILY_API_KEY to run web search. You can sign up for a free account from their website.
level4_tools/main.py: Main tool usage examples.level4_tools/tool_calling_agent.py: An example of a tool-calling agent.level4_tools/tools.py: Tool definitions and implementations.level4_tools/idea_gen.py: Idea generation tool example.level4_tools/joke_gen.py: Joke generation tool example.
First, download this dataset: https://www.kaggle.com/datasets/abhinavmoudgil95/short-jokes
Unzip inside level5/data
Next, prepare the embeddings:
cd level5_rags
uv run vector_embedding.py
This code looks for the file level5_rags/data/shortjokes.csv
This will create some files inside the data/ directory. You should now be able to run scripts to play with retrieval.
Core RAG Implementations:
level5_rags/basic_rag.py: A basic RAG implementation.level5_rags/hyde.py: An implementation of the HyDE (Hypothetical Document Embeddings) technique.level5_rags/annoy_rag.py: RAG implementation using Annoy for vector similarity.
Retrieval Components:
level5_rags/bm25_retriever.py: BM25-based retrieval implementation.level5_rags/rank_fusion.py: An example of fusing ranks from multiple retrievers.level5_rags/vector_embedding.py: Vector embedding utilities.
Tools & Applications:
level5_rags/main.py: Main application with RAG-powered tools.level5_rags/tools.py: Tool definitions for RAG applications.level5_rags/joke_gen.py: Joke generation using RAG.level5_rags/idea_gen.py: Idea generation using RAG.
Utilities:
level5_rags/prepare_data.py: Data preparation utilities for RAG systems.level5_rags/data/: Directory containing data files for RAG examples.
To run examples from each level:
# Level 2 - Multi-interaction examples
cd level2_multi_interaction
uv run t1_sequential_flow.py
uv run t2_iterative_refinement.py