Puedes integrar MongoDB con Fireworks AI para crear aplicaciones de generación aumentada por recuperación(RAG) basadas en modelos de código abierto. Este tutorial utiliza Voyage AI para incrustar y reordenar datos de muestra, y luego emplea un modelo de chat de Fireworks para generar una recomendación fundamentada.
En este tutorial, realizarás las siguientes tareas:
Configura tu entorno.
Utilice un modelo de incrustación de Voyage AI para incrustar datos de películas y almacenar las incrustaciones en MongoDB.
Utilice MongoDB Vector Search y un modelo de reordenamiento de Voyage AI para recuperar y reordenar documentos de películas.
Instruye a un modelo de chat de Fireworks para que genere una recomendación de película basada en los resultados reordenados.
Segundo plano
Fireworks AI proporciona una plataforma para entrenar y ejecutar modelos de IA de código abierto. Puedes usar MongoDB para almacenar datos operativos y de memoria, y para reentrenar modelos para casos de uso específicos.
Una aplicación RAG recupera datos relevantes y los pasa a un modelo de chat como contexto, de modo que el modelo responde a partir de tus datos en lugar de basarse únicamente en lo aprendido durante el entrenamiento. En este tutorial, MongoDB almacena y recupera tus datos. Voyage AI proporciona el modelo de incrustación que integra los datos y el modelo de reordenamiento que reordena los resultados recuperados, y Fireworks AI proporciona el modelo de chat que genera la respuesta final.
Requisitos previos
Para completar este tutorial, debes tener los siguientes recursos:
Uno de los siguientes tipos de clúster de MongoDB:
Un clúster de Atlas que ejecute la versión 6.0.11 de MongoDB, 7.0.2, o posterior. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto Atlas.
Una implementación local de Atlas creada con Python y Docker. Instala
atlas-local-lib-py(pip install atlas-local-lib-py) para crear y gestionar implementaciones locales mediante programación. Para obtener más información, consulta el repositorio atlas-local-lib-py.Un clúster de MongoDB Community con Search y búsqueda vectorial instalados.
El conjunto de datos de muestra se ha cargado en su clúster. Este tutorial utiliza la colección
sample_mflix.movies.Una clave API de Fireworks AI. Para crear una, ve a Claves API en la configuración de tu cuenta de Fireworks.
Una clave API de Voyage AI. Para crear una, consulte la sección Gestionar claves API de modelos de Voyage AI.
Python v3.11 o posterior.
Configurar el entorno
En esta sección, preparará su entorno creando un entorno virtual, instalando las dependencias necesarias, configurando sus variables de entorno y creando un archivo de proyecto.
Establecer las variables de entorno.
En tu directorio fireworks-mongodb-project, crea un archivo .env y añade el siguiente código:
FIREWORKS_API_KEY="<fireworks-api-key>"VOYAGE_API_KEY="<voyage-api-key>"MONGODB_URI="<connection-string>"Reemplace <fireworks-api-key> con su clave API de Fireworks y reemplace <voyage-api-key> con su clave API de Voyage AI.
Se debe sustituir <connection-string> por la cadena de conexión del clúster Atlas o de la implementación local de Atlas.
Su cadena de conexión debe usar el siguiente formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.netIMPORTANTE: Asegúrate de que tu cadena de conexión incluya las credenciales de tu usuario de base de datos. Para obtener más información sobre cómo encontrar tu cadena de conexión, consulta Conectar a un clúster a través de Librerías de clientes.
Su cadena de conexión debe usar el siguiente formato:
mongodb://localhost:<port-number>/?directConnection=truePara obtener más información, consulta Cadenas de conexión.
Cree un archivo de proyecto.
En tu directorio fireworks-mongodb-project, crea un archivo llamado main.py. Agrega el siguiente código a este archivo para cargar tus variables de entorno y definir dos argumentos de línea de comandos, que especifican la consulta de búsqueda y el número de resultados:
import argparseimport osimport time
import voyageaifrom dotenv import load_dotenvfrom openai import OpenAIfrom pymongo import MongoClientfrom pymongo.operations import SearchIndexModel
load_dotenv()
parser = argparse.ArgumentParser()parser.add_argument("--query", default="something interesting")parser.add_argument("--count", type=int, default=10)args = parser.parse_args()En los siguientes pasos, deberá agregar código a este archivo para incrustar, recuperar y generar respuestas a partir de los datos de su película.
Incrustar y almacenar datos de películas
En esta sección, configurará sus clientes, insertará el campo plot de los documentos de películas 50 y almacenará cada vector en un nuevo campo embedding. A continuación, creará un índice de búsqueda vectorial de MongoDB en ese campo.
Cree los clientes necesarios.
Agregue el siguiente código a su archivo main.py para crear un cliente Fireworks, un cliente Voyage AI y un cliente MongoDB, y para seleccionar sus modelos:
fireworks = OpenAI( base_url="https://api.fireworks.ai/inference/v1", api_key=os.environ["FIREWORKS_API_KEY"],)voyage = voyageai.Client()
mongo_client = MongoClient(os.environ["MONGODB_URI"])collection = mongo_client["sample_mflix"]["movies"]
EMBEDDING_MODEL = "voyage-4"RERANK_MODEL = "rerank-3"CHAT_MODEL = "accounts/fireworks/models/gpt-oss-120b"DIMENSIONS = 1024Este ejemplo selecciona los siguientes modelos:
voyage-4: Un modelo de incrustación de Voyage AI, utilizado para incrustar tramas de películas y consultas de búsqueda.rerank-3: Un modelo de reclasificación de Voyage AI, utilizado para repuntuar los candidatos de MongoDB Vector Search en función de su relevancia.accounts/fireworks/models/gpt-oss-120b: Un modelo de chat de Fireworks, utilizado para generar recomendaciones de películas basadas en datos de MongoDB.
Nota
Este tutorial solicita vectores de dimensión 1024 al modelo de incrustación de Voyage AI para reducir el espacio de almacenamiento. Puede utilizar cualquier modelo de incrustación de Voyage AI, siempre que el valor DIMENSIONS coincida con el tamaño de los vectores que devuelve el modelo.
Generar y almacenar incrustaciones.
Agregue el siguiente código a su archivo main.py para insertar la trama de cada película en el campo embedding:
def get_embeddings(texts, input_type="document"): response = voyage.embed( texts, model=EMBEDDING_MODEL, input_type=input_type, output_dimension=DIMENSIONS ) return response.embeddings
docs = list( collection.find( {"plot": {"$exists": True, "$ne": ""}}, {"_id": 1, "title": 1, "plot": 1} ).limit(50))
vectors = get_embeddings([doc["plot"] for doc in docs])
for doc, vector in zip(docs, vectors): collection.update_one({"_id": doc["_id"]}, {"$set": {"embedding": vector}})
print(f"Embedded {len(docs)} movies.")Crea el índice de búsqueda vectorial de MongoDB.
Agregue el siguiente código para crear un índice de búsqueda vectorial de MongoDB en el campo embedding y espere hasta que finalice la creación del índice:
index = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": DIMENSIONS, "similarity": "cosine", } ] }, name="movie_vector_index", type="vectorSearch",)collection.create_search_index(model=index)
print("Waiting for the index to build...")while not any( idx.get("queryable") for idx in collection.list_search_indexes("movie_vector_index")): time.sleep(5)
print("Index is ready.")Generar una respuesta a partir de los resultados de la búsqueda vectorial.
En esta sección, se ejecuta una consulta de búsqueda vectorial de MongoDB en el campo plot de los documentos y se reordenan los resultados. A continuación, se pasan las películas reordenadas a un modelo de chat de Fireworks como contexto para generar una recomendación.
Ejecute una query de búsqueda vectorial de MongoDB.
Agregue el siguiente código a su archivo main.py para insertar una consulta de campo plot y recuperar películas cuyas tramas sean similares a la consulta:
def vector_search(query, limit=5): query_vector = get_embeddings([query], input_type="query")[0] pipeline = [ { "$vectorSearch": { "index": "movie_vector_index", "path": "embedding", "queryVector": query_vector, "numCandidates": limit * 20, "limit": limit, } }, { "$project": { "_id": 0, "title": 1, "plot": 1, "score": {"$meta": "vectorSearchScore"}, } }, ] return list(collection.aggregate(pipeline))
print("\nVector search results:")for movie in vector_search(args.query, limit=args.count): print(f'{movie["score"]:.3f} {movie["title"]}')Reordena los resultados.
Para mejorar la precisión de la búsqueda vectorial en MongoDB, recupere un conjunto de candidatos más grande y vuelva a ordenarlo utilizando un modelo de reordenamiento de Voyage AI antes de pasar los resultados a un modelo de chat. Agregue el siguiente código a su archivo main.py:
def rerank(query, movies, top_n=5): candidate_texts = [f'{m["title"]}: {m["plot"]}' for m in movies] reranking = voyage.rerank(query, candidate_texts, model=RERANK_MODEL, top_k=top_n) return [movies[result.index] for result in reranking.results]
def retrieve(query, top_n=5): return rerank(query, vector_search(query, limit=top_n * 4), top_n=top_n)
print("\nReranked, precise results:")for movie in retrieve(args.query, top_n=args.count): print(movie["title"])Genera una respuesta.
Agregue el siguiente código a su archivo main.py para pasar las películas reclasificadas a un modelo de chat de Fireworks como contexto, e indíquele al modelo que responda solo a partir de ese contexto:
def answer(question): context = "\n\n".join(f'{m["title"]}: {m["plot"]}' for m in retrieve(question)) response = fireworks.chat.completions.create( model=CHAT_MODEL, messages=[ { "role": "system", "content": "Answer using only the movies in the context. " "If the context doesn't contain the answer, say so.", }, { "role": "user", "content": f"Context:\n{context}\n\nQuestion: {question}", }, ], ) return response.choices[0].message.content
print("\nRecommendation:")print(answer(f"Recommend a movie about {args.query}, and explain why."))Ejecutar el archivo
Para ejecutar el archivo main.py, ejecute el siguiente comando desde su directorio fireworks-mongodb-project. Utilice las banderas --query y --count para especificar la consulta de búsqueda y el número de resultados que devuelve el archivo:
uv run main.py --query "a heist that goes wrong" --count 5Si el comando se ejecuta correctamente, el resultado se parecerá al siguiente:
Embedded 50 movies.Waiting for the index to build...Index is ready.
Vector search results:0.724 I Became a Criminal0.664 Hallelujah0.662 Zoo in Budapest0.658 Rear Window0.654 The Long Voyage Home
Reranked, precise results:I Became a CriminalHallelujahFoolish WivesZoo in BudapestA Corner in Wheat
Recommendation:**I Became a Criminal** -- This gritty film-noir follows cynicalex-RAF flyer Morgan, who joins a break-in gang led by Narcy. Theirfirst job quickly turns disastrous when the getaway car crashesafter the crew accidentally kills a policeman. The movie centers ona heist that goes badly wrong, showcasing the chaos, moral fallout,and gritty consequences of a botched robbery.Próximos pasos
Para obtener más información sobre las opciones de configuración de Fireworks y Voyage AI y los métodos utilizados en este tutorial, consulte Integrar MongoDB con Fireworks AI.
Para crear un agente que llame a herramientas y que recuerde su historial de conversaciones en MongoDB, consulte Especificar herramientas del agente y Conservar la memoria del agente.
Para obtener más información sobre Fireworks AI, consulte la documentación de Fireworks AI.
Para obtener más información sobre Voyage AI, consulte la sección "Incrustaciones de texto"y "Reclasificadores".