Ir al contenido principal

DeepSeek V3.1: guía con proyecto de demostración

Aprende a convertir cualquier PDF en un asistente de investigación interactivo usando DeepSeek V3.1 y una app de Streamlit.
Actualizado 17 sept 2026  · 12 min leer

Explorar con IA

ChatGPTClaudePerplexity

DeepSeek ha lanzado recientemente DeepSeek V3.1, un modelo de razonamiento híbrido a gran escala que admite modos de respuesta de “think” y “non-think”, lo que lo hace ideal para el análisis interactivo de documentos.

En este blog me centro en las capacidades agénticas de DeepSeek V3.1 para comprender artículos de investigación. Te explico paso a paso cómo convertir cualquier PDF en un asistente de investigación interactivo mediante una app de Streamlit. Verás cómo:

  • Integrar DeepSeek V3.1 a través de la API de OpenRouter para razonamiento escalable con documentos largos
  • Extraer y analizar texto de PDF para manejar artículos académicos de cualquier longitud
  • Diseñar una app en Streamlit que permita alternar entre respuestas rápidas y fácticas y razonamientos profundos con evidencias
  • Implementar un seguimiento de costes y medición de rendimiento para escenarios de investigación reales
  • Respaldar las respuestas con citas extraídas de la fuente

Al final, tu app se verá así:

DeepSeek V3.1 demo project

¿Qué es DeepSeek V3.1?

DeepSeek V3.1 es un modelo híbrido de Mixture-of-Experts (MoE) con 671 B de parámetros, entrenado para estilos de respuesta tanto de "thinking" (detallado, con razonamiento) como de "non-thinking" (factual, conciso). Admite contextos de hasta 128.000 tokens y es accesible mediante la API compatible con OpenAI de OpenRouter.

DeepSeek V3.1 Benchmarks

Fuente: DeepSeek

Las características más importantes de DeepSeek V3.1 son:

  • Gestión de contextos largos: DeepSeek V3.1 procesa con eficiencia documentos extremadamente largos, con ventanas de contexto de hasta 128.000 tokens (más de 100 páginas), lo que lo hace ideal para artículos y reportes extensos.
  • Dos modos de razonamiento: el modelo incluye dos modos de razonamiento:
    • Thinking mode: ofrece razonamientos detallados paso a paso y cita evidencias directamente de la fuente para un análisis y una crítica en profundidad.
    • Non-thinking mode: proporciona respuestas concisas y fácticas para recuperar información al instante y Q&A rápidos.
  • Arquitectura híbrida Mixture-of-Experts: DeepSeek V3.1 combina múltiples subredes expertas, lo que permite tanto la recuperación factual como la síntesis avanzada en un mismo modelo.
  • Flujos de trabajo agénticos y con herramientas: el modelo está diseñado para integrarse con sistemas basados en agentes y admite el uso de herramientas externas para flujos de trabajo más ricos y de varios pasos.
  • Acceso por API compatible con OpenAI: se accede a través de la API compatible con OpenAI de OpenRouter, lo que simplifica el despliegue y la integración para desarrolladores.

Demostración de DeepSeek V3.1: asistente para artículos científicos

En esta sección te muestro cómo utilicé DeepSeek V3.1 para convertir cualquier artículo científico en PDF en un asistente de investigación interactivo con IA.

Así es como funciona:

  • Sube un PDF y previsualiza el texto extraído.
  • Haz preguntas en lenguaje natural sobre el artículo.
  • Elige entre “Explain in Brief” (non-think) o “Explain in Detail” (think) como modo de respuesta.
  • Recibe respuestas al instante, junto con el tiempo de respuesta, estimaciones de uso de tokens/coste y citas de apoyo extraídas de la fuente.

Paso 1: requisitos previos

Antes de ejecutar esta demo, asegúrate de tener todo lo necesario.

Paso 1.1: imports 

Primero, instala los siguientes paquetes:

pip install streamlit openai pypdf

Este comando instala las dependencias clave para la interfaz, el manejo de PDFs y las solicitudes a APIs.

Paso 1.2: configurar la clave de la API de OpenRouter 

El modelo DeepSeek V3.1 está disponible en varias plataformas, incluida la API oficial de DeepSeek. Sin embargo, yo utilicé OpenRouter, que ofrece acceso con una única cuenta a múltiples modelos y resultó la opción más económica para esta demo. Estos son los pasos para crear una API key para DeepSeek V3.1:

  • Crea una cuenta en https://openrouter.ai/
  • Ve a la pestaña Models y busca “DeepSeek V3.1”. También puedes elegir una versión base, pero está entrenada solo para predicción del siguiente token, lo que complica un poco el prompting. Por eso utilicé la versión de chat “deepseek/deepseek-chat-v3.1.”

