rag-monitoring / starter.py
starter.py
Raw
"""Starter code for the monitoring homework.

Sets up the text-search RAG from homework 1 and a shared OpenAI client.
"""

import os
from openai import OpenAI

from gitsource import GithubRepositoryDataReader
from minsearch import Index

from rag_helper import RAGBase
from telemetry import tracer

COMMIT = "8c1834d"

# --- Load the course lessons (same as HW1, HW2, HW4) ---
reader = GithubRepositoryDataReader(
    repo_owner="DataTalksClub",
    repo_name="llm-zoomcamp",
    commit_id=COMMIT,
    allowed_extensions={"md"},
    filename_filter=lambda path: "/lessons/" in path,
)
documents = [file.parse() for file in reader.read()]

index = Index(text_fields=["content"], keyword_fields=["filename"])
index.fit(documents)

client = OpenAI(
    api_key=os.environ.get("MISTRAL_API_KEY"),
    base_url="https://api.mistral.ai/v1"
)
rag = RAGBase(index=index, llm_client=client, model="ministral-3b-2512",)


class RAGTraced(RAGBase):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def rag(self, query):

        with tracer.start_as_current_span("rag"):
            return super().rag(query)

    def search(self, query):

        with tracer.start_as_current_span("search"):
            return super().search(query)

    def llm(self, prompt):

        with tracer.start_as_current_span("llm") as span:

            response = super().llm(prompt)

            usage = response.usage

            span.set_attribute(
                "input_tokens",
                usage.prompt_tokens,
            )

            span.set_attribute(
                "output_tokens",
                usage.completion_tokens,
            )

            return response


rag_traced = RAGTraced(index=index, llm_client=client, model="ministral-3b-2512",)

if __name__ == "__main__":
    query = "How does the agentic loop keep calling the model until it stops?"
    answer = rag.rag(query)
    print(answer)