Como usar os Chat Models do LangChain
Veja uma introdução sobre como usar os Chat Models (modelos de chat) do Framework LangChain.
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
- Inicialização: Primeiramente, as classes necessárias são importadas. A classe
ChatOpenAI
é iniciada com umtemperature
de 0, o que significa que as respostas geradas serão determinísticas e consistentes. - Envio de Mensagens: O método
chat
é usado para enviar mensagens para o modelo. As mensagens podem ser de diferentes tipos, comoAIMessage
,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. - 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.
- 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 objetoLLMResult
com um parâmetro de mensagem adicional. Um exemplo é mostrado onde o AI traduz duas frases diferentes do inglês para o francês. - 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. - Modelos de mensagens: Para facilitar a formatação das mensagens, a biblioteca fornece um recurso de modelagem através da classe
MessagePromptTemplate
. VáriosMessagePromptTemplate
podem ser combinados para formar umChatPromptTemplate
. Uma vez que umChatPromptTemplate
é formatado, ele pode ser convertido em uma string ou em um objetoMessage
para ser usado como entrada para o modelo de linguagem. - LLMChain:
LLMChain
é uma classe que facilita a combinação de um modelo de linguagem e um modelo. Uma vez que umaLLMChain
é criada, o métodorun
pode ser chamado para gerar uma resposta. - 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.