langflow icon indicating copy to clipboard operation
langflow copied to clipboard

Problema com Conectores de Saída ao Criar Text Splitters no Módulo Experimental

Open moiraphill opened this issue 1 year ago • 5 comments

Bug Description

Recentemente, identifiquei um erro ao criar text splitters utilizando o módulo Experimental do Langflow. Esse problema afeta os conectores de saída, onde apenas os conectores existentes em versões anteriores do Langflow continuam funcionando corretamente. Os conectores recém-criados exibem comportamento alterado e não conseguem se conectar com outros componentes. Especificamente, o conector de saída (Data) fica com a cor rosa e exibe a mensagem de que não há componentes compatíveis disponíveis.

Exemplo Visual:

image

Na imagem acima:

Conector Superior: Criado em versões anteriores do Langflow, funcionando normalmente. Conector Inferior: Criado na versão mais recente (1.0.18), não consegue se conectar com nenhum outro componente na saída "Data".

Informações Adicionais:

Versão do Langflow: 1.0.18

Ambiente:

  • Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-44-generic x86_64)
  • Docker version 27.2.1, build 9e34c9b
  • Docker Compose version v2.29.1
  • Imagens Docker:
    • python:3.12-slim (pip install langflow) - Python Version: 3.12.3
    • postgres:16

Reproduction

  1. Acesse o módulo Experimental do Langflow.
  2. Crie um novo text splitter.
  3. Tente conectar a saída (Data) desse text splitter a outro conector existente.

Expected behavior

Comportamento Esperado: Os conectores recém-criados devem se comportar de maneira semelhante aos conectores de versões anteriores, permitindo conexões com outros componentes sem apresentar erros visuais ou mensagens de incompatibilidade.

Comportamento Atual: Os conectores novos apresentam a saída (Data) na cor rosa e indicam que não há componentes compatíveis, impedindo a conexão com outros conectores.

Who can help?

No response

Operating System

Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-44-generic x86_64)

Langflow Version

1.0.18

Python Version

3.12

Screenshot

No response

Flow File

No response

moiraphill avatar Sep 17 '24 14:09 moiraphill

Para resolver o problema com os conectores de saída ao criar text splitters no módulo Experimental do Langflow versão 1.0.18, você precisa garantir que o tipo de saída do método split_text na classe SplitTextComponent esteja corretamente definido e seja compatível com outros componentes.

Aqui está o trecho relevante do código:

def split_text(self) -> List[Data]:
    separator = unescape_string(self.separator)

    documents = []
    for _input in self.data_inputs:
        if isinstance(_input, Data):
            documents.append(_input.to_lc_document())

    splitter = CharacterTextSplitter(
        chunk_overlap=self.chunk_overlap,
        chunk_size=self.chunk_size,
        separator=separator,
    )
    docs = splitter.split_documents(documents)
    data = self._docs_to_data(docs)
    self.status = data
    return data

Certifique-se de que os componentes aos quais você está tentando conectar a saída "Data" possam aceitar List[Data] como entrada. Se não puderem, você pode precisar ajustar o tipo de saída do text splitter ou o tipo de entrada dos outros componentes para garantir a compatibilidade.

Além disso, verifique se a classe SplitTextComponent está corretamente definida com as entradas e saídas apropriadas. Aqui está a definição completa da classe para referência:

from typing import List

from langchain_text_splitters import CharacterTextSplitter

from langflow.custom import Component
from langflow.io import HandleInput, IntInput, MessageTextInput, Output
from langflow.schema import Data
from langflow.utils.util import unescape_string