DeepSeek V3.1 on OpenRouter

  • Desplázate hacia abajo y haz clic en Create API Key. Ponle un nombre a la clave y, si quieres, un límite de crédito; después haz clic en Create. Guarda esta clave para usarla más tarde. 

Create API key

  • A continuación, ve a la pestaña Credits y añade tu tarjeta o cuenta bancaria. También puedes pagar con Amazon Pay o criptomonedas. Para esta demo, añadí unos 8 $, más que suficiente.

Add credits

Ahora, define tu clave como variable de entorno antes de ejecutar la app:

export OPENROUTER_API_KEY=your_api_key

Elegir la API adecuada

La API oficial de DeepSeek es la mejor opción para cargas de trabajo automatizadas de alto volumen.

Para la mayoría de casos de investigación, educación o demos, incluido este asistente de artículos en Streamlit, prefiero OpenRouter porque es una opción más simple y flexible. Ofrece precios globales predecibles sin restricciones temporales ni lógica de caché que gestionar, perfecto para análisis ad hoc, consultas únicas sobre documentos y colaboración sencilla.

Nota: usar DeepSeek V3.1 a través de la API requiere solo unos 8 GB de memoria para la interfaz, evitando tener que alojar localmente el modelo de 670 B de parámetros, que necesitaría más de 170 GB de disco y una GPU potente.

Paso 2: configurar la app de Streamlit

Para ofrecer DeepSeek V3.1 en una interfaz fácil de usar, utilizaremos Streamlit como framework y lo conectaremos al modelo mediante la API compatible con OpenAI de OpenRouter. 

Paso 2.1: configuración

Este paso cubre la configuración del entorno, la autenticación con la API y los ajustes básicos de Streamlit.

import streamlit as stimport pypdfimport tempfilefrom openai import OpenAIimport osimport timeimport rest.set_page_config(    page_title="DeepSeek V3.1 Research Assistant",    layout="wide")with st.sidebar:    st.title("Research Paper Assistant")    st.info("Tip: Ask about the methods, findings, or reasoning for best results.")OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "")if not OPENROUTER_API_KEY:    st.warning("Add your OpenRouter API key to an environment variable.")    st.stop()client = OpenAI(    base_url="https://openrouter.ai/api/v1",    api_key=OPENROUTER_API_KEY,)

En el código anterior, la llamada a st.set_page_config() personaliza el título y el diseño de la página en Streamlit. La app recupera la clave de OpenRouter desde las variables de entorno e instancia un cliente compatible con OpenAI apuntando al endpoint de OpenRouter, garantizando que todas las llamadas al LLM se enruten y autentiquen correctamente para DeepSeek V3.1.

Paso 2.2: funciones auxiliares

Antes de construir el flujo principal, necesitamos utilidades sólidas para procesar documentos y estimar recursos. Aquí definimos funciones para extraer texto de PDFs subidos, previsualizar contenido, contar aproximadamente los tokens y estimar el coste según los precios de DeepSeek V3.1 en OpenRouter. 

def pdf_to_text(uploaded_file):    with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:        tmp_file.write(uploaded_file.read())        tmp_path = tmp_file.name    reader = pypdf.PdfReader(tmp_path)    text = ""    for page in reader.pages:        page_text = page.extract_text()        if page_text:            text += page_text + "\n"    return textdef preview_pdf_text(text, max_chars=600):    preview = text[:max_chars]    if len(text) > max_chars:        preview += "\n...\n[Preview truncated]"    return previewdef count_tokens(text):    return max(1, int(len(text) / 4))def estimate_cost(tokens, mode="input"):    if mode == "input":        return tokens / 1_000_000 * 0.20    else:        return tokens / 1_000_000 * 0.80

Con estas funciones auxiliares, el backend queda listo para dar soporte a una interfaz de asistente de investigación escalable:

  • Análisis eficiente de PDF: la función pdf_to_text() convierte PDFs multipágina en texto plano preservando los saltos de página, dejando los datos listos para entrar al LLM y procesos posteriores.
  • Conteo de tokens y estimación de costes: la función count_tokens() ofrece un recuento aproximado de tokens para controlar el uso de la API frente a la amplia ventana de contexto de DeepSeek. Por su parte, estimate_cost() traduce este recuento en una estimación de coste en tiempo real usando los precios de OpenRouter para entrada y salida, manteniéndote al tanto del presupuesto computacional de cada consulta.
  • Generación de previsualizaciones: la función preview_pdf_text() crea vistas previas truncadas para que puedas verificar la integridad y relevancia del contenido extraído antes de incurrir en costes o chocar con límites de la API.

