89 lines
4.4 KiB
Python
89 lines
4.4 KiB
Python
"""Инструменты FAQ‑бота: поиск в ChromaDB + MCP‑style tool метаданных курса."""
|
||
import json
|
||
from langchain.tools import tool
|
||
from vectorstore import similarity_search
|
||
|
||
|
||
@tool
|
||
def search_course_docs(query: str, k: int = 3) -> str:
|
||
"""Поиск по конспектам курса в локальной базе ChromaDB.
|
||
|
||
Используй для вопросов о технологиях курса: LangChain, LangGraph, MCP,
|
||
агентах, инструментах, концепциях, примерах кода.
|
||
|
||
Args:
|
||
query: поисковый запрос
|
||
k: количество результатов (по умолчанию 3)
|
||
|
||
Returns:
|
||
релевантные отрывки из конспектов с указанием источника
|
||
"""
|
||
docs = similarity_search(query, k=k)
|
||
if not docs:
|
||
return "[source: chroma] Релевантные документы не найдены."
|
||
parts = []
|
||
for i, doc in enumerate(docs, 1):
|
||
src = doc.metadata.get("source", "unknown")
|
||
parts.append(f"{i}. [{src}]\n{doc.page_content}")
|
||
return "[source: chroma]\n\n" + "\n\n".join(parts)
|
||
|
||
|
||
@tool
|
||
def fetch_course_meta(query: str) -> str:
|
||
"""Получить метаданные курса: расписание, дедлайны, контакты, глоссарий.
|
||
|
||
Имитирует MCP‑style tool call к серверу метаданных курса.
|
||
В production‑среде это был бы вызов через MCP tool list/call.
|
||
Используй для вопросов о расписании, сроках сдачи, контактах, терминах.
|
||
|
||
Args:
|
||
query: что именно нужно (schedule/deadlines/contacts/glossary)
|
||
|
||
Returns:
|
||
метаданные курса с указанием источника [source: mcp_meta]
|
||
"""
|
||
COURSE_META = {
|
||
"schedule": {
|
||
"Понедельник": "10:00-12:00 — LangChain основы",
|
||
"Среда": "14:00-16:00 — LangGraph практика",
|
||
"Пятница": "10:00-12:00 — Разбор проектов",
|
||
},
|
||
"deadlines": {
|
||
"ДЗ-1 LangChain basics": "2026-06-15 23:59",
|
||
"ДЗ-2 LangGraph agents": "2026-06-22 23:59",
|
||
"Финальный проект": "2026-07-04 23:00",
|
||
},
|
||
"contacts": {
|
||
"Преподаватель": "professor@brojs.ru",
|
||
"Ассистент": "assistant@brojs.ru",
|
||
"Платформа": "platform.brojs.ru",
|
||
},
|
||
"glossary": {
|
||
"LangChain": "Фреймворк для LLM-приложений",
|
||
"LangGraph": "Граф‑based агентный фреймворк",
|
||
"ChromaDB": "Векторная база данных для эмбеддингов",
|
||
"MCP": "Model Context Protocol — стандарт интеграции инструментов",
|
||
"RAG": "Retrieval-Augmented Generation",
|
||
"Embeddings": "Векторные представления текста",
|
||
},
|
||
}
|
||
|
||
q = query.lower()
|
||
if any(w in q for w in ["расписание", "schedule", "занятия", "когда", "пары"]):
|
||
data = COURSE_META["schedule"]
|
||
note = "(В проде: MCP tool call к серверу расписания)"
|
||
elif any(w in q for w in ["дедлайн", "deadline", "сдать", "срок", "когда сдавать"]):
|
||
data = COURSE_META["deadlines"]
|
||
note = "(В проде: MCP tool call к трекеру дедлайнов)"
|
||
elif any(w in q for w in ["контакт", "почта", "email", "преподаватель", "ассистент"]):
|
||
data = COURSE_META["contacts"]
|
||
note = "(В проде: MCP tool call к справочнику контактов)"
|
||
elif any(w in q for w in ["глоссарий", "glossary", "что значит", "термин", "определение"]):
|
||
data = COURSE_META["glossary"]
|
||
note = "(В проде: MCP tool call к глоссарию курса)"
|
||
else:
|
||
data = COURSE_META
|
||
note = "(В проде: MCP tool call к серверу метаданных курса)"
|
||
|
||
return f"[source: mcp_meta] {note}\n{json.dumps(data, ensure_ascii=False, indent=2)}"
|