La generación aumentada por recuperación es un conjunto de técnicas en rápido crecimiento que fueron originalmente concebidas como una extensión de los modelos de lenguaje grandes (LLM), pero cada vez más se ven como un paradigma alternativo que reimagina completamente el papel de los modelos de IA.
Te mostraremos cómo crear un motor RAG básico usando el framework LlamaIndex, un LLM Mistral de código abierto, Jina Embeddings v2 y la base de datos vectorial preparada para IA de Qdrant.
tagRAG en Contexto
En un sistema RAG, el papel del modelo de IA sigue siendo central pero mucho más limitado. En lugar de responder a las preguntas desde su conocimiento interno, derivado de sus datos de entrenamiento, se le presenta la información relevante en su prompt. El papel del modelo es entonces entender y sintetizar la información en una respuesta.
Esto aprovecha las fortalezas de los modelos de IA y minimiza sus debilidades.
Por ejemplo, podríamos darle al modelo Mistral-Instruct el siguiente prompt:
Answer the query. Please be brief, concise, and complete.
Query: Why is Taylor Swift planning to attend the Superbowl?
Answer:
Cuando hice eso, el modelo respondió:
I don't have real-time information. However, as of my last update,
Taylor Swift is not officially confirmed to attend or perform at
the Superbowl. If there are any updates, I recommend checking the
latest news sources.Los modelos de lenguaje grandes son costosos de actualizar y reentrenar, por lo que su información interna nunca puede estar completamente actualizada.
Además, los modelos de lenguaje grandes son conocidos por "alucinar", es decir, confabular respuestas plausibles que pueden ser parcial o totalmente incorrectas y que deben ser verificadas.
Answer the query. Please be brief, concise, and complete.
Query: What was Weird Al Yankovic's first Taylor Swift parody?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," a spoof
of Swift's song "Blank Space." The parody was released in 2014
as part of Yankovic's album "Mandatory Fun." The song humorously
addresses the obsession with celebrity gossip and scandals, as
reported by the tabloid news website TMZ.El TMZ de Weird Al Yankovic fue lanzado en 2011 en el álbum Alpocalypse y es una parodia de You Belong with Me de Swift.
La naturaleza de las redes neuronales hace que las alucinaciones sean difíciles, si no imposibles, de prevenir completamente y socava fuertemente cualquier plan de usar modelos de IA como fuentes de información.
En palabras de Sam Altman, CEO de OpenAI:
"Creo que la gente comete un gran error cuando piensa en estos modelos [LLM] como una base de datos. [...] Funcionará, más o menos. Pero es como la base de datos más cara, más lenta y menos precisa del mundo."
RAG minimiza la dependencia del conocimiento interno de hechos sobre el mundo de un modelo de IA y aprovecha sus mayores fortalezas: la comprensión del lenguaje natural y la generación fluida de lenguaje.
Veamos otro ejemplo de una pregunta que Mistral-Instruct no puede responder:
Answer the query. Please be brief, concise, and complete.
Query: What is the title of Taylor Swift's next album?
Answer:
As of the time I am providing this answer, Taylor Swift has
not yet announced the title of her next album. She has released
several re-recorded albums, but the title of her next original
album remains unknown. I recommend checking her official social
media channels or website for the latest updates.Ahora, un sistema RAG podría tener una base de datos de artículos de noticias recientes, o tal vez buscar en Internet textos relacionados con el título del próximo álbum de Taylor Swift. Luego, insertaría los textos que encuentra en el prompt.
Supongamos que identifica este artículo de AP como relevante para la consulta y construye el siguiente prompt:
Context information is below.
---------------------
February 6, 2024
LOS ANGELES (AP) — Forget her "Reputation." Taylor Swift has a
whole new album coming out.
Accepting the Grammy for best pop vocal album on Sunday night,
Taylor said she'd been keeping a secret for two years.
"My brand-new album comes out April 19. It's called 'The Tortured
Poets Department.' I'm going to go and post the cover right now
backstage," she announced.
And so she did.
---------------------
Given the context information and not prior knowledge, answer the query.
Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What is the title of Taylor Swift's next album?
Answer:Mistral-Instruct respondió:
The title of Taylor Swift's next album is 'The Tortured Poets Department'.Este tipo de prompting también reduce drásticamente la probabilidad de alucinaciones. Por ejemplo:
Context information is below.
---------------------
Alpocalypse is the thirteenth studio album by American parody
musician "Weird Al" Yankovic, released on June 21, 2011.
Track List
1. Perform This Way (Parody of "Born This Way" by Lady Gaga)
2. CNR
3. TMZ (Parody of "You Belong with Me" by Taylor Swift)
4. Skipper Dan
5. Polka Face (Polka medley including songs by artists such as
Lady Gaga, Justin Bieber, Britney Spears, Ke$ha, and others)
6. Craigslist
7. Party in the CIA (Parody of "Party in the U.S.A." by Miley
Cyrus)
8. Ringtone
9. Another Tattoo (Parody of "Nothin' on You" by B.o.B featuring
Bruno Mars)
10. If That Isn't Love
11. Whatever You Like (Parody of "Whatever You Like" by T.I.)
12. Stop Forwarding That Crap to Me
---------------------
Given the context information and not prior knowledge, answer the
query. Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What was Weird Al Yankovic's first Taylor Swift parody, what
year was it released, and what song was he parodying?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," and it was
released in 2011. He was parodying "You Belong with Me" by Taylor
Swift.
tagAnatomía de un sistema RAG
Un sistema RAG tiene, como mínimo, dos componentes:
- Un modelo de IA generativo.
- Un sistema de recuperación de información.
En este artículo, usaremos Mistral-Instruct como el modelo de IA generativo y accederemos a él a través de la API de Inferencia de Hugging Face. Usaremos la base de datos vectorial Qdrant y Jina Embeddings juntos para el sistema de recuperación de información.
Como fuente de datos, usaremos el Plan Estratégico Nacional de Investigación y Desarrollo de Inteligencia Artificial Actualización 2023, publicado en mayo de 2023 por el Consejo Nacional de Ciencia y Tecnología, un organismo que asesora al Presidente de los Estados Unidos en asuntos científicos y técnicos. Este documento de aproximadamente 25,000 palabras es un documento de política y planificación estratégica para la política y el desarrollo de IA estadounidense.
También es un clásico documento de política gubernamental "muy largo; no lo leí". La mayor parte es muy aburrida, y a menos que tengas un interés o una participación cercana en esta área, probablemente no lo vas a leer. Pero aún podrías querer saber qué dice.
Este artículo te guiará a través de los pasos para crear un sistema RAG capaz de responder preguntas sobre el texto y su contenido.
tagInstalar los Prerrequisitos
Primero, asegúrate de tener todas las bibliotecas de Python relevantes instaladas. En tu entorno de Python, ejecuta lo siguiente:
pip install llama-index qdrant-client
pip install pdfminer.six llama-index-vector-stores-qdrant
pip install llama-index-llms-openai llama-index-embeddings-jinaai
pip install llama-index-llms-huggingface "huggingface_hub[inference]"Usaremos LlamaIndex para construir un sistema RAG alrededor del modelo de lenguaje Mistral-Instruct y pdfminer.six para procesar el archivo PDF en un almacén vectorial Qdrant.
tagConectarse a Mistral-Instruct a través de la API de inferencia de Hugging Face
Primero, configuremos el LLM. Necesitarás acceso a la API de inferencia de Hugging Face, incluyendo un token de acceso. Si tienes una cuenta de Hugging Face, puedes obtenerlo desde tu página de configuración de cuenta.
Si no tienes una cuenta, primero crea una, luego genera un token de acceso.
Coloca tu token en una variable para uso futuro:
hf_inference_api_key = '<your HuggingFace Inference API token>'A continuación, construimos una plantilla de prompt:
from llama_index.core import PromptTemplate
qa_prompt_tmpl = (
"Context information is below.\n"
"---------------------\n"
"{context_str}\\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query. Please be brief, concise, and complete.\n"
"If the context information does not contain an answer to the query, "
"respond with \"No information\".\n"
"Query: {query_str}\n"
"Answer: "
)
qa_prompt = PromptTemplate(qa_prompt_tmpl)Esta plantilla instruye al LLM a usar solo la información de contexto proporcionada en el prompt para responder preguntas. Este prompt ha funcionado bien para nosotros al trabajar con Mistral-Instruct, pero puedes experimentar con otras redacciones para ver qué funciona en tu caso de uso.
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
mixtral_llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mixtral-8x7B-Instruct-v0.1",
token=hf_inference_api_key
)Finalmente, crea e inicializa un objeto para el framework LlamaIndex que mantiene la conexión con Mistral-Instruct. El código siguiente proviene de la publicación anterior sobre crear sistemas RAG usando LlamaIndex.
Esto coloca la conexión al LLM Mistral en la variable mistral_llm.
tagRecuperación de información con Qdrant y Jina Embeddings
Para configurar el sistema de recuperación, necesitarás una clave API de Jina Embeddings. Puedes obtener una gratis con un presupuesto prepagado de 1 millón de tokens en el sitio web de Jina Embeddings.

