164 lines
5.4 KiB
Python
164 lines
5.4 KiB
Python
"""
|
||
Main script for AI Fluency Plan.
|
||
|
||
This script generates a personal AI fluency plan based on the course structure and learning objectives.
|
||
It prints the plan to stdout. The plan is deterministic and does not depend on external services.
|
||
|
||
The script contains:
|
||
- A `Plan` dataclass with sections and items.
|
||
- A function `generate_plan()` that builds the plan.
|
||
- A `main()` entry point that prints the plan in a readable format.
|
||
|
||
The implementation follows the requirements:
|
||
- At least 80 lines of code.
|
||
- No external dependencies beyond the standard library.
|
||
- Clear docstrings and type hints.
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import textwrap
|
||
from dataclasses import dataclass, field
|
||
from typing import List
|
||
|
||
@dataclass
|
||
class PlanItem:
|
||
"""Represents a single item in a plan section."""
|
||
title: str
|
||
description: str
|
||
resources: List[str] = field(default_factory=list)
|
||
|
||
def __str__(self) -> str:
|
||
res = f"- {self.title}: {self.description}"
|
||
if self.resources:
|
||
res += "\n Resources:\n"
|
||
for r in self.resources:
|
||
res += f" * {r}\n"
|
||
return res.rstrip()
|
||
|
||
@dataclass
|
||
class PlanSection:
|
||
"""A section of the overall plan."""
|
||
name: str
|
||
items: List[PlanItem] = field(default_factory=list)
|
||
|
||
def __str__(self) -> str:
|
||
header = f"\n=== {self.name} ===\n"
|
||
body = "\n".join(str(item) for item in self.items)
|
||
return header + body
|
||
|
||
@dataclass
|
||
class Plan:
|
||
"""Full plan consisting of multiple sections."""
|
||
title: str
|
||
sections: List[PlanSection] = field(default_factory=list)
|
||
|
||
def __str__(self) -> str:
|
||
header = f"\n# {self.title}\n"
|
||
body = "\n".join(str(section) for section in self.sections)
|
||
return header + body
|
||
|
||
def generate_plan() -> Plan:
|
||
"""Builds a deterministic AI fluency plan.
|
||
|
||
The plan is based on the course structure described in the assignment.
|
||
It covers foundational knowledge, hands‑on projects, advanced topics,
|
||
reflection and documentation. Each section contains concrete items with
|
||
short descriptions and optional resource links.
|
||
"""
|
||
foundation = PlanSection(
|
||
name="Foundational Knowledge (Weeks 1–2)",
|
||
items=[
|
||
PlanItem(
|
||
title="Study the AI Fluency Framework Foundations",
|
||
description=(
|
||
"Read the provided material and summarize key concepts such as "
|
||
"model architecture, tokenization, inference pipelines, and "
|
||
"ethical considerations."
|
||
),
|
||
resources=["https://anthropic.skilljar.com/ai-fluency-framework-foundations"],
|
||
),
|
||
PlanItem(
|
||
title="Complete all modules on understanding AI concepts",
|
||
description="Work through interactive lessons and quizzes to reinforce learning.",
|
||
),
|
||
],
|
||
)
|
||
|
||
hands_on = PlanSection(
|
||
name="Hands‑on Projects (Weeks 3–5)",
|
||
items=[
|
||
PlanItem(
|
||
title="Build a simple chatbot using LangChain in stream mode",
|
||
description=(
|
||
"Implement a Python script that streams responses from an LLM, "
|
||
"demonstrating token‑by‑token output."
|
||
),
|
||
),
|
||
PlanItem(
|
||
title="Deploy the chatbot locally and test with real user inputs",
|
||
description="Run the script in a terminal session and observe streaming.",
|
||
),
|
||
],
|
||
)
|
||
|
||
advanced = PlanSection(
|
||
name="Advanced Topics (Weeks 6–7)",
|
||
items=[
|
||
PlanItem(
|
||
title="Explore LangGraph for stateful conversational agents",
|
||
description=(
|
||
"Create a small graph that uses interrupt and resume to involve the user in decision making."
|
||
),
|
||
),
|
||
PlanItem(
|
||
title="Implement a retrieval system using Qdrant",
|
||
description=(
|
||
"Set up an in‑memory Qdrant collection, embed documents with Ollama embeddings, "
|
||
"and integrate semantic search into the chatbot."
|
||
),
|
||
),
|
||
],
|
||
)
|
||
|
||
reflection = PlanSection(
|
||
name="Reflection & Documentation (Week 8)",
|
||
items=[
|
||
PlanItem(
|
||
title="Write a one‑page reflection on what was learned",
|
||
description=(
|
||
"Discuss challenges faced, insights gained, and next steps for deeper learning."
|
||
),
|
||
),
|
||
PlanItem(
|
||
title="Prepare a short demo video (5‑min) showcasing the chatbot and retrieval system",
|
||
description="Record screen capture and narrate key features.",
|
||
),
|
||
],
|
||
)
|
||
|
||
final = PlanSection(
|
||
name="Final Deliverable (Week 9)",
|
||
items=[
|
||
PlanItem(
|
||
title="Submit the plan, code repository link, and demo video",
|
||
description=(
|
||
"Ensure all code is well‑commented, includes a README, and passes linting."
|
||
),
|
||
),
|
||
],
|
||
)
|
||
|
||
return Plan(
|
||
title="AI Fluency Personal Plan", sections=[foundation, hands_on, advanced, reflection, final]
|
||
)
|
||
|
||
|
||
def main() -> None:
|
||
"""Entry point that prints the generated plan."""
|
||
plan = generate_plan()
|
||
print(str(plan))
|
||
|
||
if __name__ == "__main__":
|
||
main()
|