-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Upgrade to text-embedding-3-large model as default, with vector storage optimizations #2470
base: main
Are you sure you want to change the base?
Changes from all commits
e4d98ac
2fddbd3
3e6d743
1b3d100
7ab5bfe
d2b2e9f
6f07ce8
121521a
bfb74e6
e9b822c
430f522
78cd4c1
14713d2
6e76618
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -53,9 +53,10 @@ class Document: | |
reranker_score: Optional[float] = None | ||
|
||
def serialize_for_results(self) -> dict[str, Any]: | ||
return { | ||
result_dict = { | ||
"id": self.id, | ||
"content": self.content, | ||
# Should we rename to its actual field name in the index? | ||
"embedding": Document.trim_embedding(self.embedding), | ||
"imageEmbedding": Document.trim_embedding(self.image_embedding), | ||
"category": self.category, | ||
|
@@ -78,6 +79,7 @@ def serialize_for_results(self) -> dict[str, Any]: | |
"score": self.score, | ||
"reranker_score": self.reranker_score, | ||
} | ||
return result_dict | ||
|
||
@classmethod | ||
def trim_embedding(cls, embedding: Optional[List[float]]) -> Optional[str]: | ||
|
@@ -162,6 +164,7 @@ def __init__( | |
embedding_deployment: Optional[str], # Not needed for non-Azure OpenAI or for retrieval_mode="text" | ||
embedding_model: str, | ||
embedding_dimensions: int, | ||
embedding_field: str, | ||
openai_host: str, | ||
vision_endpoint: str, | ||
vision_token_provider: Callable[[], Awaitable[str]], | ||
|
@@ -176,6 +179,7 @@ def __init__( | |
self.embedding_deployment = embedding_deployment | ||
self.embedding_model = embedding_model | ||
self.embedding_dimensions = embedding_dimensions | ||
self.embedding_field = embedding_field | ||
self.openai_host = openai_host | ||
self.vision_endpoint = vision_endpoint | ||
self.vision_token_provider = vision_token_provider | ||
|
@@ -241,7 +245,7 @@ async def search( | |
Document( | ||
id=document.get("id"), | ||
content=document.get("content"), | ||
embedding=document.get("embedding"), | ||
embedding=document.get(self.embedding_field), | ||
image_embedding=document.get("imageEmbedding"), | ||
category=document.get("category"), | ||
sourcepage=document.get("sourcepage"), | ||
|
@@ -317,7 +321,8 @@ class ExtraArgs(TypedDict, total=False): | |
**dimensions_args, | ||
) | ||
query_vector = embedding.data[0].embedding | ||
return VectorizedQuery(vector=query_vector, k_nearest_neighbors=50, fields="embedding") | ||
# TODO: use optimizations from rag time journey 3 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No changes are made to the actual search request, right? |
||
return VectorizedQuery(vector=query_vector, k_nearest_neighbors=50, fields=self.embedding_field) | ||
|
||
async def compute_image_embedding(self, q: str): | ||
endpoint = urljoin(self.vision_endpoint, "computervision/retrieval:vectorizeText") | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,6 +38,7 @@ def __init__( | |
embedding_deployment: Optional[str], # Not needed for non-Azure OpenAI or for retrieval_mode="text" | ||
embedding_model: str, | ||
embedding_dimensions: int, | ||
embedding_field: str, | ||
sourcepage_field: str, | ||
content_field: str, | ||
query_language: str, | ||
|
@@ -57,6 +58,7 @@ def __init__( | |
self.embedding_deployment = embedding_deployment | ||
self.embedding_model = embedding_model | ||
self.embedding_dimensions = embedding_dimensions | ||
self.embedding_field = embedding_field | ||
self.sourcepage_field = sourcepage_field | ||
self.content_field = content_field | ||
self.query_language = query_language | ||
|
@@ -88,7 +90,7 @@ async def run_until_final_call( | |
minimum_reranker_score = overrides.get("minimum_reranker_score", 0.0) | ||
filter = self.build_filter(overrides, auth_claims) | ||
|
||
vector_fields = overrides.get("vector_fields", ["embedding"]) | ||
vector_fields = overrides.get("vector_fields", [self.embedding_field]) | ||
send_text_to_gptvision = overrides.get("gpt4v_input") in ["textAndImages", "texts", None] | ||
send_images_to_gptvision = overrides.get("gpt4v_input") in ["textAndImages", "images", None] | ||
|
||
|
@@ -123,9 +125,9 @@ async def run_until_final_call( | |
if use_vector_search: | ||
for field in vector_fields: | ||
vector = ( | ||
await self.compute_text_embedding(query_text) | ||
if field == "embedding" | ||
else await self.compute_image_embedding(query_text) | ||
await self.compute_image_embedding(query_text) | ||
if field.startswith("image") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This was a bit tricky, feels a bit code smelly. |
||
else await self.compute_text_embedding(query_text) | ||
) | ||
vectors.append(vector) | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,6 +32,7 @@ def __init__( | |
embedding_deployment: Optional[str], # Not needed for non-Azure OpenAI or for retrieval_mode="text" | ||
embedding_model: str, | ||
embedding_dimensions: int, | ||
embedding_field: str, | ||
sourcepage_field: str, | ||
content_field: str, | ||
query_language: str, | ||
|
@@ -47,6 +48,7 @@ def __init__( | |
self.embedding_model = embedding_model | ||
self.embedding_deployment = embedding_deployment | ||
self.embedding_dimensions = embedding_dimensions | ||
self.embedding_field = embedding_field | ||
self.sourcepage_field = sourcepage_field | ||
self.content_field = content_field | ||
self.gpt4v_deployment = gpt4v_deployment | ||
|
@@ -83,7 +85,7 @@ async def run( | |
minimum_reranker_score = overrides.get("minimum_reranker_score", 0.0) | ||
filter = self.build_filter(overrides, auth_claims) | ||
|
||
vector_fields = overrides.get("vector_fields", ["embedding"]) | ||
vector_fields = overrides.get("vector_fields", [self.embedding_field]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar here, need to decide whether the frontend should render the actual field names. |
||
send_text_to_gptvision = overrides.get("gpt4v_input") in ["textAndImages", "texts", None] | ||
send_images_to_gptvision = overrides.get("gpt4v_input") in ["textAndImages", "images", None] | ||
|
||
|
@@ -92,9 +94,9 @@ async def run( | |
if use_vector_search: | ||
for field in vector_fields: | ||
vector = ( | ||
await self.compute_text_embedding(q) | ||
if field == "embedding" | ||
else await self.compute_image_embedding(q) | ||
await self.compute_image_embedding(q) | ||
if field.startswith("image") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same logic here |
||
else await self.compute_text_embedding(q) | ||
) | ||
vectors.append(vector) | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a pending question as to whether to send it down using the field of the index?