add tools.py
This commit is contained in:
@@ -0,0 +1,88 @@
|
|||||||
|
"""Инструменты 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)}"
|
||||||
Reference in New Issue
Block a user