class SplitTextComponent(Component):
    display_name: str = "Split Text"
    description: str = "Split text into chunks based on specified criteria."
    icon = "scissors-line-dashed"
    name = "SplitText"

    inputs = [
        HandleInput(
            name="data_inputs",
            display_name="Data Inputs",
            info="The data to split.",
            input_types=["Data"],
            is_list=True,
        ),
        IntInput(
            name="chunk_overlap",
            display_name="Chunk Overlap",
            info="Number of characters to overlap between chunks.",
            value=200,
        ),
        IntInput(
            name="chunk_size",
            display_name="Chunk Size",
            info="The maximum number of characters in each chunk.",
            value=1000,
        ),
        MessageTextInput(
            name="separator",
            display_name="Separator",
            info="The character to split on. Defaults to newline.",
            value="\n",
        ),
    ]

    outputs = [
        Output(display_name="Chunks", name="chunks", method="split_text"),
    ]

    def _docs_to_data(self, docs):
        data = []
        for doc in docs:
            data.append(Data(text=doc.page_content, data=doc.metadata))
        return data

    def split_text(self) -> List[Data]:
        separator = unescape_string(self.separator)

        documents = []
        for _input in self.data_inputs:
            if isinstance(_input, Data):
                documents.append(_input.to_lc_document())

        splitter = CharacterTextSplitter(
            chunk_overlap=self.chunk_overlap,
            chunk_size=self.chunk_size,
            separator=separator,
        )
        docs = splitter.split_documents(documents)
        data = self._docs_to_data(docs)
        self.status = data
        return data

Certifique-se também de que a classe TextSplitterCreator esteja configurada corretamente para lidar com os tipos de text splitter. Aqui está a parte relevante da classe TextSplitterCreator:

from typing import Dict, List, Optional, Type

from langflow.interface.base import LangChainTypeCreator
from langflow.services.deps import get_settings_service
from langflow.template.frontend_node.textsplitters import TextSplittersFrontendNode
from langflow.interface.custom_lists import textsplitter_type_to_cls_dict

from loguru import logger
from langflow.utils.util import build_template_from_class

class TextSplitterCreator(LangChainTypeCreator):
    type_name: str = "textsplitters"

    @property
    def frontend_node_class(self) -> Type[TextSplittersFrontendNode]:
        return TextSplittersFrontendNode

    @property
    def type_to_loader_dict(self) -> Dict:
        return textsplitter_type_to_cls_dict

    def get_signature(self, name: str) -> Optional[Dict]:
        """Get the signature of a text splitter."""
        try:
            return build_template_from_class(name, textsplitter_type_to_cls_dict)
        except ValueError as exc:
            raise ValueError(f"Text Splitter {name} not found") from exc
        except AttributeError as exc:
            logger.error(f"Text Splitter {name} not loaded: {exc}")
            return None

    def to_list(self) -> List[str]:
        settings_service = get_settings_service()
        return [
            textsplitter.__name__
            for textsplitter in self.type_to_loader_dict.values()
            if textsplitter.__name__ in settings_service.settings.TEXTSPLITTERS or settings_service.settings.DEV
        ]

textsplitter_creator = TextSplitterCreator()

Ao garantir que a classe SplitTextComponent e seus métodos estejam corretamente definidos e que os tipos de saída sejam compatíveis com outros componentes, você deve conseguir resolver o problema com o conector de saída "Data" [1][2][3][4].

To continue talking to Dosu, mention @dosu.

dosubot[bot] avatar Sep 17 '24 14:09 dosubot[bot]

@moiraphill

Realizei o teste na versão 1.0.18 e está conectando e funcionando conforme esperado.

image

Consegue realizar novo teste?

carlosrcoelho avatar Sep 24 '24 19:09 carlosrcoelho

stale

anovazzi1 avatar Oct 01 '24 14:10 anovazzi1

@moiraphill

Realizei o teste na versão 1.0.18 e está conectando e funcionando conforme esperado.

image Consegue realizar novo teste?

Olá, realizei novo teste instalando diretamente com pip em um ambiente virtual python e eu continuo com o mesmo erro. No seu caso, você criou um novo workflow ou usou um workflow já criado ?

moiraphill avatar Oct 01 '24 15:10 moiraphill

@moiraphill

Eu fiz o teste diretamente na branch 'main'.

Agora fiz o teste via 'pip' e realmente não está conectando.

Em breve sairá um novo release que irá corrigir isso na versão 'pip'.

carlosrcoelho avatar Oct 01 '24 19:10 carlosrcoelho

In v1.0.18 I can't connect the character splitters with any vector store either. No error message. The color of the outputs is purple instead of red.

Banbury avatar Oct 10 '24 09:10 Banbury

Hey @Banbury @moiraphill

The new version 1.0.19 has been released, and the issue has been fixed.

carlosrcoelho avatar Oct 14 '24 14:10 carlosrcoelho