A Inteligência Artificial (IA) é um campo em rápido crescimento. Os modelos de linguagem evoluíram para permitir que os agentes de IA executem tarefas complexas e tomem decisões complexas. No entanto, à medida que as habilidades desses agentes continuam a crescer, a infraestrutura para dar suporte a eles tem dificuldades para acompanhar esse ritmo.
LangGraph, uma biblioteca revolucionária projetada para revolucionar a tecnologia de agente de IA Compilação e tempo de execução Implementação.
LangGraph apresenta um novo agenteCompilação e tempo de execuçãoParadigma construtivo, que vê os fluxos de trabalho do agente como estruturas baseadas em uma topologia de gráfico cíclico.
O que é o LangGraph?
Uma importante proposta de valor da LangChain é a capacidade de criar facilmente cadeias personalizadas. No entanto, a LangChain não tem uma maneira fácil de introduzir loops nessas cadeias. De fato, essas cadeias são gráficos acíclicos direcionados (DAG) - Como a maioria das estruturas de orquestração de dados.
Um padrão comum quando as pessoas criam aplicativos LLM complexos é introduzir loops no tempo de execução. Esses loops geralmente utilizam o LLM para raciocinar sobre a próxima ação no loop. Isso é essencialmente o equivalente a executar o LLM em um loop for. Esses sistemas são geralmente chamados de agentes.
A forma mais simples é um loop com duas etapas:
- Chame o LLM para determinar qual ação deve ser tomada ou qual resposta deve ser dada ao usuário
- Execute a operação fornecida e retorne à etapa 1.
Essas etapas são repetidas até que a resposta final seja gerada. Esse é o loop que aciona o AgentExecutor no coração do LangChain. É um loop muito simples, mas também é o mais importante, pois coloca quase todo o poder de decisão e raciocínio nas mãos do LLM.
É importante observar que esse processo geralmente requer mais controle. Por exemplo, forçar o agente a invocar uma ferramenta específica primeiro, mais controle sobre como a ferramenta é invocada, prompts diferentes dependendo do estado em que o agente se encontra etc.
Esses são processos controlados, que a LangChain chama de "máquinas de estado".
Essas máquinas de estado têm a capacidade de fazer um loop; no entanto, é necessária alguma intervenção humana na construção desse loop.
O LangGraph cria essas máquinas de estado especificando-as como gráficos.
O LangGraph foi desenvolvido com base no LangChain e é totalmente compatível com o ecossistema do LangChain.interoperabilidade. Ele agrega novo valor principalmente ao introduzir uma maneira fácil de criar diagramas de loop. Isso é muito útil na criação de tempos de execução de agentes.
Essa abordagem permite que os agentes apresentem comportamentos mais variáveis e diferenciados do que os modelos de execução linear de seus antecessores. Usando a teoria dos gráficos, o LangGraph oferece novas maneiras de desenvolver sistemas complexos de agentes em rede.
Figura: um LangGraph para geração de código
Um exemplo: sistema dinâmico de perguntas e respostas
tomar O usuário pode estar fornecendo informações ao modelo passo a passo, em vez de enviar todas as informações de uma só vez.
prescrição Use um diagrama cíclico:
- Permitir que o LLM gere respostas iniciais.
- Se a resposta estiver incompleta ou se forem necessárias mais informações, gere uma nova pergunta e continue a perguntar ao usuário.
- até que o usuário confirme que o problema foi resolvido.
Estrutura do diagrama de ciclo
- NósCada nó representa uma tarefa ou operação específica, como geração de texto, resposta a perguntas, processamento de dados etc.
- BordasConexões entre nós indicam a ordem de execução da tarefa, possivelmente com julgamentos condicionais.
- Caminho de loopingLoops: Os loops são formados quando a saída de um nó precisa ser realimentada para o nó anterior ou quando precisa ser executada repetidamente.
- Condição de paradaOs diagramas de loop estão sujeitos a algum tipo de condição de término, por exemplo, quando a qualidade do resultado atende aos requisitos, quando o limite do número de vezes definido é atingido ou quando um sinal de parada acionado externamente é ativado.
Por que usar o LangGraph?
- destreza : À medida que os agentes de IA evoluem, os desenvolvedores precisam de mais controle sobre o tempo de execução do agente para permitir planos de ação personalizados e procedimentos de tomada de decisão.
- A natureza circular do raciocínio de IA LangGraph: Muitos aplicativos LLM complexos dependem da execução cíclica ao usar estratégias como raciocínio encadeado. O LangGraph oferece uma estrutura natural para modelar esses processos cíclicos.
- sistema de inteligência múltipla Inteligência múltipla: à medida que os fluxos de trabalho com várias inteligências se tornam mais comuns, aumenta a necessidade de sistemas que possam gerenciar e coordenar com eficiência várias inteligências autônomas.
Use o código para ver como o LangGraph funciona
A funcionalidade do LangGraph se baseia em alguns elementos básicos:
- Nós. Essas são ferramentas para funções ou agentes.
- Bordas. Definir caminhos para execução e fluxo de dados no sistema do agente, conectando os nós.
- StateGraph. O LangGraph permite que os dados persistentes sejam mantidos entre os ciclos de execução por meio do gerenciamento e da atualização de objetos de estado, com o fluxo de dados entre os nós.
Figura: Fluxo de trabalho básico do LangGraph
StateGraph
StateGraph
é uma classe que representa um gráfico. Você cria um gráfico passando a classe estado
para inicializar essa classe. A definição de estado representa um objeto de estado central que é atualizado ao longo do tempo. Esse estado é atualizado por nós no gráfico, que retornam operações sobre os atributos desse estado na forma de armazenamentos de valores-chave.
import os # Importar o módulo do sistema operacional
os.environ['OpenAI_API_KEY'] = 'hk-iwtbi1e427'
from typing import Annotated
de typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
class State(TypedDict).
# As mensagens são do tipo "list" e "add_messages" em Annotated define como as mensagens são atualizadas.
# Nesse exemplo, as mensagens são anexadas à lista, não substituídas.
messages: Annotated[list, add_messages]
# Crie uma instância de StateGraph, passando a classe State
graph_builder = StateGraph(State)
Nós
Criar um StateGraph
Depois disso, você pode usar o graph.add_node(name, value)
Sintaxe para adicionar nós. nome
O argumento é uma cadeia de caracteres que é o nome do nó. valor
O argumento é uma função ou um LCEL executável que será chamado.
Essa função /LCEL aceita uma função que é igual a estado
tem um dicionário com o mesmo formato da entrada e gera um dicionário que usa o parâmetro estado
para atualizar o dicionário.
from langchain_openai import ChatOpenAI # Importar ChatOpenAI from langchain_openai module
llm = ChatOpenAI( # Criar instância do ChatOpenAI
model="gpt-4o-mini", # Especificar modelo
temperature=0, # Definir a temperatura
base_url="https://api.openai-hk.com/v1" # Definir a URL de base
)
def chatbot(state: State):# Defina a função de chatbot que aceita argumentos do tipo State
"""
Processa uma solicitação de chatbot e retorna uma mensagem.
Parâmetros.
state (State): contém o estado da mensagem.
Retorna.
dict: dicionário de mensagens geradas pelo bot.
"""
return {"messages": [llm.invoke(state["messages"])]} # Retorna o dicionário que contém as mensagens
# O primeiro argumento é o nome do nó
# O segundo argumento é a função ou o objeto que está sendo chamado
graph_builder.add_node("chatbot", chatbot) # Adiciona um nó ao gráfico com o nome "chatbot"
Bordas
Indica que um dos nós é sempre chamado após o outro
# Adicionando uma borda de START a "chatbot"
graph_builder.add_edge(START, "chatbot")
# Adicionar uma aresta de "chatbot" a END.
graph_builder.add_edge("chatbot", END)
Compilar Compilar
Depois de definir nosso gráfico, podemos compilá-lo para que seja executável! Exponha os mesmos métodos da LangChain ( .invocar
(matemática) gênero .stream
(matemática) gênero .astream_log
etc.), permitindo que ele seja chamado da mesma forma que uma cadeia.
graph = graph_builder.compile() # Compilar o gráfico
estar em movimento
def stream_graph_updates(user_input: str): # Define a função stream_graph_updates para aceitar a entrada do usuário
"""
Use user_input para transmitir mensagens de atualização do gráfico.
Parâmetros.
user_input (str): mensagem de entrada do usuário.
Retorna.
Nenhum
"""
# Itere pelos eventos de fluxo do gráfico, passando as mensagens do usuário para obter a resposta do modelo
for event in graph.stream({"messages": [("user", user_input)]}): # Percorra os eventos de fluxo do gráfico
for value in event.values(): # Percorre os valores do evento
print("Assistant:", value["messages"][-1].content) # Imprima a última mensagem do assistente
whileTrue.
Tente.
user_input = input("User: ") # Obtenha a entrada do usuário
if user_input.lower() in ["quit", "exit", "q"]: # Verifique se o usuário deseja sair.
print("Goodbye!")
break# Saia do loop
# Chame a função stream_graph_updates para processar a entrada do usuário
stream_graph_updates(user_input)
except: # catch exception
# fallback se input() não estiver disponível
user_input = "What do you know about LangGraph? "# definir a entrada padrão do usuário
print("User: " + user_input) # imprimir a entrada do usuário
stream_graph_updates(user_input) # chamar a função stream_graph_updates para processar a entrada padrão
break# Sair do loop
"Diagrama" de visualização (opcional)
Visualização de "diagramas" no ambiente do Jupyter Notebook
efeito operacional
Estruturas como a LangGraph estão se tornando cada vez mais importantes à medida que a IA evolui.
À medida que os desenvolvedores se familiarizam com os recursos do LangGraph, podemos esperar ver agentes de IA mais avançados, capazes de executar tarefas mais complexas.
Em resumo, o LangGraph é um avanço significativo no desenvolvimento de agentes de IA. Ele permite que os desenvolvedores ultrapassem os limites do que é possível com os agentes de IA, eliminando as deficiências dos sistemas anteriores e fornecendo uma estrutura flexível e baseada em gráficos para a construção e execução de agentes.