From 60a799daf5f7c4eb4c97bb62f5a06e321a47b992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D0=B8=D0=BD=D0=B0=D1=80=20=D0=9C=D0=B8=D1=80=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D0=B8=D1=82=D0=BE=D0=B2?= Date: Wed, 10 Jun 2026 13:30:30 +0000 Subject: [PATCH] =?UTF-8?q?Initial=20submission=20of=20FAQ-=D0=B1=D0=BE?= =?UTF-8?q?=D1=82:=20add=20src/utils.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/utils.py diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..9e3afb9 --- /dev/null +++ b/src/utils.py @@ -0,0 +1,42 @@ +import os +from pathlib import Path +from langchain_ollama import OllamaEmbeddings +from langchain_chroma import Chroma +from langchain_text_splitters import RecursiveCharacterTextSplitter + +CHROMA_PATH = Path("./chroma_faq") + + +def load_faq_to_chroma(md_dir: str = "data"): + """Load all .md files from md_dir into a persistent Chroma store. + The function will create or update the store at CHROMA_PATH. + """ + # Ensure directory exists + Path(md_dir).mkdir(parents=True, exist_ok=True) + # Gather all markdown files + md_files = list(Path(md_dir).glob("*.md")) + if not md_files: + raise FileNotFoundError(f"No .md files found in {md_dir}") + + # Read and split documents + texts = [] + for md_file in md_files: + text = md_file.read_text(encoding="utf-8") + splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) + texts.extend(splitter.split_text(text)) + + # Create embeddings + embeddings = OllamaEmbeddings(model="nomic-embed-text") + + # Persist to Chroma + chroma = Chroma(persist_directory=str(CHROMA_PATH), embedding_function=embeddings) + chroma.add_texts(texts) + chroma.persist() + return chroma + + +def search_course_docs(query: str, k: int = 3): + """Search the persistent Chroma store for the top k documents matching query.""" + chroma = Chroma(persist_directory=str(CHROMA_PATH), embedding_function=OllamaEmbeddings(model="nomic-embed-text")) + retriever = chroma.as_retriever(search_kwargs={"k": k}) + return retriever.get_relevant_documents(query)