From 89dbbbf596e57150977b88d75d05a63cbfc146c8 Mon Sep 17 00:00:00 2001 From: Baptiste Pasquier Date: Wed, 13 Mar 2024 16:59:11 +0100 Subject: [PATCH] refactor convert_documents_to_elements --- backend/utils/elements.py | 95 +++++++++++++++++++++++++++---------- backend/utils/image.py | 14 ++++++ backend/utils/retriever.py | 4 +- img/no_image.png | Bin 0 -> 39698 bytes 4 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 img/no_image.png diff --git a/backend/utils/elements.py b/backend/utils/elements.py index 42fc8ca..c6109e3 100644 --- a/backend/utils/elements.py +++ b/backend/utils/elements.py @@ -10,6 +10,8 @@ from langchain_core.documents import Document from pydantic import BaseModel, PrivateAttr, validator +from .image import local_image_to_base64 + class Element(BaseModel): """Abstract base class representing an element with a type, format, and metadata. @@ -311,6 +313,69 @@ class TableImage(Table, Image): format: Literal["image"] = "image" +def _create_text_element(doc: Document, element_class: type[Text]) -> Element: + """Create a text element from a Langchain Document object. + + Args: + doc (Document): Langchain Document object. + element_class (Type[Text]): Text element class to create (Text, TableText). + + Returns: + Element: Text element created from the Document object. + """ + is_summary = doc.metadata.get("is_summary", False) + if is_summary: + element = element_class( + type=doc.metadata["type"], + format=doc.metadata["format"], + text="No content available", + metadata=doc.metadata, + ) + element.set_summary(doc.page_content) + else: + element = element_class( + type=doc.metadata["type"], + format=doc.metadata["format"], + text=doc.page_content, + metadata=doc.metadata, + ) + return element + + +NO_IMAGE = local_image_to_base64("img/no_image.png") + + +def _create_image_element(doc: Document, element_class: type[Image]) -> Element: + """Create an image element from a Langchain Document object. + + Args: + doc (Document): Langchain Document object. + element_class (Type[Image]): Image element class to create (Image, TableImage). + + Returns: + Element: Image element created from the Document object. + """ + is_summary = doc.metadata.get("is_summary", False) + if is_summary: + element = element_class( + type=doc.metadata["type"], + format=doc.metadata["format"], + base64=NO_IMAGE, + mime_type="image/png", + metadata=doc.metadata, + ) + element.set_summary(doc.page_content) + else: + element = element_class( + type=doc.metadata["type"], + format=doc.metadata["format"], + base64=doc.page_content, + mime_type=doc.metadata["mime_type"], + metadata=doc.metadata, + ) + return element + + def convert_documents_to_elements(docs: list[Document]) -> list: """Convert a list of Langchain Document objects to a list of Element objects. @@ -327,37 +392,19 @@ def convert_documents_to_elements(docs: list[Document]) -> list: for doc in docs: match doc.metadata["type"]: case "text": - text_format = doc.metadata["format"] - element = Text( - text=doc.page_content, format=text_format, metadata=doc.metadata - ) + element = _create_text_element(doc, Text) case "image": - element = Image( - base64=doc.page_content, - mime_type=doc.metadata["mime_type"], - metadata=doc.metadata, - ) - + element = _create_image_element(doc, Image) case "table": - table_format = doc.metadata["format"] - match table_format: + match doc.metadata["format"]: case "text" | "html" | "markdown": - element = TableText( - text=doc.page_content, - format=table_format, - metadata=doc.metadata, - ) - + element = _create_text_element(doc, TableText) case "image": - element = TableImage( - base64=doc.page_content, - mime_type=doc.metadata["mime_type"], - metadata=doc.metadata, - ) + element = _create_image_element(doc, TableImage) case other: raise ValueError(f"Unsupported table format: {other}") case other: - raise ValueError(f"Unsupported document type: {other['type']}") + raise ValueError(f"Unsupported document type: {other}") elements.append(element) return elements diff --git a/backend/utils/image.py b/backend/utils/image.py index adc43fc..9d03b38 100644 --- a/backend/utils/image.py +++ b/backend/utils/image.py @@ -2,6 +2,7 @@ import base64 import io +from pathlib import Path from PIL import Image @@ -32,3 +33,16 @@ def resize_base64_image( # Encode the resized image to Base64 return base64.b64encode(buffered.getvalue()).decode("utf-8") + + +def local_image_to_base64(image_path: str) -> str: + """Convert a local image to a Base64 string. + + Args: + image_path (str): Path to the image. + + Returns: + str: Base64 string. + """ + with Path(image_path).open("rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") diff --git a/backend/utils/retriever.py b/backend/utils/retriever.py index 4bb1336..4459296 100644 --- a/backend/utils/retriever.py +++ b/backend/utils/retriever.py @@ -79,7 +79,7 @@ def add_documents_multivector( summary_docs = [ Document( page_content=s, - metadata=metadata_list[i], + metadata={**metadata_list[i], "is_summary": True}, ) for i, s in enumerate(summary_list) ] @@ -88,7 +88,7 @@ def add_documents_multivector( content_docs = [ Document( page_content=c if isinstance(c, str) else c.page_content, - metadata=metadata_list[i], + metadata={**metadata_list[i], "is_summary": False}, ) for i, c in enumerate(content_list) ] diff --git a/img/no_image.png b/img/no_image.png new file mode 100644 index 0000000000000000000000000000000000000000..431b25ef45caf976a5d17ddc7fb1dcc68126acfb GIT binary patch literal 39698 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

XxSDkwpZTrf8;J*JRLX7e93HdB0=Ul=_Pn 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