59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
"""
|
|
Ollama embedding service for generating text embeddings.
|
|
Uses nomic-embed-text model via Ollama API.
|
|
"""
|
|
|
|
import logging
|
|
import httpx
|
|
from app.core.config import get_settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def get_embedding(text: str) -> list[float]:
|
|
"""
|
|
Generate embedding vector for text using Ollama nomic-embed-text model.
|
|
"""
|
|
settings = get_settings()
|
|
|
|
async with httpx.AsyncClient(timeout=60.0) as client:
|
|
try:
|
|
response = await client.post(
|
|
f"{settings.ollama_base_url}/api/embeddings",
|
|
json={
|
|
"model": settings.ollama_embedding_model,
|
|
"prompt": text,
|
|
}
|
|
)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
embedding = data.get("embedding", [])
|
|
|
|
if not embedding:
|
|
logger.warning(f"Empty embedding returned for text length={len(text)}")
|
|
return [0.0] * settings.qdrant_vector_size
|
|
|
|
logger.debug(f"Generated embedding: dim={len(embedding)}")
|
|
return embedding
|
|
|
|
except httpx.HTTPStatusError as e:
|
|
logger.error(f"Ollama API error: {e.response.status_code} - {e.response.text}")
|
|
raise
|
|
except httpx.RequestError as e:
|
|
logger.error(f"Ollama connection error: {e}")
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Embedding generation failed: {e}")
|
|
raise
|
|
|
|
|
|
async def get_embeddings_batch(texts: list[str]) -> list[list[float]]:
|
|
"""
|
|
Generate embedding vectors for multiple texts.
|
|
"""
|
|
embeddings = []
|
|
for text in texts:
|
|
embedding = await get_embedding(text)
|
|
embeddings.append(embedding)
|
|
return embeddings
|