Construindo sua própria interface de chat para seus dados SEM a API OpenAI

May 04 2023
O que você pode fazer com os modelos da OpenAI é fascinante. Além disso, ferramentas como LangChain e llama-index facilitam muito a instalação e execução de um sistema básico do tipo ChatGPT em poucas linhas de código.

O que você pode fazer com os modelos da OpenAI é fascinante. Além disso, ferramentas como LangChain e llama-index facilitam muito a instalação e execução de um sistema básico do tipo ChatGPT em poucas linhas de código. No entanto, a maioria dos exemplos baseia-se nas APIs da OpenAI, o que não é prático em todos os casos, por exemplo, porque você não pode enviar seus dados para a nuvem ou não pode gastar o dinheiro .

Consulte seu sistema de maneira semelhante ao ChatGPT com seus próprios dados e sem OpenAI.

Como recentemente tentei obter um sistema básico em execução usando o dolly do databrick e precisava de um pouco de tentativa e erro, aqui está meu rápido tutorial sobre como usar um LLM aberto personalizado para criar uma interface de bate-papo para seus próprios dados!

Etapa 1: coletar seus dados e instalar dependências

Para esta etapa, basta coletar todos os dados que deseja usar e colocá-los em um diretório em sua máquina local. No meu caso, foram vários arquivos de remarcação que extraí dos documentos de nossa ferramenta de curadoria de dados Spotlight (confira também ;-)).

Em seguida, instale tudo o que você precisa:

pip install torch transformers langchain llama-index====0.6.0.alpha3

Copie o código a seguir e ajuste o caminho para sua pasta de entrada. Ele usa a biblioteca de transformadores Huggingface para gerar incorporações para recuperação e dolly do databrick para gerar a saída final.

from pathlib import Path
import torch
from transformers import pipeline
from langchain.llms.base import LLM
from llama_index import SimpleDirectoryReader, LangchainEmbedding, GPTVectorStoreIndex, PromptHelper, LLMPredictor, ServiceContext
from llama_index.langchain_helpers.text_splitter import TokenTextSplitter
from llama_index.node_parser.simple import SimpleNodeParser
from langchain.embeddings.huggingface import HuggingFaceEmbeddings

INPUT_FOLDER = "path/to/your/data/folder"

index_files = list(Path(INPUT_FOLDER).glob("*"))

max_input_size = 2048
num_output = 256
max_chunk_overlap = 20
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)


pipe = pipeline("text-generation", model="databricks/dolly-v2-3b", trust_remote_code=True, torch_dtype=torch.bfloat16, device_map="auto")
embed_model = LangchainEmbedding(HuggingFaceEmbeddings())

class CustomLLM(LLM):
    model_name = "databricks/dolly-v2-3b"

    def _call(self, prompt, stop = None):
        response = pipe(prompt, max_new_tokens=num_output)[0]["generated_text"]
        return response

    @property
    def _identifying_params(self):
        return {"name_of_model": self.model_name}

    @property
    def _llm_type(self):
        return "custom"

# define our LLM
llm_predictor = LLMPredictor(llm=CustomLLM())

node_parser = SimpleNodeParser(text_splitter=TokenTextSplitter(chunk_size=512, chunk_overlap=max_chunk_overlap))
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, embed_model=embed_model, prompt_helper=prompt_helper, node_parser=node_parser, chunk_size_limit=512)
# Load your data
documents = SimpleDirectoryReader(input_files=index_files).load_data()

index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)

query_engine = index.as_query_engine()

Passo 3: Use seu sistema

Já terminamos! Agora você pode usar o objeto do mecanismo de consulta para fazer perguntas sobre seus dados!

Um prompt de exemplo que tentei em nossos documentos é algo como isto:

print(query_engine.query("Summarize typical use cases of the similarity map in few sentences."))

The Similarity Map helps to explore simulation similarities and find explanations for observable phenomens.
It can be used to group designs by similarity, find outliers and detect correlations between features and target values.