Construimos un sistema avanzado de múltiples agentes Langgraph que aprovecha el modelo Gemini de nivel libre de Google para flujos de trabajo de investigación de extremo a extremo. En este tutorial, comenzamos instalando las bibliotecas necesarias, Langgraph, Langchain-Google-Genai y Langchain-Core, luego caminamos definiendo un estado estructurado, simulando herramientas de investigación y análisis, y cableado tres agentes especializados: investigación, análisis e informes. En el camino, mostramos cómo simular búsquedas web, realizar análisis de datos y orquestar mensajes entre agentes para producir un informe ejecutivo pulido. Mira el Códigos completos aquí.
!pip install -q langgraph langchain-google-genai langchain-core
import os
from typing import TypedDict, Annotated, List, Dict, Any
from langgraph.graph import StateGraph, END
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage
import operator
import json
os.environ["GOOGLE_API_KEY"] = "Use Your Own API Key"
class AgentState(TypedDict):
messages: Annotated[List[BaseMessage], operator.add]
current_agent: str
research_data: dict
analysis_complete: bool
final_report: str
llm = ChatGoogleGenerativeAI(model="gemini-1.5-flash", temperature=0.7)
Instalamos los paquetes Langgraph y Langchain-Google-Genai e importamos los módulos centrales que necesitamos para orquestar nuestro flujo de trabajo de agente múltiple. Establecemos nuestra clave de Google API, definimos el Typeddict de AgentState para estructurar mensajes y estado de flujo de trabajo, e inicializamos el modelo Gemini-1.5-Flash con una temperatura de 0.7 para respuestas equilibradas. Mira el Códigos completos aquí.
def simulate_web_search(query: str) -> str:
"""Simulated web search - replace with real API in production"""
return f"Search results for '{query}': Found relevant information about {query} including recent developments, expert opinions, and statistical data."
def simulate_data_analysis(data: str) -> str:
"""Simulated data analysis tool"""
return f"Analysis complete: Key insights from the data include emerging trends, statistical patterns, and actionable recommendations."
def research_agent(state: AgentState) -> AgentState:
"""Agent that researches a given topic"""
messages = state["messages"]
last_message = messages[-1].content
search_results = simulate_web_search(last_message)
prompt = f"""You are a research agent. Based on the query: "{last_message}"
Here are the search results: {search_results}
Conduct thorough research and gather relevant information. Provide structured findings with:
1. Key facts and data points
2. Current trends and developments
3. Expert opinions and insights
4. Relevant statistics
Be comprehensive and analytical in your research summary."""
response = llm.invoke([HumanMessage(content=prompt)])
research_data = {
"topic": last_message,
"findings": response.content,
"search_results": search_results,
"sources": ["academic_papers", "industry_reports", "expert_analyses"],
"confidence": 0.88,
"timestamp": "2024-research-session"
}
return {
"messages": state["messages"] + [AIMessage(content=f"Research completed on '{last_message}': {response.content}")],
"current_agent": "analysis",
"research_data": research_data,
"analysis_complete": False,
"final_report": ""
}
Definimos simulate_web_search y simulate_data_analysis como herramientas de marcador de posición que se burlan de la recuperación y el análisis de la información, luego implementan investigaciones_AGENT para invocar estas simulaciones, provocar gemini para un resumen de investigación estructurado y actualizar nuestro estado de flujo de trabajo con los hallazgos. Encapsulamos toda la fase de investigación en una sola función que avanza al agente a la etapa de análisis una vez que se completa la búsqueda simulada y la salida de LLM estructurada. Mira el Códigos completos aquí.
def analysis_agent(state: AgentState) -> AgentState:
"""Agent that analyzes research data and extracts insights"""
research_data = state["research_data"]
analysis_results = simulate_data_analysis(research_data.get('findings', ''))
prompt = f"""You are an analysis agent. Analyze this research data in depth:
Topic: {research_data.get('topic', 'Unknown')}
Research Findings: {research_data.get('findings', 'No findings')}
Analysis Results: {analysis_results}
Provide deep insights including:
1. Pattern identification and trend analysis
2. Comparative analysis with industry standards
3. Risk assessment and opportunities
4. Strategic implications
5. Actionable recommendations with priority levels
Be analytical and provide evidence-based insights."""
response = llm.invoke([HumanMessage(content=prompt)])
return {
"messages": state["messages"] + [AIMessage(content=f"Analysis completed: {response.content}")],
"current_agent": "report",
"research_data": state["research_data"],
"analysis_complete": True,
"final_report": ""
}
def report_agent(state: AgentState) -> AgentState:
"""Agent that generates final comprehensive reports"""
research_data = state["research_data"]
analysis_message = None
for msg in reversed(state["messages"]):
if isinstance(msg, AIMessage) and "Analysis completed:" in msg.content:
analysis_message = msg.content.replace("Analysis completed: ", "")
break
prompt = f"""You are a professional report generation agent. Create a comprehensive executive report based on:
🔍 Research Topic: {research_data.get('topic')}
📊 Research Findings: {research_data.get('findings')}
🧠 Analysis Results: {analysis_message or 'Analysis pending'}
Generate a well-structured, professional report with these sections:
## EXECUTIVE SUMMARY
## KEY RESEARCH FINDINGS
[Detail the most important discoveries and data points]
## ANALYTICAL INSIGHTS
[Present deep analysis, patterns, and trends identified]
## STRATEGIC RECOMMENDATIONS
[Provide actionable recommendations with priority levels]
## RISK ASSESSMENT & OPPORTUNITIES
[Identify potential risks and opportunities]
## CONCLUSION & NEXT STEPS
[Summarize and suggest follow-up actions]
Make the report professional, data-driven, and actionable."""
response = llm.invoke([HumanMessage(content=prompt)])
return {
"messages": state["messages"] + [AIMessage(content=f"📄 FINAL REPORT GENERATED:\n\n{response.content}")],
"current_agent": "complete",
"research_data": state["research_data"],
"analysis_complete": True,
"final_report": response.content
}
Implementamos Analysis_Agent para tomar los resultados de la investigación simulados, ejecutarlos a través de nuestra herramienta de análisis de datos simulados, pedirle a Gemini que produzca información en profundidad y recomendaciones estratégicas, luego haga la transición del flujo de trabajo a la etapa del informe. Construimos Report_AGent para extraer el último análisis y crear un informe ejecutivo estructurado a través de Gemini, con secciones que van desde resumen hasta los próximos pasos. Luego marcamos el flujo de trabajo como completo almacenando el informe final en el estado. Mira el Códigos completos aquí.
def should_continue(state: AgentState) -> str:
"""Determine which agent should run next based on current state"""
current_agent = state.get("current_agent", "research")
if current_agent == "research":
return "analysis"
elif current_agent == "analysis":
return "report"
elif current_agent == "report":
return END
else:
return END
workflow = StateGraph(AgentState)
workflow.add_node("research", research_agent)
workflow.add_node("analysis", analysis_agent)
workflow.add_node("report", report_agent)
workflow.add_conditional_edges(
"research",
should_continue,
{"analysis": "analysis", END: END}
)
workflow.add_conditional_edges(
"analysis",
should_continue,
{"report": "report", END: END}
)
workflow.add_conditional_edges(
"report",
should_continue,
{END: END}
)
workflow.set_entry_point("research")
app = workflow.compile()
def run_research_assistant(query: str):
"""Run the complete research workflow"""
initial_state = {
"messages": [HumanMessage(content=query)],
"current_agent": "research",
"research_data": {},
"analysis_complete": False,
"final_report": ""
}
print(f"🔍 Starting Multi-Agent Research on: '{query}'")
print("=" * 60)
current_state = initial_state
print("🤖 Research Agent: Gathering information...")
current_state = research_agent(current_state)
print("✅ Research phase completed!\n")
print("🧠 Analysis Agent: Analyzing findings...")
current_state = analysis_agent(current_state)
print("✅ Analysis phase completed!\n")
print("📊 Report Agent: Generating comprehensive report...")
final_state = report_agent(current_state)
print("✅ Report generation completed!\n")
print("=" * 60)
print("🎯 MULTI-AGENT WORKFLOW COMPLETED SUCCESSFULLY!")
print("=" * 60)
final_report = final_state['final_report']
print(f"\n📋 COMPREHENSIVE RESEARCH REPORT:\n")
print(final_report)
return final_state
Construimos un StateGraph, agregamos nuestros tres agentes como nodos con bordes condicionales dictados por debería_continue, establecieron el punto de entrada en “investigación” y compiló el gráfico en un flujo de trabajo ejecutable. Luego definimos run_research_assistant () para inicializar el estado, invocar secuencialmente a cada agente, investigación, análisis e informe, imprimir actualizaciones de estado y devolver el informe final. Mira el Códigos completos aquí.
if __name__ == "__main__":
print("🚀 Advanced LangGraph Multi-Agent System Ready!")
print("🔧 Remember to set your GOOGLE_API_KEY!")
example_queries = [
"Impact of renewable energy on global markets",
"Future of remote work post-pandemic"
]
print(f"\n💡 Example queries you can try:")
for i, query in enumerate(example_queries, 1):
print(f" {i}. {query}")
print(f"\n🎯 Usage: run_research_assistant('Your research question here')")
result = run_research_assistant("What are emerging trends in sustainable technology?")
Definimos el punto de entrada que inicia nuestro sistema de múltiples agentes, mostrando un mensaje de preparación, consultas de ejemplo y recordándonos que establezcamos la tecla API de Google. Mostramos indicaciones de muestra para demostrar cómo interactuar con el asistente de investigación y luego ejecutar una prueba de ejecución de “tendencias emergentes en tecnología sostenible”, imprimiendo la salida de flujo de trabajo de extremo a extremo.
En conclusión, reflexionamos sobre cómo esta configuración modular nos permite prototipos de flujos de trabajo complejos rápidamente. Cada agente encapsula una fase distinta de recopilación, interpretación y entrega de inteligencia, lo que nos permite intercambiar en API reales o extender la tubería con nuevas herramientas a medida que nuestras necesidades evolucionan. Le recomendamos que experimente con herramientas personalizadas, ajuste la estructura de estado y explore los LLM alternativos. Este marco está diseñado para crecer con sus objetivos de investigación y producto. A medida que iteramos, refinamos continuamente las indicaciones y capacidades de nuestros agentes, asegurando que nuestro sistema de múltiples agentes sea robusto y adaptable a cualquier dominio.
Mira el Códigos completos aquí. No dude en ver nuestro Página de Github para tutoriales, códigos y cuadernos. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro Subreddit de 100k+ ml y suscribirse a Nuestro boletín.
Asif Razzaq es el CEO de MarktechPost Media Inc .. Como empresario e ingeniero visionario, ASIF se compromete a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, MarktechPost, que se destaca por su cobertura profunda de noticias de aprendizaje automático y de aprendizaje profundo que es técnicamente sólido y fácilmente comprensible por una audiencia amplia. La plataforma cuenta con más de 2 millones de vistas mensuales, ilustrando su popularidad entre el público.