ai-robot-core/ai-service/app/services/embedding/ollama_embedding.py

61 lines
1.8 KiB
Python
Raw Normal View History

"""
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