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