Coloca tu clave de Jina Embeddings en una variable para uso futuro:
jina_emb_api_key = "<your Jina Embeddings API key>"Luego, crea un objeto conector usando LlamaIndex para el servidor de Jina Embeddings, seleccionando específicamente el modelo monolingüe en inglés:
from llama_index.embeddings.jinaai import JinaEmbedding
jina_embedding_model = JinaEmbedding(
api_key=jina_emb_api_key,
model="jina-embeddings-v2-base-en",
)tagCargar datos de texto
A continuación, cargaremos el documento y lo dividiremos en párrafos. Primero, descarga el PDF del sitio web de la Casa Blanca en la variable pdf_data:
import urllib.request
uri = "https://www.whitehouse.gov/wp-content/uploads/2023/05/National-Artificial-Intelligence-Research-and-Development-Strategic-Plan-2023-Update.pdf"
pdf_data = urllib.request.urlopen(uri).read()Luego, procesaremos el PDF página por página, extrayendo el texto y dividiéndolo en párrafos separando por dobles saltos de línea. Estos se almacenan en la lista text_paras:
import regex as re
from io import BytesIO, StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
text_paras = []
parser = PDFParser(BytesIO(pdf_data))
doc = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
for page in PDFPage.create_pages(doc):
output_string = StringIO()
device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
interpreter = PDFPageInterpreter(rsrcmgr, device)
interpreter.process_page(page)
page_text = output_string.getvalue()
text_paras.extend(re.split(r'\n\s*\n', page_text))
Verifica que todo esté cargado:
assert len(text_paras) == 615A continuación, convertiremos esta lista de textos cortos en objetos Document de LlamaIndex:
from llama_index.core.readers import StringIterableReader
rag_docs = StringIterableReader().load_data(text_paras)Y puedes inspeccionar el texto:
print(rag_docs[0].text)Resultado:
NATIONAL ARTIFICIAL INTELLIGENCE
RESEARCH AND DEVELOPMENT
STRATEGIC PLAN
2023 UPDATEtagConfigurar una base de datos vectorial Qdrant
En este artículo, usaremos Qdrant Vector Search Cloud para implementar la base de datos del sistema RAG. El nivel gratuito de Qdrant incluye 1GB de almacenamiento, que es más que suficiente para este tutorial.
Necesitarás crear una cuenta en el sitio web de Qdrant Cloud antes de continuar.

