Skip to content

Commit f5c3684

Browse files
Merge pull request #40 from luiscarbonel1991/fix/openai-embeddings-batch-limit
fix: batch OpenAI embeddings to respect 2048 input limit
2 parents 67537b3 + f2f481a commit f5c3684

4 files changed

Lines changed: 13 additions & 10 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "nlp2sql"
3-
version = "0.2.0rc11"
3+
version = "0.2.0rc12"
44
description = "Enterprise-ready Natural Language to SQL converter with multi-provider support. Built for production scale (1000+ tables) with Clean Architecture."
55
readme = "README.md"
66
license = {text = "MIT"}

src/nlp2sql/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from .schema.example_store import ExampleStore
2121
from .services.query_service import QueryGenerationService
2222

23-
__version__ = "0.2.0rc11"
23+
__version__ = "0.2.0rc12"
2424
__author__ = "Luis Carbonel"
2525
__email__ = "devhighlevel@gmail.com"
2626

src/nlp2sql/adapters/openai_embedding_adapter.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,27 @@ async def encode(self, texts: List[str]) -> np.ndarray:
7979
processed_texts.append(text)
8080

8181
try:
82-
response = await self.client.embeddings.create(model=self.model, input=processed_texts)
82+
# OpenAI API limits input array to 2048 items per request
83+
batch_size = 2000
84+
all_embeddings: list[list[float]] = []
8385

84-
# Extract embeddings from response
85-
embeddings = [item.embedding for item in response.data]
86-
embeddings_array = np.array(embeddings)
86+
for i in range(0, len(processed_texts), batch_size):
87+
batch = processed_texts[i : i + batch_size]
88+
response = await self.client.embeddings.create(model=self.model, input=batch)
89+
all_embeddings.extend(item.embedding for item in response.data)
90+
91+
embeddings_array = np.array(all_embeddings)
8792

8893
# Normalize embeddings for cosine similarity with FAISS IndexFlatIP
89-
# This is critical: FAISS IndexFlatIP uses inner product which only works
90-
# as cosine similarity when vectors are normalized to unit length
9194
norms = np.linalg.norm(embeddings_array, axis=1, keepdims=True)
92-
# Avoid division by zero (though rare for real embeddings)
9395
norms = np.where(norms == 0, 1, norms)
9496
normalized_embeddings = embeddings_array / norms
9597

9698
logger.debug(
9799
"OpenAI embeddings generated and normalized",
98100
model=self.model,
99101
texts_count=len(processed_texts),
102+
batches=((len(processed_texts) - 1) // batch_size) + 1,
100103
dimension=normalized_embeddings.shape[1],
101104
)
102105

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)