| import sys |
| from loguru import logger |
| from langchain_qdrant import QdrantVectorStore |
| from langchain_huggingface import HuggingFaceEmbeddings |
| from qdrant_client import QdrantClient |
|
|
| |
| DB_PATH = "data/qdrant_db" |
| COLLECTION_NAME = "satellites" |
| MODEL_NAME = "BAAI/bge-small-en-v1.5" |
|
|
| |
| logger.remove() |
| logger.add(sys.stderr, format="<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{message}</cyan>", level="INFO") |
|
|
| def get_vector_store(): |
| logger.info(f"Loading embedding model: {MODEL_NAME}...") |
| embeddings = HuggingFaceEmbeddings( |
| model_name=MODEL_NAME, |
| model_kwargs={'device': 'cpu'}, |
| encode_kwargs={'normalize_embeddings': True} |
| ) |
| |
| logger.info(f"Connecting to Qdrant at {DB_PATH}...") |
| client = QdrantClient(path=DB_PATH) |
| |
| vector_store = QdrantVectorStore( |
| client=client, |
| collection_name=COLLECTION_NAME, |
| embedding=embeddings, |
| ) |
| return vector_store |
|
|
| def chat_loop(): |
| args = sys.argv[1:] |
| if args: |
| query = " ".join(args) |
| logger.info(f"Retrieving context for: '{query}'") |
| try: |
| vector_store = get_vector_store() |
| results = vector_store.similarity_search_with_score(query, k=3) |
| |
| print(f"\n--- Context Retrieved ({len(results)} chunks) ---") |
| for i, (doc, score) in enumerate(results, 1): |
| meta = doc.metadata |
| print(f"[{i}] {meta.get('name')} (Score: {score:.4f})") |
| print(f" Source: {meta.get('url')}") |
| print(f" Content Snippet: {doc.page_content[:150]}...") |
| except Exception as e: |
| logger.error(f"Error during retrieval: {e}") |
| return |
|
|
| logger.info("Initializing RAG Retrieval System...") |
| try: |
| vector_store = get_vector_store() |
| logger.info("System Ready. Type 'exit' to quit.") |
| except Exception as e: |
| logger.error(f"Failed to initialize: {e}") |
| return |
|
|
| while True: |
| try: |
| query = input("\nUse Query: ") |
| if query.lower() in ['exit', 'quit']: |
| break |
| |
| logger.info(f"Retrieving context for: '{query}'") |
| |
| |
| results = vector_store.similarity_search_with_score(query, k=3) |
| |
| context_text = "\n\n".join([doc.page_content for doc, _score in results]) |
| |
| print(f"\n--- Context Retrieved ({len(results)} chunks) ---") |
| for i, (doc, score) in enumerate(results, 1): |
| meta = doc.metadata |
| print(f"[{i}] {meta.get('name')} (Score: {score:.4f})") |
| |
| |
| print("\n--- Answer Generation (Requires Ollama) ---") |
| print("Note: Install Ollama (https://ollama.com/) and run `ollama pull llama3`") |
| |
| |
| |
| |
| |
| |
| except KeyboardInterrupt: |
| break |
| except Exception as e: |
| logger.error(f"Error during retrieval: {e}") |
|
|
| if __name__ == "__main__": |
| chat_loop() |
|
|