Un bot de preguntas y respuestas sobre sus documentos
Ponga en producción un bot RAG funcional: ingiera PDF, genere embeddings, busque y genere respuestas. El «hola mundo» de los agentes en producción.
Un bot de preguntas y respuestas sobre sus documentos es una lección gratuita de AI Agents en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Agents, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Agents incluye 4 lecciones en total.
Partes de esta lección aún no han sido traducidas y se muestran en inglés.
Objetivo del proyecto
Construya un chatbot que responda preguntas a partir de sus propios documentos (PDF, Markdown, etc.). Este es el «hola mundo» de los agentes de producción y resulta útil de inmediato para cualquier equipo.
Arquitectura
- Ingesta: cargar documentos → dividirlos en fragmentos → generar embeddings → almacenarlos en una base de datos vectorial
- Consulta: generar el embedding de la pregunta → recuperar los fragmentos top-K → incluirlos en el prompt → LLM
- Citas: formatear los fragmentos con identificadores; pedir al LLM que cite las fuentes
Step 1: Load and Chunk
from langchain.text_splitter import RecursiveCharacterTextSplitter
from pypdf import PdfReader
text = ''
for page in PdfReader('handbook.pdf').pages:
text += page.extract_text() + '\n'
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_text(text)
print(f'{len(chunks)} chunks')Step 2: Embed and Store
import chromadb
from openai import OpenAI
oai = OpenAI()
chroma = chromadb.PersistentClient(path='./db')
collection = chroma.get_or_create_collection('handbook')
resp = oai.embeddings.create(model='text-embedding-3-small', input=chunks)
vectors = [d.embedding for d in resp.data]
collection.add(ids=[f'c{i}' for i in range(len(chunks))], embeddings=vectors, documents=chunks)Step 3: Query Function
def query(question, k=4):
qvec = oai.embeddings.create(model='text-embedding-3-small', input=question).data[0].embedding
res = collection.query(query_embeddings=[qvec], n_results=k)
return res['documents'][0]Step 4: Build the Prompt
def make_prompt(question, chunks):
context = '\n\n'.join(f'[{i+1}] {c}' for i, c in enumerate(chunks))
return f'''
Using only the context below, answer the question.
If the answer is not present, say so.
Cite the source like [1], [2], etc.
Context:
{context}
Question: {question}
Answer:
'''
print(make_prompt("What is the return policy?", ["Returns accepted within 30 days.", "Item must be unused."]))
Step 5: Generate
def answer(question):
chunks = query(question)
prompt = make_prompt(question, chunks)
response = oai.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
temperature=0,
)
return response.choices[0].message.content
print(answer('What is our refund policy?'))Conéctelo a una interfaz
Envuélvalo en FastAPI con una página HTML sencilla (o Streamlit) y tendrá una aplicación funcional.
# pip install fastapi uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.post('/ask')
def ask(payload: dict):
return {'answer': answer(payload['question'])}Añada el historial del chat
Para preguntas y respuestas de varios turnos, conserve los mensajes y páselos al prompt:
messages = [{'role': 'system', 'content': 'You are a doc Q&A assistant.'}]
def chat(user_input):
messages.append({'role': 'user', 'content': user_input})
chunks = query(user_input)
context_msg = {'role': 'system', 'content': f'Context:\n{chr(10).join(chunks)}'}
response = oai.chat.completions.create(
model='gpt-4o-mini',
messages=[messages[0], context_msg] + messages[1:]
)
answer = response.choices[0].message.content
messages.append({'role': 'assistant', 'content': answer})
return answerErrores habituales
- Fragmentos demasiado grandes o pequeños: pruebe con 500-800 tokens
- Sin citas de fuentes: los usuarios no confían en respuestas sin citas
- K demasiado grande: desperdicia tokens y dispersa la atención
- Generar el embedding de la pregunta COMPLETA, incluido el historial del chat: genere el embedding solo de la pregunta más reciente del usuario
Añada enlaces a las fuentes
Guarde las URL de las fuentes en los metadatos y muéstrelas en la respuesta:
metadata = [{'source': 'handbook.pdf', 'page': i} for i in range(len(chunks))]
# In the prompt, include 'source: <url>' so the LLM can produce clickable references.Evalúelo
Recopile 20 preguntas reales de los usuarios. Marque manualmente si el bot responde correctamente. Utilice este conjunto como punto de partida para la evaluación.
Publique e itere
Este bot, en producción, gestiona el 80 % de las preguntas habituales. Itere a partir del 20 % que responde mal; normalmente necesitará mejores fragmentación o reordenación.
Citas de fuentes
¿Por qué incluir identificadores de fuentes en el prompt y pedir al LLM que cite?
Resumen
Un bot RAG en unas 50 líneas. Publíquelo, evalúelo e itere sobre la fragmentación y la recuperación. Este patrón se repite en innumerables aplicaciones de agentes.
Preguntas frecuentes
¿La lección «Un bot de preguntas y respuestas sobre sus documentos» es gratis?
Sí — el texto completo de «Un bot de preguntas y respuestas sobre sus documentos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Agents, actualiza a CoddyKit PRO. El curso de AI Agents incluye 4 lecciones en total.
¿Qué aprenderé en «Un bot de preguntas y respuestas sobre sus documentos»?
Ponga en producción un bot RAG funcional: ingiera PDF, genere embeddings, busque y genere respuestas. El «hola mundo» de los agentes en producción. Practicas AI Agents con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Agents?
No se requiere experiencia previa. AI Agents en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Un bot de preguntas y respuestas sobre sus documentos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Agents?
Sí. Cada lección de AI Agents incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Un bot de preguntas y respuestas sobre sus documentos
- Un agente que explica código
- Un agente de investigación que navega por la web
- Un asistente SQL para su base de datos