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