From aa422ef7b1ca0c694a9713c57e764dc7a7c64513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=B8=D1=80=D0=B8=D0=BB=D0=BB=20=D0=9A=D1=83=D1=82?= =?UTF-8?q?=D0=BB=D0=B0=D1=85=D0=BC=D0=B5=D1=82=D0=BE=D0=B2?= Date: Thu, 4 Jun 2026 16:27:51 +0000 Subject: [PATCH] add main.py --- main.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..4b1c7a5 --- /dev/null +++ b/main.py @@ -0,0 +1,60 @@ +""" +CLI для FAQ‑бота курса KFU-26-1. +Маршрутизация: вопросы по материалам → ChromaDB, по метаданным → MCP‑style tool. + +Запуск: + ollama pull nomic-embed-text + python main.py +""" +import asyncio +import sys +from dotenv import load_dotenv + +load_dotenv() + +from vectorstore import load_faq_to_chroma # noqa: E402 +from agent import ask # noqa: E402 + +# 3 заготовленных вопроса: 2 в chroma, 1 в mcp_meta +DEMO_QUESTIONS = [ + ("Что такое LangGraph и как он отличается от LangChain?", "chroma"), + ("Как создать инструмент tool в LangChain?", "chroma"), + ("Когда дедлайн финального проекта и как связаться с препо?", "mcp_meta"), +] + +async def run_demo() -> None: + """Запускает три заготовленных демо‑вопроса.""" + print("\n--- Демо-вопросы ---") + for i, (question, expected_source) in enumerate(DEMO_QUESTIONS, 1): + print(f"\n[{i}] Вопрос: {question}") + print(f" Ожидаемый источник: {expected_source}") + answer = await ask(question, thread_id=f"demo-{i}") + print(f" Ответ: {answer}") + +async def interactive_mode() -> None: + """Интерактивный режим — вводи вопросы вручную.""" + print("\n--- Интерактивный режим (exit для выхода) ---") + session_id = 0 + while True: + try: + q = input("\nВопрос: ").strip() + except (EOFError, KeyboardInterrupt): + print("\nВыход.") + break + if not q or q.lower() in ("exit", "quit"): + break + session_id += 1 + answer = await ask(q, thread_id=f"interactive-{session_id}") + print(f"Ответ: {answer}") + +async def main() -> None: + print("=== FAQ‑бот курса KFU-26-1 ===") + print("Загружаем конспекты в ChromaDB (Ollama nomic-embed-text)...") + n = load_faq_to_chroma() + print(f"Проиндексировано: {n} чанков\n") + + await run_demo() + await interactive_mode() + +if __name__ == "__main__": + asyncio.run(main())