mirror of
https://gitverse.ru/kpa39l/rag-pipeline-docker.git
synced 2026-09-29 09:15:11 +00:00
60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
test_qdrant_search.py — Тестовый скрипт поиска по Qdrant.
|
|
Берёт текст, получает эмбеддинг через Ollama, ищет в Qdrant.
|
|
|
|
Использование: python3 scripts/test_qdrant_search.py --query "текст"
|
|
"""
|
|
import argparse
|
|
import json
|
|
import sys
|
|
import urllib.request
|
|
from pathlib import Path
|
|
|
|
OLLAMA_URL = "http://localhost:11434/api/embeddings"
|
|
EMBEDDING_MODEL = "nomic-embed-text:latest"
|
|
QDRANT_SEARCH_URL = "http://localhost:6333/collections/knowledge_base/points/search"
|
|
TOP_K = 5
|
|
|
|
|
|
def get_embedding(text: str) -> list[float]:
|
|
payload = json.dumps({"model": EMBEDDING_MODEL, "prompt": text}).encode()
|
|
req = urllib.request.Request(OLLAMA_URL, data=payload,
|
|
headers={"Content-Type": "application/json"})
|
|
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
data = json.loads(resp.read())
|
|
return data.get("embedding")
|
|
|
|
|
|
def search_qdrant(vector: list[float], top_k: int = TOP_K) -> list[dict]:
|
|
payload = json.dumps({
|
|
"vector": {"name": "dense", "vector": vector},
|
|
"limit": top_k,
|
|
"with_payload": True,
|
|
"with_vector": False,
|
|
}).encode()
|
|
req = urllib.request.Request(QDRANT_SEARCH_URL, data=payload,
|
|
headers={"Content-Type": "application/json"})
|
|
with urllib.request.urlopen(req, timeout=15) as resp:
|
|
data = json.loads(resp.read())
|
|
return data.get("result", [])
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--query", "-q", required=True)
|
|
args = parser.parse_args()
|
|
|
|
vector = get_embedding(args.query)
|
|
print(f"Embedding: {len(vector)} dims")
|
|
|
|
results = search_qdrant(vector)
|
|
print(f"Results: {len(results)}")
|
|
for i, r in enumerate(results, 1):
|
|
payload = r.get("payload", {})
|
|
text = (payload.get("text") or payload.get("content", ""))[:200]
|
|
print(f" #{i} score={r['score']:.4f} | {payload.get('source','?')} | {text}...")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |