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())