Files
task-6a02e23da6fe2e4ac16acf65/rag_tools.py
T

55 lines
1.9 KiB
Python

"""RAG-инструменты агента."""
from __future__ import annotations
from langchain.tools import tool
try:
from knowledge_base import KnowledgeBase, build_knowledge_base
except ModuleNotFoundError:
from .knowledge_base import KnowledgeBase, build_knowledge_base
_kb: KnowledgeBase | None = None
def get_knowledge_base() -> KnowledgeBase:
"""Ленивая инициализация — не подключаем Ollama при импорте модуля."""
global _kb
if _kb is None:
_kb = build_knowledge_base()
return _kb
@tool
def search_knowledge_base(query: str, max_results: int = 5) -> str:
"""Семантический поиск в базе знаний.
Args:
query: поисковый запрос
max_results: максимум фрагментов в ответе
"""
results = get_knowledge_base().search(query, max_results=max_results)
if not results:
return "По запросу ничего не найдено."
lines = [f"Найдено: {len(results)} фрагмент(ов)\n"]
for idx, item in enumerate(results, start=1):
lines.append(
f"{idx}. [{item['title']}] (score={item['score']})\n{item['content']}\n"
)
return "\n".join(lines)
@tool
def add_to_knowledge_base(content: str, title: str) -> str:
"""Добавляет документ в векторную базу знаний.
Args:
content: текст документа
title: заголовок / имя документа
"""
if not content.strip():
return "Ошибка: пустой content."
if not title.strip():
return "Ошибка: пустой title."
chunks = get_knowledge_base().add_document(content.strip(), title.strip())
return f"Документ «{title}» добавлен ({chunks} чанк(ов))."