En este tutorial, demostramos cómo construir un asistente inteligente de IA integrando Langchain, Gemini 2.0 Flash y Jina Herramientas de búsqueda. Al combinar las capacidades de un poderoso modelo de lenguaje grande (LLM) con una API de búsqueda externa, creamos un asistente que puede proporcionar información actualizada con citas. Este tutorial paso a paso camina a través de la configuración de las claves API, la instalación de bibliotecas necesarias, herramientas de enlace al modelo Gemini y construyendo una cadena de lang personalizada que llame dinámicamente herramientas externas cuando el modelo requiere información fresca o específica. Al final de este tutorial, tendremos un asistente de IA interactivo totalmente funcional que puede responder a las consultas de los usuarios con respuestas precisas, actuales y bien generadas.
%pip install --quiet -U "langchain-community>=0.2.16" langchain langchain-google-genai
Instalamos los paquetes de Python requeridos para este proyecto. Incluye el marco Langchain para la creación de aplicaciones de IA, las herramientas de la comunidad Langchain (versión 0.2.16 o superior) y la integración de Langchain con los modelos Google Gemini. Estos paquetes permiten el uso sin problemas de modelos Gemini y herramientas externas dentro de las tuberías de Langchain.
import getpass
import os
import json
from typing import Dict, Any
Incorporamos módulos esenciales en el proyecto. GetPass permite ingresar de forma segura las teclas API sin mostrarlas en la pantalla, mientras que el sistema operativo ayuda a administrar variables de entorno y rutas de archivos. JSON se utiliza para manejar las estructuras de datos JSON, y la escritura proporciona sugerencias de tipo para variables, como diccionarios y argumentos de funciones, asegurando una mejor legibilidad de código y mantenimiento.
if not os.environ.get("JINA_API_KEY"):
os.environ["JINA_API_KEY"] = getpass.getpass("Enter your Jina API key: ")
if not os.environ.get("GOOGLE_API_KEY"):
os.environ["GOOGLE_API_KEY"] = getpass.getpass("Enter your Google/Gemini API key: ")
Nos aseguramos de que las claves API necesarias para Jina y Google Gemini se establezcan como variables de entorno. Supongamos que las claves ya no están definidas en el entorno. En ese caso, el script solicita al usuario que los ingrese de forma segura utilizando el módulo GetPass, manteniendo las claves ocultas a la vista para fines de seguridad. Este enfoque permite un acceso perfecto a estos servicios sin requerir la codificación difícil de la información confidencial en el código.
from langchain_community.tools import JinaSearch
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableConfig, chain
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage
print("🔧 Setting up tools and model...")
Importamos módulos y clases clave del ecosistema Langchain. Presenta la herramienta JinaSearch para la búsqueda web, el modelo ChatGoogleGenerativeai para acceder a Gemini de Google y clases esenciales de Langchain Core, incluidas ChatPrompptTemplate, Runnableconfig y estructuras de mensajes (HumanMessage, Aimessage y Toolmessage). Juntos, estos componentes permiten la integración de herramientas externas con Gemini para la recuperación de información dinámica impulsada por la IA. La declaración de impresión confirma que el proceso de configuración ha comenzado.
search_tool = JinaSearch()
print(f"✅ Jina Search tool initialized: {search_tool.name}")
print("\n🔍 Testing Jina Search directly:")
direct_search_result = search_tool.invoke({"query": "what is langgraph"})
print(f"Direct search result preview: {direct_search_result[:200]}...")
Inicializamos la herramienta de búsqueda de Jina creando una instancia de Jinasearch () y confirmando que está lista para su uso. La herramienta está diseñada para manejar consultas de búsqueda web dentro del ecosistema Langchain. Luego, el script ejecuta una consulta de prueba directa, “qué es Langgraph”, utilizando el método de Invoke e imprime una vista previa del resultado de la búsqueda. Este paso verifica que la herramienta de búsqueda funcione correctamente antes de integrarla en un flujo de trabajo de asistente de IA más grande.
gemini_model = ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
temperature=0.1,
convert_system_message_to_human=True
)
print("✅ Gemini model initialized")
Inicializamos el modelo Flash Gemini 2.0 usando la clase ChatGoogleGenerativeai de Langchain. El modelo se establece con una temperatura baja (0.1) para respuestas más deterministas, y el convert_system_message_to_human = True Parameter asegura que las indicaciones a nivel del sistema se manejen adecuadamente como mensajes legibles por humanos para la API de Gemini. La declaración de impresión final confirma que el modelo Gemini está listo para su uso.
detailed_prompt = ChatPromptTemplate.from_messages([
("system", """You are an intelligent assistant with access to web search capabilities.
When users ask questions, you can use the Jina search tool to find current information.
Instructions:
1. If the question requires recent or specific information, use the search tool
2. Provide comprehensive answers based on the search results
3. Always cite your sources when using search results
4. Be helpful and informative in your responses"""),
("human", "{user_input}"),
("placeholder", "{messages}"),
])
Definimos una plantilla de aviso usando chatpromptTemplate.from_messages () que guía el comportamiento de la IA. Incluye un mensaje del sistema que describe el papel del asistente, un marcador de posición de mensajes humanos para consultas de usuarios y un marcador de posición para los mensajes de herramientas generados durante las llamadas de herramientas. Este aviso estructurado garantiza que la IA proporcione respuestas útiles, informativas y bien generadas al tiempo que integra sin problemas los resultados de búsqueda en la conversación.
gemini_with_tools = gemini_model.bind_tools([search_tool])
print("✅ Tools bound to Gemini model")
main_chain = detailed_prompt | gemini_with_tools
def format_tool_result(tool_call: Dict[str, Any], tool_result: str) -> str:
"""Format tool results for better readability"""
return f"Search Results for '{tool_call['args']['query']}':\n{tool_result[:800]}..."
Vinculamos la herramienta de búsqueda de Jina al modelo Gemini usando bind_tools (), permitiendo que el modelo invoque la herramienta de búsqueda cuando sea necesario. Main_chain combina la plantilla de solicitud estructurada y el modelo Gemini mejorado por la herramienta, creando un flujo de trabajo perfecto para manejar las entradas de los usuarios y las llamadas de herramientas dinámicas. Además, los resultados de búsqueda de la función Format_Tool_Result Formats para una pantalla clara y legible, asegurando que los usuarios puedan comprender fácilmente las salidas de consultas de búsqueda.
@chain
def enhanced_search_chain(user_input: str, config: RunnableConfig):
"""
Enhanced chain that handles tool calls and provides detailed responses
"""
print(f"\n🤖 Processing query: '{user_input}'")
input_data = {"user_input": user_input}
print("📤 Sending to Gemini...")
ai_response = main_chain.invoke(input_data, config=config)
if ai_response.tool_calls:
print(f"🛠️ AI requested {len(ai_response.tool_calls)} tool call(s)")
tool_messages = []
for i, tool_call in enumerate(ai_response.tool_calls):
print(f" 🔍 Executing search {i+1}: {tool_call['args']['query']}")
tool_result = search_tool.invoke(tool_call)
tool_msg = ToolMessage(
content=tool_result,
tool_call_id=tool_call['id']
)
tool_messages.append(tool_msg)
print("📥 Getting final response with search results...")
final_input = {
**input_data,
"messages": [ai_response] + tool_messages
}
final_response = main_chain.invoke(final_input, config=config)
return final_response
else:
print("ℹ️ No tool calls needed")
return ai_response
Definimos el mejorado_search_chain usando el decorador @chain de Langchain, lo que le permite manejar las consultas de los usuarios con el uso de herramientas dinámicas. Se necesita una entrada del usuario y un objeto de configuración, pasa la entrada a través de la cadena principal (que incluye el mensaje y Gemini con herramientas), y verifica si la IA sugiere alguna llamada de herramientas (por ejemplo, búsqueda web a través de Jina). Si las llamadas de herramientas están presentes, ejecuta las búsquedas, crea objetos de poder de herramientas y reinvoca la cadena con los resultados de la herramienta para una respuesta final enriquecida con el contexto. Si no se realizan llamadas de herramientas, devuelve la respuesta de la IA directamente.
def test_search_chain():
"""Test the search chain with various queries"""
test_queries = [
"what is langgraph",
"latest developments in AI for 2024",
"how does langchain work with different LLMs"
]
print("\n" + "="*60)
print("🧪 TESTING ENHANCED SEARCH CHAIN")
print("="*60)
for i, query in enumerate(test_queries, 1):
print(f"\n📝 Test {i}: {query}")
print("-" * 50)
try:
response = enhanced_search_chain.invoke(query)
print(f"✅ Response: {response.content[:300]}...")
if hasattr(response, 'tool_calls') and response.tool_calls:
print(f"🛠️ Used {len(response.tool_calls)} tool call(s)")
except Exception as e:
print(f"❌ Error: {str(e)}")
print("-" * 50)
La función, test_search_chain (), valida toda la configuración del asistente de IA ejecutando una serie de consultas de prueba a través del mejorado_search_chain. Define una lista de diversos indicaciones de prueba, herramientas de cubierta, temas de IA e integraciones de Langchain e imprime resultados, lo que indica si se utilizaron llamadas de herramientas. Esto ayuda a verificar que la IA pueda activar efectivamente las búsquedas web, procesar respuestas y devolver información útil a los usuarios, asegurando un sistema robusto e interactivo.
if __name__ == "__main__":
print("\n🚀 Starting enhanced LangChain + Gemini + Jina Search demo...")
test_search_chain()
print("\n" + "="*60)
print("💬 INTERACTIVE MODE - Ask me anything! (type 'quit' to exit)")
print("="*60)
while True:
user_query = input("\n🗣️ Your question: ").strip()
if user_query.lower() in ['quit', 'exit', 'bye']:
print("👋 Goodbye!")
break
if user_query:
try:
response = enhanced_search_chain.invoke(user_query)
print(f"\n🤖 Response:\n{response.content}")
except Exception as e:
print(f"❌ Error: {str(e)}")
Finalmente, ejecutamos el asistente de IA como un script cuando el archivo se ejecuta directamente. Primero llama a la función test_search_chain () para validar el sistema con consultas predefinidas, asegurando que la configuración funcione correctamente. Luego, inicia un modo interactivo, lo que permite a los usuarios escribir preguntas personalizadas y recibir respuestas generadas por IA enriquecidas con resultados de búsqueda dinámicos cuando sea necesario. El bucle continúa hasta que los tipos de usuario ‘abandonen’, ‘salir’ o ‘adiós’, proporcionando una forma intuitiva y práctica de interactuar con el sistema AI.
En conclusión, hemos creado con éxito un asistente de IA mejorado que aprovecha el marco modular de Langchain, las capacidades generativas de Gemini 2.0 Flash y la funcionalidad de búsqueda web en tiempo real de Jina Search. Este enfoque híbrido demuestra cómo los modelos AI pueden ampliar su conocimiento más allá de los datos estáticos, proporcionando a los usuarios información oportuna y relevante de fuentes confiables. Ahora puede extender este proyecto aún más integrando herramientas adicionales, personalizando indicaciones o implementando el asistente como API o aplicación web para aplicaciones más amplias. Esta base abre infinitas posibilidades para construir sistemas inteligentes que son poderosos y contextualmente conscientes.
Mira el Cuaderno en Github. Todo el crédito por esta investigación va a los investigadores de este proyecto. Además, siéntete libre de seguirnos Gorjeo Y no olvides unirte a nuestro 95k+ ml de subreddit 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.