feat: tools search_local_kb (chromadb) + web_search (tavily)

This commit is contained in:
2026-06-05 14:55:41 +00:00
parent 52e8da8258
commit 96a8608aa9
+47 -20
View File
@@ -1,30 +1,57 @@
import os """Инструменты агента: локальный поиск (ChromaDB) и веб-поиск (Tavily)."""
from typing import Any
from langchain.tools import tool from langchain.tools import tool
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma from langchain_chroma import Chroma
from langchain_tavily import TavilySearchResults from langchain_tavily import TavilySearch
from vectorstore import create_vectorstore _vectorstore: Chroma | None = None
def init_tools(vectorstore: Chroma) -> None:
"""Привязать vectorstore к инструментам (вызывается из main.py)."""
global _vectorstore
_vectorstore = vectorstore
# Global vector store instance
VECTORSTORE = create_vectorstore()
@tool @tool
def search_local_kb(query: str, top_k: int = 3) -> str: def search_local_kb(query: str, top_k: int = 5) -> str:
"""Semantic search in the local ChromaDB knowledge base.""" """Семантический поиск по локальной базе знаний (ChromaDB).
retriever = VECTORSTORE.as_retriever(search_kwargs={"k": top_k}) Используй для вопросов по загруженным документам и конспектам.
docs = retriever.get_relevant_documents(query) """
if _vectorstore is None:
return "База знаний не инициализирована."
docs = _vectorstore.similarity_search(query, k=top_k)
if not docs: if not docs:
return "No relevant local knowledge found." return "Документов по запросу не найдено в базе знаний."
return "\n\n".join(doc.page_content for doc in docs) parts = [
f"[{i + 1}] ({d.metadata.get('source', 'unknown')})
{d.page_content}"
for i, d in enumerate(docs)
]
return "Источник: chromadb
" + "
".join(parts)
@tool @tool
def web_search(query: str) -> str: def web_search(query: str) -> str:
"""Web search using Tavily.""" """Поиск актуальной информации в интернете через Tavily.
tavily = TavilySearchResults(api_key=os.getenv("TAVILY_API_KEY")) Используй для новостей, актуальных событий, фактов из сети.
results = tavily.run(query) """
if not results: tavily = TavilySearch(max_results=5)
return "No web results found." results = tavily.invoke({"query": query})
return "\n\n".join(f"{r['title']}\n{r['content']}" for r in results) if isinstance(results, list):
parts = [
f"[{i + 1}] {r.get('title', '')}
{r.get('content', r.get('snippet', ''))}"
for i, r in enumerate(results)
]
content = "
".join(parts)
else:
content = str(results)
return "Источник: tavily
" + content