feat: solution for 'Экзамен: RAG-агент с ChromaDB и веб-поиском'
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
from typing import List
|
||||
|
||||
from langchain.tools import tool
|
||||
from langchain_ollama import Ollama
|
||||
from langchain_qdrant import QdrantVectorStore
|
||||
from langchain_tavily import TavilySearchResults
|
||||
|
||||
|
||||
@tool
|
||||
def search_local_kb(
|
||||
query: str,
|
||||
top_k: int,
|
||||
vectorstore: QdrantVectorStore,
|
||||
) -> List[str]:
|
||||
"""
|
||||
Perform a semantic search in the local knowledge base stored in Qdrant.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
query : str
|
||||
The user's query.
|
||||
top_k : int
|
||||
Number of top results to return.
|
||||
vectorstore : QdrantVectorStore
|
||||
The vector store to search.
|
||||
|
||||
Returns
|
||||
-------
|
||||
List[str]
|
||||
List of relevant document snippets.
|
||||
"""
|
||||
retriever = vectorstore.as_retriever(search_kwargs={"k": top_k})
|
||||
docs = retriever.get_relevant_documents(query)
|
||||
return [doc.page_content for doc in docs]
|
||||
|
||||
|
||||
@tool
|
||||
def web_search(
|
||||
query: str,
|
||||
tavily_api_key: str,
|
||||
max_results: int = 3,
|
||||
) -> List[str]:
|
||||
"""
|
||||
Perform a web search using Tavily.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
query : str
|
||||
The user's query.
|
||||
tavily_api_key : str
|
||||
Tavily API key.
|
||||
max_results : int
|
||||
Number of search results to return.
|
||||
|
||||
Returns
|
||||
-------
|
||||
List[str]
|
||||
List of search result snippets.
|
||||
"""
|
||||
tavily = TavilySearchResults(
|
||||
api_key=tavily_api_key,
|
||||
max_results=max_results,
|
||||
)
|
||||
results = tavily.run(query)
|
||||
# Extract snippets from results
|
||||
snippets = []
|
||||
for result in results:
|
||||
snippet = result.get("content") or result.get("snippet") or result.get("title")
|
||||
if snippet:
|
||||
snippets.append(snippet)
|
||||
return snippets
|
||||
Reference in New Issue
Block a user