Construindo um chatbot em PDF com Langchain, Ollama e Chroma: um tutorial passo a passo
Se você já quis criar um chatbot interativo que possa mergulhar no conteúdo de um PDF e responder às suas perguntas de forma inteligente, você está no lugar certo. Neste tutorial, examinaremos a criação de um aplicativo baseado em simplificação que aproveita Langchain para a IA conversacional, Ollama para incorporações de modelo local e Chroma como um banco de dados vetorial para lidar com a recuperação de documentos. Essa configuração permite que você envie um PDF, processe e converse com ele como se fosse sua base de conhecimento pessoal. No final desta postagem, você terá um aplicativo totalmente funcional que é executado localmente (ou em um servidor) e pode lidar com consultas sobre qualquer PDF que você lançar nele. Vamos dividir o código fornecido passo a passo, explicar os principais componentes e mostrar como fazê -lo em execução. Além disso, eu incorporei um tutorial em vídeo do YouTube abaixo para um passo a passo visual – verifique se você preferir seguir com demos de código. Assista ao vídeo do tutorial para uma demonstração prática da construção e execução deste aplicativo, assista a este vídeo do YouTube: (clique na miniatura para reproduzir o vídeo no YouTube.) Por que criar este chatbot em PDF? Imagine fazer upload de um artigo de pesquisa, um manual do usuário ou um longo relatório e, em seguida, fazendo perguntas em linguagem natural como “Quais são as principais descobertas?” ou “Explique a Seção 3 em termos simples”. Este aplicativo possibilita isso sem a necessidade de serviços em nuvem (embora ofereça suporte a opções como o GPT-3.5, se desejar). É alimentado por ferramentas de código aberto, tornando-o econômico e focado na privacidade. Langchain lida com a orquestração, o Ollama fornece incorporações e modelos, e o Chroma Stores vetorizou pedaços do seu PDF para recuperação rápida. Este projeto é ótimo para iniciantes no desenvolvimento de aplicativos de IA, pois combina interfaces da web (via streamlit), processamento de documentos e geração de recuperação de agitação (RAG). Se você estiver familiarizado com o Python, pode ter isso em funcionamento em menos de uma hora. Pré -requisitos Antes de mergulharmos, verifique se está configurado: Python 3.8+, PIP para instalar pacotes e um entendimento básico dos ambientes virtuais. Você precisará instalar as seguintes bibliotecas-faça isso no seu terminal: Instale o Langchain Langchain-Langchain-Communidade de Langchain, com comunidade Langchain, que você está usando o modo de tela API. Para modelos locais, verifique se o Ollama está instalado e executando (faça o download de ollama.com). Usaremos modelos como o LLAMA 3.2 ou o Qwen 2.5, que você pode puxar através do Ollama Pull. Crie um arquivo .env em sua raiz do projeto com todas as chaves necessárias, como openai_api_key = sua chave-here. A quebra de código passo a passo O código é estruturado como um único arquivo app.py para obter simplicidade. Vamos dissecá -lo por função, explicando o que cada parte faz e por que está lá. Incluirei trechos de código relevantes para facilitar o acompanhamento. 1. Configuração de importações e ambiente Começamos importando os módulos necessários: simplitam para a interface do usuário, componentes de Langchain para IA e recuperação e ajudantes como DOTENV para variáveis de ambiente de carregamento. A chamada load_dotenv () puxa segredos como as teclas da API. Os arquivos temporários são tratados com o TempFile e o SO para o processamento de PDFs enviados sem desordem seu disco. Aqui está a seção de importação: Importar simplidades como sT a partir de dotenv import load_dotenv de Langchain.schema Importar HumanMessage, Aimessage, SystemMessage de Langchain_ollama Importar Chatollama, OLLamaembeddings de Langchain. Importar pypdfloader de Langchain.CHains Importar recuperação de importação OS Importar TempFile # Carregar variáveis de ambiente de um arquivo .env load_dotenv () Digite o modo de tela fullcreen Sair Modo de tela completa 2. Configuração da página A função Configure_Page () configura a aparência e a sensação do aplicativo. Ele define o título (“Converse com seu PDF usando Langchain, Ollama e Chroma”), adiciona um ícone e permite um amplo layout para uma melhor usabilidade. Há também um expansor de espiar no estado da sessão – manuseio para depuração. def Configure_page (): St.Set_Page_Config (Page_title = “PDF Chat com Langchain, Ollama e Chroma”, Page_icon = “🤖”, Layout = “Wide”, Initial_side_Bar_state = “Explanded”,) St.Title (“📄🤖 Chat com seu PDF usando PDF” Estado “): St.Write (St.Session_State) Digite o modo de saída de tela cheia Modo de tela cheia 3. Barra lateral Manipulando a barra lateral é onde os usuários interagem com as configurações. Em handle_sidebar (), permitimos que os usuários selecionem um modelo (por exemplo, “LLAMA3.2” para Ollama local ou “GPT-3.5-turbo” para o OpenAI). Ele armazena isso no estado da sessão de Streamlit para persistência nos reprises. Em seguida, há um upload de arquivo para PDFs. Quando um arquivo é carregado, o aplicativo o processa: carrega o PDF, divide -o em pedaços, gera incorporações com Ollama e cria uma loja de vetores do Chroma. Isso é armazenado em cache para eficiência. Os botões para limpar o bate -papo ou o cache garantem um novo começo quando necessário. As funções do ajudante de chave aqui incluem: get_chat_model (model_name): retorna uma instância do modelo de bate -papo, armazenada em cache para evitar recriá -lo desnecessariamente. @St.cache_resource def Modo de tela cheia de saída Modo de tela cheia get_embeddings (): fornece incorporações de Ollama (usando “MXBAI-EBLED-LARGE” para representações vetoriais de alta qualidade). @St.Cache_Resource def get_embeddings (): retornar o ollamaembeddings (model = “mxbai-embebed-large”) Digite o modo de tela cheia de saída do modo de tela cheia load_pdf (upload_file): salva o upload temporariamente e carrega-o com Pypfloader. def load_pdf (upload_file): com tempfile.namedTemporaryFile (DELETE = false, sufix = “. carregador.load () os.unlink (tmp_file_path) # Limpe os documentos de retorno do arquivo temporário Digite o modo de tela cheia de saída de tela cheia split_text (documentos): divide o PDF em pedaços gerenciáveis (1000 caracteres com sobreposição) usando o RecursiveCaracterTextsplitter. def split_text (documentos): text_splitter = recursiveCharacTerTextsPlitter (chunk_size = 1000, chunk_overlap = 200, length_function = len) textos = text_splitter.split_documents (documentos) retorna textos em textos de tela cheia. em um diretório temporário. def create_vector_store (textos, incorporados): # defina o diretório em que o Chroma armazenará seus dados chroma_persist_directory = os.path.join (tempfile.gettempdir (), “croma_db”) # inicializar o store de vetor de vetor, vector_store = croma. persist_directory = chroma_persist_directory) # persiste o armazenamento de vetores no disco vector_store.persist () return Vector_store Digite o modo de tela cheia de tela cheia 4. Exibindo mensagens de bate -papo Display_chat_messages () loops através das mensagens de sessão e as renderizam em bolhas – usuários de bate -papes – usam mensagens de bate -papes – usem, sobre as mensagens de bate -papo. Ele pula a mensagem inicial do sistema (“Você é um assistente útil de IA.”), Que define o comportamento da IA. DEF Display_Chat_Messages (): Para mensagem em St.Session_State.Messages[1:]: if isinstance(message, HumanMessage): # Display user messages with st.chat_message(“user”): st.write(message.content) elif isinstance(message, AIMessage): # Display AI responses with st.chat_message(“assistant”): st.write(message.content) Enter fullscreen mode Exit fullscreen mode 5. Handling User Input In handle_user_input (chat_model, retriever), capturamos os avisos do usuário por meio de uma caixa de entrada de bate -papo. Ele anexa a mensagem ao histórico, exibe -o e gera uma resposta. Se existir uma loja de vetores (ou seja, um PDF é carregado), ele usa a recuperação para buscar pedaços relevantes e aumentar a resposta do modelo. Caso contrário, ele volta a um bate -papo básico. As respostas são transmitidas para uma sensação natural, com o tratamento de erros para obter problemas. def handle_user_input (chat_model, retriever): se prompt: = stiChat_input (“Pergunte algo sobre o seu pdf”): St.Session_State.Messages.append (HumanMessage (content = sTrel) com sT.Chat_Message (“Usuário”): St.Write () com sTthat_mess) com strel (“Usuário”): STILT_MESSAGE) com sT.Chat_Message (“Usuário”): St.Write () com St.Chat_Mess) com St.Chat_Message (“Usuário”): St.Write () com STILT_MESS). “” Tente: # use a cadeia de recuperação para obter a resposta da resposta = chat_model.run (prompt) Full_Response = resposta message_placeholder.Markdown (Full_Response) St.Session_State.Messages.Append (AimLessage (Content = Full_Response), exceto a exceção e o e -mail. {e} “) Digite o modo de saída de tela cheia 6. A função principal principal () une tudo: configura a página, lida com a barra lateral, inicializa o modelo de bate -papo e o retriever, exibe mensagens e processa entradas. Ele garante que o estado da sessão seja configurado com uma mensagem padrão do sistema, se for a primeira execução. O aplicativo verifica uma loja de vetores para ativar o RAG; Se estiver presente, cria uma cadeia de recuperação com tipo “Stuff” (que material recuperou os documentos no prompt). def main (): configure_page () selected_model = handle_sidebar () chat_model = get_chat_model (selected_model) # inicialize o histórico de bate -papo no estado da sessão, se não estiver presente se “mensagens” não em St.Session_State: St.Session_State.Messages = [
SystemMessage(content=”You are a helpful AI assistant.”)
]
# Inicialize o Vector Store se o PDF for carregado se “Vector_store” em St.Session_State: Retriever = St.Session_State.Vector_Store.as_retriever () qa_chain = Retriealqa.from_chain_type (llm = chat_model, Chela_type = ” chat_model_with_retrieval = qa_chain else: chat_model_with_retrieval = chat_model display_chat_messages () # atribua retriever separadamente se “vector_store” em St.Session_state: Retriever_instance = St.Session_State.Vector.Vector.ASSE.ASS_STATE: handle_user_input (chat_model_with_retrieval, retriever = retriever_instance) se __name__ == “__Main__”: main () digite o modo de tela cheia de tela cheia executando o modo de aplicativo Salvar o código como app.py. No seu terminal, navegue até o diretório e execute: simplit run app.py, digite o modo de tela cheia de tela cheia, que inicia um servidor da web local (geralmente abre -o no navegador, selecione um modelo na barra lateral, faça o que você está em busca de um pdf. A imagem está disponível para download em alta resolução por até 1920×1080. Em um pacote simples – perfeito para projetos pessoais ou ferramentas corporativas de prototipagem.
Fonte
Publicar comentário