Files
task-6a219d2dfd30e81cf3146bad/main.py
T
2026-06-04 16:27:51 +00:00

61 lines
2.3 KiB
Python

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