Spaces:
Running
Running
from typing import List, Optional | |
from llama_index.core import VectorStoreIndex | |
from llama_index.core.vector_stores import (FilterOperator, MetadataFilter, | |
MetadataFilters) | |
from pydantic import BaseModel, Field | |
from .config import get_vector_store | |
class Node(BaseModel): | |
file_name: str = Field("Name of the file") | |
url: str = Field("GitHub repo url of the file") | |
score: float = Field("Relevance score of the node") # Changed to float | |
content: str = Field("Content of the node") | |
class ContextResponseModel(BaseModel): | |
response: str = Field("Response for user's query") | |
source_nodes: Optional[List[Node]] = Field( | |
"List of sources used to generate response" | |
) | |
class QueryRetriever: | |
def __init__(self, repo): | |
self.vector_store_index = VectorStoreIndex.from_vector_store(get_vector_store()) | |
self.filters = MetadataFilters( | |
filters=[ | |
MetadataFilter( | |
key="metadata.repo", | |
value=repo, | |
operator=FilterOperator.EQ, | |
) | |
] | |
) | |
def make_query(self, query: str, mode: str = "default") -> dict: | |
""" | |
Retrieve relevant documentation context for a given query using specified retrieval mode. | |
This function is designed to support Retrieval-Augmented Generation (RAG) by extracting | |
the most relevant context chunks from indexed documentation sources. | |
Args: | |
query (str): The user's input query related to the documentation. | |
mode (str, optional): Retrieval strategy to use. One of: | |
- "default": Standard semantic similarity search. | |
- "text_search": Keyword-based search. | |
- "hybrid": Combines semantic and keyword-based methods. | |
Defaults to "default". | |
Returns: | |
dict: Dictionary with 'response' and 'source_nodes' keys | |
""" | |
query_engine = self.vector_store_index.as_query_engine( | |
similarity_top_k=5, | |
vector_store_query_mode=mode, | |
filters=self.filters, | |
response_mode="refine", | |
) | |
response = query_engine.query(query) | |
nodes = [] | |
for node in response.source_nodes: | |
nodes.append( | |
{ | |
"file_name": node.metadata.get("file_name", "Unknown"), | |
"url": node.metadata.get("url", "#"), | |
"score": float(node.score) if node.score else 0.0, | |
"content": node.get_content(), | |
} | |
) | |
return {"response": str(response.response), "source_nodes": nodes} | |
def get_available_repos() -> List[str]: | |
"""Get list of available repositories in the vector store""" | |
try: | |
from .config import get_available_repos as get_repos_from_db | |
print("fetching repos") | |
re = get_repos_from_db() | |
print(re) | |
return re | |
except Exception as e: | |
print(f"Error getting repos from database: {e}") | |
# Fallback to hardcoded list | |
return ["mindsdb/mindsdb", "run-llama/llama_index"] | |