Nota
Este tutorial utiliza la Kernel Semántica librería de Python. Para un tutorial que utiliza la librería de C#, consulte Introducción a la integración de C# con Kernel Semántico
Puedes integrar MongoDB Vector Search con Semantic Kernel de Microsoft para crear aplicaciones de IA e implementar la generación de recuperación aumentada (RAG). Este tutorial demuestra cómo empezar a utilizar la búsqueda vectorial de MongoDB con Semantic Kernel para realizar una búsqueda semántica en tus datos y compilar una implementación de RAG. Específicamente, realizas las siguientes acciones:
Configura el entorno.
Almacene datos personalizados en MongoDB.
Cree un índice de Búsqueda Vectorial de MongoDB en sus datos.
Ejecutar una búsqueda semántica query en tus datos.
Implementa RAG utilizando MongoDB Vector Search para responder preguntas sobre tus datos.
Trabaja con una versión ejecutable de este tutorial como un cuaderno interactivo de Python.
Segundo plano
Semantic Kernel es un SDK de código abierto que permite combinar distintos servicios de IA y plugins con tus aplicaciones. Puedes utilizar Semantic Kernel para una variedad de casos de uso de IA, incluyendo RAG.
Al integrar la búsqueda vectorial de MongoDB con Semantic Kernel, puedes utilizar MongoDB como una base de datos vectorial y utilizar la búsqueda vectorial de MongoDB para implementar RAG recuperando documentos semánticamente similares de tus datos. Para obtener más información sobre RAG, consulte Generación de recuperación aumentada (RAG) con MongoDB.
Requisitos previos
Para completar este tutorial, debes tener lo siguiente:
Uno de los siguientes tipos de clúster de MongoDB:
Se requiere un clúster de Atlas que ejecute MongoDB 6.0.11 versión, 7.0.2 o posterior. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto de Atlas.
Una implementación local de Atlas creada usando Atlas CLI. Para obtener más información, consulta Crear una Implementación local de Atlas.
Un clúster de MongoDB Community o Enterprise con Search y Vector Search instalados.
Una llave de API de OpenAI. Debes tener una cuenta de OpenAI con créditos disponibles para las solicitudes de API. Para obtener más información sobre cómo registrar una cuenta de OpenAI, consulta el sitio web de la API de OpenAI.
Un entorno para ejecutar cuadernos interactivos de Python como Colab.
Configurar el entorno
Configura el entorno para este tutorial. Cree un cuaderno interactivo de Python guardando un archivo con la extensión .ipynb. Este cuaderno te permite ejecutar snippets de código Python de forma individual y lo utilizarás para ejecutar el código en este tutorial.
Para configurar tu entorno de notebook:
Instala e importa las dependencias.
Ejecuta el siguiente comando en tu notebook para instalar el núcleo semántico en tu entorno.
pip install --quiet --upgrade semantic-kernel openai motor Ejecuta el siguiente código para importar los paquetes necesarios:
import semantic_kernel as sk from semantic_kernel.connectors.ai.open_ai import (OpenAIChatCompletion, OpenAITextEmbedding) from semantic_kernel.connectors.memory.mongodb_atlas import MongoDBAtlasMemoryStore from semantic_kernel.core_plugins.text_memory_plugin import TextMemoryPlugin from semantic_kernel.memory.semantic_text_memory import SemanticTextMemory from semantic_kernel.prompt_template.input_variable import InputVariable from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig from pymongo import MongoClient from pymongo.operations import SearchIndexModel
Defina variables de entorno.
Ejecuta el siguiente código, reemplazando los marcadores de posición con los siguientes valores:
Su clave API de OpenAI.
La cadena de conexión de tu clúster de MongoDB.
Nota
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.net
Para obtener más información, consulta Conectar a un clúster a través de bibliotecas de clientes.
Su cadena de conexión debe usar el siguiente formato:
mongodb://localhost:<port-number>/?directConnection=true
Para obtener más información, consulta Cadenas de conexión.
Almacene datos personalizados en MongoDB
En esta sección, inicias el kernel, que es la interfaz principal utilizada para gestionar los servicios y plugins de la aplicación. Mediante el kernel, configuras tus servicios de IA, instancias MongoDB como una base de datos vectorial (también llamada almacén de memoria) y cargas datos personalizados en tu clúster de MongoDB.
Para almacenar datos personalizados en MongoDB, pega y ejecuta los siguientes fragmentos de código en tu notebook:
Agrega los servicios de IA al kernel.
Ejecuta el siguiente código para configurar el modelo de embedding de OpenAI y el modelo chat utilizados en este tutorial y agregar estos servicios al núcleo. Este código especifica lo siguiente:
text-embedding-ada-002de OpenAI como el modelo de embeddings utilizado para convertir texto en embeddings de vectores.El
gpt-3.5-turbode OpenAI como el modelo de chat utilizado para generar respuestas.
chat_service = OpenAIChatCompletion( service_id="chat", ai_model_id="gpt-3.5-turbo", api_key=OPENAI_API_KEY ) embedding_service = OpenAITextEmbedding( ai_model_id="text-embedding-ada-002", api_key=OPENAI_API_KEY ) kernel.add_service(chat_service) kernel.add_service(embedding_service)
Instancia Atlas como un almacenamiento de memoria.
Ejecuta el siguiente código para instanciar Atlas como un almacén de memoria y añadirlo al kernel. Este código establece una conexión con tu clúster de Atlas y especifica lo siguiente:
semantic_kernel_dbcomo la base de datos Atlas utilizada para almacenar los documentos.vector_indexcomo el índice utilizado para ejecutar consultas de búsqueda semántica.
También importa un plugin llamado TextMemoryPlugin, que proporciona un conjunto de funciones nativas para ayudarle a almacenar y recuperar texto en la memoria.
mongodb_atlas_memory_store = MongoDBAtlasMemoryStore( connection_string=MONGODB_URI, database_name="semantic_kernel_db", index_name="vector_index" ) memory = SemanticTextMemory( storage=mongodb_atlas_memory_store, embeddings_generator=embedding_service ) kernel.add_plugin(TextMemoryPlugin(memory), "TextMemoryPlugin")
Cargue datos de muestra en su clúster Atlas.
Este código define y ejecuta una función para rellenar la colección semantic_kernel_db.test con algunos documentos de muestra. Estos documentos contienen datos personalizados a los que el LLM no tenía acceso originalmente.
async def populate_memory(kernel: sk.Kernel) -> None: await memory.save_information( collection="test", id="1", text="I am a developer" ) await memory.save_information( collection="test", id="2", text="I started using MongoDB two years ago" ) await memory.save_information( collection="test", id="3", text="I'm using MongoDB Vector Search with Semantic Kernel to implement RAG" ) await memory.save_information( collection="test", id="4", text="I like coffee" ) print("Populating memory...") await populate_memory(kernel) print(kernel)
Populating memory... plugins=KernelPluginCollection(plugins={'TextMemoryPlugin': KernelPlugin(name='TextMemoryPlugin', description=None, functions={'recall': KernelFunctionFromMethod(metadata=KernelFunctionMetadata(name='recall', plugin_name='TextMemoryPlugin', description='Recall a fact from the long term memory', parameters=[KernelParameterMetadata(name='ask', description='The information to retrieve', default_value=None, type_='str', is_required=True, type_object=<class 'str'>), KernelParameterMetadata(name='collection', description='The collection to search for information.', default_value='generic', type_='str', is_required=False, type_object=<class 'str'>), KernelParameterMetadata(name='relevance', description='The relevance score, from 0.0 to 1.0; 1.0 means perfect match', default_value=0.75, type_='float', is_required=False, type_object=<class 'float'>), KernelParameterMetadata(name='limit', description='The maximum number of relevant memories to recall.', default_value=1, type_='int', is_required=False, type_object=<class 'int'>)], is_prompt=False, is_asynchronous=True, return_parameter=KernelParameterMetadata(name='return', description='', default_value=None, type_='str', is_required=True, type_object=None)), method=<bound method TextMemoryPlugin.recall of TextMemoryPlugin(memory=SemanticTextMemory())>, stream_method=None), 'save': KernelFunctionFromMethod(metadata=KernelFunctionMetadata(name='save', plugin_name='TextMemoryPlugin', description='Save information to semantic memory', parameters=[KernelParameterMetadata(name='text', description='The information to save.', default_value=None, type_='str', is_required=True, type_object=<class 'str'>), KernelParameterMetadata(name='key', description='The unique key to associate with the information.', default_value=None, type_='str', is_required=True, type_object=<class 'str'>), KernelParameterMetadata(name='collection', description='The collection to save the information.', default_value='generic', type_='str', is_required=False, type_object=<class 'str'>)], is_prompt=False, is_asynchronous=True, return_parameter=KernelParameterMetadata(name='return', description='', default_value=None, type_='', is_required=True, type_object=None)), method=<bound method TextMemoryPlugin.save of TextMemoryPlugin(memory=SemanticTextMemory())>, stream_method=None)})}) services={'chat': OpenAIChatCompletion(ai_model_id='gpt-3.5-turbo', service_id='chat', client=<openai.AsyncOpenAI object at 0x7999971c8fa0>, ai_model_type=<OpenAIModelTypes.CHAT: 'chat'>, prompt_tokens=0, completion_tokens=0, total_tokens=0), 'text-embedding-ada-002': OpenAITextEmbedding(ai_model_id='text-embedding-ada-002', service_id='text-embedding-ada-002', client=<openai.AsyncOpenAI object at 0x7999971c8fd0>, ai_model_type=<OpenAIModelTypes.EMBEDDING: 'embedding'>, prompt_tokens=32, completion_tokens=0, total_tokens=32)} ai_service_selector=<semantic_kernel.services.ai_service_selector.AIServiceSelector object at 0x7999971cad70> retry_mechanism=PassThroughWithoutRetry() function_invoking_handlers={} function_invoked_handlers={}
Tip
Después de ejecutar el código de ejemplo, si usas Atlas, puedes verificar tus incrustaciones vectoriales navegando al namespace semantic_kernel_db.test en la Interfaz de Usuario de Atlas.
Cree el índice de búsqueda vectorial de MongoDB
Para permitir consultas de búsqueda vectorial en tu almacén vectorial, ejecuta el siguiente código en tu notebook para crear un índice de MongoDB Vector Search en la colección semantic_kernel_db.test.
# Connect to your MongoDB cluster and specify the collection client = MongoClient(MONGODB_URI) collection = client["semantic_kernel_db"]["test"] # Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
La definición de índice indexa el campo embedding como el tipo vector. El campo embedding contiene las incrustaciones creadas mediante el modelo de incrustaciones de OpenAI text-embedding-ada-002. La definición del índice especifica 1536 dimensiones vectoriales y mide la similitud utilizando cosine.
Ejecución de consultas de búsqueda vectorial
Una vez que MongoDB haya compilado tu índice, podrás ejecutar consultas de búsqueda vectorial en tus datos.
Ejecuta el siguiente código en tu notebook para realizar una búsqueda semántica básica del string What is my job title?. Imprime el documento más relevante y una puntuación de relevancia entre 0 y 1.
result = await memory.search("test", "What is my job title?") print(f"Retrieved document: {result[0].text}, {result[0].relevance}")
Retrieved document: I am a developer, 0.8991971015930176
Responde preguntas sobre tus datos
Esta sección muestra un ejemplo de implementación de RAG con MongoDB Vector Search y Kernel Semántico. Ahora que has utilizado la búsqueda vectorial de MongoDB para recuperar documentos semánticamente similares, ejecuta el siguiente ejemplo de código para invitar al LLM a responder preguntas en base a esos documentos.
El siguiente código define un prompt para instruir al LLM que utilice el documento recuperado como contexto para su query. En este ejemplo, solicita al LLM con la query de muestra When did I start using MongoDB?. Debido a que ampliaste la base de conocimientos del LLM con datos personalizados, el modelo de chat puede generar una respuesta más precisa y contextualizada.
service_id = "chat" settings = kernel.get_service(service_id).instantiate_prompt_execution_settings( service_id=service_id ) prompt_template = """ Answer the following question based on the given context. Question: {{$input}} Context: {{$context}} """ chat_prompt_template_config = PromptTemplateConfig( execution_settings=settings, input_variables=[ InputVariable(name="input"), InputVariable(name="context") ], template=prompt_template ) prompt = kernel.add_function( function_name="RAG", plugin_name="TextMemoryPlugin", prompt_template_config=chat_prompt_template_config, ) question = "When did I start using MongoDB?" results = await memory.search("test", question) retrieved_document = results[0].text answer = await prompt.invoke( kernel=kernel, input=question, context=retrieved_document ) print(answer)
You started using MongoDB two years ago.
Próximos pasos
MongoDB también proporciona los siguientes recursos para desarrolladores: