Docs Menu
Docs Home
/ /

Introducción a la integración de Python con el núcleo semántico

Nota

Este tutorial utiliza el núcleo semántico Biblioteca de PythonPara ver un tutorial que utiliza la biblioteca C#, consulte Comience a utilizar la integración de C# en el núcleo semántico.

Puede integrar MongoDB Vector Search con Microsoft Semantic Kernel para crear aplicaciones de IA e implementar la generación aumentada por recuperación (RAG). Este tutorial muestra cómo empezar a usar MongoDB Vector Search con Semantic Kernel para realizar búsquedas semánticas en sus datos y crear una Implementación deRAG. En concreto, se realizan las siguientes acciones:

  1. Configura el entorno.

  2. Almacenar datos personalizados en MongoDB.

  3. Cree un índice de búsqueda vectorial MongoDB en sus datos.

  4. Ejecute una consulta de búsqueda semántica en sus datos.

  5. Implemente RAG utilizando MongoDB Vector Search para responder preguntas sobre sus datos.

Trabaja con una versión ejecutable de este tutorial como un cuaderno interactivo de Python.

Semantic Kernel es un SDK de código abierto que permite combinar diversos servicios y complementos de IA con las aplicaciones. Se puede usar Semantic Kernel para diversos casos de uso de IA, incluyendo RAG.

Al integrar Búsqueda Vectorial de MongoDB con Semantic Kernel, se puede utilizar MongoDB como una base de datos vectorial y así aprovechar Búsqueda Vectorial de MongoDB para implementar RAG al recuperar documentos semánticamente similares de sus datos. Para obtener más información sobre RAG, consulte generación de recuperación aumentada (RAG) con MongoDB.

Para completar este tutorial, debes tener lo siguiente:

  • Uno de los siguientes tipos de clúster de MongoDB:

  • 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.

Configura el entorno para este tutorial. Crea un cuaderno interactivo de Python guardando un archivo con el .ipynb Extensión. Este cuaderno te permite ejecutar fragmentos de código Python individualmente y lo usarás para ejecutar el código en este tutorial.

Para configurar el entorno de su portátil:

1
  1. Ejecute el siguiente comando en su notebook para instalar el kernel semántico en su entorno.

    pip install --quiet --upgrade semantic-kernel openai motor
  2. Ejecute 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
2

Ejecute 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 su clúster 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,consulte Conectarse a un clúster a través de bibliotecas de cliente.

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.

En esta sección, se inicializa el kernel, la interfaz principal para administrar los servicios y complementos de la aplicación. A través del kernel, se configuran los servicios de IA, se instancia MongoDB como base de datos vectorial (también denominada almacén de memoria) y se cargan datos personalizados en el clúster de MongoDB.

Para almacenar datos personalizados en MongoDB, pegue y ejecute los siguientes fragmentos de código en su cuaderno:

1

Ejecute el siguiente código para inicializar el kernel.

kernel = sk.Kernel()
2

Ejecute el siguiente código para configurar el modelo de incrustación y el modelo de chat de OpenAI utilizados en este tutorial y añadir estos servicios al kernel. Este código especifica lo siguiente:

  • text-embedding-ada-002 de OpenAI como modelo de incrustación utilizado para convertir texto en incrustaciones vectoriales.

  • El gpt-3.5-turbo de 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)
3

Ejecute el siguiente código para instanciar Atlas como almacén de memoria y agregarlo al kernel. Este código establece una conexión con el clúster Atlas y especifica lo siguiente:

  • semantic_kernel_db como la base de datos Atlas utilizada para almacenar los documentos.

  • vector_index como el índice utilizado para ejecutar consultas de búsqueda semántica.

También importa un complemento TextMemoryPluginllamado, que proporciona un grupo 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")
4

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.

Para habilitar consultas de búsqueda de vectores en su tienda de vectores, ejecute el siguiente código en su cuaderno para crear un índice de búsqueda de vectores de MongoDB 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 del índice indexa el embedding campo como tipo de vector. El embedding campo contiene las incrustaciones creadas con el modelo de incrustación de OpenAI.text-embedding-ada-002 La definición del índice especifica las 1536 dimensiones del vector y mide la similitud cosine mediante.

Una vez que MongoDB crea su índice, puede ejecutar consultas de búsqueda vectorial en sus datos.

En tu notebook, ejecuta el siguiente código para realizar una búsqueda semántica básica de la What is my job title? cadena. Imprime el documento más relevante y una puntuación de relevancia entre 0 1y.

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

Esta sección muestra un ejemplo de implementación de RAG con MongoDB Vector Search y Semantic Kernel. Ahora que ha utilizado MongoDB Vector Search para recuperar documentos semánticamente similares, ejecute el siguiente ejemplo de código para solicitar al LLM que responda preguntas basadas en esos documentos.

El siguiente código define una solicitud para indicar al LLM que utilice el documento recuperado como contexto para su consulta. En este ejemplo, se solicita al LLM la consulta de When did I start using MongoDB? ejemplo. Al ampliar la base de conocimientos del LLM con datos personalizados, el modelo de chat puede generar una respuesta más precisa y contextual.

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.

MongoDB también proporciona los siguientes recursos para desarrolladores:

Volver

LlamaIndex

En esta página