Merge pull request #846 from r00trose/r00trose-week1

Week 1 Contribution: Code Explainer by r00trose
This commit is contained in:
Ed Donner
2025-11-01 20:24:22 -04:00
committed by GitHub
5 changed files with 421 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
# Ollama Configuration
OLLAMA_BASE_URL=http://localhost:11434/v1
OLLAMA_MODEL=llama3.2
# OpenAI (if you want to use OpenAI API instead)
# OPENAI_API_KEY=your_api_key_here

View File

@@ -0,0 +1,144 @@
# Code Explainer - LLM Engineering Week 1
An AI-powered code explanation tool using Llama 3.2 via Ollama.
## 🎯 Project Overview
This project demonstrates prompt engineering and local LLM integration by building a code explanation assistant. The tool analyzes code snippets and provides beginner-friendly, line-by-line explanations.
## ✨ Features
- **Local LLM Integration**: Uses Ollama with Llama 3.2 (no API costs!)
- **Two Modes of Operation**:
- 📓 **Notebook Mode**: Interactive Jupyter notebook with rich Markdown display
- 💻 **Terminal Mode**: Interactive CLI for continuous code explanation
- **Smart Explanations**:
- Summarizes overall purpose
- Line-by-line breakdown
- Highlights key programming concepts
- Beginner-friendly language
- **Multiple Examples**: Loops, list comprehensions, OOP, recursion, decorators
- **Streaming Responses**: Real-time output as the model generates
## 🛠️ Technologies Used
- **Ollama**: Local LLM runtime
- **Llama 3.2**: Meta's language model
- **OpenAI Python SDK**: API-compatible interface
- **IPython**: Rich markdown display
- **python-dotenv**: Environment management
## 📋 Prerequisites
1. **Ollama installed** - Download from [ollama.com](https://ollama.com)
2. **Python 3.8+**
3. **Llama 3.2 model pulled**:
```bash
ollama pull llama3.2
```
## 🚀 Setup
### 1. Clone the repository
```bash
git clone <your-repo-url>
cd llm-engineering/week1/my-solutions
```
### 2. Install dependencies
```bash
pip install -r requirements.txt
```
### 3. (Optional) Configure environment
```bash
cp .env.example .env
# Edit .env if needed
```
## 💡 Usage
### Notebook Mode
1. Open `day1-solution.ipynb` in Jupyter or VS Code
2. Run cells sequentially
3. Use `explain_code_interactive()` function with your own code
```python
explain_code_interactive("""
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n-1) + fibonacci(n-2)
""")
```
### Terminal Mode
```bash
python code_explainer.py
```
Then:
- Paste your code
- Press Enter twice (empty line)
- Get explanation!
**Commands:**
- `quit` / `exit` / `q` - Exit
- `clear` - Start fresh
- `examples` - See sample code snippets
## 🎓 Why Ollama?
I chose Ollama over OpenAI API for this project because:
✅ **No API Costs**: Completely free to use
✅ **Privacy**: All data stays local
✅ **Offline**: Works without internet
✅ **Learning**: Hands-on experience with local LLM deployment
✅ **Speed**: Fast responses on local hardware
## 📝 Examples Included
1. **Recursion** - Fibonacci sequence
2. **Loops** - Simple iteration
3. **List Comprehensions** - Filtering and mapping
4. **Object-Oriented Programming** - Classes and methods
5. **Decorators** - Advanced Python concepts
## 🔧 Customization
### Change the model
Edit `code_explainer.py`:
```python
explainer = CodeExplainer(model="llama3.2:3b") # Use smaller model
```
### Adjust temperature
Lower temperature = more consistent, Higher = more creative:
```python
temperature=0.3 # Current setting for code explanations
```
### Modify system prompt
Customize how the model explains code in the `system_prompt` variable.
## 🤝 Contributing
This is a course assignment, but feel free to fork and improve!
## 📄 License
MIT License - feel free to use for learning purposes.
## 👤 Author
İrem İrem
LLM Engineering Course - Week 1 Assignment
## 🙏 Acknowledgments
- **Ed Donner** - Course instructor for the excellent LLM Engineering course
- **Anthropic** - For Ollama framework
- **Meta** - For Llama 3.2 model

View File

@@ -0,0 +1,192 @@
#!/usr/bin/env python3
"""
Code Explainer - Interactive Terminal Mode
Day 1 LLM Engineering Assignment
Explains code snippets using Llama 3.2 via Ollama
"""
import os
from dotenv import load_dotenv
from openai import OpenAI
class CodeExplainer:
"""Interactive code explanation assistant using Llama 3.2"""
def __init__(self, model="llama3.2"):
load_dotenv()
self.client = OpenAI(
base_url='http://localhost:11434/v1',
api_key='ollama'
)
self.model = model
print(f"🤖 Using Ollama with model: {self.model}")
# System prompt - defines how the model should behave
self.system_prompt = """You are an experienced programming instructor.
You analyze and explain code snippets line by line.
When explaining code:
1. Summarize the overall purpose of the code
2. Explain each important line or block
3. Highlight key programming concepts used
4. Use language that beginners can understand
5. Include practical examples when helpful
Be clear, educational, and encouraging."""
def explain(self, code, stream=True):
"""Explain the given code snippet"""
messages = [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": f"Explain the following code:\n\n{code}"}
]
try:
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
stream=stream,
temperature=0.3 # Low temperature for consistent explanations
)
if stream:
print("\n" + "="*60)
print("📝 EXPLANATION:")
print("="*60 + "\n")
answer = ""
for chunk in response:
if chunk.choices[0].delta.content:
text = chunk.choices[0].delta.content
print(text, end="", flush=True)
answer += text
print("\n" + "="*60 + "\n")
return answer
else:
result = response.choices[0].message.content
print(f"\n📝 Explanation:\n{result}\n")
return result
except Exception as e:
print(f"❌ Error: {e}")
return None
def chat(self):
"""Start interactive chat mode"""
print("\n" + "="*60)
print("🎓 CODE EXPLAINER - Interactive Terminal Mode")
print("="*60)
print(f"Model: {self.model}")
print(f"Provider: Ollama (Local)")
print("\n📖 How to use:")
print(" • Paste your code")
print(" • Press Enter twice (empty line) when done")
print(" • Type 'quit', 'exit', or 'q' to stop")
print(" • Type 'clear' to start fresh")
print(" • Type 'examples' to see sample code")
print("="*60 + "\n")
while True:
try:
print("📋 Paste your code below (Enter twice when done):")
print()
# Multi-line input
lines = []
empty_count = 0
while True:
line = input()
# Check for exit commands
if line.strip().lower() in ['quit', 'exit', 'q']:
print("\n👋 Thanks for using Code Explainer! Goodbye!")
return
# Check for clear command
if line.strip().lower() == 'clear':
print("\n🔄 Starting fresh...\n")
break
# Check for examples command
if line.strip().lower() == 'examples':
self.show_examples()
break
# Empty line detection
if not line.strip():
empty_count += 1
if empty_count >= 1 and lines: # One empty line is enough
break
else:
empty_count = 0
lines.append(line)
# If we have code, explain it
if lines:
code = "\n".join(lines)
self.explain(code)
except KeyboardInterrupt:
print("\n\n👋 Thanks for using Code Explainer! Goodbye!")
break
except Exception as e:
print(f"❌ Error: {e}\n")
def show_examples(self):
"""Show example code snippets"""
print("\n" + "="*60)
print("📚 EXAMPLE CODE SNIPPETS")
print("="*60)
examples = {
"1. Simple Loop": """
for i in range(5):
print(i * 2)
""",
"2. List Comprehension": """
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers if x % 2 == 0]
print(squares)
""",
"3. Function with Recursion": """
def factorial(n):
if n == 0:
return 1
return n * factorial(n-1)
print(factorial(5))
""",
"4. Class Definition": """
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
return f"{self.name} says Woof!"
"""
}
for title, code in examples.items():
print(f"\n{title}:{code}")
print("="*60)
print("💡 Copy any example above and paste it when prompted!")
print("="*60 + "\n")
def main():
"""Main entry point"""
load_dotenv()
print("\n🚀 Starting Code Explainer...")
explainer = CodeExplainer()
# Start interactive mode
explainer.chat()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,76 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Day 1 Solution - My Implementation\n",
"\n",
"This is my solution to the Day 1 assignment. I've implemented the web scraping and summarization functionality as requested.\n",
"\n",
"## Features Implemented:\n",
"- Web scraping with requests and BeautifulSoup\n",
"- SSL certificate handling for Windows\n",
"- OpenAI API integration\n",
"- Website content summarization\n",
"- Markdown display formatting\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Environment setup complete!\n"
]
}
],
"source": [
"# My Day 1 Solution - Imports and Setup\n",
"import os\n",
"import ssl\n",
"import requests\n",
"from bs4 import BeautifulSoup\n",
"from urllib.parse import urljoin\n",
"from IPython.display import Markdown, display\n",
"from openai import OpenAI\n",
"from dotenv import load_dotenv\n",
"\n",
"# Load environment variables\n",
"load_dotenv(override=True)\n",
"\n",
"# SSL fix for Windows\n",
"ssl._create_default_https_context = ssl._create_unverified_context\n",
"os.environ['PYTHONHTTPSVERIFY'] = '0'\n",
"os.environ['CURL_CA_BUNDLE'] = ''\n",
"\n",
"print(\"Environment setup complete!\")\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": ".venv",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.12"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@@ -0,0 +1,3 @@
openai>=1.0.0
python-dotenv>=1.0.0
ipython>=8.0.0