Criando um programa de agente de interface do usuário com Langgraph: colocando alguém em loop
Inteligência artificial

Criando um programa de agente de interface do usuário com Langgraph: colocando alguém em loop


Em nosso estudo anterior, criamos um agente de IA capaz de responder a perguntas usando a Web e adicionar à última condição. No entanto, em muitos casos, você pode colocar uma pessoa no loop para olhar e permitir ações do agente. Isso pode ser feito facilmente com um Langgram. Vamos considerar como isso funciona.

Configurando um agente

Continuaremos a partir daí, deixamos o último estudo. Primeiro, defina variáveis ​​naturais, faça as entradas necessárias e prepare o checkpointer.

pip install langgraph==0.2.53 langgraph-checkpoint==2.0.6 langgraph-sdk==0.1.36 langchain-groq langchain-community langgraph-checkpoint-sqlite==2.0.1
import os
os.environ['TAVILY_API_KEY'] = ""
os.environ['GROQ_API_KEY'] = ""
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator
from langchain_core.messages import AnyMessage, SystemMessage, HumanMessage, ToolMessage, AIMessage
from langchain_groq import ChatGroq
from langchain_community.tools.tavily_search import TavilySearchResults

from langgraph.checkpoint.sqlite import SqliteSaver
import sqlite3
sqlite_conn = sqlite3.connect("checkpoints.sqlite",check_same_thread=False)
memory = SqliteSaver(sqlite_conn)

# Initialize the search tool
tool = TavilySearchResults(max_results=2)

Para explicar o agente

class Agent:
    def __init__(self, model, tools, checkpointer, system=""):
        self.system = system
        graph = StateGraph(AgentState)
        graph.add_node("llm", self.call_openai)
        graph.add_node("action", self.take_action)
        graph.add_conditional_edges("llm", self.exists_action, {True: "action", False: END})
        graph.add_edge("action", "llm")
        graph.set_entry_point("llm")
        self.graph = graph.compile(checkpointer=checkpointer)
        self.tools = {t.name: t for t in tools}
        self.model = model.bind_tools(tools)

    def call_openai(self, state: AgentState):
        messages = state['messages']
        if self.system:
            messages = [SystemMessage(content=self.system)] + messages
        message = self.model.invoke(messages)
        return {'messages': [message]}

    def exists_action(self, state: AgentState):
        result = state['messages'][-1]
        return len(result.tool_calls) > 0

    def take_action(self, state: AgentState):
        tool_calls = state['messages'][-1].tool_calls
        results = []
        for t in tool_calls:
            print(f"Calling: {t}")
            result = self.tools[t['name']].invoke(t['args'])
            results.append(ToolMessage(tool_call_id=t['id'], name=t['name'], content=str(result)))
        print("Back to the model!")
        return {'messages': results}

Para configurar um status de agente

Agora nos preparamos para o status do agente com uma pequena modificação. Anteriormente, uma lista de mensagens é descrita com operadores operados.Add, inserindo novas mensagens na lista existente. Trabalhando com pessoas no loop, às vezes queremos restaurar mensagens de texto existentes em vez de usá-lo.

from uuid import uuid4

def reduce_messages(left: list[AnyMessage], right: list[AnyMessage]) -> list[AnyMessage]:
    # Assign IDs to messages that don't have them
    for message in right:
        if not message.id:
            message.id = str(uuid4())
    # Merge the new messages with the existing ones
    merged = left.copy()
    for message in right:
        for i, existing in enumerate(merged):
            if existing.id == message.id:
                merged[i] = message
                break
        else:
            merged.append(message)
    return merged

class AgentState(TypedDict):
    messages: Annotated[list[AnyMessage], reduce_messages]

Adicionando uma pessoa ao loop

Introduzimos conversão adicional ao combinar gráfico. Interurture_beren =[“action”] O parâmetro adiciona interrupção antes de chamar o nó para a ação, para garantir a aprovação do manual antes de emitir ferramentas.

class Agent:
    def __init__(self, model, tools, checkpointer, system=""):
        # Everything else remains the same as before
        self.graph = graph.compile(checkpointer=checkpointer, interrupt_before=["action"])
    # Everything else remains unchanged

Executando o agente

Agora, iniciaremos o programa com o mesmo prompt, modelo e ponto de verificação como antes. Quando chamamos um agente, passamos pela string da string.

prompt = """You are a smart research assistant. Use the search engine to look up information. 
You are allowed to make multiple calls (either together or in sequence). 
Only look up information when you are sure of what you want. 
If you need to look up some information before asking a follow up question, you are allowed to do that!
"""
model = ChatGroq(model="Llama-3.3-70b-Specdec")
abot = Agent(model, [tool], system=prompt, checkpointer=memory)
messages = [HumanMessage(content="Whats the weather in SF?")]
thread = {"configurable": {"thread_id": "1"}}
for event in abot.graph.stream({"messages": messages}, thread):
    for v in event.values():
        print(v)

As respostas são transferidas de volta e o processo para após a mensagem da IA, mostrando a barra de ferramentas. No entanto, parâmetros perturbadores_screen cada parâmetro restringe a morte rápida. E podemos encontrar o status atual do gráfico para este thread e ver o que contemos e ele consiste no próximo local ('Ação' aqui).

abot.graph.get_state(thread)
abot.graph.get_state(thread).next

Contínuo, também chamamos um pão e, na mesma linha, não passa nada. Isso transmite os resultados de volta, incluindo a mensagem da ferramenta com a última mensagem de IA. Como não há desordem adicional entre o verbo e o verbo e o longo, a execução é contínua.

for event in abot.graph.stream(None, thread):
    for v in event.values():
        print(v)

A aprovação de uma pessoa

Podemos usar um loop simples que faça as aprovações do usuário antes de continuar sendo morto. O novo ID da linha é usado para novo desempenho. Se o usuário optar por não continuar, o agente para.

messages = [HumanMessage("What's the weather in LA?")]
thread = {"configurable": {"thread_id": "2"}}

for event in abot.graph.stream({"messages": messages}, thread):
    for v in event.values():
        print(v)

while abot.graph.get_state(thread).next:
    print("n", abot.graph.get_state(thread), "n")
    _input = input("Proceed? (y/n): ")
    if _input.lower() != "y":
        print("Aborting")
        break
    for event in abot.graph.stream(None, thread):
        for v in event.values():
            print(v)

É bom! Agora você sabe como incluir alguém na cintura. Agora, tente tentar um distúrbio diferente e veja como o agente os trata.

Progresso: Deeepleccioun.ai (


Weneet Kumar é estudante de um consultor em Marktechpost. Atualmente, ele perseguiu seu BS do Instituto Indiano de Tecnologia (IIT), Kanpur. Ele é um entusiasmo de aprendizado de máquina. Ela é apaixonada pela pesquisa recente e raiva na aprendizagem mais profunda, na ideia de computador e nos campos relacionados.

✅ [Recommended] Junte -se ao nosso canal de telégrafo



Source link

Você também pode gostar...

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *