Usando LangChain para criar aplicativos de modelo de linguagem grande (LLM) via HuggingFace

May 03 2023
Langchain é uma estrutura de código aberto que facilita a criação de aplicativos e chatbots baseados em LLM.
Atualmente sou o Evangelista Chefe @ HumanFirst. Eu exploro e escrevo sobre todas as coisas na interseção de IA e linguagem; variando de LLMs, Chatbots, Voicebots, estruturas de desenvolvimento, espaços latentes centrados em dados e muito mais.

Atualmente sou o Evangelista Chefe @ HumanFirst . Eu exploro e escrevo sobre todas as coisas na interseção de IA e linguagem; variando de LLMs, Chatbots, Voicebots, estruturas de desenvolvimento, espaços latentes centrados em dados e muito mais.

O que torna o desenvolvimento do Langchain importante é a noção de que precisamos passar do cenário de playground e da fase de experimentação para produzir a funcionalidade do Large Language Model (LLM).

A resposta para o desenvolvimento em LLMs não é necessariamente as Estruturas de Desenvolvimento de IA Conversacional atuais e existentes, embora essa seja uma das opções.

Estruturas de código profissional desenvolvidas sob medida que interagem e alavancam LLMs também não devem ser vistas como inevitáveis.

Como você verá neste artigo, Langchain é uma estrutura alternativa para criar aplicativos baseados em LLM e interfaces de conversação em uma estrutura estruturada e intuitiva.

Langchain também contribui para um entendimento compartilhado e forma de trabalho entre os desenvolvedores LLM. Uma abordagem uniforme pode auxiliar na padronização das implementações e expectativas do LLM, ao mesmo tempo em que desmistifica as expectativas do mercado sobre custo e desempenho.

Em um artigo recente , escrevi sobre os desafios do design de fluxo de conversação ao alavancar Modelos de Linguagem Grande (LLMs).

Também ilustrei alguns cenários sobre como o Langchain pode ser usado para criar chatbots e outros aplicativos baseados em LLM.

Este artigo cobre dois aspectos dos LLMs:

1️⃣ Um exemplo de uso do Langchain para fazer interface com a API de inferência HuggingFace para um chatbot QnA.

2️⃣ Seguido por alguns exemplos práticos que ilustram como introduzir o contexto na conversa por meio de uma abordagem de aprendizagem de poucos tiros, usando Langchain e HuggingFace.

Configurando o HuggingFace para QnA Bot

Você precisará criar uma conta gratuita no HuggingFace e, em seguida, acessar as configurações do seu perfil. Conforme visto abaixo, criei um token de acesso com o nome LangChain.

Abaixo está o código Python completo para a interface do bot Langchain QnA com o HuggingFace. Observe onde você terá que adicionar seu token da API HuggingFace e, em seguida, onde a pergunta será adicionada.

pip install langchain[all]
import os
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "xxxxxxxxxxxxxxxxxxx"
from langchain import PromptTemplate, HuggingFaceHub, LLMChain
template = """Question: {question}

Answer: Let's think step by step."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm=HuggingFaceHub(repo_id="google/flan-t5-xl", model_kwargs={"temperature":1e-10})

question = "When was Google founded?"

print(llm_chain.run(question))

Google was founded in 1998. The final answer: 1998.

Por exemplo, como mostra a imagem, copia-se a referência ao modelo bloom:

repo_id="bigscience/bloom"

      
                

Duas ressalvas que preciso adicionar, alguns dos modelos HuggingFace que mencionei no Colab Notebook expiraram, isso pode estar relacionado a estar em um nível gratuito ou algo semelhante.

Em segundo lugar, os resultados parecem diferir entre o Colab Notebook e as consultas de modelo de cartão. Em geral, os LLMs não são determinísticos, o que significa que entradas idênticas podem gerar saídas diferentes. Existem opções para definir a temperatura, comprimento de resposta, etc, mas uma pequena quantidade de variabilidade pode permanecer.

Chatbot contextual de aprendizagem de poucos tiros

Este exemplo demonstra a maneira mais simples de gerenciar o contexto de conversação em um chatbot baseado em LLM…

Um LLM pode ser usado em uma abordagem generativa, conforme visto abaixo no exemplo do playground OpenAI. A entrada inicial ( bloco vermelho número 1 ) é submetida ao LLM.

Este prompt inicial contém uma descrição do chatbot e a primeira entrada humana.

Bloco vermelho número 2: A resposta do LLM (neste caso, text-davinci-003).

Bloco vermelho número 3: Para continuar a conversa, o bloco 1, 2 e o novo bloco adicional 3 são enviados.

Bloco vermelho número 4: O LLM responde com o bloco 4, esta resposta é informada e baseada no contexto dos blocos 1, 2 e 3 que são enviados juntos.

Portanto, em termos simples, cada turno de diálogo é armazenado em buffer com a memória da conversa... e eu sei o que você está pensando. Esse buffer pode ficar muito grande em termos de tamanho e custos de LLM.

Conversas mais longas podem ser resolvidas de duas maneiras:

  1. Truncar o histórico da conversa, removendo, portanto, a primeira parte do histórico da conversa em estágios definidos. Essa abordagem é análoga a limitar os arquivos de log a um determinado tamanho por meio de logs contínuos.
  2. A segunda abordagem é fazer uso de LLMs para resumir o histórico da conversa, à medida que as conversas continuam.

O que eu gosto é que o LangChain tem três métodos para abordar o gerenciamento de contexto:

⦿ Buffering : Esta opção permite passar as últimas Ninterações como referência contextual. Npode ser definido com base em um número fixo.

⦿ Resumo : Resumindo as conversas e fazendo uso do resumo em vez dos diálogos literais. Em comparação com o buffer, a sumarização comprime as informações contextuais. Haverá perda, mas os limites de comprimento de solicitação projetados permanecerão dentro dos limites.

⦿ Combinação : Uma combinação de armazenamento em buffer e resumo, onde um resumo é gerado junto com as respostas textuais de interações anteriores. Essa abordagem é mais equilibrada, por exemplo, os últimos 5 turnos de diálogo podem ser verbatim e os diálogos mais antigos podem ser resumidos.

E, finalmente, abaixo um exemplo de código, que faz referência à API de inferência HuggingFace, com a entrada do usuário:

from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferMemory

conversation = ConversationChain(
    llm=llm, 
    verbose=True, 
    memory=ConversationBufferMemory()
)

conversation.predict(input="Hi there!")

> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:

Human: Hi there!
AI:

> Finished chain.
Hi there!

conversation.predict(input="Tell me more about yourself?")

> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.

Current conversation:

Human: Hi there!
AI: Hi there!
Human: Tell me more about yourself?
AI:

> Finished chain.
I'm a student at the University of Washington.

A melhor maneira de começar é acessar a documentação do Langchain e começar a prototipar em um Notebook.

⭐️ Por favor, siga-me no LinkedIn para atualizações sobre Conversational AI ⭐️

Atualmente sou o Evangelista Chefe @ HumanFirst . Eu exploro e escrevo sobre todas as coisas na interseção de IA e linguagem; variando de LLMs , Chatbots , Voicebots , estruturas de desenvolvimento, espaços latentes centrados em dados e muito mais.

https://www.linkedin.com/in/cobusgreyling
O Cobus Quadrant™ de design de NLU O Cobus Quadrant™ de recursos de design de conversação
LangChain é um software de código aberto para gerenciamento de estado de diálogo e memória contextual LLM

https://langchain-hub-ui-production.up.railway.app/