Con estas piezas listas, pasamos a montar la app de Streamlit completa para Q&A agéntico con contexto largo sobre artículos científicos.

Paso 2.3: aplicación en Streamlit

Con las utilidades básicas listas, montamos la interfaz principal en Streamlit que une el procesamiento del PDF, la estimación de tokens/coste, el Q&A guiado por el usuario y la interacción en tiempo real con DeepSeek V3.1 a través de OpenRouter. 

st.header("Research Paper Assistant")pdf_file = st.file_uploader("Upload your research paper (PDF)", type=["pdf"])if "paper_text" not in st.session_state or st.session_state.get("last_uploaded") != pdf_file:    if pdf_file is not None:        with st.spinner("Extracting text from PDF..."):            st.session_state.paper_text = pdf_to_text(pdf_file)            st.session_state.last_uploaded = pdf_file            st.success(f"PDF uploaded. Total characters extracted: {len(st.session_state.paper_text):,}")            with st.expander("Preview of extracted PDF text:"):                st.code(preview_pdf_text(st.session_state.paper_text), language='markdown')paper_text = st.session_state.get("paper_text")if paper_text:    input_tokens = count_tokens(paper_text)    st.caption(f"Estimated input tokens: {input_tokens:,} (Estimated input cost: ${estimate_cost(input_tokens):.3f})")    question = st.text_area("Ask a question about this paper:", height=80, placeholder="E.g. What are the main findings?")    mode = st.radio(        "Select Mode",        ["Explain in Brief (Non-Think)", "Explain in Detail (Think)"],        horizontal=True,    )    go = st.button("Get Answer", use_container_width=True)    if question and go:        if mode == "Explain in Brief (Non-Think)":            prompt = (                f"{paper_text}\n\n"                f"Question: {question}\n"                "First, answer in a few sentences. Then, quote 1–2 exact sentences from the above paper that best support your answer. "                "Show each quote on a new line."            )            thinking_flag = False            header = "Explain in Brief (Non-Think)"        else:            prompt = (                f"{paper_text}\n\n"                f"Question: {question}\n"                "First, answer in detail with reasoning and evidence. Then, quote 2–3 exact sentences from the above paper that most strongly support your answer. "                "List the quotes after your answer."            )            thinking_flag = True            header = "Explain in Detail (Think)"        with st.spinner(f"Generating answer..."):            start_time = time.perf_counter()            try:                response = client.chat.completions.create(                    model="deepseek/deepseek-chat-v3.1",                    messages=[                        {"role": "system", "content": "You are a helpful research assistant."},                        {"role": "user", "content": prompt}                    ],                    max_tokens=900,                    extra_body={"thinking": thinking_flag},                 )                answer = response.choices[0].message.content.strip()                output_tokens = count_tokens(answer)            except Exception as e:                answer = f"Error: {e}"                output_tokens = 0            end_time = time.perf_counter()            elapsed_time = end_time - start_time            parts = re.split(r"(?:^|\n)(Quotes?:?)", answer, flags=re.IGNORECASE)            if len(parts) >= 3:                main_answer = parts[0].strip()                quotes = parts[2].strip()            else:                main_answer = answer                quotes = None            st.markdown(f"### {header}")            st.info(f"Time taken: {elapsed_time:.2f} seconds | Output tokens: {output_tokens} (Est. output cost: ${estimate_cost(output_tokens, 'output'):.3f})")            st.write(main_answer)            if quotes:                st.markdown("**Supporting Quotes:**")                st.success(quotes)

Esta aplicación de Streamlit implementa un asistente dinámico para artículos científicos con DeepSeek V3.1, gestionando desde la ingestión del documento hasta el Q&A contextual con el LLM. Estas son las funciones clave:

1. Subida y caché del PDF

El usuario sube un PDF a través de la interfaz y luego:

  • La app comprueba st.session_state para ver si el archivo es nuevo. Si lo es, extrae el texto y lo guarda en session_state junto con la referencia de subida, evitando repetir la extracción en cada interacción.
  • Tras la extracción, muestra una previsualización de ~600 caracteres, junto con estadísticas como número de caracteres, tokens estimados y coste.

2. Consulta del usuario y selección de modo

Con el documento cargado, puedes escribir una pregunta y elegir entre Non-think y Think; la interfaz adapta las instrucciones del prompt para cada modo:

  • Modo Non-think: devuelve una respuesta breve con 1–2 citas de apoyo del artículo.
  • Modo Think: devuelve una respuesta detallada y con evidencias, con 2–3 citas de apoyo.