Una vez que tengas una cuenta y hayas iniciado sesión, necesitarás crear un cluster. Sigue las instrucciones de "inicio rápido" en el sitio web de Qdrant para configurar un cluster gratuito y obtener una API y el nombre del servidor host de Qdrant.

Almacena la clave y el nombre del host en variables:
qdrant_api_key = "<your API key>"
qdrant_server = "https://<your server>"A continuación, necesitaremos importar los componentes relevantes de los paquetes qdrant_client y llama_index:
import qdrant_client
from llama_index.vector_stores.qdrant import QdrantVectorStore
client = qdrant_client.QdrantClient(qdrant_server, api_key=qdrant_api_key)
vector_store = QdrantVectorStore(client=client, collection_name="NTSC")Esto crea una colección llamada NTSC en tu clúster gratuito.
Puedes leer la documentación de Qdrant para obtener información sobre cómo construir un almacén de datos local en memoria o en disco y hospedar tu propia instancia del servidor Qdrant en un contenedor docker a través de una API web.
tagCompletar el sistema RAG
Ahora ensamblaremos estos componentes en un sistema RAG completo utilizando código base para LlamaIndex:
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.storage.storage_context import StorageContext
from llama_index.core import (
VectorStoreIndex,
ServiceContext,
get_response_synthesizer,
)
# set up the service and storage contexts
service_context = ServiceContext.from_defaults(
llm=mixtral_llm, embed_model=jina_embedding_model
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# create an index
index = VectorStoreIndex.from_documents(
rag_docs, storage_context=storage_context, service_context=service_context
)
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=2,
)
# configure response synthesizer
response_synthesizer = get_response_synthesizer(
service_context=service_context,
text_qa_template=qa_prompt,
response_mode="compact",
)
# assemble query engine
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
Este sistema utilizará Jina Embeddings para indexar los párrafos de nuestra fuente de texto y colocará las dos mejores coincidencias en el contexto de cada prompt. Para cambiar a las tres mejores, por ejemplo, solo modifica la inicialización de VectorIndexRetriever anterior para tener un parámetro similarity_top_k diferente:
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=3,
)Ahora el sistema está listo para usar.
tagConsultar un Documento
Probemos una consulta sencilla:
response = query_engine.query("""
What is the Biden Administration's policy with regard to AI?
""")
print(response.response)El resultado (el tuyo puede no ser idéntico):
The Biden Administration prioritizes responsible AI systems that
are ethical, trustworthy, and safe, and serve the public good.
The Administration has committed to substantial funding for AI
R&D, and has established the National AI Initiative Office to
coordinate AI activities across the federal government.
The Administration's AI policy focuses on developing evaluative
techniques for AI, workforce development, public-private
partnerships, and international collaboration in AI research.O algo más específico:
response = query_engine.query("""
What protections does the AI Bill of Rights propose to offer?
""")
print(response.response)The AI Bill of Rights proposes five core protections: Safe and
Effective Systems; Algorithmic Discrimination Protections; Data
Privacy; Notice and Explanation; and Human Alternatives,
Consideration, and Fallback.O incluso muy específico:
response = query_engine.query("Who is Kei Koizumi?")
print(response.response)Kei Koizumi is the Principal Deputy Director for Policy at the Office
of Science and Technology Policy (OSTP).También puedes hacer preguntas más imaginativas:
response = query_engine.query("""
What rights will AI's receive under President Biden's proposed
AI Bill of Rights?
""")
print(response.response)The proposed AI Bill of Rights does not grant rights to AI systems, but
rather outlines principles to ensure that AI technologies are
developed and used in a manner that respects human rights and values.
The principles include safety, transparency, fairness, disclosure,
data privacy, non-discrimination, and the ability for individuals to
opt out of certain AI systems.response = query_engine.query("""
Why is President Biden's proposing an AI Bill of Rights?
Does AI really need rights?
""")
print(response.response)President Biden's proposed AI Bill of Rights aims to ensure that AI
technologies are developed and used ethically, legally, and with
societal considerations in mind. The Bill of Rights is not granting
"rights" to AI, but rather setting guidelines for the responsible
development and deployment of AI systems to protect individuals and
communities from potential negative impacts.response = query_engine.query("""
Has Donald Trump weighed in on AI?
Will he Make Humans Great Again?
""")
print(response.response)
No information. The context information does not mention Donald
Trump's views on AI.tagJina AI y Qdrant
La ventana de contexto de 8k tokens de Jina Embeddings lo hace especialmente adecuado para la generación aumentada por recuperación porque puede trabajar con bloques de texto mucho más grandes. Mientras que otras aplicaciones RAG a menudo tienen que almacenar oraciones individuales o pares de oraciones, en este tutorial, pudimos usar párrafos completos sin preocuparnos por su tamaño.
Esto reduce el número de elementos de texto que deben almacenarse para llevar la misma información, reduciendo los costos de computación, ahorrando memoria y haciendo la recuperación más rápida.
La base de datos vectorial de Qdrant es simple de configurar, rápida y rentable, y como has visto, solo se necesitan unas pocas líneas de Python para integrarla en un sistema RAG.
Para más información sobre la base de datos preparada para IA y las ofertas en la nube de Qdrant, puedes visitar su sitio web.

tagContacta con Nosotros
Jina AI está comprometida a llevar tecnologías de IA confiables y asequibles a empresas de todos los tamaños y tipos. Nos encantaría conocer tus casos de uso y ayudarte a integrar la IA en tus procesos de negocio. Para más información sobre las ofertas de Jina AI y para contactarnos, visita el sitio web de Jina AI o únete a nuestra comunidad en Discord.












