Como usar os Chat Models do LangChain

Veja uma introdução sobre como usar os Chat Models (modelos de chat) do Framework LangChain.

Ricardo Reis
5 min readMay 21, 2023

--

Este exemplo aborda como começar a usar Chat Models. A interface é baseada em mensagens em vez de texto bruto.

from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)

Você pode obter conclusões de chat (respostas) passando uma ou mais mensagens para o modelo de chat. A resposta será uma mensagem. Os tipos de mensagens suportados no LangChain são AIMessage, HumanMessage, SystemMessage, eChatMessage (ChatMessage aceita um apâmetro de função arbitrário). Na maioria das vezes você estará lidando apenas com HumanMessage, AIMessage, e SystemMessage.

chat([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
AIMessage(content="J'aime programmer.", additional_kwargs={})

O modelo de bate-papo do OpenAI suporta várias mensagens como entrada. Veja aqui a documentação oficial da OpenAI sobre esse assunto. A seguir veremos um exemplo de envio de uma mensagem do sistema e do usuário para o Chat Model:

messages = [
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="I love programming.")
]
chat(messages)
AIMessage(content="J'aime programmer.", additional_kwargs={})

Você pode dar um passo adiante e gerar conclusões para vários conjuntos de mensagens usando generate. Isso retorna um LLMResult com um parâmetro de mensagem adicional.

batch_messages = [
[
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="I love programming.")
],
[
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="I love artificial intelligence.")
],
]
result = chat.generate(batch_messages)
result
LLMResult("generations="[
[
"ChatGeneration(text=""J'aime programmer.",
"generation_info=None",
"message=AIMessage(content=""J'aime programmer.",
"additional_kwargs="{

}"))"
],
[
"ChatGeneration(text=""J'aime l'intelligence artificielle.",
"generation_info=None",
"message=AIMessage(content=""J'aime l'intelligence artificielle.",
"additional_kwargs="{

}"))"
]
],
"llm_output="{
"token_usage":{
"prompt_tokens":57,
"completion_tokens":20,
"total_tokens":77
}
})

Você pode recuperar coisas como uso de token deste LLMResult

result.llm_output
{'token_usage': {'prompt_tokens': 57,
'completion_tokens': 20,
'total_tokens': 77}}

PromptTemplates

Você pode usar modelos usando um MessagePromptTemplate. Você pode criar um ChatPromptTemplate de um ou mais MessagePromptTemplates.

Você pode usar o format_prompt do ChatPromptTemplate, que vai retornar um PromptValue, que você pode converter em uma string ou em um objeto Message, dependendo se você deseja usar o valor formatado como entrada para um LLM Model ou para um Chat Model.

Por conveniência, existe um método from_template exposto no modelo. Se você fosse usar este modelo, seria assim:

template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# get a chat completion from the formatted messages
chat(chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.").to_messages())
AIMessage(content="J'adore la programmation.", additional_kwargs={})

Se você quiser construir o MessagePromptTemplate mais diretamente, você pode criar um PromptTemplate fora e depois passá-lo, por exemplo:

prompt=PromptTemplate(
template="You are a helpful assistant that translates {input_language} to {output_language}.",
input_variables=["input_language", "output_language"],
)
system_message_prompt = SystemMessagePromptTemplate(prompt=prompt)

LLMChain

Você pode usar o LLMChain existente de maneira muito semelhante a antes — forneça um prompt e um modelo.

chain = LLMChain(llm=chat, prompt=chat_prompt)
chain.run(input_language="English", output_language="French", text="I love programming.")
"J'adore la programmation."

Streaming

O streaming é compatível com o ChatOpenAI por meio do processamento de callbacks (retorno de chamada).

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
chat = ChatOpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0)
resp = chat([HumanMessage(content="Write me a song about sparkling water.")])
Verse 1:
Bubbles rising to the top
A refreshing drink that never stops
Clear and crisp, it's pure delight
A taste that's sure to excite

Chorus:
Sparkling water, oh so fine
A drink that's always on my mind
With every sip, I feel alive
Sparkling water, you're my vibe

Verse 2:
No sugar, no calories, just pure bliss
A drink that's hard to resist
It's the perfect way to quench my thirst
A drink that always comes first

Chorus:
Sparkling water, oh so fine
A drink that's always on my mind
With every sip, I feel alive
Sparkling water, you're my vibe

Bridge:
From the mountains to the sea
Sparkling water, you're the key
To a healthy life, a happy soul
A drink that makes me feel whole

Chorus:
Sparkling water, oh so fine
A drink that's always on my mind
With every sip, I feel alive
Sparkling water, you're my vibe

Outro:
Sparkling water, you're the one
A drink that's always so much fun
I'll never let you go, my friend
Sparkling

Resumo

  1. Inicialização: Primeiramente, as classes necessárias são importadas. A classe ChatOpenAI é iniciada com um temperature de 0, o que significa que as respostas geradas serão determinísticas e consistentes.
  2. Envio de Mensagens: O método chat é usado para enviar mensagens para o modelo. As mensagens podem ser de diferentes tipos, como AIMessage, HumanMessage, SystemMessage, sendo que cada um representa um tipo de interação no chat. Um exemplo é dado para traduzir uma frase em inglês para francês.
  3. Geração de respostas com várias mensagens: O modelo de chat da OpenAI suporta múltiplas mensagens como entrada. Isto é útil para fornecer contexto para o modelo. Um exemplo é mostrado onde uma mensagem de sistema define o papel do AI como um assistente útil que traduz do inglês para o francês, seguido por uma mensagem humana que precisa ser traduzida.
  4. Gerar respostas para múltiplos conjuntos de mensagens: A função generate pode ser usada para gerar respostas para múltiplos conjuntos de mensagens. Isto retorna um objeto LLMResult com um parâmetro de mensagem adicional. Um exemplo é mostrado onde o AI traduz duas frases diferentes do inglês para o francês.
  5. Recuperar uso de tokens: O uso de tokens pode ser recuperado do LLMResult. Tokens são a unidade de processamento para o modelo de linguagem.
  6. Modelos de mensagens: Para facilitar a formatação das mensagens, a biblioteca fornece um recurso de modelagem através da classe MessagePromptTemplate. Vários MessagePromptTemplate podem ser combinados para formar um ChatPromptTemplate. Uma vez que um ChatPromptTemplate é formatado, ele pode ser convertido em uma string ou em um objeto Message para ser usado como entrada para o modelo de linguagem.
  7. LLMChain: LLMChain é uma classe que facilita a combinação de um modelo de linguagem e um modelo. Uma vez que uma LLMChain é criada, o método run pode ser chamado para gerar uma resposta.
  8. Streaming: ChatOpenAI também suporta streaming, que pode ser usado para lidar com grandes volumes de mensagens. Um exemplo é mostrado onde uma canção sobre água com gás é gerada, e cada linha da canção é enviada para a saída padrão conforme ela é gerada.

LangChain — Índice

Clique no link abaixo para acessar a página que serve como um índice abrangente, reunindo todos os links para os nossos tutoriais sobre LangChain.

--

--

No responses yet