3. Ingeniería de prompts y llamada a la API

Cuando haces clic en "Get Answer", la app:

  • Construye un prompt con contexto, inyectando el contenido del artículo, tu pregunta y las instrucciones de respuesta.
  • Define el parámetro thinking en la solicitud a la API de OpenRouter (extra_body={"thinking": thinking_flag}), asegurando que el modelo ejecute el modo de razonamiento correcto sin depender de la temperatura.
  • Mide el tiempo de inferencia, los tokens de salida y el coste por respuesta y los muestra para mayor transparencia.

4. Posprocesado y visualización

La respuesta devuelta se analiza para separar el contenido principal de las citas de apoyo (si las hay). Luego se muestran ambos en la interfaz, destacando la evidencia textual exacta del artículo fuente.

Para probarlo, guarda el código como app.py y ejecuta:

streamlit run app.py

En mis pruebas, DeepSeek V3.1 tardó bastante más en generar respuestas detalladas en modo “think” que respuestas breves en modo “non-think”. Esto se debe a que las salidas más largas y razonadas requieren más cómputo y tiempo.

Conclusión

Este tutorial ha mostrado cómo usar DeepSeek V3.1 para crear un asistente interactivo capaz de analizar documentos largos, ofrecer respuestas tanto concisas como detalladas y controlar los costes en tiempo real, todo dentro de una app de Streamlit. Si te apetece seguir creando proyectos con DeepSeek, te recomiendo consultar nuestro tutorial sobre el nuevo DeepSeek V3.2-Speciale.


Aashi Dutt's photo
Author
Aashi Dutt
LinkedIn
Twitter

Soy experta Google Developers en ML (Gen AI), triple experta en Kaggle y embajadora de Women Techmakers, con más de tres años de experiencia en el sector tecnológico. Cofundé una startup de salud en 2020 y actualmente curso un máster en informática en Georgia Tech, con especialización en aprendizaje automático.

Temas
Inteligencia Artificial
Grandes modelos lingüísticos

¡Aprende IA con estos cursos!

Curso

Agentes de texto a consulta con MongoDB y LangGraph

2 h
902
Descubre cómo interactuar con tus datos utilizando agentes de IA de texto a consulta con MongoDB y LangGraph.
Ver detallesRight Arrow
Iniciar Curso
Ver másRight Arrow
Relacionado
An AI juggles tasks

blog

Cinco proyectos que puedes crear con modelos de IA generativa (con ejemplos)

Aprende a utilizar modelos de IA generativa para crear un editor de imágenes, un chatbot similar a ChatGPT con pocos recursos y una aplicación clasificadora de aprobación de préstamos y a automatizar interacciones PDF y un asistente de voz con GPT.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Tutorial

Tutorial de DeepSeek-Coder-V2: Ejemplos, instalación, puntos de referencia

DeepSeek-Coder-V2 es un modelo de lenguaje de código de código abierto que rivaliza con el rendimiento de GPT-4, Gemini 1.5 Pro, Claude 3 Opus, Llama 3 70B o Codestral.
Dimitri Didmanidze's photo

Dimitri Didmanidze

8 min

Tutorial

Tutorial de DeepChecks: Automatizar las pruebas de aprendizaje automático

Aprende a realizar la validación de datos y modelos para garantizar un sólido rendimiento del aprendizaje automático utilizando nuestra guía paso a paso para automatizar las pruebas con DeepChecks.
Abid Ali Awan's photo

Abid Ali Awan

12 min

Tutorial

Visión GPT-4: Guía completa para principiantes

Este tutorial le presentará todo lo que necesita saber sobre GPT-4 Vision, desde cómo acceder a él hasta ejemplos prácticos del mundo real y sus limitaciones.
Arunn Thevapalan's photo

Arunn Thevapalan

12 min

Tutorial

Tutorial de Python: Streamlit

Este tutorial sobre Streamlit está pensado para ayudar a los científicos de datos o ingenieros de machine learning que no son desarrolladores web y no están interesados en pasar semanas aprendiendo a utilizar estos marcos para crear aplicaciones web.
Nadia mhadhbi's photo

Nadia mhadhbi

15 min

Tutorial

Tutorial sobre cómo crear aplicaciones LLM con LangChain

Explore el potencial sin explotar de los grandes modelos lingüísticos con LangChain, un marco Python de código abierto para crear aplicaciones avanzadas de IA.
Moez Ali's photo

Moez Ali

12 min

Ver MásVer Más