| from src.embedder import embed_query | |
| from src.vector_store import semantic_search | |
| from src.graph_store import get_connected_entities, extract_entity_names | |
| def hybrid_retrieve(query: str, top_k: int = 5) -> dict: | |
| query_vec = embed_query(query) | |
| vector_results = semantic_search(query_vec, top_k=top_k) | |
| all_entities = extract_entity_names() | |
| chunks_text = [r["text"] for r in vector_results] | |
| graph_context = [] | |
| for entity_name in all_entities: | |
| if entity_name.lower() in query.lower(): | |
| connected = get_connected_entities(entity_name, depth=2) | |
| for c in connected: | |
| if c.get("name"): | |
| graph_context.append(f"{c['name']} ({c.get('type', '?')})") | |
| break | |
| return { | |
| "vector_context": chunks_text, | |
| "graph_context": list(set(graph_context))[:20], | |
| } | |